diff --git a/Changelogs/Changes-CM_12.1.txt b/Changelogs/Changes-CM_12.1.txt deleted file mode 100644 index 60a84c59..00000000 --- a/Changelogs/Changes-CM_12.1.txt +++ /dev/null @@ -1,42 +0,0 @@ -General Changes - Build - - Base: Added 182 applications to the automatic power profile switcher config - - Base: Don't enable battery saver when switching to power save profile - - Browser: Changed some default settings - - Browser: UI Update - - Compiled with UBERTC GCC 4.9 and AOSP NDK 4.9 using JustArchi's v4.1 optimization flags - - Removed analytics from various packages - - Removed some packages for privacy reasons - - Removed useless packages - - Settings: Added option to change encryption password - - Settings: Senisitive notification content is hidden by default - Kernels - - Compiled with UBERTC GCC 4.8 using Cortex-A15 optimization flags - - Enabled DIAG (SnoopSnitch support) - - Enabled modules support - - Implemented KEXEC support (Multirom support) - - Implemented Quick Wakeup (Battery savings) - To Do - - DNScrypt support - - Remove DRM server - - Add more governors - - Add more I/O schedulers - - LZ4 boot support - - Remove unneeded Qualcomm blobs - -Bacon Changes - Kernel - - Implemented UKSM (Memory deduplication) - - Overclocked from 2.45Ghz to 2.88Ghz - - Underclocked from 300Mhz to 268Mhz - - Upgraded from Linux 3.4.67 to 3.4.110 - Device - - Basic performance/battery build.prop optimizations - - Removed bundled Google Widevine DRM and Microsoft PlayReady DRM firmware files - -Mako Changes - Kernel - - Overclocked from 1.51Ghz to 1.94Ghz - - Underclocked from 384Mhz to 81Mhz - Device - - None Yet diff --git a/Changelogs/Changes-CM_13.0.txt b/Changelogs/Changes-CM_13.0.txt deleted file mode 100644 index 8eded5ab..00000000 --- a/Changelogs/Changes-CM_13.0.txt +++ /dev/null @@ -1,53 +0,0 @@ -Last Updated: 08/11/2016 -General changes - - Changed network connectivity check URL to personal server (with logging disabled on server) - - Compiled with UBERTC GCC 4.9 and AOSP NDK 4.9 using JustArchi's v4.1 optimization flags - - Compiled with OpenJDK 8 - - Doze is significantly more aggressive - - Instant shutdown after 5 failed unlock attempts - - Fixed Profiles failing to change to user's prefered network type - - Miscellaneous hardening - - Removed Cyanogen AmbientSDK from various repos and packages - - Removed CyanogenMod analytics from various repos and packages - - Removed Gello from supported devices - - Removed unnecessary/outdated packages - - Replaced outdated AOSP webview with newer Chromium-based webview - - Browser - - Changed default home page to DuckDuckGo - - Changed default search engine to DuckDuckGo - - Link preloading is disabled by default - - Plugins are disabled by default - - Removed referrer flags from DuckDuckGo - - Removed RLZ tracking - - Search result preloading is disabled by default - - Camera2 - - Location recording is disabled by default - - Settings - - NFC and NDEF are disabled by default - - Passwords are hidden by default - - Senisitive notification content is hidden by default - -Device Changes - - bacon - - Kernel - - Overclocked from 2.45Ghz to 2.95Ghz - - No thats not a typo, its actually pretty stable - - Underclocked from 300Mhz to 268Mhz - - Device - - Basic performance/battery build.prop optimizations - - Removed bundled Google Widevine DRM and Microsoft PlayReady DRM firmware files - - Removed as many unnecessary proprietary Qualcomm blobs (CNE/DPM/Location/QTI) - - mako - - Device - - Enabled LTE support - - Increase speaker and microphone volume by 4dB - - Fixed dexopt related bootloop - -To Do - - Implement ARMORED (TRESOR) - - Implement DNScrypt support - - Implement MAC address and hostname randomization - - Remove CMStats from Trebuchet, currently only disabled code still there - - Remove DRM server - - Remove RemoteFolder from Trebuchet - - Remove unnecessary proprietary blobs diff --git a/Changelogs/Changes-CM_14.1.txt b/Changelogs/Changes-CM_14.1.txt deleted file mode 100644 index c7a84ef7..00000000 --- a/Changelogs/Changes-CM_14.1.txt +++ /dev/null @@ -1,48 +0,0 @@ -Last Updated: 12/23/2016 -Credits: CyanogenMod, CopperheadOS, OmniROM, TeamWin, F-Droid, MicroG, anarkia1976, bhb27, Daniel Micay, dirtyhank, Evisceration, Felipe de Leon, flar2, franciscofranco, hellsgod, mar-v-in, nikhil18, Paul Reioux, savoca, stefano.villa1976, WedyDQ10, XileForce -General Changes - - Added support for Chromium monochrome - - Builds are dex-preopted on supported devices - - Builds are signed with private release-keys - - Bundled in our custom DNS blocklist - - Compiled with OpenJDK 8 - - Doze is re-enabled on devices without real Google Play Services - - Hardened IPv4 and IPv6 stacks - - Hardened special file systems - - Hardened SQLite - - Nuked CMAnalytics from orbit - - Removed unnecessary/outdated/insecure packages. Warning: No Browser is included, please install getChromium or IceCat from F-Droid - - Updated Chromium WebView on arm64 devices - - F-Droid - - F-Droid and FDroidPrivilegedExtension are included by default - - FDroidPrivilegedExtension ONLY allows access to our signed version of F-Droid - - MicroG - - GmsCore, GsfProxy, and FakeStore are included by default - - Required signature spoofing permission is ONLY granted to signed system apps unlike other ROMs - - Settings - - NFC and NDEF are disabled by default - - Passwords are hidden by default -Device Changes - - bacon - - Overclocked from 2.45Ghz to 2.95Ghz (=+2.02Ghz) - - Underclocked from 300Mhz to 268Mhz - - Qualcomm DIAG enabled - - Removed bundled Google Widevine DRM and Microsoft PlayReady DRM firmware files - - bullhead - - Overclocked a57 from 1.82Ghz to 2.01Ghz, overclocked a53 from 1.44Ghz to 1.63Ghz (=+1.14Ghz) - - Underclocked both from 384Mhz to 300Mhz - - MMC performance slightly increased - - clark - - Overclocked a57 from 1.82Ghz to 2.01Ghz, overclocked a53 from 1.44Ghz to 1.63Ghz (=+1.14Ghz) - - Underclocked both from 384Mhz to 300Mhz - - MMC performance slightly increased - - Removed bundled Google Widevine DRM and Microsoft PlayReady DRM firmware files - - mako - - Overclocked from 1.51Ghz to 1.94Ghz (=+1.72Ghz) - - Underclocked from 384Mhz to 81Mhz - - Enabled LTE support (Requires LTE hybrid modem to be flashed) - - hammerhead - - Overclocked from 2.26Ghz to 2.95Ghz (=+2.75Ghz) - - shamu - - Overclocked from 2.64Ghz to 2.88Ghz (=+0.96Ghz) - - Underclocked from 300Mhz to 35Mhz diff --git a/Manifests/Manifest_CM-13.0.xml b/Manifests/Manifest_CM-13.0.xml deleted file mode 100644 index 2711c77b..00000000 --- a/Manifests/Manifest_CM-13.0.xml +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Manifests/Manifest_CM-14.1.xml b/Manifests/Manifest_CM-14.1.xml deleted file mode 100644 index 6f3bb033..00000000 --- a/Manifests/Manifest_CM-14.1.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Manifests/Manifest_OmniROM-7.1.xml b/Manifests/Manifest_OmniROM-7.1.xml deleted file mode 100644 index 2f074251..00000000 --- a/Manifests/Manifest_OmniROM-7.1.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/Patches/Copperhead-13.0/android_build/1.patch b/Patches/Copperhead-13.0/android_build/1.patch deleted file mode 100644 index 828de3de..00000000 --- a/Patches/Copperhead-13.0/android_build/1.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 4eb4173b876ab4b4d71a5be541096d346649bbef Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Sat, 30 May 2015 22:47:50 -0400 -Subject: [PATCH] add optional automated signing - ---- - core/Makefile | 48 ++++++++++++++++++++++++++++++++++++++++-------- - 1 file changed, 40 insertions(+), 8 deletions(-) - -diff --git a/core/Makefile b/core/Makefile -index 7eca2db..82006c9 100644 ---- a/core/Makefile -+++ b/core/Makefile -@@ -408,6 +408,11 @@ ifneq ($(OTA_PACKAGE_SIGNING_KEY),) - DEFAULT_KEY_CERT_PAIR := $(OTA_PACKAGE_SIGNING_KEY) - endif - -+ifneq ($(SIGNING_KEY_DIR),) -+ KEY_CERT_DIR := $(SIGNING_KEY_DIR) -+ DEFAULT_KEY_CERT_PAIR := $(SIGNING_KEY_DIR)/releasekey -+endif -+ - # Rules that need to be present for the all targets, even - # if they don't do anything. - .PHONY: systemimage -@@ -943,13 +948,18 @@ endif - # substitute other keys for this one. - OTA_PUBLIC_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem - --ifneq ($(OTA_PACKAGE_SIGNING_KEY),) -- OTA_PUBLIC_KEYS := $(OTA_PACKAGE_SIGNING_KEY).x509.pem -- PRODUCT_EXTRA_RECOVERY_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) -+ifneq ($(SIGNING_KEY_DIR),) -+ OTA_PUBLIC_KEYS := $(SIGNING_KEY_DIR)/releasekey.x509.pem -+ PRODUCT_EXTRA_RECOVERY_KEYS += $(SIGNING_KEY_DIR)/extra - else -- PRODUCT_EXTRA_RECOVERY_KEYS += \ -- build/target/product/security/cm \ -- build/target/product/security/cm-devkey -+ ifneq ($(OTA_PACKAGE_SIGNING_KEY),) -+ OTA_PUBLIC_KEYS := $(OTA_PACKAGE_SIGNING_KEY).x509.pem -+ PRODUCT_EXTRA_RECOVERY_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) -+ else -+ PRODUCT_EXTRA_RECOVERY_KEYS += \ -+ build/target/product/security/cm \ -+ build/target/product/security/cm-devkey -+ endif - endif - - # Generate a file containing the keys that will be read by the -@@ -1593,6 +1603,12 @@ BUILT_TARGET_FILES_PACKAGE := $(intermediates)/$(name).zip - $(BUILT_TARGET_FILES_PACKAGE): intermediates := $(intermediates) - $(BUILT_TARGET_FILES_PACKAGE): \ - zip_root := $(intermediates)/$(name) -+SIGNED_TARGET_FILES_PACKAGE := $(intermediates)/signed-$(name).zip -+MAYBE_SIGNED_TARGET_FILES_PACKAGE := $(BUILT_TARGET_FILES_PACKAGE) -+ -+ifneq ($(SIGNING_KEY_DIR),) -+ MAYBE_SIGNED_TARGET_FILES_PACKAGE := $(SIGNED_TARGET_FILES_PACKAGE) -+endif - - # $(1): Directory to copy - # $(2): Location to copy it to -@@ -1868,6 +1884,12 @@ else - OTA_FROM_TARGET_SCRIPT := $(TARGET_RELEASETOOL_OTA_FROM_TARGET_SCRIPT) - endif - -+ifeq ($(TARGET_RELEASETOOL_SIGN_TARGET_SCRIPT),) -+ SIGN_TARGET_SCRIPT := ./build/tools/releasetools/sign_target_files_apks -+else -+ SIGN_TARGET_SCRIPT := $(TARGET_RELEASETOOL_SIGN_TARGET_SCRIPT) -+endif -+ - ifeq ($(WITH_GMS),true) - $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := false - else -@@ -1895,7 +1917,17 @@ ifneq ($(BLOCK_BASED_OTA),false) - $(INTERNAL_OTA_PACKAGE_TARGET): block_based := --block - endif - --$(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS) -+$(SIGNED_TARGET_FILES_PACKAGE): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS) -+ @echo "$(SIGN_TARGET_SCRIPT)" > $(PRODUCT_OUT)/sign_script_path -+ @echo -e ${CL_YLW}"Sign target files:"${CL_RST}" $@" -+ $(hide) $(SIGN_TARGET_SCRIPT) \ -+ -d $(KEY_CERT_DIR) \ -+ -o \ -+ -e SMSSecure.apk,Orbot.apk,Android-IMSI-Catcher-Detector.apk,FreeOTP.apk,F-Droid.apk= \ -+ $(BUILT_TARGET_FILES_PACKAGE) \ -+ $(SIGNED_TARGET_FILES_PACKAGE) -+ -+$(INTERNAL_OTA_PACKAGE_TARGET): $(MAYBE_SIGNED_TARGET_FILES_PACKAGE) $(DISTTOOLS) - @echo "$(OTA_FROM_TARGET_SCRIPT)" > $(PRODUCT_OUT)/ota_script_path - @echo "$(override_device)" > $(PRODUCT_OUT)/ota_override_device - @echo -e ${CL_YLW}"Package OTA:"${CL_RST}" $@" -@@ -1907,7 +1939,7 @@ $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS) - --backup=$(backuptool) \ - --override_device=$(override_device) $(override_prop) \ - $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \ -- $(BUILT_TARGET_FILES_PACKAGE) $@ -+ $(MAYBE_SIGNED_TARGET_FILES_PACKAGE) $@ - - CM_TARGET_PACKAGE := $(PRODUCT_OUT)/cm-$(CM_VERSION).zip - diff --git a/Patches/Copperhead-13.0/android_external_sqlite/1.patch b/Patches/Copperhead-13.0/android_external_sqlite/1.patch deleted file mode 100644 index 7b24e98f..00000000 --- a/Patches/Copperhead-13.0/android_external_sqlite/1.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 56366ba56892d9de832ca86c95acb6674820d360 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Thu, 14 May 2015 19:14:53 -0400 -Subject: [PATCH] enable secure_delete by default - -This sanitizes deleted data by overwriting it with zeroes. It prevents a -non-root user from obtaining the deleted data even though it can still -linger on the underlying storage device. ---- - dist/Android.mk | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/dist/Android.mk b/dist/Android.mk -index 20b3a0a..7eabbdc 100644 ---- a/dist/Android.mk -+++ b/dist/Android.mk -@@ -27,7 +27,8 @@ common_sqlite_flags := \ - -DSQLITE_OMIT_BUILTIN_TEST \ - -DSQLITE_OMIT_COMPILEOPTION_DIAGS \ - -DSQLITE_OMIT_LOAD_EXTENSION \ -- -DSQLITE_DEFAULT_FILE_PERMISSIONS=0600 -+ -DSQLITE_DEFAULT_FILE_PERMISSIONS=0600 \ -+ -DSQLITE_SECURE_DELETE - - device_sqlite_flags := $(common_sqlite_flags) \ - -DSQLITE_ENABLE_ICU \ diff --git a/Patches/Copperhead-13.0/android_frameworks_base/1.patch b/Patches/Copperhead-13.0/android_frameworks_base/1.patch deleted file mode 100644 index 18aa289d..00000000 --- a/Patches/Copperhead-13.0/android_frameworks_base/1.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 938608ff6a4c61b4c1db2f6b94e81cae1a970aae Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Wed, 27 May 2015 00:29:08 -0400 -Subject: [PATCH] hide passwords by default - ---- - core/java/android/text/method/TextKeyListener.java | 2 +- - core/java/com/android/internal/widget/PasswordEntryKeyboardHelper.java | 2 +- - packages/Keyguard/src/com/android/keyguard/PasswordTextView.java | 2 +- - 3 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/core/java/android/text/method/TextKeyListener.java b/core/java/android/text/method/TextKeyListener.java -index 994f3d7..b2ac244 100644 ---- a/core/java/android/text/method/TextKeyListener.java -+++ b/core/java/android/text/method/TextKeyListener.java -@@ -291,7 +291,7 @@ private void updatePrefs(ContentResolver resolver) { - boolean cap = System.getInt(resolver, System.TEXT_AUTO_CAPS, 1) > 0; - boolean text = System.getInt(resolver, System.TEXT_AUTO_REPLACE, 1) > 0; - boolean period = System.getInt(resolver, System.TEXT_AUTO_PUNCTUATE, 1) > 0; -- boolean pw = System.getInt(resolver, System.TEXT_SHOW_PASSWORD, 1) > 0; -+ boolean pw = System.getInt(resolver, System.TEXT_SHOW_PASSWORD, 0) > 0; - - mPrefs = (cap ? AUTO_CAP : 0) | - (text ? AUTO_TEXT : 0) | -diff --git a/core/java/com/android/internal/widget/PasswordEntryKeyboardHelper.java b/core/java/com/android/internal/widget/PasswordEntryKeyboardHelper.java -index b2c9dc5..dc5b7f9 100644 ---- a/core/java/com/android/internal/widget/PasswordEntryKeyboardHelper.java -+++ b/core/java/com/android/internal/widget/PasswordEntryKeyboardHelper.java -@@ -159,7 +159,7 @@ public void setKeyboardMode(int mode) { - mKeyboardState = KEYBOARD_STATE_NORMAL; - final boolean visiblePassword = Settings.System.getInt( - mContext.getContentResolver(), -- Settings.System.TEXT_SHOW_PASSWORD, 1) != 0; -+ Settings.System.TEXT_SHOW_PASSWORD, 0) != 0; - final boolean enablePreview = false; // TODO: grab from configuration - mKeyboardView.setPreviewEnabled(visiblePassword && enablePreview); - break; -diff --git a/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java b/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java -index 50e7ecb..7d29928 100644 ---- a/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java -+++ b/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java -@@ -129,7 +129,7 @@ public PasswordTextView(Context context, AttributeSet attrs, int defStyleAttr, - mCharPadding = getContext().getResources().getDimensionPixelSize(R.dimen - .password_char_padding); - mShowPassword = Settings.System.getInt(mContext.getContentResolver(), -- Settings.System.TEXT_SHOW_PASSWORD, 1) == 1; -+ Settings.System.TEXT_SHOW_PASSWORD, 0) == 1; - mAppearInterpolator = AnimationUtils.loadInterpolator(mContext, - android.R.interpolator.linear_out_slow_in); - mDisappearInterpolator = AnimationUtils.loadInterpolator(mContext, diff --git a/Patches/Copperhead-13.0/android_frameworks_base/2.patch b/Patches/Copperhead-13.0/android_frameworks_base/2.patch deleted file mode 100644 index 30e2d0e0..00000000 --- a/Patches/Copperhead-13.0/android_frameworks_base/2.patch +++ /dev/null @@ -1,154 +0,0 @@ -From a798817de09cc787850ee957c7326fb36dc6c5a5 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Thu, 3 Dec 2015 14:27:34 -0500 -Subject: [PATCH] support separate encryption/lockscreen passwords - -This adds the necessary infrastructure for allowing users to opt-in to a -distinct device encryption passphrase. The passwords are still tied -together by default. This makes it possible to use a complex encryption -passphrase without losing the convenience of a very simple lockscreen -pin. - -This feature can be combined with a forced reboot after a chosen number -of failed unlocking attempts to prevent brute-forcing by requiring the -entry of the encryption password instead. ---- - core/java/android/provider/Settings.java | 7 +++ - .../android/internal/widget/LockPatternUtils.java | 72 +++++++++++++++++++++- - .../com/android/server/LockSettingsService.java | 1 + - 3 files changed, 77 insertions(+), 3 deletions(-) - -diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java -index e107fd1..a6be540 100644 ---- a/core/java/android/provider/Settings.java -+++ b/core/java/android/provider/Settings.java -@@ -4850,6 +4850,13 @@ public static boolean putFloatForUser(ContentResolver cr, String name, float val - "lock_screen_allow_private_notifications"; - - /** -+ * Separate password for encryption and the lockscreen. -+ * @hide -+ */ -+ public static final String LOCK_SEPARATE_ENCRYPTION_PASSWORD = -+ "lock_separate_encryption_password"; -+ -+ /** - * Set by the system to track if the user needs to see the call to action for - * the lockscreen notification policy. - * @hide -diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java -index ae22b50..25f56e7 100644 ---- a/core/java/com/android/internal/widget/LockPatternUtils.java -+++ b/core/java/com/android/internal/widget/LockPatternUtils.java -@@ -457,7 +457,8 @@ public void clearLock(int userHandle) { - // well, we tried... - } - -- if (userHandle == UserHandle.USER_OWNER) { -+ if (userHandle == UserHandle.USER_OWNER -+ && !isSeparateEncryptionPasswordEnabled()) { - // Set the encryption password to default. - updateEncryptionPassword(StorageManager.CRYPT_TYPE_DEFAULT, null); - } -@@ -518,7 +519,8 @@ public void saveLockPattern(List pattern, String savedPatt - - // Update the device encryption password. - if (userId == UserHandle.USER_OWNER -- && LockPatternUtils.isDeviceEncryptionEnabled()) { -+ && LockPatternUtils.isDeviceEncryptionEnabled() -+ && !isSeparateEncryptionPasswordEnabled()) { - if (!shouldEncryptWithCredentials(true)) { - clearEncryptionPassword(); - } else { -@@ -727,7 +729,8 @@ public void saveLockPassword(String password, String savedPassword, int quality, - - // Update the device encryption password. - if (userHandle == UserHandle.USER_OWNER -- && LockPatternUtils.isDeviceEncryptionEnabled()) { -+ && LockPatternUtils.isDeviceEncryptionEnabled() -+ && !isSeparateEncryptionPasswordEnabled()) { - if (!shouldEncryptWithCredentials(true)) { - clearEncryptionPassword(); - } else { -@@ -1071,6 +1074,69 @@ public void setVisiblePasswordEnabled(boolean enabled, int userId) { - } - } - -+ private void updateEncryptionPasswordFromPassword(String password) { -+ if (!TextUtils.isEmpty(password)) { -+ int computedQuality = computePasswordQuality(password); -+ boolean numeric = computedQuality -+ == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC; -+ boolean numericComplex = computedQuality -+ == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX; -+ int type = numeric || numericComplex ? StorageManager.CRYPT_TYPE_PIN -+ : StorageManager.CRYPT_TYPE_PASSWORD; -+ updateEncryptionPassword(type, password); -+ } else { -+ clearEncryptionPassword(); -+ } -+ } -+ -+ /** -+ * Set the encryption password separately from the lockscreen password. -+ * -+ * @param password The password to save -+ */ -+ public void setSeparateEncryptionPassword(String password) { -+ updateEncryptionPasswordFromPassword(password); -+ setSeparateEncryptionPasswordEnabled(true); -+ } -+ -+ /** -+ * Replace the separate encryption password by tying it to the lockscreen -+ * password. No change will occur if the provided lockscreen password is -+ * incorrect. -+ * -+ * @param password The current lockscreen password -+ * @return Whether the lockscreen password was correct. -+ */ -+ public void replaceSeparateEncryptionPassword(String password) { -+ updateEncryptionPasswordFromPassword(password); -+ setSeparateEncryptionPasswordEnabled(false); -+ } -+ -+ /** -+ * Replace the separate encryption password by tying it to the lockscreen -+ * pattern. No change will occur if the provided lockscreen password is -+ * incorrect. -+ * -+ * @param pattern The current lockscreen pattern -+ * @return Whether the lockscreen pattern was correct. -+ */ -+ public void replaceSeparateEncryptionPasswordWithPattern(List pattern) { -+ String stringPattern = patternToString(pattern); -+ updateEncryptionPassword(StorageManager.CRYPT_TYPE_PATTERN, stringPattern); -+ setSeparateEncryptionPasswordEnabled(false); -+ } -+ -+ /** -+ * @return Whether the encryption password is separate from the lockscreen password. -+ */ -+ public boolean isSeparateEncryptionPasswordEnabled() { -+ return getBoolean(Settings.Secure.LOCK_SEPARATE_ENCRYPTION_PASSWORD, false, UserHandle.USER_OWNER); -+ } -+ -+ private void setSeparateEncryptionPasswordEnabled(boolean enabled) { -+ setBoolean(Settings.Secure.LOCK_SEPARATE_ENCRYPTION_PASSWORD, enabled, UserHandle.USER_OWNER); -+ } -+ - /** - * @return Whether tactile feedback for the pattern is enabled. - */ -diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java -index bb0615d..6e05fde 100644 ---- a/services/core/java/com/android/server/LockSettingsService.java -+++ b/services/core/java/com/android/server/LockSettingsService.java -@@ -813,6 +813,7 @@ public void requireStrongAuth(int strongAuthReason, int userId) { - Secure.LOCK_PATTERN_SIZE, - Secure.LOCK_DOTS_VISIBLE, - Secure.LOCK_SHOW_ERROR_PATH, -+ Secure.LOCK_SEPARATE_ENCRYPTION_PASSWORD - }; - - // Reading these settings needs the contacts permission diff --git a/Patches/Copperhead-13.0/android_frameworks_base/3.patch b/Patches/Copperhead-13.0/android_frameworks_base/3.patch deleted file mode 100644 index 0f54ed98..00000000 --- a/Patches/Copperhead-13.0/android_frameworks_base/3.patch +++ /dev/null @@ -1,22 +0,0 @@ -From e46cfef3dcfec3b5ee5aff05c46d21ea76b36100 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Sat, 5 Dec 2015 19:33:19 -0500 -Subject: [PATCH] remove analytics support - ---- - .../src/com/android/providers/settings/DatabaseHelper.java | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java -index b3ec295..9784ee7 100644 ---- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java -+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java -@@ -1911,8 +1911,6 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) { - } - - if (upgradeVersion < 115) { -- moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_SECURE, -- new String[] { CMSettings.Secure.STATS_COLLECTION }, true); - if (mUserHandle == UserHandle.USER_OWNER) { - db.beginTransaction(); - SQLiteStatement stmt = null; diff --git a/Patches/Copperhead-13.0/android_packages_apps_Browser/1.patch b/Patches/Copperhead-13.0/android_packages_apps_Browser/1.patch deleted file mode 100644 index e57d95ef..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_Browser/1.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 4b908ef94233b911fe3d6f2d93a6076a7ab92151 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Sun, 5 Apr 2015 00:57:23 -0400 -Subject: [PATCH] remove duckduckgo referral strings - ---- - res/values/all_search_engines.xml | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/res/values/all_search_engines.xml b/res/values/all_search_engines.xml -index a87c880..51ebfe4 100644 ---- a/res/values/all_search_engines.xml -+++ b/res/values/all_search_engines.xml -@@ -752,7 +752,7 @@ http://www.opensearch.org/Specifications/OpenSearch/1.1/Draft_4#OpenSearch_1.1_p - DuckDuckGo - duckduckgo.com - https://duckduckgo.com/favicon.ico -- https://duckduckgo.com/?q={searchTerms}&t=cyanogenmod -+ https://duckduckgo.com/?q={searchTerms} - UTF-8 - - -@@ -760,7 +760,7 @@ http://www.opensearch.org/Specifications/OpenSearch/1.1/Draft_4#OpenSearch_1.1_p - DuckDuckGo (UK) - duckduckgo.com - https://duckduckgo.com/favicon.ico -- https://duckduckgo.com/?q={searchTerms}%20r:uk&t=cyanogenmod -+ https://duckduckgo.com/?q={searchTerms}%20r:uk - UTF-8 - - diff --git a/Patches/Copperhead-13.0/android_packages_apps_Browser/2.patch b/Patches/Copperhead-13.0/android_packages_apps_Browser/2.patch deleted file mode 100644 index 909706d3..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_Browser/2.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 58bde4cc16f1a0544526fed769542b707b7dc516 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Fri, 20 Mar 2015 18:13:23 -0400 -Subject: [PATCH] switch default search engine to duckduckgo - ---- - res/xml-sw600dp/advanced_preferences.xml | 2 +- - res/xml/advanced_preferences.xml | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/res/xml-sw600dp/advanced_preferences.xml b/res/xml-sw600dp/advanced_preferences.xml -index f3107d8..ae19504 100644 ---- a/res/xml-sw600dp/advanced_preferences.xml -+++ b/res/xml-sw600dp/advanced_preferences.xml -@@ -21,7 +21,7 @@ - - -diff --git a/res/xml/advanced_preferences.xml b/res/xml/advanced_preferences.xml -index 1b051f8..f068330 100644 ---- a/res/xml/advanced_preferences.xml -+++ b/res/xml/advanced_preferences.xml -@@ -21,7 +21,7 @@ - - diff --git a/Patches/Copperhead-13.0/android_packages_apps_Browser/3.patch b/Patches/Copperhead-13.0/android_packages_apps_Browser/3.patch deleted file mode 100644 index c09628dd..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_Browser/3.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 54f68f47ef79ebda9b695e0205b8abc4e2f07d86 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Sun, 5 Apr 2015 01:00:31 -0400 -Subject: [PATCH] switch default home page to duckduckgo - ---- - res/values/strings.xml | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/res/values/strings.xml b/res/values/strings.xml -index d79c7f7..0899df9 100644 ---- a/res/values/strings.xml -+++ b/res/values/strings.xml -@@ -794,8 +794,7 @@ - Dump navigation cache - - -- -- https://www.google.com/webhp?client={CID}&source=android-home -+ https://duckduckgo.com/ - - - diff --git a/Patches/Copperhead-13.0/android_packages_apps_Browser/4.patch b/Patches/Copperhead-13.0/android_packages_apps_Browser/4.patch deleted file mode 100644 index 9368a5cf..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_Browser/4.patch +++ /dev/null @@ -1,22 +0,0 @@ -From defa0e59c0f38e8f0ea6429ee05414a9402bbd8b Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Sun, 5 Apr 2015 01:27:56 -0400 -Subject: [PATCH] disable link preloading by default - ---- - res/values/strings.xml | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/res/values/strings.xml b/res/values/strings.xml -index 0899df9..8529cf6 100644 ---- a/res/values/strings.xml -+++ b/res/values/strings.xml -@@ -684,7 +684,7 @@ - NEVER - WIFI_ONLY - ALWAYS -- @string/pref_link_prefetch_value_wifi_only -+ @string/pref_link_prefetch_value_never - - @string/pref_link_prefetch_value_never - @string/pref_link_prefetch_value_wifi_only diff --git a/Patches/Copperhead-13.0/android_packages_apps_Browser/5.patch b/Patches/Copperhead-13.0/android_packages_apps_Browser/5.patch deleted file mode 100644 index d6080480..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_Browser/5.patch +++ /dev/null @@ -1,22 +0,0 @@ -From a2cf2c31329c3b14798059d0d7a56b7568089552 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Sun, 5 Apr 2015 01:29:22 -0400 -Subject: [PATCH] disable search result preloading by default - ---- - res/values/strings.xml | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/res/values/strings.xml b/res/values/strings.xml -index 8529cf6..9012511 100644 ---- a/res/values/strings.xml -+++ b/res/values/strings.xml -@@ -662,7 +662,7 @@ - NEVER - WIFI_ONLY - ALWAYS -- @string/pref_data_preload_value_wifi_only -+ @string/pref_data_preload_value_never - - @string/pref_data_preload_value_never - @string/pref_data_preload_value_wifi_only diff --git a/Patches/Copperhead-13.0/android_packages_apps_Browser/6.patch b/Patches/Copperhead-13.0/android_packages_apps_Browser/6.patch deleted file mode 100644 index d7b54606..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_Browser/6.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 093e38c00f3e46f875726f1e14190e2f120d3ed7 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Tue, 7 Apr 2015 02:18:09 -0400 -Subject: [PATCH] disable plugins by default - ---- - res/xml-sw600dp/advanced_preferences.xml | 2 +- - res/xml/advanced_preferences.xml | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/res/xml-sw600dp/advanced_preferences.xml b/res/xml-sw600dp/advanced_preferences.xml -index ae19504..93ccbf1 100644 ---- a/res/xml-sw600dp/advanced_preferences.xml -+++ b/res/xml-sw600dp/advanced_preferences.xml -@@ -46,7 +46,7 @@ - -diff --git a/res/xml/advanced_preferences.xml b/res/xml/advanced_preferences.xml -index f068330..0996bab 100644 ---- a/res/xml/advanced_preferences.xml -+++ b/res/xml/advanced_preferences.xml -@@ -51,7 +51,7 @@ - diff --git a/Patches/Copperhead-13.0/android_packages_apps_Browser/7.patch b/Patches/Copperhead-13.0/android_packages_apps_Browser/7.patch deleted file mode 100644 index e9cabba1..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_Browser/7.patch +++ /dev/null @@ -1,203 +0,0 @@ -From 664f95d59cc672fb8b8ea3068a92530b08114f95 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Tue, 7 Apr 2015 03:23:22 -0400 -Subject: [PATCH] remove RLZ tracking - ---- - AndroidManifest.xml | 8 -- - res/values/strings.xml | 3 - - src/com/android/browser/UrlHandler.java | 129 -------------------------------- - 3 files changed, 140 deletions(-) - -diff --git a/AndroidManifest.xml b/AndroidManifest.xml -index 0ffdec4..7152192 100644 ---- a/AndroidManifest.xml -+++ b/AndroidManifest.xml -@@ -239,14 +239,6 @@ - - - -- -- -- - - - -diff --git a/res/values/strings.xml b/res/values/strings.xml -index 9012511..d9023ec 100644 ---- a/res/values/strings.xml -+++ b/res/values/strings.xml -@@ -875,9 +875,6 @@ - - Other Bookmarks - -- -- Y1 -- - - Choose account - -diff --git a/src/com/android/browser/UrlHandler.java b/src/com/android/browser/UrlHandler.java -index 084a479..52919c8 100644 ---- a/src/com/android/browser/UrlHandler.java -+++ b/src/com/android/browser/UrlHandler.java -@@ -38,9 +38,6 @@ - */ - public class UrlHandler { - -- static final String RLZ_PROVIDER = "com.google.android.partnersetup.rlzappprovider"; -- static final Uri RLZ_PROVIDER_URI = Uri.parse("content://" + RLZ_PROVIDER + "/"); -- - // Use in overrideUrlLoading - /* package */ final static String SCHEME_WTAI = "wtai://wp/"; - /* package */ final static String SCHEME_WTAI_MC = "wtai://wp/mc;"; -@@ -50,9 +47,6 @@ - Controller mController; - Activity mActivity; - -- private Boolean mIsProviderPresent = null; -- private Uri mRlzUri = null; -- - public UrlHandler(Controller controller) { - mController = controller; - mActivity = mController.getActivity(); -@@ -101,20 +95,6 @@ boolean shouldOverrideUrlLoading(Tab tab, WebView view, String url) { - return false; - } - -- // If this is a Google search, attempt to add an RLZ string -- // (if one isn't already present). -- if (rlzProviderPresent()) { -- Uri siteUri = Uri.parse(url); -- if (needsRlzString(siteUri)) { -- // Need to look up the RLZ info from a database, so do it in an -- // AsyncTask. Although we are not overriding the URL load synchronously, -- // we guarantee that we will handle this URL load after the task executes, -- // so it's safe to just return true to WebCore now to stop its own loading. -- new RLZTask(tab, siteUri, view).execute(); -- return true; -- } -- } -- - if (startActivityForUrl(tab, url)) { - return true; - } -@@ -248,113 +228,4 @@ boolean handleMenuClick(Tab tab, String url) { - - return false; - } -- -- // TODO: Move this class into Tab, where it can be properly stopped upon -- // closure of the tab -- private class RLZTask extends AsyncTask { -- private Tab mTab; -- private Uri mSiteUri; -- private WebView mWebView; -- -- public RLZTask(Tab tab, Uri uri, WebView webView) { -- mTab = tab; -- mSiteUri = uri; -- mWebView = webView; -- } -- -- protected String doInBackground(Void... unused) { -- String result = mSiteUri.toString(); -- Cursor cur = null; -- try { -- cur = mActivity.getContentResolver() -- .query(getRlzUri(), null, null, null, null); -- if (cur != null && cur.moveToFirst() && !cur.isNull(0)) { -- result = mSiteUri.buildUpon() -- .appendQueryParameter("rlz", cur.getString(0)) -- .build().toString(); -- } -- } finally { -- if (cur != null) { -- cur.close(); -- } -- } -- return result; -- } -- -- protected void onPostExecute(String result) { -- // abort if we left browser already -- if (mController.isActivityPaused()) return; -- // Make sure the Tab was not closed while handling the task -- if (mController.getTabControl().getTabPosition(mTab) != -1) { -- // If the Activity Manager is not invoked, load the URL directly -- if (!startActivityForUrl(mTab, result)) { -- if (!handleMenuClick(mTab, result)) { -- mController.loadUrl(mTab, result); -- } -- } -- } -- } -- } -- -- // Determine whether the RLZ provider is present on the system. -- private boolean rlzProviderPresent() { -- if (mIsProviderPresent == null) { -- PackageManager pm = mActivity.getPackageManager(); -- mIsProviderPresent = pm.resolveContentProvider(RLZ_PROVIDER, 0) != null; -- } -- return mIsProviderPresent; -- } -- -- // Retrieve the RLZ access point string and cache the URI used to -- // retrieve RLZ values. -- private Uri getRlzUri() { -- if (mRlzUri == null) { -- String ap = mActivity.getResources() -- .getString(R.string.rlz_access_point); -- mRlzUri = Uri.withAppendedPath(RLZ_PROVIDER_URI, ap); -- } -- return mRlzUri; -- } -- -- // Determine if this URI appears to be for a Google search -- // and does not have an RLZ parameter. -- // Taken largely from Chrome source, src/chrome/browser/google_url_tracker.cc -- private static boolean needsRlzString(Uri uri) { -- String scheme = uri.getScheme(); -- if (("http".equals(scheme) || "https".equals(scheme)) && -- (uri.getQueryParameter("q") != null) && -- (uri.getQueryParameter("rlz") == null)) { -- String host = uri.getHost(); -- if (host == null) { -- return false; -- } -- String[] hostComponents = host.split("\\."); -- -- if (hostComponents.length < 2) { -- return false; -- } -- int googleComponent = hostComponents.length - 2; -- String component = hostComponents[googleComponent]; -- if (!"google".equals(component)) { -- if (hostComponents.length < 3 || -- (!"co".equals(component) && !"com".equals(component))) { -- return false; -- } -- googleComponent = hostComponents.length - 3; -- if (!"google".equals(hostComponents[googleComponent])) { -- return false; -- } -- } -- -- // Google corp network handling. -- if (googleComponent > 0 && "corp".equals( -- hostComponents[googleComponent - 1])) { -- return false; -- } -- -- return true; -- } -- return false; -- } -- - } diff --git a/Patches/Copperhead-13.0/android_packages_apps_Camera2/1.patch b/Patches/Copperhead-13.0/android_packages_apps_Camera2/1.patch deleted file mode 100644 index cf0ff832..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_Camera2/1.patch +++ /dev/null @@ -1,24 +0,0 @@ -From cd7f624c7ead431469813ddf146f1b94c57eeda3 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Tue, 13 Oct 2015 17:36:00 -0400 -Subject: [PATCH] disable location recording by default - ---- - src/com/android/camera/settings/Keys.java | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/src/com/android/camera/settings/Keys.java b/src/com/android/camera/settings/Keys.java -index f59591f..5092bfa 100644 ---- a/src/com/android/camera/settings/Keys.java -+++ b/src/com/android/camera/settings/Keys.java -@@ -182,6 +182,10 @@ public static void setDefaults(SettingsManager settingsManager, Context context) - - settingsManager.setDefaults(KEY_SHOULD_SHOW_SETTINGS_BUTTON_CLING, true); - -+ settingsManager.setDefaults(KEY_RECORD_LOCATION, false); -+ if (!settingsManager.isSet(SettingsManager.SCOPE_GLOBAL, KEY_RECORD_LOCATION)) { -+ settingsManager.setToDefault(SettingsManager.SCOPE_GLOBAL, KEY_RECORD_LOCATION); -+ } - } - - /** Helper functions for some defined keys. */ diff --git a/Patches/Copperhead-13.0/android_packages_apps_Nfc/1.patch b/Patches/Copperhead-13.0/android_packages_apps_Nfc/1.patch deleted file mode 100644 index c2e70500..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_Nfc/1.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 8d7a463afe1ab6aaecdff9707576b4fe74fab713 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Sat, 6 Jun 2015 10:40:51 -0400 -Subject: [PATCH] disable NFC and NDEF Push by default - ---- - src/com/android/nfc/NfcService.java | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/com/android/nfc/NfcService.java b/src/com/android/nfc/NfcService.java -index 6aa0dfc..cd4b819 100755 ---- a/src/com/android/nfc/NfcService.java -+++ b/src/com/android/nfc/NfcService.java -@@ -98,9 +98,9 @@ - public static final String PREF = "NfcServicePrefs"; - - static final String PREF_NFC_ON = "nfc_on"; -- static final boolean NFC_ON_DEFAULT = true; -+ static final boolean NFC_ON_DEFAULT = false; - static final String PREF_NDEF_PUSH_ON = "ndef_push_on"; -- static final boolean NDEF_PUSH_ON_DEFAULT = true; -+ static final boolean NDEF_PUSH_ON_DEFAULT = false; - static final String PREF_FIRST_BEAM = "first_beam"; - static final String PREF_FIRST_BOOT = "first_boot"; - static final String PREF_AIRPLANE_OVERRIDE = "airplane_override"; diff --git a/Patches/Copperhead-13.0/android_packages_apps_Settings/1.patch b/Patches/Copperhead-13.0/android_packages_apps_Settings/1.patch deleted file mode 100644 index 209f61a6..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_Settings/1.patch +++ /dev/null @@ -1,1057 +0,0 @@ -From 3a9c4fef92a40a52aabdd5a9f60b3a053a91411a Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Tue, 1 Dec 2015 11:59:58 -0500 -Subject: [PATCH] remove analytics support - ---- - AndroidManifest.xml | 26 -- - res/values/cm_strings.xml | 22 -- - res/xml/anonymous_stats.xml | 32 --- - res/xml/device_info_settings.xml | 8 - - res/xml/preview_data.xml | 53 ---- - res/xml/privacy_settings_cyanogenmod.xml | 8 - - .../android/settings/cmstats/AnonymousStats.java | 105 -------- - src/com/android/settings/cmstats/PreviewData.java | 55 ---- - .../android/settings/cmstats/ReportingService.java | 106 -------- - .../settings/cmstats/ReportingServiceManager.java | 123 --------- - .../settings/cmstats/StatsUploadJobService.java | 292 --------------------- - src/com/android/settings/cmstats/Utilities.java | 102 ------- - 12 files changed, 932 deletions(-) - delete mode 100644 res/xml/anonymous_stats.xml - delete mode 100644 res/xml/preview_data.xml - delete mode 100644 src/com/android/settings/cmstats/AnonymousStats.java - delete mode 100644 src/com/android/settings/cmstats/PreviewData.java - delete mode 100644 src/com/android/settings/cmstats/ReportingService.java - delete mode 100644 src/com/android/settings/cmstats/ReportingServiceManager.java - delete mode 100644 src/com/android/settings/cmstats/StatsUploadJobService.java - delete mode 100644 src/com/android/settings/cmstats/Utilities.java - -diff --git a/AndroidManifest.xml b/AndroidManifest.xml -index 75065cf..63648fc 100755 ---- a/AndroidManifest.xml -+++ b/AndroidManifest.xml -@@ -1530,12 +1530,6 @@ - - - -- -- -- - - $ - - -- -- -- -- -- -- -- -- -- -- -- -- -- - - - -diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml -index 853281b..97963a4 100644 ---- a/res/values/cm_strings.xml -+++ b/res/values/cm_strings.xml -@@ -817,28 +817,6 @@ - No filters set - Denied %s - -- -- -- CyanogenMod statistics -- Help make CyanogenMod better by opting into anonymous statistics reporting -- About -- Opting into CyanogenMod Statistics will allow non-personal data to be submitted to the -- developers of CyanogenMod to track unique installations across devices. The information submitted includes an unique identifier, -- which does not compromise your privacy or personal data. The data is submitted during each boot.\n\nFor an example of the data that is submitted, tap on Preview Data. -- Enable reporting -- Preview data -- View stats -- Learn more -- -- -- Unique ID -- Device -- Version -- Country -- Carrier -- Stats collection -- When enabled, allows metrics collection. -- - - Reset pattern - Enter primary email account and associated password to reset pattern lock -diff --git a/res/xml/anonymous_stats.xml b/res/xml/anonymous_stats.xml -deleted file mode 100644 -index 7cc5875..0000000 ---- a/res/xml/anonymous_stats.xml -+++ /dev/null -@@ -1,32 +0,0 @@ -- -- -- -- -- -- -- -- -- -- -diff --git a/res/xml/device_info_settings.xml b/res/xml/device_info_settings.xml -index 6cda1ed..4abb4d9 100644 ---- a/res/xml/device_info_settings.xml -+++ b/res/xml/device_info_settings.xml -@@ -58,14 +58,6 @@ - - - -- -- -- -- - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -diff --git a/res/xml/privacy_settings_cyanogenmod.xml b/res/xml/privacy_settings_cyanogenmod.xml -index 65e8198..6cf695b 100644 ---- a/res/xml/privacy_settings_cyanogenmod.xml -+++ b/res/xml/privacy_settings_cyanogenmod.xml -@@ -28,12 +28,4 @@ - android:title="@string/blacklist_title" - android:summary="@string/blacklist_summary" - android:fragment="com.android.settings.blacklist.BlacklistSettings" /> -- -- -- -- - -diff --git a/src/com/android/settings/cmstats/AnonymousStats.java b/src/com/android/settings/cmstats/AnonymousStats.java -deleted file mode 100644 -index 1534ccf..0000000 ---- a/src/com/android/settings/cmstats/AnonymousStats.java -+++ /dev/null -@@ -1,105 +0,0 @@ --/* -- * Copyright (C) 2015 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.settings.cmstats; -- --import android.content.Context; --import android.content.SharedPreferences; --import android.os.Bundle; -- --import android.os.UserHandle; --import android.preference.Preference; --import android.preference.PreferenceScreen; --import android.preference.SwitchPreference; --import com.android.internal.logging.MetricsLogger; --import com.android.settings.R; --import com.android.settings.SettingsPreferenceFragment; --import cyanogenmod.providers.CMSettings; -- --public class AnonymousStats extends SettingsPreferenceFragment { -- -- private static final String PREF_FILE_NAME = "CMStats"; -- /* package */ static final String ANONYMOUS_OPT_IN = "pref_anonymous_opt_in"; -- /* package */ static final String ANONYMOUS_LAST_CHECKED = "pref_anonymous_checked_in"; -- -- /* package */ static final String KEY_LAST_JOB_ID = "last_job_id"; -- /* package */ static final int QUEUE_MAX_THRESHOLD = 1000; -- -- public static final String KEY_STATS = "stats_collection"; -- -- SwitchPreference mStatsSwitch; -- -- public static SharedPreferences getPreferences(Context context) { -- return context.getSharedPreferences(PREF_FILE_NAME, 0); -- } -- -- @Override -- public void onCreate(Bundle savedInstanceState) { -- super.onCreate(savedInstanceState); -- addPreferencesFromResource(R.xml.anonymous_stats); -- mStatsSwitch = (SwitchPreference) findPreference(KEY_STATS); -- } -- -- @Override -- public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { -- if (preference == mStatsSwitch) { -- boolean checked = mStatsSwitch.isChecked(); -- if (checked) { -- // clear opt out flags -- CMSettings.Secure.putIntForUser(getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION_REPORTED, 0, UserHandle.USER_OWNER); -- } -- // will initiate opt out sequence if necessary -- ReportingServiceManager.setAlarm(getActivity()); -- return true; -- } -- return super.onPreferenceTreeClick(preferenceScreen, preference); -- } -- -- public static void updateLastSynced(Context context) { -- getPreferences(context) -- .edit() -- .putLong(ANONYMOUS_LAST_CHECKED,System.currentTimeMillis()) -- .commit(); -- } -- -- private static int getLastJobId(Context context) { -- return getPreferences(context).getInt(KEY_LAST_JOB_ID, 0); -- } -- -- private static void setLastJobId(Context context, int id) { -- getPreferences(context) -- .edit() -- .putInt(KEY_LAST_JOB_ID, id) -- .commit(); -- } -- -- public static int getNextJobId(Context context) { -- int lastId = getLastJobId(context); -- if (lastId >= QUEUE_MAX_THRESHOLD) { -- lastId = 1; -- } else { -- lastId += 1; -- } -- setLastJobId(context, lastId); -- return lastId; -- } -- -- @Override -- protected int getMetricsCategory() { -- return MetricsLogger.DONT_TRACK_ME_BRO; -- } --} -diff --git a/src/com/android/settings/cmstats/PreviewData.java b/src/com/android/settings/cmstats/PreviewData.java -deleted file mode 100644 -index 014f0e5..0000000 ---- a/src/com/android/settings/cmstats/PreviewData.java -+++ /dev/null -@@ -1,55 +0,0 @@ --/* -- * Copyright (C) 2012 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.settings.cmstats; -- --import android.content.Context; --import android.os.Bundle; --import android.preference.Preference; --import android.preference.PreferenceScreen; -- --import com.android.internal.logging.MetricsLogger; --import com.android.settings.R; --import com.android.settings.SettingsPreferenceFragment; -- --public class PreviewData extends SettingsPreferenceFragment { -- private static final String UNIQUE_ID = "preview_id"; -- private static final String DEVICE = "preview_device"; -- private static final String VERSION = "preview_version"; -- private static final String COUNTRY = "preview_country"; -- private static final String CARRIER = "preview_carrier"; -- -- @Override -- public void onCreate(Bundle savedInstanceState) { -- super.onCreate(savedInstanceState); -- -- addPreferencesFromResource(R.xml.preview_data); -- -- final PreferenceScreen prefSet = getPreferenceScreen(); -- final Context context = getActivity(); -- -- prefSet.findPreference(UNIQUE_ID).setSummary(Utilities.getUniqueID(context)); -- prefSet.findPreference(DEVICE).setSummary(Utilities.getDevice()); -- prefSet.findPreference(VERSION).setSummary(Utilities.getModVersion()); -- prefSet.findPreference(COUNTRY).setSummary(Utilities.getCountryCode(context)); -- prefSet.findPreference(CARRIER).setSummary(Utilities.getCarrier(context)); -- } -- -- @Override -- protected int getMetricsCategory() { -- return MetricsLogger.DONT_TRACK_ME_BRO; -- } --} -diff --git a/src/com/android/settings/cmstats/ReportingService.java b/src/com/android/settings/cmstats/ReportingService.java -deleted file mode 100644 -index 8410143..0000000 ---- a/src/com/android/settings/cmstats/ReportingService.java -+++ /dev/null -@@ -1,106 +0,0 @@ --/* -- * Copyright (C) 2015 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.settings.cmstats; -- --import android.app.IntentService; --import android.app.job.JobInfo; --import android.app.job.JobScheduler; --import android.content.ComponentName; --import android.content.Context; --import android.content.Intent; --import android.os.PersistableBundle; --import android.os.UserHandle; --import android.util.Log; --import cyanogenmod.providers.CMSettings; -- --import java.util.List; -- --public class ReportingService extends IntentService { -- /* package */ static final String TAG = "CMStats"; -- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); -- -- public static final String EXTRA_OPTING_OUT = "cmstats::opt_out"; -- -- public ReportingService() { -- super(ReportingService.class.getSimpleName()); -- } -- -- @Override -- protected void onHandleIntent(Intent intent) { -- JobScheduler js = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); -- -- String deviceId = Utilities.getUniqueID(getApplicationContext()); -- String deviceName = Utilities.getDevice(); -- String deviceVersion = Utilities.getModVersion(); -- String deviceCountry = Utilities.getCountryCode(getApplicationContext()); -- String deviceCarrier = Utilities.getCarrier(getApplicationContext()); -- String deviceCarrierId = Utilities.getCarrierId(getApplicationContext()); -- boolean optOut = intent.getBooleanExtra(EXTRA_OPTING_OUT, false); -- -- final int cyanogenJobId = AnonymousStats.getNextJobId(getApplicationContext()); -- final int cmOrgJobId = AnonymousStats.getNextJobId(getApplicationContext()); -- -- if (DEBUG) Log.d(TAG, "scheduling jobs id: " + cyanogenJobId + ", " + cmOrgJobId); -- -- PersistableBundle cyanogenBundle = new PersistableBundle(); -- cyanogenBundle.putBoolean(StatsUploadJobService.KEY_OPT_OUT, optOut); -- cyanogenBundle.putString(StatsUploadJobService.KEY_DEVICE_NAME, deviceName); -- cyanogenBundle.putString(StatsUploadJobService.KEY_UNIQUE_ID, deviceId); -- cyanogenBundle.putString(StatsUploadJobService.KEY_VERSION, deviceVersion); -- cyanogenBundle.putString(StatsUploadJobService.KEY_COUNTRY, deviceCountry); -- cyanogenBundle.putString(StatsUploadJobService.KEY_CARRIER, deviceCarrier); -- cyanogenBundle.putString(StatsUploadJobService.KEY_CARRIER_ID, deviceCarrierId); -- cyanogenBundle.putLong(StatsUploadJobService.KEY_TIMESTAMP, System.currentTimeMillis()); -- -- // get snapshot and persist it -- PersistableBundle cmBundle = new PersistableBundle(cyanogenBundle); -- -- // set job types -- cyanogenBundle.putInt(StatsUploadJobService.KEY_JOB_TYPE, -- StatsUploadJobService.JOB_TYPE_CYANOGEN); -- cmBundle.putInt(StatsUploadJobService.KEY_JOB_TYPE, -- StatsUploadJobService.JOB_TYPE_CMORG); -- -- // schedule cyanogen stats upload -- js.schedule(new JobInfo.Builder(cyanogenJobId, new ComponentName(getPackageName(), -- StatsUploadJobService.class.getName())) -- .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) -- .setMinimumLatency(1000) -- .setExtras(cyanogenBundle) -- .setPersisted(true) -- .build()); -- -- // schedule cmorg stats upload -- js.schedule(new JobInfo.Builder(cmOrgJobId, new ComponentName(getPackageName(), -- StatsUploadJobService.class.getName())) -- .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) -- .setMinimumLatency(1000) -- .setExtras(cmBundle) -- .setPersisted(true) -- .build()); -- -- if (optOut) { -- // we've successfully scheduled the opt out. -- CMSettings.Secure.putIntForUser(getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION_REPORTED, 1, UserHandle.USER_OWNER); -- } -- -- // reschedule -- AnonymousStats.updateLastSynced(this); -- ReportingServiceManager.setAlarm(this); -- } --} -diff --git a/src/com/android/settings/cmstats/ReportingServiceManager.java b/src/com/android/settings/cmstats/ReportingServiceManager.java -deleted file mode 100644 -index bce1372..0000000 ---- a/src/com/android/settings/cmstats/ReportingServiceManager.java -+++ /dev/null -@@ -1,123 +0,0 @@ --/* -- * Copyright (C) 2012 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.settings.cmstats; -- --import android.app.AlarmManager; --import android.app.PendingIntent; --import android.app.job.JobScheduler; --import android.content.BroadcastReceiver; --import android.content.Context; --import android.content.Intent; --import android.content.SharedPreferences; --import android.os.UserHandle; --import android.util.Log; --import cyanogenmod.providers.CMSettings; -- --public class ReportingServiceManager extends BroadcastReceiver { -- private static final long MILLIS_PER_HOUR = 60L * 60L * 1000L; -- private static final long MILLIS_PER_DAY = 24L * MILLIS_PER_HOUR; -- private static final long UPDATE_INTERVAL = 1L * MILLIS_PER_DAY; -- -- private static final String TAG = ReportingServiceManager.class.getSimpleName(); -- -- public static final String ACTION_LAUNCH_SERVICE = -- "com.android.settings.action.TRIGGER_REPORT_METRICS"; -- public static final String EXTRA_FORCE = "force"; -- -- @Override -- public void onReceive(Context context, Intent intent) { -- if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { -- setAlarm(context); -- } else if (intent.getAction().equals(ACTION_LAUNCH_SERVICE)){ -- launchService(context, intent.getBooleanExtra(EXTRA_FORCE, false)); -- } -- } -- -- /** -- * opt out if we haven't yet -- */ -- public static void initiateOptOut(Context context) { -- final boolean optOutReported = CMSettings.Secure.getIntForUser(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION_REPORTED, 0, UserHandle.USER_OWNER) == 1; -- if (!optOutReported) { -- Intent intent = new Intent(); -- intent.setClass(context, ReportingService.class); -- intent.putExtra(ReportingService.EXTRA_OPTING_OUT, true); -- context.startServiceAsUser(intent, UserHandle.OWNER); -- } -- } -- -- public static void setAlarm(Context context) { -- SharedPreferences prefs = AnonymousStats.getPreferences(context); -- if (prefs.contains(AnonymousStats.ANONYMOUS_OPT_IN)) { -- migrate(context, prefs); -- } -- if (!Utilities.isStatsCollectionEnabled(context)) { -- initiateOptOut(context); -- return; -- } -- long lastSynced = prefs.getLong(AnonymousStats.ANONYMOUS_LAST_CHECKED, 0); -- if (lastSynced == 0) { -- launchService(context, true); // service will reschedule the next alarm -- return; -- } -- long millisFromNow = (lastSynced + UPDATE_INTERVAL) - System.currentTimeMillis(); -- -- Intent intent = new Intent(ACTION_LAUNCH_SERVICE); -- intent.setClass(context, ReportingServiceManager.class); -- -- AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); -- alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + millisFromNow, -- PendingIntent.getBroadcast(context, 0, intent, 0)); -- Log.d(TAG, "Next sync attempt in : " -- + (millisFromNow / MILLIS_PER_HOUR) + " hours"); -- } -- -- public static void launchService(Context context, boolean force) { -- SharedPreferences prefs = AnonymousStats.getPreferences(context); -- -- if (!Utilities.isStatsCollectionEnabled(context)) { -- return; -- } -- -- if (!force) { -- long lastSynced = prefs.getLong(AnonymousStats.ANONYMOUS_LAST_CHECKED, 0); -- if (lastSynced == 0) { -- setAlarm(context); -- return; -- } -- long timeElapsed = System.currentTimeMillis() - lastSynced; -- if (timeElapsed < UPDATE_INTERVAL) { -- long timeLeft = UPDATE_INTERVAL - timeElapsed; -- Log.d(TAG, "Waiting for next sync : " -- + timeLeft / MILLIS_PER_HOUR + " hours"); -- return; -- } -- } -- -- Intent intent = new Intent(); -- intent.setClass(context, ReportingService.class); -- context.startServiceAsUser(intent, UserHandle.OWNER); -- } -- -- private static void migrate(Context context, SharedPreferences prefs) { -- Utilities.setStatsCollectionEnabled(context, -- prefs.getBoolean(AnonymousStats.ANONYMOUS_OPT_IN, true)); -- prefs.edit().remove(AnonymousStats.ANONYMOUS_OPT_IN).commit(); -- } -- --} -diff --git a/src/com/android/settings/cmstats/StatsUploadJobService.java b/src/com/android/settings/cmstats/StatsUploadJobService.java -deleted file mode 100644 -index 77b26e6..0000000 ---- a/src/com/android/settings/cmstats/StatsUploadJobService.java -+++ /dev/null -@@ -1,292 +0,0 @@ --/* -- * Copyright (C) 2015 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.settings.cmstats; -- --import android.app.job.JobParameters; --import android.app.job.JobService; --import android.net.Uri; --import android.os.AsyncTask; --import android.os.PersistableBundle; --import android.util.ArrayMap; --import android.util.Log; --import com.android.settings.R; --import org.json.JSONException; --import org.json.JSONObject; -- --import java.io.BufferedInputStream; --import java.io.BufferedReader; --import java.io.BufferedWriter; --import java.io.IOException; --import java.io.InputStream; --import java.io.InputStreamReader; --import java.io.OutputStream; --import java.io.OutputStreamWriter; --import java.net.HttpURLConnection; --import java.net.URL; --import java.util.Collections; --import java.util.Map; -- --public class StatsUploadJobService extends JobService { -- -- private static final String TAG = StatsUploadJobService.class.getSimpleName(); -- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); -- -- public static final String KEY_JOB_TYPE = "job_type"; -- public static final int JOB_TYPE_CYANOGEN = 1; -- public static final int JOB_TYPE_CMORG = 2; -- -- public static final String KEY_UNIQUE_ID = "uniqueId"; -- public static final String KEY_DEVICE_NAME = "deviceName"; -- public static final String KEY_VERSION = "version"; -- public static final String KEY_COUNTRY = "country"; -- public static final String KEY_CARRIER = "carrier"; -- public static final String KEY_CARRIER_ID = "carrierId"; -- public static final String KEY_TIMESTAMP = "timeStamp"; -- public static final String KEY_OPT_OUT = "optOut"; -- -- private final Map mCurrentJobs -- = Collections.synchronizedMap(new ArrayMap()); -- -- @Override -- public boolean onStartJob(JobParameters jobParameters) { -- if (DEBUG) -- Log.d(TAG, "onStartJob() called with " + "jobParameters = [" + jobParameters + "]"); -- final StatsUploadTask uploadTask = new StatsUploadTask(jobParameters); -- mCurrentJobs.put(jobParameters, uploadTask); -- uploadTask.execute((Void) null); -- return true; -- } -- -- @Override -- public boolean onStopJob(JobParameters jobParameters) { -- if (DEBUG) -- Log.d(TAG, "onStopJob() called with " + "jobParameters = [" + jobParameters + "]"); -- -- final StatsUploadTask cancelledJob; -- cancelledJob = mCurrentJobs.remove(jobParameters); -- -- if (cancelledJob != null) { -- // cancel the ongoing background task -- cancelledJob.cancel(true); -- return true; // reschedule -- } -- -- return false; -- } -- -- private class StatsUploadTask extends AsyncTask { -- -- private JobParameters mJobParams; -- -- public StatsUploadTask(JobParameters jobParams) { -- this.mJobParams = jobParams; -- } -- -- @Override -- protected Void doInBackground(Void... params) { -- -- PersistableBundle extras = mJobParams.getExtras(); -- -- String deviceId = extras.getString(KEY_UNIQUE_ID); -- String deviceName = extras.getString(KEY_DEVICE_NAME); -- String deviceVersion = extras.getString(KEY_VERSION); -- String deviceCountry = extras.getString(KEY_COUNTRY); -- String deviceCarrier = extras.getString(KEY_CARRIER); -- String deviceCarrierId = extras.getString(KEY_CARRIER_ID); -- long timeStamp = extras.getLong(KEY_TIMESTAMP); -- boolean optOut = extras.getBoolean(KEY_OPT_OUT); -- -- boolean success = false; -- int jobType = extras.getInt(KEY_JOB_TYPE, -1); -- if (!isCancelled()) { -- switch (jobType) { -- case JOB_TYPE_CYANOGEN: -- try { -- JSONObject json = new JSONObject(); -- json.put("optOut", optOut); -- json.put("uniqueId", deviceId); -- json.put("deviceName", deviceName); -- json.put("version", deviceVersion); -- json.put("country", deviceCountry); -- json.put("carrier", deviceCarrier); -- json.put("carrierId", deviceCarrierId); -- json.put("timestamp", timeStamp); -- -- success = uploadToCyanogen(json); -- } catch (IOException | JSONException e) { -- Log.e(TAG, "Could not upload stats checkin to cyanogen server", e); -- success = false; -- } -- break; -- -- case JOB_TYPE_CMORG: -- try { -- success = uploadToCM(deviceId, deviceName, deviceVersion, deviceCountry, -- deviceCarrier, deviceCarrierId, optOut); -- } catch (IOException e) { -- Log.e(TAG, "Could not upload stats checkin to commnity server", e); -- success = false; -- } -- break; -- } -- } -- -- if (success) { -- // we hit the server, succeed either which way. -- mCurrentJobs.remove(mJobParams); -- } -- -- if (DEBUG) -- Log.d(TAG, "job id " + mJobParams.getJobId() + ", has finished with success=" -- + success); -- jobFinished(mJobParams, !success); -- return null; -- } -- } -- -- -- private boolean uploadToCM(String deviceId, String deviceName, String deviceVersion, -- String deviceCountry, String deviceCarrier, String deviceCarrierId, -- boolean optOut) -- throws IOException { -- -- final Uri uri = Uri.parse(getString(R.string.stats_cm_url)).buildUpon() -- .appendQueryParameter("opt_out", optOut ? "1" : "0") -- .appendQueryParameter("device_hash", deviceId) -- .appendQueryParameter("device_name", deviceName) -- .appendQueryParameter("device_version", deviceVersion) -- .appendQueryParameter("device_country", deviceCountry) -- .appendQueryParameter("device_carrier", deviceCarrier) -- .appendQueryParameter("device_carrier_id", deviceCarrierId).build(); -- URL url = new URL(uri.toString()); -- HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); -- try { -- urlConnection.setInstanceFollowRedirects(true); -- urlConnection.setDoOutput(true); -- urlConnection.connect(); -- -- final int responseCode = urlConnection.getResponseCode(); -- if (DEBUG) Log.d(TAG, "cm server response code=" + responseCode); -- final boolean success = responseCode == HttpURLConnection.HTTP_OK; -- if (!success) { -- Log.w(TAG, "failed sending, server returned: " + getResponse(urlConnection, -- !success)); -- } -- return success; -- } finally { -- urlConnection.disconnect(); -- } -- -- } -- -- private boolean uploadToCyanogen(JSONObject json) -- throws IOException, JSONException { -- String authToken = getAuthToken(); -- -- if (authToken.isEmpty()) { -- Log.w(TAG, "no auth token!"); -- } -- -- URL url = new URL(getString(R.string.stats_cyanogen_url)); -- HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); -- try { -- urlConnection.setInstanceFollowRedirects(true); -- urlConnection.setDoInput(true); -- urlConnection.setDoOutput(true); -- -- urlConnection.setRequestProperty("Accept-Encoding", "identity"); -- urlConnection.setRequestProperty("Authorization", authToken); -- urlConnection.setRequestProperty("Content-Type", "application/json"); -- -- OutputStream os = urlConnection.getOutputStream(); -- BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); -- writer.write(json.toString()); -- writer.flush(); -- writer.close(); -- os.close(); -- -- urlConnection.connect(); -- -- final int responseCode = urlConnection.getResponseCode(); -- final boolean success = responseCode == HttpURLConnection.HTTP_OK; -- -- final String response = getResponse(urlConnection, !success); -- if (DEBUG) -- Log.d(TAG, "server responseCode: " + responseCode +", response=" + response); -- -- if (!success) { -- Log.w(TAG, "failed sending, server returned: " + response); -- } -- return success; -- } finally { -- urlConnection.disconnect(); -- } -- } -- -- private String getAuthToken() { -- HttpURLConnection urlConnection = null; -- try { -- URL url = new URL(getString(R.string.stats_cyanogen_token_url)); -- urlConnection = (HttpURLConnection) url.openConnection(); -- urlConnection.setInstanceFollowRedirects(true); -- urlConnection.setDoInput(true); -- -- urlConnection.setRequestProperty("Accept-Encoding", "identity"); -- urlConnection.setRequestProperty("Content-Type", "text/plain"); -- -- urlConnection.connect(); -- -- final int responseCode = urlConnection.getResponseCode(); -- final boolean success = responseCode == HttpURLConnection.HTTP_OK; -- if (DEBUG) Log.d(TAG, "server auth response code=" + responseCode); -- final String response = getResponse(urlConnection, !success); -- if (DEBUG) -- Log.d(TAG, "server auth response=" + response); -- -- if (success) { -- return response; -- } -- } catch (IOException e) { -- Log.e(TAG, "error getting auth token", e); -- } finally { -- if (urlConnection != null) { -- urlConnection.disconnect(); -- } -- } -- return ""; -- } -- -- private String getResponse(HttpURLConnection httpUrlConnection, boolean errorStream) -- throws IOException { -- InputStream responseStream = new BufferedInputStream(errorStream -- ? httpUrlConnection.getErrorStream() -- : httpUrlConnection.getInputStream()); -- -- BufferedReader responseStreamReader = new BufferedReader( -- new InputStreamReader(responseStream)); -- String line = ""; -- StringBuilder stringBuilder = new StringBuilder(); -- while ((line = responseStreamReader.readLine()) != null) { -- stringBuilder.append(line).append("\n"); -- } -- responseStreamReader.close(); -- responseStream.close(); -- -- return stringBuilder.toString(); -- } -- --} -diff --git a/src/com/android/settings/cmstats/Utilities.java b/src/com/android/settings/cmstats/Utilities.java -deleted file mode 100644 -index 1e98888..0000000 ---- a/src/com/android/settings/cmstats/Utilities.java -+++ /dev/null -@@ -1,102 +0,0 @@ --/* -- * Copyright (C) 2012 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.settings.cmstats; -- --import android.content.Context; --import android.os.Build; --import android.os.SystemProperties; --import android.provider.Settings; --import android.telephony.TelephonyManager; --import android.text.TextUtils; -- --import cyanogenmod.providers.CMSettings; -- --import java.math.BigInteger; --import java.net.NetworkInterface; --import java.security.MessageDigest; -- --public class Utilities { -- public static String getUniqueID(Context context) { -- final String id = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); -- return digest(context.getPackageName() + id); -- } -- -- public static String getCarrier(Context context) { -- TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); -- String carrier = tm.getNetworkOperatorName(); -- if (TextUtils.isEmpty(carrier)) { -- carrier = "Unknown"; -- } -- return carrier; -- } -- -- public static String getCarrierId(Context context) { -- TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); -- String carrierId = tm.getNetworkOperator(); -- if (TextUtils.isEmpty(carrierId)) { -- carrierId = "0"; -- } -- return carrierId; -- } -- -- public static String getCountryCode(Context context) { -- TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); -- String countryCode = tm.getNetworkCountryIso(); -- if (TextUtils.isEmpty(countryCode)) { -- countryCode = "Unknown"; -- } -- return countryCode; -- } -- -- public static String getDevice() { -- return SystemProperties.get("ro.cm.device", Build.PRODUCT); -- } -- -- public static String getModVersion() { -- return SystemProperties.get("ro.cm.version", Build.DISPLAY); -- } -- -- public static String digest(String input) { -- try { -- MessageDigest md = MessageDigest.getInstance("MD5"); -- return new BigInteger(1, md.digest(input.getBytes())).toString(16).toUpperCase(); -- } catch (Exception e) { -- return null; -- } -- } -- -- /** -- * Check to see if global stats are enabled. -- * @param context -- * @return Whether or not stats collection is enabled. -- */ -- public static boolean isStatsCollectionEnabled(Context context) { -- return CMSettings.Secure.getInt(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, 1) != 0; -- } -- -- /** -- * Enabled or disable stats collection -- * @param context -- * @param enabled Boolean that sets collection being enabled. -- */ -- public static void setStatsCollectionEnabled(Context context, boolean enabled) { -- int enable = (enabled) ? 1 : 0; -- CMSettings.Secure.putInt(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, enable); -- } --} diff --git a/Patches/Copperhead-13.0/android_packages_apps_Settings/2.patch b/Patches/Copperhead-13.0/android_packages_apps_Settings/2.patch deleted file mode 100644 index 6658fc1d..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_Settings/2.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 382f9153c766ef96ac03adbd1ad8ec5bae2fa193 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Wed, 2 Dec 2015 00:14:29 -0500 -Subject: [PATCH] hide passwords by default - ---- - src/com/android/settings/CryptKeeperConfirm.java | 2 +- - src/com/android/settings/SecuritySettings.java | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/com/android/settings/CryptKeeperConfirm.java b/src/com/android/settings/CryptKeeperConfirm.java -index 45b50f6..bb0c7e5 100644 ---- a/src/com/android/settings/CryptKeeperConfirm.java -+++ b/src/com/android/settings/CryptKeeperConfirm.java -@@ -130,7 +130,7 @@ public void onClick(View v) { - } - int value = Settings.System.getInt(getContext().getContentResolver(), - Settings.System.TEXT_SHOW_PASSWORD, -- 1); -+ 0); - utils.setVisiblePasswordEnabled(value != 0, UserHandle.USER_OWNER); - - Intent intent = new Intent(getActivity(), Blank.class); -diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java -index c0e5b73..ec04136 100644 ---- a/src/com/android/settings/SecuritySettings.java -+++ b/src/com/android/settings/SecuritySettings.java -@@ -661,7 +661,7 @@ public void onResume() { - - if (mShowPassword != null) { - mShowPassword.setChecked(Settings.System.getInt(getContentResolver(), -- Settings.System.TEXT_SHOW_PASSWORD, 1) != 0); -+ Settings.System.TEXT_SHOW_PASSWORD, 0) != 0); - } - - if (mResetCredentials != null) { diff --git a/Patches/Copperhead-13.0/android_packages_apps_Settings/3.patch b/Patches/Copperhead-13.0/android_packages_apps_Settings/3.patch deleted file mode 100644 index 8988aad7..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_Settings/3.patch +++ /dev/null @@ -1,756 +0,0 @@ -From 2d6aa76f7c765ac129d5ac163460eb8e62080afa Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Mon, 15 Jun 2015 10:06:33 -0400 -Subject: [PATCH] support setting a separate encryption password - ---- - AndroidManifest.xml | 3 + - res/values/strings.xml | 9 + - res/xml/security_settings_encrypted.xml | 10 + - .../android/settings/ChooseEncryptionPassword.java | 682 +++++++++++++++++++++ - 4 files changed, 704 insertions(+) - create mode 100644 src/com/android/settings/ChooseEncryptionPassword.java - -diff --git a/AndroidManifest.xml b/AndroidManifest.xml -index 63648fc..a561d7e 100755 ---- a/AndroidManifest.xml -+++ b/AndroidManifest.xml -@@ -1524,6 +1524,9 @@ - - -+ -+ - -diff --git a/res/values/strings.xml b/res/values/strings.xml -index 3072f33..d5324f1 100755 ---- a/res/values/strings.xml -+++ b/res/values/strings.xml -@@ -937,6 +937,15 @@ - - Switch input method - -+ -+ Change encryption password -+ -+ -+ Change the password used for device encryption -+ -+ -+ Set encryption password -+ - - - -diff --git a/res/xml/security_settings_encrypted.xml b/res/xml/security_settings_encrypted.xml -index 2399243..f05bad5 100644 ---- a/res/xml/security_settings_encrypted.xml -+++ b/res/xml/security_settings_encrypted.xml -@@ -27,6 +27,16 @@ - android:title="@string/crypt_keeper_encrypt_title" - android:summary="@string/crypt_keeper_encrypted_summary"/> - -+ -+ -+ -+ -+ - - - -diff --git a/src/com/android/settings/ChooseEncryptionPassword.java b/src/com/android/settings/ChooseEncryptionPassword.java -new file mode 100644 -index 0000000..43e2b0e ---- /dev/null -+++ b/src/com/android/settings/ChooseEncryptionPassword.java -@@ -0,0 +1,682 @@ -+/* -+ * Copyright (C) 2015 The Android Open Source Project -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ */ -+ -+package com.android.settings; -+ -+import com.android.internal.logging.MetricsLogger; -+import com.android.internal.widget.LockPatternUtils; -+import com.android.internal.widget.PasswordEntryKeyboardHelper; -+import com.android.internal.widget.PasswordEntryKeyboardView; -+import com.android.internal.widget.TextViewInputDisabler; -+import com.android.internal.widget.LockPatternUtils.RequestThrottledException; -+import com.android.settings.notification.RedactionInterstitial; -+ -+import android.app.Activity; -+import android.app.Fragment; -+import android.app.admin.DevicePolicyManager; -+import android.content.Context; -+import android.content.Intent; -+import android.inputmethodservice.KeyboardView; -+import android.os.Bundle; -+import android.os.Handler; -+import android.os.Message; -+import android.os.UserHandle; -+import android.text.Editable; -+import android.text.InputType; -+import android.text.Selection; -+import android.text.Spannable; -+import android.text.TextUtils; -+import android.text.TextWatcher; -+import android.util.Log; -+import android.view.KeyEvent; -+import android.view.LayoutInflater; -+import android.view.View; -+import android.view.ViewGroup; -+import android.view.View.OnClickListener; -+import android.view.inputmethod.EditorInfo; -+import android.widget.Button; -+import android.widget.TextView; -+import android.widget.TextView.OnEditorActionListener; -+ -+public class ChooseEncryptionPassword extends SettingsActivity { -+ public static final String PASSWORD_MIN_KEY = "lockscreen.password_min"; -+ public static final String PASSWORD_MAX_KEY = "lockscreen.password_max"; -+ public static final String PASSWORD_MIN_LETTERS_KEY = "lockscreen.password_min_letters"; -+ public static final String PASSWORD_MIN_LOWERCASE_KEY = "lockscreen.password_min_lowercase"; -+ public static final String PASSWORD_MIN_UPPERCASE_KEY = "lockscreen.password_min_uppercase"; -+ public static final String PASSWORD_MIN_NUMERIC_KEY = "lockscreen.password_min_numeric"; -+ public static final String PASSWORD_MIN_SYMBOLS_KEY = "lockscreen.password_min_symbols"; -+ public static final String PASSWORD_MIN_NONLETTER_KEY = "lockscreen.password_min_nonletter"; -+ -+ private static final String TAG = "ChooseEncryptionPassword"; -+ -+ @Override -+ public Intent getIntent() { -+ Intent modIntent = new Intent(super.getIntent()); -+ modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName()); -+ return modIntent; -+ } -+ -+ public static Intent createIntent(Context context, int quality, -+ int minLength, final int maxLength, boolean requirePasswordToDecrypt, -+ boolean confirmCredentials) { -+ Intent intent = new Intent().setClass(context, ChooseEncryptionPassword.class); -+ intent.putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, quality); -+ intent.putExtra(PASSWORD_MIN_KEY, minLength); -+ intent.putExtra(PASSWORD_MAX_KEY, maxLength); -+ intent.putExtra(ChooseLockGeneric.CONFIRM_CREDENTIALS, confirmCredentials); -+ intent.putExtra(EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, requirePasswordToDecrypt); -+ return intent; -+ } -+ -+ public static Intent createIntent(Context context, int quality, -+ int minLength, final int maxLength, boolean requirePasswordToDecrypt, String password) { -+ Intent intent = createIntent(context, quality, minLength, maxLength, -+ requirePasswordToDecrypt, false); -+ intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, password); -+ return intent; -+ } -+ -+ public static Intent createIntent(Context context, int quality, -+ int minLength, final int maxLength, boolean requirePasswordToDecrypt, long challenge) { -+ Intent intent = createIntent(context, quality, minLength, maxLength, -+ requirePasswordToDecrypt, false); -+ intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true); -+ intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge); -+ return intent; -+ } -+ -+ @Override -+ protected boolean isValidFragment(String fragmentName) { -+ if (ChooseEncryptionPasswordFragment.class.getName().equals(fragmentName)) return true; -+ return false; -+ } -+ -+ /* package */ Class getFragmentClass() { -+ return ChooseEncryptionPasswordFragment.class; -+ } -+ -+ @Override -+ public void onCreate(Bundle savedInstanceState) { -+ // TODO: Fix on phones -+ // Disable IME on our window since we provide our own keyboard -+ //getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, -+ //WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); -+ super.onCreate(savedInstanceState); -+ CharSequence msg = getText(R.string.lockpassword_choose_your_password_header); -+ setTitle(msg); -+ } -+ -+ public static class ChooseEncryptionPasswordFragment extends InstrumentedFragment -+ implements OnClickListener, OnEditorActionListener, TextWatcher, -+ SaveAndFinishWorker.Listener { -+ private static final String KEY_FIRST_PIN = "first_pin"; -+ private static final String KEY_UI_STAGE = "ui_stage"; -+ private static final String KEY_CURRENT_PASSWORD = "current_password"; -+ private static final String FRAGMENT_TAG_SAVE_AND_FINISH = "save_and_finish_worker"; -+ -+ private String mCurrentPassword; -+ private String mChosenPassword; -+ private boolean mHasChallenge; -+ private long mChallenge; -+ private TextView mPasswordEntry; -+ private TextViewInputDisabler mPasswordEntryInputDisabler; -+ private int mPasswordMinLength = LockPatternUtils.MIN_LOCK_PASSWORD_SIZE; -+ private int mPasswordMaxLength = 16; -+ private int mPasswordMinLetters = 0; -+ private int mPasswordMinUpperCase = 0; -+ private int mPasswordMinLowerCase = 0; -+ private int mPasswordMinSymbols = 0; -+ private int mPasswordMinNumeric = 0; -+ private int mPasswordMinNonLetter = 0; -+ private LockPatternUtils mLockPatternUtils; -+ private SaveAndFinishWorker mSaveAndFinishWorker; -+ private int mRequestedQuality = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC; -+ private ChooseLockSettingsHelper mChooseLockSettingsHelper; -+ private Stage mUiStage = Stage.Introduction; -+ -+ private TextView mHeaderText; -+ private String mFirstPin; -+ private KeyboardView mKeyboardView; -+ private PasswordEntryKeyboardHelper mKeyboardHelper; -+ private boolean mIsAlphaMode; -+ private Button mCancelButton; -+ private Button mNextButton; -+ private static final int CONFIRM_EXISTING_REQUEST = 58; -+ static final int RESULT_FINISHED = RESULT_FIRST_USER; -+ private static final long ERROR_MESSAGE_TIMEOUT = 3000; -+ private static final int MSG_SHOW_ERROR = 1; -+ -+ private Handler mHandler = new Handler() { -+ @Override -+ public void handleMessage(Message msg) { -+ if (msg.what == MSG_SHOW_ERROR) { -+ updateStage((Stage) msg.obj); -+ } -+ } -+ }; -+ -+ /** -+ * Keep track internally of where the user is in choosing a pattern. -+ */ -+ protected enum Stage { -+ -+ Introduction(R.string.lockpassword_choose_your_password_header, -+ R.string.lockpassword_choose_your_pin_header, -+ R.string.lockpassword_continue_label), -+ -+ NeedToConfirm(R.string.lockpassword_confirm_your_password_header, -+ R.string.lockpassword_confirm_your_pin_header, -+ R.string.lockpassword_ok_label), -+ -+ ConfirmWrong(R.string.lockpassword_confirm_passwords_dont_match, -+ R.string.lockpassword_confirm_pins_dont_match, -+ R.string.lockpassword_continue_label); -+ -+ Stage(int hintInAlpha, int hintInNumeric, int nextButtonText) { -+ this.alphaHint = hintInAlpha; -+ this.numericHint = hintInNumeric; -+ this.buttonText = nextButtonText; -+ } -+ -+ public final int alphaHint; -+ public final int numericHint; -+ public final int buttonText; -+ } -+ -+ // required constructor for fragments -+ public ChooseEncryptionPasswordFragment() { -+ -+ } -+ -+ @Override -+ public void onCreate(Bundle savedInstanceState) { -+ super.onCreate(savedInstanceState); -+ mLockPatternUtils = new LockPatternUtils(getActivity()); -+ Intent intent = getActivity().getIntent(); -+ if (!(getActivity() instanceof ChooseEncryptionPassword)) { -+ throw new SecurityException("Fragment contained in wrong activity"); -+ } -+ mRequestedQuality = Math.max(intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -+ mRequestedQuality), mLockPatternUtils.getRequestedPasswordQuality( -+ UserHandle.myUserId())); -+ mPasswordMinLength = Math.max(Math.max( -+ LockPatternUtils.MIN_LOCK_PASSWORD_SIZE, -+ intent.getIntExtra(PASSWORD_MIN_KEY, mPasswordMinLength)), -+ mLockPatternUtils.getRequestedMinimumPasswordLength(UserHandle.myUserId())); -+ mPasswordMaxLength = intent.getIntExtra(PASSWORD_MAX_KEY, mPasswordMaxLength); -+ mPasswordMinLetters = Math.max(intent.getIntExtra(PASSWORD_MIN_LETTERS_KEY, -+ mPasswordMinLetters), mLockPatternUtils.getRequestedPasswordMinimumLetters( -+ UserHandle.myUserId())); -+ mPasswordMinUpperCase = Math.max(intent.getIntExtra(PASSWORD_MIN_UPPERCASE_KEY, -+ mPasswordMinUpperCase), mLockPatternUtils.getRequestedPasswordMinimumUpperCase( -+ UserHandle.myUserId())); -+ mPasswordMinLowerCase = Math.max(intent.getIntExtra(PASSWORD_MIN_LOWERCASE_KEY, -+ mPasswordMinLowerCase), mLockPatternUtils.getRequestedPasswordMinimumLowerCase( -+ UserHandle.myUserId())); -+ mPasswordMinNumeric = Math.max(intent.getIntExtra(PASSWORD_MIN_NUMERIC_KEY, -+ mPasswordMinNumeric), mLockPatternUtils.getRequestedPasswordMinimumNumeric( -+ UserHandle.myUserId())); -+ mPasswordMinSymbols = Math.max(intent.getIntExtra(PASSWORD_MIN_SYMBOLS_KEY, -+ mPasswordMinSymbols), mLockPatternUtils.getRequestedPasswordMinimumSymbols( -+ UserHandle.myUserId())); -+ mPasswordMinNonLetter = Math.max(intent.getIntExtra(PASSWORD_MIN_NONLETTER_KEY, -+ mPasswordMinNonLetter), mLockPatternUtils.getRequestedPasswordMinimumNonLetter( -+ UserHandle.myUserId())); -+ -+ mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); -+ } -+ -+ @Override -+ public View onCreateView(LayoutInflater inflater, ViewGroup container, -+ Bundle savedInstanceState) { -+ return inflater.inflate(R.layout.choose_lock_password, container, false); -+ } -+ -+ @Override -+ public void onViewCreated(View view, Bundle savedInstanceState) { -+ super.onViewCreated(view, savedInstanceState); -+ -+ mCancelButton = (Button) view.findViewById(R.id.cancel_button); -+ mCancelButton.setOnClickListener(this); -+ mNextButton = (Button) view.findViewById(R.id.next_button); -+ mNextButton.setOnClickListener(this); -+ -+ mIsAlphaMode = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == mRequestedQuality -+ || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == mRequestedQuality -+ || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == mRequestedQuality; -+ mKeyboardView = (PasswordEntryKeyboardView) view.findViewById(R.id.keyboard); -+ mPasswordEntry = (TextView) view.findViewById(R.id.password_entry); -+ mPasswordEntry.setOnEditorActionListener(this); -+ mPasswordEntry.addTextChangedListener(this); -+ mPasswordEntryInputDisabler = new TextViewInputDisabler(mPasswordEntry); -+ -+ final Activity activity = getActivity(); -+ mKeyboardHelper = new PasswordEntryKeyboardHelper(activity, -+ mKeyboardView, mPasswordEntry); -+ mKeyboardHelper.setKeyboardMode(mIsAlphaMode ? -+ PasswordEntryKeyboardHelper.KEYBOARD_MODE_ALPHA -+ : PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC); -+ -+ mHeaderText = (TextView) view.findViewById(R.id.headerText); -+ mKeyboardView.requestFocus(); -+ -+ int currentType = mPasswordEntry.getInputType(); -+ mPasswordEntry.setInputType(mIsAlphaMode ? currentType -+ : (InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD)); -+ -+ Intent intent = getActivity().getIntent(); -+ final boolean confirmCredentials = intent.getBooleanExtra( -+ ChooseLockGeneric.CONFIRM_CREDENTIALS, true); -+ mCurrentPassword = intent.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); -+ mHasChallenge = intent.getBooleanExtra( -+ ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false); -+ mChallenge = intent.getLongExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0); -+ if (savedInstanceState == null) { -+ updateStage(Stage.Introduction); -+ if (confirmCredentials) { -+ mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, -+ getString(R.string.unlock_set_unlock_launch_picker_title), true); -+ } -+ } else { -+ // restore from previous state -+ mFirstPin = savedInstanceState.getString(KEY_FIRST_PIN); -+ final String state = savedInstanceState.getString(KEY_UI_STAGE); -+ if (state != null) { -+ mUiStage = Stage.valueOf(state); -+ updateStage(mUiStage); -+ } -+ -+ if (mCurrentPassword == null) { -+ mCurrentPassword = savedInstanceState.getString(KEY_CURRENT_PASSWORD); -+ } -+ -+ // Re-attach to the exiting worker if there is one. -+ mSaveAndFinishWorker = (SaveAndFinishWorker) getFragmentManager().findFragmentByTag( -+ FRAGMENT_TAG_SAVE_AND_FINISH); -+ } -+ if (activity instanceof SettingsActivity) { -+ final SettingsActivity sa = (SettingsActivity) activity; -+ int id = mIsAlphaMode ? R.string.lockpassword_choose_your_password_header -+ : R.string.lockpassword_choose_your_pin_header; -+ CharSequence title = getText(id); -+ sa.setTitle(title); -+ } -+ } -+ -+ @Override -+ protected int getMetricsCategory() { -+ return MetricsLogger.CHOOSE_LOCK_PASSWORD; -+ } -+ -+ @Override -+ public void onResume() { -+ super.onResume(); -+ updateStage(mUiStage); -+ if (mSaveAndFinishWorker != null) { -+ mSaveAndFinishWorker.setListener(this); -+ } else { -+ mKeyboardView.requestFocus(); -+ } -+ } -+ -+ @Override -+ public void onPause() { -+ mHandler.removeMessages(MSG_SHOW_ERROR); -+ if (mSaveAndFinishWorker != null) { -+ mSaveAndFinishWorker.setListener(null); -+ } -+ -+ super.onPause(); -+ } -+ -+ @Override -+ public void onSaveInstanceState(Bundle outState) { -+ super.onSaveInstanceState(outState); -+ outState.putString(KEY_UI_STAGE, mUiStage.name()); -+ outState.putString(KEY_FIRST_PIN, mFirstPin); -+ outState.putString(KEY_CURRENT_PASSWORD, mCurrentPassword); -+ } -+ -+ @Override -+ public void onActivityResult(int requestCode, int resultCode, -+ Intent data) { -+ super.onActivityResult(requestCode, resultCode, data); -+ switch (requestCode) { -+ case CONFIRM_EXISTING_REQUEST: -+ if (resultCode != Activity.RESULT_OK) { -+ getActivity().setResult(RESULT_FINISHED); -+ getActivity().finish(); -+ } else { -+ mCurrentPassword = data.getStringExtra( -+ ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); -+ } -+ break; -+ } -+ } -+ -+ protected Intent getRedactionInterstitialIntent(Context context) { -+ return RedactionInterstitial.createStartIntent(context); -+ } -+ -+ protected void updateStage(Stage stage) { -+ final Stage previousStage = mUiStage; -+ mUiStage = stage; -+ updateUi(); -+ -+ // If the stage changed, announce the header for accessibility. This -+ // is a no-op when accessibility is disabled. -+ if (previousStage != stage) { -+ mHeaderText.announceForAccessibility(mHeaderText.getText()); -+ } -+ } -+ -+ /** -+ * Validates PIN and returns a message to display if PIN fails test. -+ * @param password the raw password the user typed in -+ * @return error message to show to user or null if password is OK -+ */ -+ private String validatePassword(String password) { -+ if (password.length() < mPasswordMinLength) { -+ return getString(mIsAlphaMode ? -+ R.string.lockpassword_password_too_short -+ : R.string.lockpassword_pin_too_short, mPasswordMinLength); -+ } -+ if (password.length() > mPasswordMaxLength) { -+ return getString(mIsAlphaMode ? -+ R.string.lockpassword_password_too_long -+ : R.string.lockpassword_pin_too_long, mPasswordMaxLength + 1); -+ } -+ int letters = 0; -+ int numbers = 0; -+ int lowercase = 0; -+ int symbols = 0; -+ int uppercase = 0; -+ int nonletter = 0; -+ for (int i = 0; i < password.length(); i++) { -+ char c = password.charAt(i); -+ // allow non control Latin-1 characters only -+ if (c < 32 || c > 127) { -+ return getString(R.string.lockpassword_illegal_character); -+ } -+ if (c >= '0' && c <= '9') { -+ numbers++; -+ nonletter++; -+ } else if (c >= 'A' && c <= 'Z') { -+ letters++; -+ uppercase++; -+ } else if (c >= 'a' && c <= 'z') { -+ letters++; -+ lowercase++; -+ } else { -+ symbols++; -+ nonletter++; -+ } -+ } -+ if (DevicePolicyManager.PASSWORD_QUALITY_NUMERIC == mRequestedQuality -+ || DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX == mRequestedQuality) { -+ if (letters > 0 || symbols > 0) { -+ // This shouldn't be possible unless user finds some way to bring up -+ // soft keyboard -+ return getString(R.string.lockpassword_pin_contains_non_digits); -+ } -+ // Check for repeated characters or sequences (e.g. '1234', '0000', '2468') -+ final int sequence = LockPatternUtils.maxLengthSequence(password); -+ if (DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX == mRequestedQuality -+ && sequence > LockPatternUtils.MAX_ALLOWED_SEQUENCE) { -+ return getString(R.string.lockpassword_pin_no_sequential_digits); -+ } -+ } else if (DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == mRequestedQuality) { -+ if (letters < mPasswordMinLetters) { -+ return String.format(getResources().getQuantityString( -+ R.plurals.lockpassword_password_requires_letters, mPasswordMinLetters), -+ mPasswordMinLetters); -+ } else if (numbers < mPasswordMinNumeric) { -+ return String.format(getResources().getQuantityString( -+ R.plurals.lockpassword_password_requires_numeric, mPasswordMinNumeric), -+ mPasswordMinNumeric); -+ } else if (lowercase < mPasswordMinLowerCase) { -+ return String.format(getResources().getQuantityString( -+ R.plurals.lockpassword_password_requires_lowercase, mPasswordMinLowerCase), -+ mPasswordMinLowerCase); -+ } else if (uppercase < mPasswordMinUpperCase) { -+ return String.format(getResources().getQuantityString( -+ R.plurals.lockpassword_password_requires_uppercase, mPasswordMinUpperCase), -+ mPasswordMinUpperCase); -+ } else if (symbols < mPasswordMinSymbols) { -+ return String.format(getResources().getQuantityString( -+ R.plurals.lockpassword_password_requires_symbols, mPasswordMinSymbols), -+ mPasswordMinSymbols); -+ } else if (nonletter < mPasswordMinNonLetter) { -+ return String.format(getResources().getQuantityString( -+ R.plurals.lockpassword_password_requires_nonletter, mPasswordMinNonLetter), -+ mPasswordMinNonLetter); -+ } -+ } else { -+ final boolean alphabetic = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC -+ == mRequestedQuality; -+ final boolean alphanumeric = DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC -+ == mRequestedQuality; -+ if ((alphabetic || alphanumeric) && letters == 0) { -+ return getString(R.string.lockpassword_password_requires_alpha); -+ } -+ if (alphanumeric && numbers == 0) { -+ return getString(R.string.lockpassword_password_requires_digit); -+ } -+ } -+ if(mLockPatternUtils.checkPasswordHistory(password, UserHandle.myUserId())) { -+ return getString(mIsAlphaMode ? R.string.lockpassword_password_recently_used -+ : R.string.lockpassword_pin_recently_used); -+ } -+ -+ return null; -+ } -+ -+ public void handleNext() { -+ if (mSaveAndFinishWorker != null) return; -+ mChosenPassword = mPasswordEntry.getText().toString(); -+ if (TextUtils.isEmpty(mChosenPassword)) { -+ return; -+ } -+ String errorMsg = null; -+ if (mUiStage == Stage.Introduction) { -+ errorMsg = validatePassword(mChosenPassword); -+ if (errorMsg == null) { -+ mFirstPin = mChosenPassword; -+ mPasswordEntry.setText(""); -+ updateStage(Stage.NeedToConfirm); -+ } -+ } else if (mUiStage == Stage.NeedToConfirm) { -+ if (mFirstPin.equals(mChosenPassword)) { -+ startSaveAndFinish(); -+ } else { -+ CharSequence tmp = mPasswordEntry.getText(); -+ if (tmp != null) { -+ Selection.setSelection((Spannable) tmp, 0, tmp.length()); -+ } -+ updateStage(Stage.ConfirmWrong); -+ } -+ } -+ if (errorMsg != null) { -+ showError(errorMsg, mUiStage); -+ } -+ } -+ -+ protected void setNextEnabled(boolean enabled) { -+ mNextButton.setEnabled(enabled); -+ } -+ -+ protected void setNextText(int text) { -+ mNextButton.setText(text); -+ } -+ -+ public void onClick(View v) { -+ switch (v.getId()) { -+ case R.id.next_button: -+ handleNext(); -+ break; -+ -+ case R.id.cancel_button: -+ getActivity().finish(); -+ break; -+ } -+ } -+ -+ private void showError(String msg, final Stage next) { -+ mHeaderText.setText(msg); -+ mHeaderText.announceForAccessibility(mHeaderText.getText()); -+ Message mesg = mHandler.obtainMessage(MSG_SHOW_ERROR, next); -+ mHandler.removeMessages(MSG_SHOW_ERROR); -+ mHandler.sendMessageDelayed(mesg, ERROR_MESSAGE_TIMEOUT); -+ } -+ -+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { -+ // Check if this was the result of hitting the enter or "done" key -+ if (actionId == EditorInfo.IME_NULL -+ || actionId == EditorInfo.IME_ACTION_DONE -+ || actionId == EditorInfo.IME_ACTION_NEXT) { -+ handleNext(); -+ return true; -+ } -+ return false; -+ } -+ -+ /** -+ * Update the hint based on current Stage and length of password entry -+ */ -+ private void updateUi() { -+ final boolean canInput = mSaveAndFinishWorker == null; -+ String password = mPasswordEntry.getText().toString(); -+ final int length = password.length(); -+ if (mUiStage == Stage.Introduction) { -+ if (length < mPasswordMinLength) { -+ String msg = getString(mIsAlphaMode ? R.string.lockpassword_password_too_short -+ : R.string.lockpassword_pin_too_short, mPasswordMinLength); -+ mHeaderText.setText(msg); -+ setNextEnabled(false); -+ } else { -+ String error = validatePassword(password); -+ if (error != null) { -+ mHeaderText.setText(error); -+ setNextEnabled(false); -+ } else { -+ mHeaderText.setText(R.string.lockpassword_press_continue); -+ setNextEnabled(true); -+ } -+ } -+ } else { -+ mHeaderText.setText(mIsAlphaMode ? mUiStage.alphaHint : mUiStage.numericHint); -+ setNextEnabled(canInput && length > 0); -+ } -+ setNextText(mUiStage.buttonText); -+ mPasswordEntryInputDisabler.setInputEnabled(canInput); -+ } -+ -+ public void afterTextChanged(Editable s) { -+ // Changing the text while error displayed resets to NeedToConfirm state -+ if (mUiStage == Stage.ConfirmWrong) { -+ mUiStage = Stage.NeedToConfirm; -+ } -+ updateUi(); -+ } -+ -+ public void beforeTextChanged(CharSequence s, int start, int count, int after) { -+ -+ } -+ -+ public void onTextChanged(CharSequence s, int start, int before, int count) { -+ -+ } -+ -+ private void startSaveAndFinish() { -+ if (mSaveAndFinishWorker != null) { -+ Log.w(TAG, "startSaveAndFinish with an existing SaveAndFinishWorker."); -+ return; -+ } -+ -+ mPasswordEntryInputDisabler.setInputEnabled(false); -+ setNextEnabled(false); -+ -+ mSaveAndFinishWorker = new SaveAndFinishWorker(); -+ getFragmentManager().beginTransaction().add(mSaveAndFinishWorker, -+ FRAGMENT_TAG_SAVE_AND_FINISH).commit(); -+ mSaveAndFinishWorker.setListener(this); -+ -+ final boolean required = getActivity().getIntent().getBooleanExtra( -+ EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); -+ mSaveAndFinishWorker.start(mLockPatternUtils, required, mHasChallenge, mChallenge, -+ mChosenPassword, mCurrentPassword, mRequestedQuality); -+ } -+ -+ @Override -+ public void onChosenLockSaveFinished(boolean wasSecureBefore, Intent resultData) { -+ getActivity().setResult(RESULT_FINISHED, resultData); -+ getActivity().finish(); -+ -+ if (!wasSecureBefore) { -+ Intent intent = getRedactionInterstitialIntent(getActivity()); -+ if (intent != null) { -+ startActivity(intent); -+ } -+ } -+ } -+ } -+ -+ private static class SaveAndFinishWorker extends SaveChosenLockWorkerBase { -+ -+ private String mChosenPassword; -+ private String mCurrentPassword; -+ private int mRequestedQuality; -+ -+ public void start(LockPatternUtils utils, boolean required, -+ boolean hasChallenge, long challenge, -+ String chosenPassword, String currentPassword, int requestedQuality) { -+ prepare(utils, required, hasChallenge, challenge); -+ -+ mChosenPassword = chosenPassword; -+ mCurrentPassword = currentPassword; -+ mRequestedQuality = requestedQuality; -+ -+ start(); -+ } -+ -+ @Override -+ protected Intent saveAndVerifyInBackground() { -+ Intent result = null; -+ final int userId = UserHandle.myUserId(); -+ mUtils.setCredentialRequiredToDecrypt(true); -+ mUtils.setSeparateEncryptionPassword(mChosenPassword); -+ -+ if (mHasChallenge) { -+ byte[] token; -+ try { -+ token = mUtils.verifyPassword(mChosenPassword, mChallenge, userId); -+ } catch (RequestThrottledException e) { -+ token = null; -+ } -+ -+ if (token == null) { -+ Log.e(TAG, "critical: no token returned for known good password."); -+ } -+ -+ result = new Intent(); -+ result.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token); -+ } -+ -+ return result; -+ } -+ } -+} diff --git a/Patches/Copperhead-13.0/android_packages_apps_Settings/4.patch b/Patches/Copperhead-13.0/android_packages_apps_Settings/4.patch deleted file mode 100644 index 010b390e..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_Settings/4.patch +++ /dev/null @@ -1,198 +0,0 @@ -From 0985c9dc829bd54d29335231704bff3bda2750b3 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Sat, 27 Jun 2015 12:39:17 -0400 -Subject: [PATCH] support replacing a separate encryption password - ---- - AndroidManifest.xml | 2 + - res/values/strings.xml | 6 ++ - res/xml/security_settings_encrypted.xml | 10 +++ - .../settings/ReplaceEncryptionPassword.java | 99 ++++++++++++++++++++++ - src/com/android/settings/SecuritySettings.java | 10 +++ - 5 files changed, 127 insertions(+) - create mode 100644 src/com/android/settings/ReplaceEncryptionPassword.java - -diff --git a/AndroidManifest.xml b/AndroidManifest.xml -index a561d7e..c54e4fa 100755 ---- a/AndroidManifest.xml -+++ b/AndroidManifest.xml -@@ -1527,6 +1527,8 @@ - - -+ -+ - -diff --git a/res/values/strings.xml b/res/values/strings.xml -index d5324f1..224c91e 100755 ---- a/res/values/strings.xml -+++ b/res/values/strings.xml -@@ -946,6 +946,12 @@ - - Set encryption password - -+ -+ Replace encryption password -+ -+ -+ Remove the separate encryption password -+ - - - -diff --git a/res/xml/security_settings_encrypted.xml b/res/xml/security_settings_encrypted.xml -index f05bad5..e068541 100644 ---- a/res/xml/security_settings_encrypted.xml -+++ b/res/xml/security_settings_encrypted.xml -@@ -37,6 +37,16 @@ - android:targetClass="com.android.settings.ChooseEncryptionPassword" /> - - -+ -+ -+ -+ -+ - - - -diff --git a/src/com/android/settings/ReplaceEncryptionPassword.java b/src/com/android/settings/ReplaceEncryptionPassword.java -new file mode 100644 -index 0000000..84dcc48 ---- /dev/null -+++ b/src/com/android/settings/ReplaceEncryptionPassword.java -@@ -0,0 +1,99 @@ -+/* -+ * Copyright (C) 2015 The Android Open Source Project -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ */ -+ -+package com.android.settings; -+ -+import com.android.internal.widget.LockPatternUtils; -+import com.android.internal.widget.LockPatternUtils.RequestThrottledException; -+ -+import android.app.Activity; -+import android.app.Fragment; -+import android.content.Intent; -+import android.content.res.Resources; -+import android.os.Bundle; -+import android.os.storage.StorageManager; -+import android.os.UserHandle; -+import android.view.LayoutInflater; -+import android.view.View; -+import android.view.ViewGroup; -+ -+public class ReplaceEncryptionPassword extends SettingsActivity { -+ @Override -+ public Intent getIntent() { -+ Intent modIntent = new Intent(super.getIntent()); -+ modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName()); -+ return modIntent; -+ } -+ -+ @Override -+ protected boolean isValidFragment(String fragmentName) { -+ if (ReplaceEncryptionPasswordFragment.class.getName().equals(fragmentName)) return true; -+ return false; -+ } -+ -+ /* package */ Class getFragmentClass() { -+ return ReplaceEncryptionPasswordFragment.class; -+ } -+ -+ public static class ReplaceEncryptionPasswordFragment extends Fragment { -+ private static final int KEYGUARD_REQUEST = 55; -+ -+ @Override -+ public void onCreate(Bundle savedInstanceState) { -+ super.onCreate(savedInstanceState); -+ if (!(getActivity() instanceof ReplaceEncryptionPassword)) { -+ throw new SecurityException("Fragment contained in wrong activity"); -+ } -+ } -+ -+ @Override -+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) { -+ Resources res = getActivity().getResources(); -+ ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(getActivity(), this); -+ -+ helper.launchConfirmationActivity(KEYGUARD_REQUEST, -+ res.getText(R.string.unlock_set_unlock_password_title), -+ true); -+ -+ return null; -+ } -+ -+ @Override -+ public void onActivityResult(int requestCode, int resultCode, Intent data) { -+ super.onActivityResult(requestCode, resultCode, data); -+ -+ if (requestCode != KEYGUARD_REQUEST) { -+ return; -+ } -+ -+ // If the user entered a valid keyguard trace, present the final -+ // confirmation prompt; otherwise, go back to the initial state. -+ if (resultCode == Activity.RESULT_OK && data != null) { -+ LockPatternUtils utils = new LockPatternUtils(getActivity()); -+ int type = data.getIntExtra(ChooseLockSettingsHelper.EXTRA_KEY_TYPE, -1); -+ String password = data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); -+ if (type == StorageManager.CRYPT_TYPE_PATTERN) { -+ utils.replaceSeparateEncryptionPasswordWithPattern( -+ utils.stringToPattern(password, utils.getLockPatternSize())); -+ } else { -+ utils.replaceSeparateEncryptionPassword(password); -+ } -+ } -+ -+ getActivity().finish(); -+ } -+ } -+} -diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java -index 4d76f08..7cab5ca 100644 ---- a/src/com/android/settings/SecuritySettings.java -+++ b/src/com/android/settings/SecuritySettings.java -@@ -110,6 +110,7 @@ - private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive"; - private static final String KEY_TRUST_AGENT = "trust_agent"; - private static final String KEY_SCREEN_PINNING = "screen_pinning_settings"; -+ private static final String KEY_REPLACE_ENCRYPTION_PASSWORD = "crypt_keeper_replace_password"; - private static final String KEY_SMS_SECURITY_CHECK_PREF = "sms_security_check_limit"; - - // malloc configuration -@@ -270,6 +271,15 @@ public boolean onPreferenceClick(Preference preference) { - if (LockPatternUtils.isDeviceEncryptionEnabled()) { - // The device is currently encrypted. - addPreferencesFromResource(R.xml.security_settings_encrypted); -+ if (!mLockPatternUtils.isSeparateEncryptionPasswordEnabled()) { -+ PreferenceGroup securityCategory = -+ (PreferenceGroup)root.findPreference(KEY_SECURITY_CATEGORY); -+ if (securityCategory != null) { -+ Preference replaceEncryptionPassword = -+ root.findPreference(KEY_REPLACE_ENCRYPTION_PASSWORD); -+ securityCategory.removePreference(replaceEncryptionPassword); -+ } -+ } - } else { - // This device supports encryption but isn't encrypted. - addPreferencesFromResource(R.xml.security_settings_unencrypted); diff --git a/Patches/Copperhead-13.0/android_packages_apps_Settings/5.patch b/Patches/Copperhead-13.0/android_packages_apps_Settings/5.patch deleted file mode 100644 index 74b06627..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_Settings/5.patch +++ /dev/null @@ -1,73 +0,0 @@ -From a29c050a986312d6863d2a7ed6cceb1f1b0b9fac Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Sun, 28 Jun 2015 13:31:54 -0400 -Subject: [PATCH] fix usage of ChooseLockSettingsHelper - -The fragment was not being passed, so the ChooseLock* fragments are not -informed if authentication fails (i.e. the cancel button is pushed) and -continue on as if it was successful. This wasn't noticed because this -code isn't used in the normal path where authentication happens before -entering the preferences menu to choose the authentication method. - -The authentication support built-in to these fragments may even be dead -code, but it should work correctly if it's there because it may be the -basis of new code. ---- - src/com/android/settings/ChooseEncryptionPassword.java | 2 +- - src/com/android/settings/ChooseLockGeneric.java | 2 +- - src/com/android/settings/ChooseLockPassword.java | 2 +- - src/com/android/settings/ChooseLockPattern.java | 2 +- - 4 files changed, 4 insertions(+), 4 deletions(-) - -diff --git a/src/com/android/settings/ChooseEncryptionPassword.java b/src/com/android/settings/ChooseEncryptionPassword.java -index 43e2b0e..761603a 100644 ---- a/src/com/android/settings/ChooseEncryptionPassword.java -+++ b/src/com/android/settings/ChooseEncryptionPassword.java -@@ -237,7 +237,7 @@ public void onCreate(Bundle savedInstanceState) { - mPasswordMinNonLetter), mLockPatternUtils.getRequestedPasswordMinimumNonLetter( - UserHandle.myUserId())); - -- mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); -+ mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity(), this); - } - - @Override -diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java -index 7f5960f..b177d11 100644 ---- a/src/com/android/settings/ChooseLockGeneric.java -+++ b/src/com/android/settings/ChooseLockGeneric.java -@@ -137,7 +137,7 @@ public void onCreate(Bundle savedInstanceState) { - (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE); - mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); - mKeyStore = KeyStore.getInstance(); -- mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity()); -+ mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity(), this); - mLockPatternUtils = new LockPatternUtils(getActivity()); - mLockPatternUtils.sanitizePassword(); - -diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java -index 54c3620..59d1153 100644 ---- a/src/com/android/settings/ChooseLockPassword.java -+++ b/src/com/android/settings/ChooseLockPassword.java -@@ -237,7 +237,7 @@ public void onCreate(Bundle savedInstanceState) { - mPasswordMinNonLetter), mLockPatternUtils.getRequestedPasswordMinimumNonLetter( - UserHandle.myUserId())); - -- mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); -+ mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity(), this); - } - - @Override -diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java -index c85e604..f6f0b7e 100644 ---- a/src/com/android/settings/ChooseLockPattern.java -+++ b/src/com/android/settings/ChooseLockPattern.java -@@ -366,7 +366,7 @@ public void run() { - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); -- mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); -+ mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity(), this); - if (!(getActivity() instanceof ChooseLockPattern)) { - throw new SecurityException("Fragment contained in wrong activity"); - } diff --git a/Patches/Copperhead-13.0/android_packages_apps_SetupWizard/1-old.patch b/Patches/Copperhead-13.0/android_packages_apps_SetupWizard/1-old.patch deleted file mode 100644 index 39c18dfc..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_SetupWizard/1-old.patch +++ /dev/null @@ -1,1020 +0,0 @@ -From 8f5b0fee3dd4a251d08b86a6400d57a57c5be28b Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Mon, 6 Apr 2015 00:05:13 -0400 -Subject: [PATCH] remove analytics support - ---- - AndroidManifest.xml | 1 - - res/layout/setup_cyanogen_services.xml | 36 ----- - .../setupwizard/cmstats/SetupStats.java | 162 --------------------- - .../setupwizard/cmstats/StatsUtils.java | 44 ------ - .../setupwizard/setup/BluetoothSetupPage.java | 7 - - .../setupwizard/setup/ChooseDataSimPage.java | 5 - - .../setupwizard/setup/CyanogenServicesPage.java | 13 -- - .../setupwizard/setup/CyanogenSettingsPage.java | 60 -------- - .../setupwizard/setup/DateTimePage.java | 19 --- - .../setupwizard/setup/FingerprintSetupPage.java | 4 - - .../setupwizard/setup/GmsAccountPage.java | 22 --- - .../setupwizard/setup/MobileDataPage.java | 4 - - .../setupwizard/setup/OtherSettingsPage.java | 16 -- - .../cyanogenmod/setupwizard/setup/SetupPage.java | 7 - - .../cyanogenmod/setupwizard/setup/WelcomePage.java | 8 - - .../setupwizard/setup/WifiSetupPage.java | 27 +--- - .../setupwizard/ui/SetupPageFragment.java | 3 - - .../setupwizard/ui/SetupWizardActivity.java | 11 -- - .../util/EnableAccessibilityController.java | 3 - - 19 files changed, 1 insertion(+), 451 deletions(-) - delete mode 100644 src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java - delete mode 100644 src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java - -diff --git a/AndroidManifest.xml b/AndroidManifest.xml -index 5821eba..d134ade 100644 ---- a/AndroidManifest.xml -+++ b/AndroidManifest.xml -@@ -47,7 +47,6 @@ - - - -- - - - -diff --git a/res/layout/setup_cyanogen_services.xml b/res/layout/setup_cyanogen_services.xml -index 36837bb..82b70fd 100644 ---- a/res/layout/setup_cyanogen_services.xml -+++ b/res/layout/setup_cyanogen_services.xml -@@ -102,42 +102,6 @@ - - - -- -- -- -- -- -- -- -- -- -- - - mEvents = new LinkedList(); -- -- private static final SetupStats sInstance = new SetupStats(); -- -- private static final boolean DEBUG = false; -- -- private SetupStats() {} -- -- public static void addEvent(String category, String action, -- String label, String value) { -- sInstance.mEvents.add(new Event(category, action, label, value)); -- } -- -- public static void addEvent(String category, String action) { -- sInstance.mEvents.add(new Event(category, action, null, null)); -- } -- -- public static void sendEvents(Context context) { -- while (!sInstance.mEvents.isEmpty()) { -- sInstance.sendEvent(context, sInstance.mEvents.remove()); -- } -- } -- -- private void sendEvent(Context context, Event event) { -- -- if (!StatsUtils.isStatsPackageInstalled(context) -- || !StatsUtils.isStatsCollectionEnabled(context)) { -- return; -- } -- -- // Create new intent -- Intent intent = new Intent(); -- intent.setAction(ANALYTIC_INTENT); -- -- // add tracking id -- intent.putExtra(TRACKING_ID, context.getPackageName()); -- // append -- intent.putExtra(Fields.EVENT_CATEGORY, event.category); -- if (DEBUG) Log.d(TAG, Fields.EVENT_CATEGORY + "=" + event.category); -- intent.putExtra(Fields.EVENT_ACTION, event.action); -- if (DEBUG) Log.d(TAG, Fields.EVENT_ACTION + "=" + event.action); -- // check if exist -- if (event.label != null) { -- intent.putExtra(Fields.EVENT_LABEL, event.label); -- if (DEBUG) Log.d(TAG, Fields.EVENT_LABEL + "=" + event.label); -- } -- -- if (event.value != null) { -- intent.putExtra(Fields.EVENT_VALUE, event.value); -- if (DEBUG) Log.d(TAG, Fields.EVENT_VALUE + "=" + event.value); -- } -- -- // broadcast for internal package -- context.sendBroadcastAsUser(intent, -- new UserHandle(UserHandle.USER_CURRENT), ANALYTIC_PERMISSION); -- } -- -- private static final class Event { -- private final String category; -- private final String action; -- private final String label; -- private final String value; -- -- public Event(String category, String action, String label, String value) { -- this.action = action; -- this.category = category; -- this.label = label; -- this.value = value; -- } -- } -- -- public static final class Fields { -- public static final String EVENT_CATEGORY = "category"; -- public static final String EVENT_ACTION = "action"; -- public static final String EVENT_LABEL = "label"; -- public static final String EVENT_VALUE = "value"; -- } -- -- public static final class Categories { -- public static final String APP_LAUNCH = "app_launch"; -- public static final String APP_FINISHED = "app_finish"; -- public static final String PAGE_LOAD = "page_load"; -- public static final String EXTERNAL_PAGE_LOAD = "external_page_load"; -- public static final String BUTTON_CLICK = "button_click"; -- public static final String SETTING_CHANGED = "setting_changed"; -- } -- -- public static final class Action { -- public static final String PAGE_LOADED = "page_loaded"; -- public static final String PREVIOUS_BUTTON = "previous_button"; -- public static final String NEXT_BUTTON = "next_button"; -- public static final String CHANGE_LOCALE = "change_local"; -- public static final String EXTERNAL_PAGE_LAUNCH = "external_page_launch"; -- public static final String EXTERNAL_PAGE_RESULT = "external_page_result"; -- public static final String ENABLE_MOBILE_DATA = "enable_mobile_data"; -- public static final String PREFERRED_DATA_SIM = "preferred_data_sim"; -- public static final String APPLY_CUSTOM_THEME = "apply_custom_theme"; -- public static final String USE_SECURE_SMS = "use_secure_sms"; -- public static final String ENABLE_BACKUP = "enable_backup"; -- public static final String ENABLE_NAV_KEYS = "enable_nav_keys"; -- public static final String ENABLE_LOCATION = "enable_location"; -- public static final String ENABLE_NETWORK_LOCATION = "enable_network_location"; -- public static final String ENABLE_GPS_LOCATION = "enable_gps_location"; -- public static final String DATE_CHANGED = "date_changed"; -- public static final String TIME_CHANGED = "time_changed"; -- public static final String TIMEZONE_CHANGED = "timezone_changed"; -- } -- -- public static final class Label { -- public static final String PAGE = "page"; -- public static final String LOCALE = "local"; -- public static final String RESULT = "result"; -- public static final String WIFI_SETUP = "wifi_setup"; -- public static final String BLUETOOTH_SETUP = "bluetooth_setup"; -- public static final String CYANOGEN_ACCOUNT = "cyanogen_account_setup"; -- public static final String CAPTIVE_PORTAL_LOGIN = "captive_portal_login"; -- public static final String EMERGENCY_CALL = "emergency_call"; -- public static final String GMS_ACCOUNT = "gms_account"; -- public static final String RESTORE = "restore"; -- public static final String CHECKED = "checked"; -- public static final String VALUE = "value"; -- public static final String SLOT = "slot"; -- public static final String TOTAL_TIME = "total_time"; -- public static final String FINGERPRINT_SETUP = "fingerprint_setup"; -- } -- --} -diff --git a/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java b/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java -deleted file mode 100644 -index 8be8fad..0000000 ---- a/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java -+++ /dev/null -@@ -1,44 +0,0 @@ -- --/* -- * Copyright (C) 2014 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.cyanogenmod.setupwizard.cmstats; -- --import android.content.Context; --import android.content.pm.ApplicationInfo; --import android.content.pm.PackageInfo; --import android.content.pm.PackageManager; -- --import cyanogenmod.providers.CMSettings; -- --public class StatsUtils { -- private static final String STATS_PACKAGE = "com.cyngn.stats"; -- -- public static boolean isStatsCollectionEnabled(Context context) { -- return CMSettings.Secure.getInt(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, 1) != 0; -- } -- -- public static boolean isStatsPackageInstalled(Context context) { -- try { -- PackageInfo pi = context.getPackageManager().getPackageInfo(STATS_PACKAGE, 0); -- return pi.applicationInfo.enabled -- && ((pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0); -- } catch (PackageManager.NameNotFoundException e) { -- return false; -- } -- } --} -diff --git a/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -index 915abec..8609dbb 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -@@ -28,7 +28,6 @@ - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -91,9 +90,6 @@ public void doLoadAction(FragmentManager fragmentManager, int action) { - @Override - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_BLUETOOTH) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.BLUETOOTH_SETUP, "success"); - getCallbacks().onNextPage(); - } else { - return false; -@@ -111,9 +107,6 @@ private void launchConnectInput() { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.BLUETOOTH_SETUP); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_BLUETOOTH, options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java b/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -index 255cbad..ceffabd 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -@@ -47,7 +47,6 @@ - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -356,13 +355,9 @@ private void setDataSubChecked(SubscriptionInfo subInfoRecord) { - for (int i = 0; i < mCheckBoxes.size(); i++) { - if (subInfoRecord.getSimSlotIndex() == i) { - mCheckBoxes.get(i).setChecked(true); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.PREFERRED_DATA_SIM, -- SetupStats.Label.SLOT, String.valueOf(i + 1)); - } else { - mCheckBoxes.get(i).setChecked(false); - } -- - } - } - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java b/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -index e71dd79..5bfe3b0 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -@@ -32,7 +32,6 @@ - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -95,10 +94,6 @@ public void doLoadAction(FragmentManager fragmentManager, int action) { - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CYANOGEN) { - if (resultCode == Activity.RESULT_OK || resultCode == Activity.RESULT_FIRST_USER) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CYANOGEN_ACCOUNT, -- resultCode == Activity.RESULT_OK ? "success" : "skipped"); - if (SetupWizardUtils.accountExists(mContext, - mContext.getString(R.string.cm_account_type))) { - if (SetupWizardUtils.isDeviceLocked()) { -@@ -108,9 +103,6 @@ public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - } - getCallbacks().onNextPage(); - } else if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CYANOGEN_ACCOUNT, "canceled"); - getCallbacks().onPreviousPage(); - } - } -@@ -136,11 +128,6 @@ public void run(AccountManagerFuture future) { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats -- .addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, -- SetupStats.Label.CYANOGEN_ACCOUNT); - mFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_CYANOGEN, - options.toBundle()); -diff --git a/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java b/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -index 6184055..41ddd2f 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -@@ -48,7 +48,6 @@ - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.ui.WebViewDialogFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -65,12 +64,10 @@ - - public static final String TAG = "CyanogenSettingsPage"; - -- public static final String KEY_SEND_METRICS = "send_metrics"; - public static final String KEY_REGISTER_WHISPERPUSH = "register"; - public static final String KEY_ENABLE_NAV_KEYS = "enable_nav_keys"; - public static final String KEY_APPLY_DEFAULT_THEME = "apply_default_theme"; - -- public static final String SETTING_METRICS = "settings.cyanogen.allow_metrics"; - public static final String PRIVACY_POLICY_URI = "https://cyngn.com/oobe-legal?hideHeader=1"; - - private static final String WHISPERPUSH_PACKAGE = "org.whispersystems.whisperpush"; -@@ -140,16 +137,11 @@ public void onFinishSetup() { - @Override - public void run() { - if (getData().containsKey(KEY_ENABLE_NAV_KEYS)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_NAV_KEYS, -- SetupStats.Label.CHECKED, -- String.valueOf(getData().getBoolean(KEY_ENABLE_NAV_KEYS))); - writeDisableNavkeysOption(mContext, getData().getBoolean(KEY_ENABLE_NAV_KEYS)); - } - } - }); - handleWhisperPushRegistration(); -- handleEnableMetrics(); - handleDefaultThemeSetup(); - } - -@@ -158,33 +150,15 @@ private void handleWhisperPushRegistration() { - if (privacyData != null && - privacyData.containsKey(KEY_REGISTER_WHISPERPUSH) && - privacyData.getBoolean(KEY_REGISTER_WHISPERPUSH)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.USE_SECURE_SMS, -- SetupStats.Label.CHECKED, -- String.valueOf(privacyData.getBoolean(KEY_REGISTER_WHISPERPUSH))); - Log.i(TAG, "Registering with WhisperPush"); - WhisperPushUtils.startRegistration(mContext); - } - } - -- private void handleEnableMetrics() { -- Bundle privacyData = getData(); -- if (privacyData != null -- && privacyData.containsKey(KEY_SEND_METRICS)) { -- CMSettings.Secure.putInt(mContext.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, privacyData.getBoolean(KEY_SEND_METRICS) -- ? 1 : 0); -- } -- } -- - private void handleDefaultThemeSetup() { - /*Bundle privacyData = getData(); - if (!ThemeUtils.getDefaultThemePackageName(mContext).equals(ThemeConfig.SYSTEM_DEFAULT) && - privacyData != null && privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.APPLY_CUSTOM_THEME, -- SetupStats.Label.CHECKED, -- String.valueOf(privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME))); - Log.i(TAG, "Applying default theme"); - final ThemeManager tm = (ThemeManager) mContext.getSystemService(Context.THEME_SERVICE); - tm.applyDefaultTheme(); -@@ -230,11 +204,9 @@ private static boolean hideWhisperPush(Context context) { - private View mKillSwitchView; - private TextView mKillSwitchTitle; - private ImageView mKillSwitchStatus; -- private View mMetricsRow; - private View mDefaultThemeRow; - private View mNavKeysRow; - private View mSecureSmsRow; -- private CheckBox mMetrics; - private CheckBox mDefaultTheme; - private CheckBox mNavKeys; - private CheckBox mSecureSms; -@@ -244,15 +216,6 @@ private static boolean hideWhisperPush(Context context) { - private boolean mHideSmsRow = false; - - -- private View.OnClickListener mMetricsClickListener = new View.OnClickListener() { -- @Override -- public void onClick(View view) { -- boolean checked = !mMetrics.isChecked(); -- mMetrics.setChecked(checked); -- mPage.getData().putBoolean(KEY_SEND_METRICS, checked); -- } -- }; -- - private View.OnClickListener mDefaultThemeClickListener = new View.OnClickListener() { - @Override - public void onClick(View view) { -@@ -319,19 +282,6 @@ public void onClick(View textView) { - } - } - -- mMetricsRow = mRootView.findViewById(R.id.metrics); -- mMetricsRow.setOnClickListener(mMetricsClickListener); -- String metricsHelpImproveCM = -- getString(R.string.services_help_improve_cm, getString(R.string.os_name)); -- String metricsSummary = getString(R.string.services_metrics_label, -- metricsHelpImproveCM, getString(R.string.os_name)); -- final SpannableStringBuilder metricsSpan = new SpannableStringBuilder(metricsSummary); -- metricsSpan.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), -- 0, metricsHelpImproveCM.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); -- TextView metrics = (TextView) mRootView.findViewById(R.id.enable_metrics_summary); -- metrics.setText(metricsSpan); -- mMetrics = (CheckBox) mRootView.findViewById(R.id.enable_metrics_checkbox); -- - mDefaultThemeRow = mRootView.findViewById(R.id.theme); - mHideThemeRow = true; // hideThemeSwitch(getActivity()); - if (mHideThemeRow) { -@@ -397,20 +347,10 @@ protected int getLayoutResource() { - public void onResume() { - super.onResume(); - /*updateDisableNavkeysOption();*/ -- updateMetricsOption(); - updateThemeOption(); - updateSmsOption(); - } - -- private void updateMetricsOption() { -- final Bundle myPageBundle = mPage.getData(); -- boolean metricsChecked = -- !myPageBundle.containsKey(KEY_SEND_METRICS) || myPageBundle -- .getBoolean(KEY_SEND_METRICS); -- mMetrics.setChecked(metricsChecked); -- myPageBundle.putBoolean(KEY_SEND_METRICS, metricsChecked); -- } -- - private void updateThemeOption() { - if (!mHideThemeRow) { - final Bundle myPageBundle = mPage.getData(); -diff --git a/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java b/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -index 15cfdca..0e04fd9 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -@@ -42,7 +42,6 @@ - import android.widget.TimePicker; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - - import org.xmlpull.v1.XmlPullParserException; -@@ -136,8 +135,6 @@ protected void initializePage() { - mDateView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "date_picker"); - showDatePicker(); - } - }); -@@ -145,8 +142,6 @@ public void onClick(View view) { - mTimeView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "time_picker"); - showTimePicker(); - } - }); -@@ -167,17 +162,11 @@ public void onItemSelected(AdapterView adapterView, View view, int position, - final Map map = (Map) adapterView.getItemAtPosition(position); - final String tzId = (String) map.get(KEY_ID); - if (mCurrentTimeZone != null && !mCurrentTimeZone.getID().equals(tzId)) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "timezone_picker"); - // Update the system timezone value - final Activity activity = getActivity(); - final AlarmManager alarm = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE); - alarm.setTimeZone(tzId); - mCurrentTimeZone = TimeZone.getTimeZone(tzId); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.TIMEZONE_CHANGED, -- SetupStats.Label.VALUE, -- mCurrentTimeZone.getDisplayName()); - } - - } -@@ -220,10 +209,6 @@ public void onDateSet(DatePicker view, int year, int month, int day) { - if (activity != null) { - setDate(activity, year, month, day); - updateTimeAndDateDisplay(activity); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.DATE_CHANGED, -- SetupStats.Label.VALUE, -- month+"/"+day+"/"+year); - } - } - -@@ -233,10 +218,6 @@ public void onTimeSet(TimePicker view, int hourOfDay, int minute) { - if (activity != null) { - setTime(activity, hourOfDay, minute); - updateTimeAndDateDisplay(activity); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.TIME_CHANGED, -- SetupStats.Label.VALUE, -- hourOfDay+":"+minute); - } - } - -diff --git a/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -index 890a4f6..c9174c6 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -@@ -28,7 +28,6 @@ - import com.android.internal.widget.LockPatternUtils; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - - public class FingerprintSetupPage extends SetupPage { -@@ -113,9 +112,6 @@ private void launchFingerprintSetup() { - ActivityOptions.makeCustomAnimation(getActivity(), - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.FINGERPRINT_SETUP); - startActivityForResult(intent, SetupWizardApp.REQUEST_CODE_SETUP_FINGERPRINT, - options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -index 34a344c..b4fd658 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -@@ -37,7 +37,6 @@ - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -123,9 +122,6 @@ public void doLoadAction(FragmentManager fragmentManager, int action) { - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS) { - if (!mBackupEnabled && SetupWizardUtils.isOwner() && resultCode == Activity.RESULT_OK) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.GMS_ACCOUNT, "success"); - launchGmsRestorePage(); - } else { - handleResult(requestCode, resultCode); -@@ -150,24 +146,12 @@ public void onFinishSetup() { - - private void handleResult(int requestCode, int resultCode) { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "canceled"); - getCallbacks().onPreviousPage(); - } else { - if (resultCode == Activity.RESULT_OK) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "success"); - getCallbacks().onNextPage(); - } else { - if (canSkip()) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "skipped"); - getCallbacks().onNextPage(); - } else { - getCallbacks().onPreviousPage(); -@@ -195,9 +179,6 @@ private void launchGmsRestorePage() { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.RESTORE); - mFragment.startActivityForResult( - intent, - SetupWizardApp.REQUEST_CODE_RESTORE_GMS, options.toBundle()); -@@ -238,9 +219,6 @@ public void run(AccountManagerFuture future) { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.GMS_ACCOUNT); - mFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_GMS, options.toBundle()); - } catch (OperationCanceledException e) { -diff --git a/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java b/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -index caffc41..a472ca6 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -@@ -37,7 +37,6 @@ - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -124,9 +123,6 @@ public void onClick(View view) { - boolean checked = !mEnableMobileData.isChecked(); - SetupWizardUtils.setMobileDataEnabled(getActivity(), checked); - mEnableMobileData.setChecked(checked); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_MOBILE_DATA, -- SetupStats.Label.CHECKED, String.valueOf(checked)); - } - }; - -diff --git a/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java b/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -index 0ed17ff..e5da518 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -@@ -40,7 +40,6 @@ - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -233,9 +232,6 @@ private void updateBackupToggle() { - private void onToggleBackup(boolean checked) { - try { - mBackupManager.setBackupEnabled(checked); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_BACKUP, -- SetupStats.Label.CHECKED, String.valueOf(checked)); - } catch (RemoteException e) {} - updateBackupToggle(); - } -@@ -309,10 +305,6 @@ private void updateLocationToggles(int mode) { - } - - private void onToggleLocationAccess(boolean checked) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); -- - if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_SENSORS_ONLY); - } else { -@@ -321,10 +313,6 @@ private void onToggleLocationAccess(boolean checked) { - } - - private void onToggleBatterySaving(boolean checked) { -- /* SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_BATTERY_SAVING_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); */ -- - if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_BATTERY_SAVING); - } else { -@@ -333,10 +321,6 @@ private void onToggleBatterySaving(boolean checked) { - } - - private void onToggleNetwork(boolean checked) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_NETWORK_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); -- - if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY); - } else { -diff --git a/src/com/cyanogenmod/setupwizard/setup/SetupPage.java b/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -index 1a19fb0..9804049 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -@@ -26,7 +26,6 @@ - import android.view.Gravity; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - - - public abstract class SetupPage implements Page { -@@ -76,18 +75,12 @@ public void onFinishSetup() {} - public void doLoadAction(FragmentManager fragmentManager, int action) { - Fragment fragment = getFragment(fragmentManager, action); - if (action == Page.ACTION_NEXT) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- SetupStats.Action.NEXT_BUTTON, getKey(), -- String.valueOf(System.currentTimeMillis())); - Transition t = new Slide(Gravity.RIGHT); - fragment.setEnterTransition(t); - fragmentManager.beginTransaction() - .replace(R.id.content,fragment, getKey()) - .commit(); - } else { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- SetupStats.Action.PREVIOUS_BUTTON, getKey(), -- String.valueOf(System.currentTimeMillis())); - Transition t = new Slide(Gravity.LEFT); - fragment.setEnterTransition(t); - fragmentManager.beginTransaction() -diff --git a/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java b/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -index b925b32..807fb15 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -@@ -36,7 +36,6 @@ - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LocalePicker; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -92,10 +91,6 @@ public boolean doPreviousAction() { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, SetupStats.Label.EMERGENCY_CALL); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.EMERGENCY_CALL); - mContext.startActivity(intent, options.toBundle()); - return true; - } -@@ -234,9 +229,6 @@ private void onLocaleChanged(Locale paramLocale) { - localResources.updateConfiguration(localConfiguration1, null); - mHandler.removeCallbacks(mUpdateLocale); - mCurrentLocale = paramLocale; -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.CHANGE_LOCALE, SetupStats.Label.LOCALE, -- mCurrentLocale.getDisplayName()); - mHandler.postDelayed(mUpdateLocale, 1000); - } - -diff --git a/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -index 56beddf..5ebe5c8 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -@@ -31,7 +31,6 @@ - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -83,9 +82,6 @@ public void run() { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.CAPTIVE_PORTAL_LOGIN); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL, - options.toBundle()); -@@ -154,19 +150,10 @@ public void doLoadAction(FragmentManager fragmentManager, int action) { - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_WIFI) { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "canceled"); -- getCallbacks().onPreviousPage(); -+ getCallbacks().onPreviousPage(); - } else if (resultCode == Activity.RESULT_OK) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "success"); - checkForCaptivePortal(); - } else { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "skipped"); - getCallbacks().onNextPage(); - } - } else if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL) { -@@ -176,20 +163,11 @@ public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - } - String token = data.getStringExtra("response_token"); - if (token != null && !token.equals(mResponseToken)) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "token_mismatch"); - launchWifiSetup(); - } else { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "canceled"); - launchWifiSetup(); - } else { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "success"); - getCallbacks().onNextPage(); - } - } -@@ -253,9 +231,6 @@ private void launchWifiSetup() { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.WIFI_SETUP); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_WIFI, options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java b/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -index b0df440..33c61c7 100644 ---- a/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -+++ b/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -@@ -26,7 +26,6 @@ - import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.setup.Page; - import com.cyanogenmod.setupwizard.setup.SetupDataCallbacks; - -@@ -43,8 +42,6 @@ - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setRetainInstance(true); -- SetupStats.addEvent(SetupStats.Categories.PAGE_LOAD, SetupStats.Action.PAGE_LOADED, -- mKey, String.valueOf(System.currentTimeMillis())); - } - - @Override -diff --git a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -index 77efb96..3eb445a 100644 ---- a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -+++ b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -@@ -41,7 +41,6 @@ - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.setup.CMSetupWizardData; - import com.cyanogenmod.setupwizard.setup.Page; - import com.cyanogenmod.setupwizard.setup.SetupDataCallbacks; -@@ -76,8 +75,6 @@ - - private volatile boolean mIsFinishing = false; - -- private static long sLaunchTime = 0; -- - private final ArrayList mFinishRunnables = new ArrayList(); - - public void onCreate(Bundle savedInstanceState) { -@@ -94,10 +91,6 @@ public void onSystemUiVisibilityChange(int visibility) { - } - } - }); -- if (sLaunchTime == 0) { -- SetupStats.addEvent(SetupStats.Categories.APP_LAUNCH, TAG); -- sLaunchTime = System.nanoTime(); -- } - setContentView(R.layout.setup_main); - mRootView = findViewById(R.id.root); - mRootView.setSystemUiVisibility(UI_FLAGS); -@@ -332,9 +325,6 @@ public void onProgress(int progress) { - @Override - public void finishSetup() { - if (!mIsFinishing) { -- SetupStats.addEvent(SetupStats.Categories.APP_FINISHED, TAG, -- SetupStats.Label.TOTAL_TIME, String.valueOf( -- System.nanoTime() - sLaunchTime)); - final SetupWizardApp setupWizardApp = (SetupWizardApp)getApplication(); - setupWizardApp.sendStickyBroadcastAsUser( - new Intent(SetupWizardApp.ACTION_FINISHED), -@@ -423,7 +413,6 @@ public void run() { - /*final ThemeManager tm = - (ThemeManager) SetupWizardActivity.this.getSystemService(THEME_SERVICE); - tm.removeClient(SetupWizardActivity.this);*/ -- SetupStats.sendEvents(SetupWizardActivity.this); - SetupWizardUtils.disableGMSSetupWizard(SetupWizardActivity.this); - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.addCategory(Intent.CATEGORY_HOME); -diff --git a/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java b/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -index 440129b..47d6de5 100644 ---- a/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -+++ b/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -@@ -39,7 +39,6 @@ - import android.view.accessibility.IAccessibilityManager; - - import com.android.internal.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - - import java.util.ArrayList; - import java.util.Iterator; -@@ -284,8 +283,6 @@ private void enableAccessibility() { - // Turn on accessibility mode last. - Settings.Secure.putIntForUser(resolver, Settings.Secure.ACCESSIBILITY_ENABLED, - 1, userId); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- "accessibility_enabled"); - } else if (keyguardLocked) { - try { - mAccessibilityManager.temporaryEnableAccessibilityStateUntilKeyguardRemoved( diff --git a/Patches/Copperhead-13.0/android_packages_apps_SetupWizard/1.patch b/Patches/Copperhead-13.0/android_packages_apps_SetupWizard/1.patch deleted file mode 100644 index d2b338e6..00000000 --- a/Patches/Copperhead-13.0/android_packages_apps_SetupWizard/1.patch +++ /dev/null @@ -1,1016 +0,0 @@ -From 0cf457b9be7e1bc6841b48c67f707e3522d10e18 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Mon, 6 Apr 2015 00:05:13 -0400 -Subject: [PATCH] remove analytics support - ---- - AndroidManifest.xml | 1 - - res/layout/setup_cyanogen_services.xml | 36 ----- - .../setupwizard/cmstats/SetupStats.java | 162 --------------------- - .../setupwizard/cmstats/StatsUtils.java | 44 ------ - .../setupwizard/setup/BluetoothSetupPage.java | 7 - - .../setupwizard/setup/ChooseDataSimPage.java | 5 - - .../setupwizard/setup/CyanogenServicesPage.java | 13 -- - .../setupwizard/setup/CyanogenSettingsPage.java | 56 ------- - .../setupwizard/setup/DateTimePage.java | 19 --- - .../setupwizard/setup/FingerprintSetupPage.java | 4 - - .../setupwizard/setup/GmsAccountPage.java | 22 --- - .../setupwizard/setup/MobileDataPage.java | 4 - - .../setupwizard/setup/OtherSettingsPage.java | 16 -- - .../cyanogenmod/setupwizard/setup/SetupPage.java | 7 - - .../cyanogenmod/setupwizard/setup/WelcomePage.java | 14 -- - .../setupwizard/setup/WifiSetupPage.java | 27 +--- - .../setupwizard/ui/SetupPageFragment.java | 3 - - .../setupwizard/ui/SetupWizardActivity.java | 11 -- - .../util/EnableAccessibilityController.java | 3 - - 19 files changed, 1 insertion(+), 453 deletions(-) - delete mode 100644 src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java - delete mode 100644 src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java - -diff --git a/AndroidManifest.xml b/AndroidManifest.xml -index 6717cb5..d576e44 100644 ---- a/AndroidManifest.xml -+++ b/AndroidManifest.xml -@@ -43,7 +43,6 @@ - - - -- - - - -diff --git a/res/layout/setup_cyanogen_services.xml b/res/layout/setup_cyanogen_services.xml -index 3ab26c7..128500f 100644 ---- a/res/layout/setup_cyanogen_services.xml -+++ b/res/layout/setup_cyanogen_services.xml -@@ -102,42 +102,6 @@ - - - -- -- -- -- -- -- -- -- -- -- - - mEvents = new LinkedList(); -- -- private static final SetupStats sInstance = new SetupStats(); -- -- private static final boolean DEBUG = false; -- -- private SetupStats() {} -- -- public static void addEvent(String category, String action, -- String label, String value) { -- sInstance.mEvents.add(new Event(category, action, label, value)); -- } -- -- public static void addEvent(String category, String action) { -- sInstance.mEvents.add(new Event(category, action, null, null)); -- } -- -- public static void sendEvents(Context context) { -- while (!sInstance.mEvents.isEmpty()) { -- sInstance.sendEvent(context, sInstance.mEvents.remove()); -- } -- } -- -- private void sendEvent(Context context, Event event) { -- -- if (!StatsUtils.isStatsPackageInstalled(context) -- || !StatsUtils.isStatsCollectionEnabled(context)) { -- return; -- } -- -- // Create new intent -- Intent intent = new Intent(); -- intent.setAction(ANALYTIC_INTENT); -- -- // add tracking id -- intent.putExtra(TRACKING_ID, context.getPackageName()); -- // append -- intent.putExtra(Fields.EVENT_CATEGORY, event.category); -- if (DEBUG) Log.d(TAG, Fields.EVENT_CATEGORY + "=" + event.category); -- intent.putExtra(Fields.EVENT_ACTION, event.action); -- if (DEBUG) Log.d(TAG, Fields.EVENT_ACTION + "=" + event.action); -- // check if exist -- if (event.label != null) { -- intent.putExtra(Fields.EVENT_LABEL, event.label); -- if (DEBUG) Log.d(TAG, Fields.EVENT_LABEL + "=" + event.label); -- } -- -- if (event.value != null) { -- intent.putExtra(Fields.EVENT_VALUE, event.value); -- if (DEBUG) Log.d(TAG, Fields.EVENT_VALUE + "=" + event.value); -- } -- -- // broadcast for internal package -- context.sendBroadcastAsUser(intent, -- new UserHandle(UserHandle.USER_CURRENT), ANALYTIC_PERMISSION); -- } -- -- private static final class Event { -- private final String category; -- private final String action; -- private final String label; -- private final String value; -- -- public Event(String category, String action, String label, String value) { -- this.action = action; -- this.category = category; -- this.label = label; -- this.value = value; -- } -- } -- -- public static final class Fields { -- public static final String EVENT_CATEGORY = "category"; -- public static final String EVENT_ACTION = "action"; -- public static final String EVENT_LABEL = "label"; -- public static final String EVENT_VALUE = "value"; -- } -- -- public static final class Categories { -- public static final String APP_LAUNCH = "app_launch"; -- public static final String APP_FINISHED = "app_finish"; -- public static final String PAGE_LOAD = "page_load"; -- public static final String EXTERNAL_PAGE_LOAD = "external_page_load"; -- public static final String BUTTON_CLICK = "button_click"; -- public static final String SETTING_CHANGED = "setting_changed"; -- } -- -- public static final class Action { -- public static final String PAGE_LOADED = "page_loaded"; -- public static final String PREVIOUS_BUTTON = "previous_button"; -- public static final String NEXT_BUTTON = "next_button"; -- public static final String CHANGE_LOCALE = "change_local"; -- public static final String EXTERNAL_PAGE_LAUNCH = "external_page_launch"; -- public static final String EXTERNAL_PAGE_RESULT = "external_page_result"; -- public static final String ENABLE_MOBILE_DATA = "enable_mobile_data"; -- public static final String PREFERRED_DATA_SIM = "preferred_data_sim"; -- public static final String APPLY_CUSTOM_THEME = "apply_custom_theme"; -- public static final String USE_SECURE_SMS = "use_secure_sms"; -- public static final String ENABLE_BACKUP = "enable_backup"; -- public static final String ENABLE_NAV_KEYS = "enable_nav_keys"; -- public static final String ENABLE_LOCATION = "enable_location"; -- public static final String ENABLE_NETWORK_LOCATION = "enable_network_location"; -- public static final String ENABLE_GPS_LOCATION = "enable_gps_location"; -- public static final String DATE_CHANGED = "date_changed"; -- public static final String TIME_CHANGED = "time_changed"; -- public static final String TIMEZONE_CHANGED = "timezone_changed"; -- } -- -- public static final class Label { -- public static final String PAGE = "page"; -- public static final String LOCALE = "local"; -- public static final String RESULT = "result"; -- public static final String WIFI_SETUP = "wifi_setup"; -- public static final String BLUETOOTH_SETUP = "bluetooth_setup"; -- public static final String CYANOGEN_ACCOUNT = "cyanogen_account_setup"; -- public static final String CAPTIVE_PORTAL_LOGIN = "captive_portal_login"; -- public static final String EMERGENCY_CALL = "emergency_call"; -- public static final String GMS_ACCOUNT = "gms_account"; -- public static final String RESTORE = "restore"; -- public static final String CHECKED = "checked"; -- public static final String VALUE = "value"; -- public static final String SLOT = "slot"; -- public static final String TOTAL_TIME = "total_time"; -- public static final String FINGERPRINT_SETUP = "fingerprint_setup"; -- } -- --} -diff --git a/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java b/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java -deleted file mode 100644 -index 8be8fad..0000000 ---- a/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java -+++ /dev/null -@@ -1,44 +0,0 @@ -- --/* -- * Copyright (C) 2014 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.cyanogenmod.setupwizard.cmstats; -- --import android.content.Context; --import android.content.pm.ApplicationInfo; --import android.content.pm.PackageInfo; --import android.content.pm.PackageManager; -- --import cyanogenmod.providers.CMSettings; -- --public class StatsUtils { -- private static final String STATS_PACKAGE = "com.cyngn.stats"; -- -- public static boolean isStatsCollectionEnabled(Context context) { -- return CMSettings.Secure.getInt(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, 1) != 0; -- } -- -- public static boolean isStatsPackageInstalled(Context context) { -- try { -- PackageInfo pi = context.getPackageManager().getPackageInfo(STATS_PACKAGE, 0); -- return pi.applicationInfo.enabled -- && ((pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0); -- } catch (PackageManager.NameNotFoundException e) { -- return false; -- } -- } --} -diff --git a/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -index 915abec..8609dbb 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -@@ -28,7 +28,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -91,9 +90,6 @@ public class BluetoothSetupPage extends SetupPage { - @Override - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_BLUETOOTH) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.BLUETOOTH_SETUP, "success"); - getCallbacks().onNextPage(); - } else { - return false; -@@ -111,9 +107,6 @@ public class BluetoothSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.BLUETOOTH_SETUP); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_BLUETOOTH, options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java b/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -index 255cbad..ceffabd 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -@@ -47,7 +47,6 @@ import com.android.internal.telephony.TelephonyIntents; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -356,13 +355,9 @@ public class ChooseDataSimPage extends SetupPage { - for (int i = 0; i < mCheckBoxes.size(); i++) { - if (subInfoRecord.getSimSlotIndex() == i) { - mCheckBoxes.get(i).setChecked(true); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.PREFERRED_DATA_SIM, -- SetupStats.Label.SLOT, String.valueOf(i + 1)); - } else { - mCheckBoxes.get(i).setChecked(false); - } -- - } - } - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java b/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -index e71dd79..5bfe3b0 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -@@ -32,7 +32,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -95,10 +94,6 @@ public class CyanogenServicesPage extends SetupPage { - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CYANOGEN) { - if (resultCode == Activity.RESULT_OK || resultCode == Activity.RESULT_FIRST_USER) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CYANOGEN_ACCOUNT, -- resultCode == Activity.RESULT_OK ? "success" : "skipped"); - if (SetupWizardUtils.accountExists(mContext, - mContext.getString(R.string.cm_account_type))) { - if (SetupWizardUtils.isDeviceLocked()) { -@@ -108,9 +103,6 @@ public class CyanogenServicesPage extends SetupPage { - } - getCallbacks().onNextPage(); - } else if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CYANOGEN_ACCOUNT, "canceled"); - getCallbacks().onPreviousPage(); - } - } -@@ -136,11 +128,6 @@ public class CyanogenServicesPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats -- .addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, -- SetupStats.Label.CYANOGEN_ACCOUNT); - mFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_CYANOGEN, - options.toBundle()); -diff --git a/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java b/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -index 4827090..697896d 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -@@ -43,7 +43,6 @@ import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -54,7 +53,6 @@ public class CyanogenSettingsPage extends SetupPage { - - public static final String TAG = "CyanogenSettingsPage"; - -- public static final String KEY_SEND_METRICS = "send_metrics"; - public static final String DISABLE_NAV_KEYS = "disable_nav_keys"; - public static final String KEY_APPLY_DEFAULT_THEME = "apply_default_theme"; - public static final String KEY_BUTTON_BACKLIGHT = "pre_navbar_button_backlight"; -@@ -116,37 +114,18 @@ public class CyanogenSettingsPage extends SetupPage { - @Override - public void run() { - if (getData().containsKey(DISABLE_NAV_KEYS)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_NAV_KEYS, -- SetupStats.Label.CHECKED, -- String.valueOf(getData().getBoolean(DISABLE_NAV_KEYS))); - writeDisableNavkeysOption(mContext, getData().getBoolean(DISABLE_NAV_KEYS)); - } - } - }); -- handleEnableMetrics(); - handleDefaultThemeSetup(); - } - -- private void handleEnableMetrics() { -- Bundle privacyData = getData(); -- if (privacyData != null -- && privacyData.containsKey(KEY_SEND_METRICS)) { -- CMSettings.Secure.putInt(mContext.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, privacyData.getBoolean(KEY_SEND_METRICS) -- ? 1 : 0); -- } -- } -- - private void handleDefaultThemeSetup() { - Bundle privacyData = getData(); - if (!SetupWizardUtils.getDefaultThemePackageName(mContext).equals( - ThemeConfig.SYSTEM_DEFAULT) && privacyData != null && - privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.APPLY_CUSTOM_THEME, -- SetupStats.Label.CHECKED, -- String.valueOf(privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME))); - Log.i(TAG, "Applying default theme"); - final ThemeManager tm = (ThemeManager) mContext.getSystemService(Context.THEME_SERVICE); - tm.applyDefaultTheme(); -@@ -176,26 +155,14 @@ public class CyanogenSettingsPage extends SetupPage { - private View mKillSwitchView; - private TextView mKillSwitchTitle; - private ImageView mKillSwitchStatus; -- private View mMetricsRow; - private View mDefaultThemeRow; - private View mNavKeysRow; -- private CheckBox mMetrics; - private CheckBox mDefaultTheme; - private CheckBox mNavKeys; - - private boolean mHideNavKeysRow = false; - private boolean mHideThemeRow = false; - -- -- private View.OnClickListener mMetricsClickListener = new View.OnClickListener() { -- @Override -- public void onClick(View view) { -- boolean checked = !mMetrics.isChecked(); -- mMetrics.setChecked(checked); -- mPage.getData().putBoolean(KEY_SEND_METRICS, checked); -- } -- }; -- - private View.OnClickListener mDefaultThemeClickListener = new View.OnClickListener() { - @Override - public void onClick(View view) { -@@ -253,19 +220,6 @@ public class CyanogenSettingsPage extends SetupPage { - } - } - -- mMetricsRow = mRootView.findViewById(R.id.metrics); -- mMetricsRow.setOnClickListener(mMetricsClickListener); -- String metricsHelpImproveCM = -- getString(R.string.services_help_improve_cm, getString(R.string.os_name)); -- String metricsSummary = getString(R.string.services_metrics_label, -- metricsHelpImproveCM, getString(R.string.os_name)); -- final SpannableStringBuilder metricsSpan = new SpannableStringBuilder(metricsSummary); -- metricsSpan.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), -- 0, metricsHelpImproveCM.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); -- TextView metrics = (TextView) mRootView.findViewById(R.id.enable_metrics_summary); -- metrics.setText(metricsSpan); -- mMetrics = (CheckBox) mRootView.findViewById(R.id.enable_metrics_checkbox); -- - mDefaultThemeRow = mRootView.findViewById(R.id.theme); - mHideThemeRow = hideThemeSwitch(getActivity()); - if (mHideThemeRow) { -@@ -314,19 +268,9 @@ public class CyanogenSettingsPage extends SetupPage { - public void onResume() { - super.onResume(); - updateDisableNavkeysOption(); -- updateMetricsOption(); - updateThemeOption(); - } - -- private void updateMetricsOption() { -- final Bundle myPageBundle = mPage.getData(); -- boolean metricsChecked = -- !myPageBundle.containsKey(KEY_SEND_METRICS) || myPageBundle -- .getBoolean(KEY_SEND_METRICS); -- mMetrics.setChecked(metricsChecked); -- myPageBundle.putBoolean(KEY_SEND_METRICS, metricsChecked); -- } -- - private void updateThemeOption() { - if (!mHideThemeRow) { - final Bundle myPageBundle = mPage.getData(); -diff --git a/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java b/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -index 7a5922b..a669163 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -@@ -42,7 +42,6 @@ import android.widget.TextView; - import android.widget.TimePicker; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - - import org.xmlpull.v1.XmlPullParserException; -@@ -136,8 +135,6 @@ public class DateTimePage extends SetupPage { - mDateView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "date_picker"); - showDatePicker(); - } - }); -@@ -145,8 +142,6 @@ public class DateTimePage extends SetupPage { - mTimeView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "time_picker"); - showTimePicker(); - } - }); -@@ -167,17 +162,11 @@ public class DateTimePage extends SetupPage { - final Map map = (Map) adapterView.getItemAtPosition(position); - final String tzId = (String) map.get(KEY_ID); - if (mCurrentTimeZone != null && !mCurrentTimeZone.getID().equals(tzId)) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "timezone_picker"); - // Update the system timezone value - final Activity activity = getActivity(); - final AlarmManager alarm = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE); - alarm.setTimeZone(tzId); - mCurrentTimeZone = TimeZone.getTimeZone(tzId); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.TIMEZONE_CHANGED, -- SetupStats.Label.VALUE, -- mCurrentTimeZone.getDisplayName()); - } - - } -@@ -232,10 +221,6 @@ public class DateTimePage extends SetupPage { - if (activity != null) { - setDate(activity, year, month, day); - updateTimeAndDateDisplay(activity); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.DATE_CHANGED, -- SetupStats.Label.VALUE, -- month+"/"+day+"/"+year); - } - } - -@@ -245,10 +230,6 @@ public class DateTimePage extends SetupPage { - if (activity != null) { - setTime(activity, hourOfDay, minute); - updateTimeAndDateDisplay(activity); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.TIME_CHANGED, -- SetupStats.Label.VALUE, -- hourOfDay+":"+minute); - } - } - -diff --git a/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -index 890a4f6..c9174c6 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -@@ -28,7 +28,6 @@ import android.widget.TextView; - import com.android.internal.widget.LockPatternUtils; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - - public class FingerprintSetupPage extends SetupPage { -@@ -113,9 +112,6 @@ public class FingerprintSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(getActivity(), - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.FINGERPRINT_SETUP); - startActivityForResult(intent, SetupWizardApp.REQUEST_CODE_SETUP_FINGERPRINT, - options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -index 34a344c..b4fd658 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -@@ -37,7 +37,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -123,9 +122,6 @@ public class GmsAccountPage extends SetupPage { - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS) { - if (!mBackupEnabled && SetupWizardUtils.isOwner() && resultCode == Activity.RESULT_OK) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.GMS_ACCOUNT, "success"); - launchGmsRestorePage(); - } else { - handleResult(requestCode, resultCode); -@@ -150,24 +146,12 @@ public class GmsAccountPage extends SetupPage { - - private void handleResult(int requestCode, int resultCode) { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "canceled"); - getCallbacks().onPreviousPage(); - } else { - if (resultCode == Activity.RESULT_OK) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "success"); - getCallbacks().onNextPage(); - } else { - if (canSkip()) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "skipped"); - getCallbacks().onNextPage(); - } else { - getCallbacks().onPreviousPage(); -@@ -195,9 +179,6 @@ public class GmsAccountPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.RESTORE); - mFragment.startActivityForResult( - intent, - SetupWizardApp.REQUEST_CODE_RESTORE_GMS, options.toBundle()); -@@ -238,9 +219,6 @@ public class GmsAccountPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.GMS_ACCOUNT); - mFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_GMS, options.toBundle()); - } catch (OperationCanceledException e) { -diff --git a/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java b/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -index caffc41..a472ca6 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -@@ -37,7 +37,6 @@ import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -124,9 +123,6 @@ public class MobileDataPage extends SetupPage { - boolean checked = !mEnableMobileData.isChecked(); - SetupWizardUtils.setMobileDataEnabled(getActivity(), checked); - mEnableMobileData.setChecked(checked); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_MOBILE_DATA, -- SetupStats.Label.CHECKED, String.valueOf(checked)); - } - }; - -diff --git a/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java b/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -index 0ed17ff..e5da518 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -@@ -40,7 +40,6 @@ import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -233,9 +232,6 @@ public class OtherSettingsPage extends SetupPage { - private void onToggleBackup(boolean checked) { - try { - mBackupManager.setBackupEnabled(checked); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_BACKUP, -- SetupStats.Label.CHECKED, String.valueOf(checked)); - } catch (RemoteException e) {} - updateBackupToggle(); - } -@@ -309,10 +305,6 @@ public class OtherSettingsPage extends SetupPage { - } - - private void onToggleLocationAccess(boolean checked) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); -- - if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_SENSORS_ONLY); - } else { -@@ -321,10 +313,6 @@ public class OtherSettingsPage extends SetupPage { - } - - private void onToggleBatterySaving(boolean checked) { -- /* SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_BATTERY_SAVING_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); */ -- - if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_BATTERY_SAVING); - } else { -@@ -333,10 +321,6 @@ public class OtherSettingsPage extends SetupPage { - } - - private void onToggleNetwork(boolean checked) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_NETWORK_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); -- - if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY); - } else { -diff --git a/src/com/cyanogenmod/setupwizard/setup/SetupPage.java b/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -index 1a19fb0..9804049 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -@@ -26,7 +26,6 @@ import android.transition.Transition; - import android.view.Gravity; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - - - public abstract class SetupPage implements Page { -@@ -76,18 +75,12 @@ public abstract class SetupPage implements Page { - public void doLoadAction(FragmentManager fragmentManager, int action) { - Fragment fragment = getFragment(fragmentManager, action); - if (action == Page.ACTION_NEXT) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- SetupStats.Action.NEXT_BUTTON, getKey(), -- String.valueOf(System.currentTimeMillis())); - Transition t = new Slide(Gravity.RIGHT); - fragment.setEnterTransition(t); - fragmentManager.beginTransaction() - .replace(R.id.content,fragment, getKey()) - .commit(); - } else { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- SetupStats.Action.PREVIOUS_BUTTON, getKey(), -- String.valueOf(System.currentTimeMillis())); - Transition t = new Slide(Gravity.LEFT); - fragment.setEnterTransition(t); - fragmentManager.beginTransaction() -diff --git a/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java b/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -index e09c2a1..eedb24d 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -@@ -42,7 +42,6 @@ import android.widget.Toast; - import com.android.internal.telephony.MccTable; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LocalePicker; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -87,7 +86,6 @@ public class WelcomePage extends SetupPage { - return true; - } else { - if (mWelcomeFragment != null) { -- mWelcomeFragment.sendLocaleStats(); - } - return super.doNextAction(); - } -@@ -102,10 +100,6 @@ public class WelcomePage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, SetupStats.Label.EMERGENCY_CALL); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.EMERGENCY_CALL); - mContext.startActivity(intent, options.toBundle()); - return true; - } -@@ -269,14 +263,6 @@ public class WelcomePage extends SetupPage { - return R.layout.setup_welcome_page; - } - -- public void sendLocaleStats() { -- if (!mCurrentLocale.equals(mInitialLocale)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.CHANGE_LOCALE, SetupStats.Label.LOCALE, -- mCurrentLocale.getDisplayName()); -- } -- } -- - public void fetchAndUpdateSimLocale() { - if (mIgnoreSimLocale || isDetached()) { - return; -diff --git a/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -index 56beddf..5ebe5c8 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -@@ -31,7 +31,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -83,9 +82,6 @@ public class WifiSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.CAPTIVE_PORTAL_LOGIN); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL, - options.toBundle()); -@@ -154,19 +150,10 @@ public class WifiSetupPage extends SetupPage { - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_WIFI) { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "canceled"); -- getCallbacks().onPreviousPage(); -+ getCallbacks().onPreviousPage(); - } else if (resultCode == Activity.RESULT_OK) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "success"); - checkForCaptivePortal(); - } else { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "skipped"); - getCallbacks().onNextPage(); - } - } else if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL) { -@@ -176,20 +163,11 @@ public class WifiSetupPage extends SetupPage { - } - String token = data.getStringExtra("response_token"); - if (token != null && !token.equals(mResponseToken)) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "token_mismatch"); - launchWifiSetup(); - } else { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "canceled"); - launchWifiSetup(); - } else { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "success"); - getCallbacks().onNextPage(); - } - } -@@ -253,9 +231,6 @@ public class WifiSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.WIFI_SETUP); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_WIFI, options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java b/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -index b0df440..33c61c7 100644 ---- a/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -+++ b/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -@@ -26,7 +26,6 @@ import android.view.ViewGroup; - import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.setup.Page; - import com.cyanogenmod.setupwizard.setup.SetupDataCallbacks; - -@@ -43,8 +42,6 @@ public abstract class SetupPageFragment extends Fragment { - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setRetainInstance(true); -- SetupStats.addEvent(SetupStats.Categories.PAGE_LOAD, SetupStats.Action.PAGE_LOADED, -- mKey, String.valueOf(System.currentTimeMillis())); - } - - @Override -diff --git a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -index d8a5abb..1a7a310 100644 ---- a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -+++ b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -@@ -42,7 +42,6 @@ import android.widget.ProgressBar; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.setup.CMSetupWizardData; - import com.cyanogenmod.setupwizard.setup.Page; - import com.cyanogenmod.setupwizard.setup.SetupDataCallbacks; -@@ -78,8 +77,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - - private volatile boolean mIsFinishing = false; - -- private static long sLaunchTime = 0; -- - private final ArrayList mFinishRunnables = new ArrayList(); - - public void onCreate(Bundle savedInstanceState) { -@@ -100,10 +97,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - } - } - }); -- if (sLaunchTime == 0) { -- SetupStats.addEvent(SetupStats.Categories.APP_LAUNCH, TAG); -- sLaunchTime = System.nanoTime(); -- } - setContentView(R.layout.setup_main); - mRootView = findViewById(R.id.root); - mRootView.setSystemUiVisibility(UI_FLAGS); -@@ -345,9 +338,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - @Override - public void finishSetup() { - if (!mIsFinishing) { -- SetupStats.addEvent(SetupStats.Categories.APP_FINISHED, TAG, -- SetupStats.Label.TOTAL_TIME, String.valueOf( -- System.nanoTime() - sLaunchTime)); - final SetupWizardApp setupWizardApp = (SetupWizardApp)getApplication(); - setupWizardApp.sendStickyBroadcastAsUser( - new Intent(SetupWizardApp.ACTION_FINISHED), -@@ -436,7 +426,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - final ThemeManager tm = - (ThemeManager) SetupWizardActivity.this.getSystemService(THEME_SERVICE); - tm.removeClient(SetupWizardActivity.this); -- SetupStats.sendEvents(SetupWizardActivity.this); - SetupWizardUtils.disableGMSSetupWizard(SetupWizardActivity.this); - final WallpaperManager wallpaperManager = - WallpaperManager.getInstance(SetupWizardActivity.this); -diff --git a/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java b/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -index 440129b..47d6de5 100644 ---- a/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -+++ b/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -@@ -39,7 +39,6 @@ import android.view.accessibility.AccessibilityManager; - import android.view.accessibility.IAccessibilityManager; - - import com.android.internal.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - - import java.util.ArrayList; - import java.util.Iterator; -@@ -284,8 +283,6 @@ public class EnableAccessibilityController { - // Turn on accessibility mode last. - Settings.Secure.putIntForUser(resolver, Settings.Secure.ACCESSIBILITY_ENABLED, - 1, userId); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- "accessibility_enabled"); - } else if (keyguardLocked) { - try { - mAccessibilityManager.temporaryEnableAccessibilityStateUntilKeyguardRemoved( --- -2.5.0 - diff --git a/Patches/Copperhead-13.0/android_system_core/1.patch b/Patches/Copperhead-13.0/android_system_core/1.patch deleted file mode 100644 index b7b2b597..00000000 --- a/Patches/Copperhead-13.0/android_system_core/1.patch +++ /dev/null @@ -1,24 +0,0 @@ -From fe1708406e0b31214fcb9a9abf2a4b7c944fab6d Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Fri, 27 Mar 2015 02:55:14 -0400 -Subject: [PATCH] add back dmesg_restrict - -The debugging use case with the shell user is not very compelling. This -is supposed to enforced elsewhere via SELinux now but there's no harm in -redundancy. ---- - rootdir/init.rc | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/rootdir/init.rc b/rootdir/init.rc -index 5c6b606..b98443a 100644 ---- a/rootdir/init.rc -+++ b/rootdir/init.rc -@@ -105,6 +105,7 @@ on init - write /proc/sys/kernel/sched_child_runs_first 0 - - write /proc/sys/kernel/randomize_va_space 2 -+ write /proc/sys/kernel/dmesg_restrict 1 - write /proc/sys/kernel/kptr_restrict 2 - write /proc/sys/vm/mmap_min_addr 32768 - write /proc/sys/net/ipv4/ping_group_range "0 2147483647" diff --git a/Patches/Copperhead-13.0/android_system_core/2.patch b/Patches/Copperhead-13.0/android_system_core/2.patch deleted file mode 100644 index 485a6b28..00000000 --- a/Patches/Copperhead-13.0/android_system_core/2.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 5eb07e6823e9e68e30f25e4d85466d9b1fccf48d Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Fri, 6 Feb 2015 11:46:34 -0500 -Subject: [PATCH] tighten up mount permissions - ---- - init/init.cpp | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/init/init.cpp b/init/init.cpp -index 542c35e..c7275b1 100644 ---- a/init/init.cpp -+++ b/init/init.cpp -@@ -1039,9 +1039,9 @@ int main(int argc, char** argv) { - mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755"); - mkdir("/dev/pts", 0755); - mkdir("/dev/socket", 0755); -- mount("devpts", "/dev/pts", "devpts", 0, NULL); -- mount("proc", "/proc", "proc", 0, NULL); -- mount("sysfs", "/sys", "sysfs", 0, NULL); -+ mount("devpts", "/dev/pts", "devpts", MS_NOSUID|MS_NOEXEC, NULL); -+ mount("proc", "/proc", "proc", MS_NOSUID|MS_NODEV|MS_NOEXEC, NULL); -+ mount("sysfs", "/sys", "sysfs", MS_NOSUID|MS_NODEV|MS_NOEXEC, NULL); - } - - // We must have some place other than / to create the device nodes for diff --git a/Patches/Copperhead-13.0/android_system_core/3.patch b/Patches/Copperhead-13.0/android_system_core/3.patch deleted file mode 100644 index 675dd60c..00000000 --- a/Patches/Copperhead-13.0/android_system_core/3.patch +++ /dev/null @@ -1,35 +0,0 @@ -From eee064eb93d1ee3f1db56a9634015ba23e3b0e92 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Thu, 5 Feb 2015 20:33:17 -0500 -Subject: [PATCH] tighten up kernel tcp/ip settings - ---- - rootdir/init.rc | 15 +++++++++++++++ - 1 file changed, 15 insertions(+) - -diff --git a/rootdir/init.rc b/rootdir/init.rc -index b98443a..f30baf4 100644 ---- a/rootdir/init.rc -+++ b/rootdir/init.rc -@@ -124,6 +124,21 @@ on init - write /proc/sys/net/ipv4/conf/all/accept_redirects 0 - write /proc/sys/net/ipv6/conf/all/accept_redirects 0 - -+ # IPv4 hardening -+ # -+ # reverse path filtering is done with netfilter for consistency with IPv6 -+ write /proc/sys/net/ipv4/tcp_rfc1337 1 -+ write /proc/sys/net/ipv4/conf/all/accept_source_route 0 -+ write /proc/sys/net/ipv4/conf/default/accept_source_route 0 -+ write /proc/sys/net/ipv4/conf/default/accept_redirects 0 -+ write /proc/sys/net/ipv4/conf/all/send_redirects 0 -+ write /proc/sys/net/ipv4/conf/default/send_redirects 0 -+ -+ # IPv6 hardening -+ write /proc/sys/net/ipv6/conf/default/accept_redirects 0 -+ write /proc/sys/net/ipv6/conf/all/use_tempaddr 2 -+ write /proc/sys/net/ipv6/conf/default/use_tempaddr 2 -+ - # Create cgroup mount points for process groups - mkdir /dev/cpuctl - mount cgroup none /dev/cpuctl cpu diff --git a/Patches/Copperhead-13.0/android_system_core/4.patch b/Patches/Copperhead-13.0/android_system_core/4.patch deleted file mode 100644 index 57574999..00000000 --- a/Patches/Copperhead-13.0/android_system_core/4.patch +++ /dev/null @@ -1,22 +0,0 @@ -From f7704509fc9ae1abed312e5e4276ce51f1c541ad Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Fri, 14 Aug 2015 15:07:33 -0400 -Subject: [PATCH] slow down the service respawning rate - ---- - init/init.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/init/init.cpp b/init/init.cpp -index 78859a5..11ed674 100644 ---- a/init/init.cpp -+++ b/init/init.cpp -@@ -465,7 +465,7 @@ void property_changed(const char *name, const char *value) - - static void restart_service_if_needed(struct service *svc) - { -- time_t next_start_time = svc->time_started + 5; -+ time_t next_start_time = svc->time_started + 10; - - if (next_start_time <= gettime()) { - svc->flags &= (~SVC_RESTARTING); diff --git a/Patches/Copperhead-13.0/android_vendor_cm/1.patch b/Patches/Copperhead-13.0/android_vendor_cm/1.patch deleted file mode 100644 index 477b31a2..00000000 --- a/Patches/Copperhead-13.0/android_vendor_cm/1.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 868adf173741eb6a3f0693d6b14fb92148a48db1 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Fri, 20 Nov 2015 00:13:54 -0500 -Subject: [PATCH] remove analytics support - ---- - .../vendor/cmsdk/packages/CMSettingsProvider/res/values/defaults.xml | 5 ----- - 1 file changed, 5 deletions(-) - -diff --git a/overlay/common/vendor/cmsdk/packages/CMSettingsProvider/res/values/defaults.xml b/overlay/common/vendor/cmsdk/packages/CMSettingsProvider/res/values/defaults.xml -index eec242d..27ec5fe 100644 ---- a/overlay/common/vendor/cmsdk/packages/CMSettingsProvider/res/values/defaults.xml -+++ b/overlay/common/vendor/cmsdk/packages/CMSettingsProvider/res/values/defaults.xml -@@ -22,9 +22,4 @@ - 1. Right - 2. Left --> - 1 -- -- -- -- -- true - diff --git a/Patches/Copperhead-13.0/cm_platform_sdk/1-fixed.patch b/Patches/Copperhead-13.0/cm_platform_sdk/1-fixed.patch deleted file mode 100644 index 5e4e1ed7..00000000 --- a/Patches/Copperhead-13.0/cm_platform_sdk/1-fixed.patch +++ /dev/null @@ -1,107 +0,0 @@ -From 882d5f332dfa9e0904c1e931440712fddbccf034 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Fri, 18 Dec 2015 20:27:11 -0500 -Subject: [PATCH] remove analytics support - -Change-Id: Ie3e0541398747d43ab24bad9b9b93c81df4877b9 ---- - host/migration/src/CMSettings.java | 7 ------- - packages/CMSettingsProvider/res/values/defaults.xml | 5 +---- - .../src/org/cyanogenmod/cmsettings/CMDatabaseHelper.java | 3 --- - src/java/cyanogenmod/providers/CMSettings.java | 13 ------------- - 4 files changed, 1 insertion(+), 27 deletions(-) - -diff --git a/host/migration/src/CMSettings.java b/host/migration/src/CMSettings.java -index 0d57b0d..b4f5be9 100644 ---- a/host/migration/src/CMSettings.java -+++ b/host/migration/src/CMSettings.java -@@ -833,12 +833,6 @@ public final class CMSettings { - public static final String QS_USE_MAIN_TILES = "sysui_qs_main_tiles"; - - /** -- * Global stats collection -- * @hide -- */ -- public static final String STATS_COLLECTION = "stats_collection"; -- -- /** - * Boolean value whether to link ringtone and notification volume - * - * @hide -@@ -1021,7 +1015,6 @@ public final class CMSettings { - CMSettings.Secure.DEV_FORCE_SHOW_NAVBAR, - CMSettings.Secure.KEYBOARD_BRIGHTNESS, - CMSettings.Secure.POWER_MENU_ACTIONS, -- CMSettings.Secure.STATS_COLLECTION, - CMSettings.Secure.QS_SHOW_BRIGHTNESS_SLIDER, - CMSettings.Secure.QS_TILES, - CMSettings.Secure.QS_USE_MAIN_TILES, -diff --git a/packages/CMSettingsProvider/res/values/defaults.xml b/packages/CMSettingsProvider/res/values/defaults.xml -index 3a514f8..96af970 100644 ---- a/packages/CMSettingsProvider/res/values/defaults.xml -+++ b/packages/CMSettingsProvider/res/values/defaults.xml -@@ -41,9 +41,6 @@ - Comma-delimited, quick settings tiles. See QSConstants.java for a list of all available tiles --> - wifi,bt,cell,airplane,rotation,flashlight,location,cast,visualizer,hotspot,live_display - -- -- false -- - - true - -@@ -76,4 +73,4 @@ - - false -- -\ No newline at end of file -+ -diff --git a/packages/CMSettingsProvider/src/org/cyanogenmod/cmsettings/CMDatabaseHelper.java b/packages/CMSettingsProvider/src/org/cyanogenmod/cmsettings/CMDatabaseHelper.java -index 5d40866..de0fe19 100644 ---- a/packages/CMSettingsProvider/src/org/cyanogenmod/cmsettings/CMDatabaseHelper.java -+++ b/packages/CMSettingsProvider/src/org/cyanogenmod/cmsettings/CMDatabaseHelper.java -@@ -234,9 +234,6 @@ public class CMDatabaseHelper extends SQLiteOpenHelper{ - loadBooleanSetting(db, CMTableNames.TABLE_SECURE, CMSettings.Secure.QS_USE_MAIN_TILES, - R.bool.def_sysui_qs_main_tiles); - -- loadBooleanSetting(db, CMTableNames.TABLE_SECURE, CMSettings.Secure.STATS_COLLECTION, -- R.bool.def_stats_collection); -- - loadBooleanSetting(db, CMTableNames.TABLE_SECURE, - CMSettings.Secure.LOCKSCREEN_VISUALIZER_ENABLED, R.bool.def_lockscreen_visualizer); - } -diff --git a/src/java/cyanogenmod/providers/CMSettings.java b/src/java/cyanogenmod/providers/CMSettings.java -index 9da713b..9d63a9b 100644 ---- a/src/java/cyanogenmod/providers/CMSettings.java -+++ b/src/java/cyanogenmod/providers/CMSettings.java -@@ -2464,18 +2464,6 @@ public final class CMSettings { - public static final String QS_USE_MAIN_TILES = "sysui_qs_main_tiles"; - - /** -- * Global stats collection -- * @hide -- */ -- public static final String STATS_COLLECTION = "stats_collection"; -- -- /** -- * Whether the global stats collection setting has been successfully reported to server -- * @hide -- */ -- public static final String STATS_COLLECTION_REPORTED = "stats_collection_reported"; -- -- /** - * Whether newly installed apps should run with privacy guard by default - * @hide - */ -@@ -2631,7 +2619,6 @@ public final class CMSettings { - CMSettings.Secure.DEV_FORCE_SHOW_NAVBAR, - CMSettings.Secure.KEYBOARD_BRIGHTNESS, - CMSettings.Secure.POWER_MENU_ACTIONS, -- CMSettings.Secure.STATS_COLLECTION, - CMSettings.Secure.QS_SHOW_BRIGHTNESS_SLIDER, - CMSettings.Secure.QS_TILES, - CMSettings.Secure.QS_USE_MAIN_TILES, --- -2.6.4 - diff --git a/Patches/Copperhead-13.0/cm_platform_sdk/1.patch b/Patches/Copperhead-13.0/cm_platform_sdk/1.patch deleted file mode 100644 index 3005ba77..00000000 --- a/Patches/Copperhead-13.0/cm_platform_sdk/1.patch +++ /dev/null @@ -1,103 +0,0 @@ -From fdea0fad552207679fc0981a937079b262bfc810 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Fri, 20 Nov 2015 00:13:11 -0500 -Subject: [PATCH] remove analytics support - ---- - host/migration/src/CMSettings.java | 7 ------- - packages/CMSettingsProvider/res/values/defaults.xml | 5 +---- - .../src/org/cyanogenmod/cmsettings/CMDatabaseHelper.java | 3 --- - src/java/cyanogenmod/providers/CMSettings.java | 13 ------------- - 4 files changed, 1 insertion(+), 27 deletions(-) - -diff --git a/host/migration/src/CMSettings.java b/host/migration/src/CMSettings.java -index 0d57b0d..b4f5be9 100644 ---- a/host/migration/src/CMSettings.java -+++ b/host/migration/src/CMSettings.java -@@ -833,12 +833,6 @@ public static boolean isLegacySetting(String key) { - public static final String QS_USE_MAIN_TILES = "sysui_qs_main_tiles"; - - /** -- * Global stats collection -- * @hide -- */ -- public static final String STATS_COLLECTION = "stats_collection"; -- -- /** - * Boolean value whether to link ringtone and notification volume - * - * @hide -@@ -1021,7 +1015,6 @@ public static boolean isLegacySetting(String key) { - CMSettings.Secure.DEV_FORCE_SHOW_NAVBAR, - CMSettings.Secure.KEYBOARD_BRIGHTNESS, - CMSettings.Secure.POWER_MENU_ACTIONS, -- CMSettings.Secure.STATS_COLLECTION, - CMSettings.Secure.QS_SHOW_BRIGHTNESS_SLIDER, - CMSettings.Secure.QS_TILES, - CMSettings.Secure.QS_USE_MAIN_TILES, -diff --git a/packages/CMSettingsProvider/res/values/defaults.xml b/packages/CMSettingsProvider/res/values/defaults.xml -index ffc9c88..762abc1 100644 ---- a/packages/CMSettingsProvider/res/values/defaults.xml -+++ b/packages/CMSettingsProvider/res/values/defaults.xml -@@ -41,9 +41,6 @@ - Comma-delimited, quick settings tiles. See QSConstants.java for a list of all available tiles --> - wifi,bt,cell,airplane,rotation,flashlight,location,cast,visualizer,hotspot,live_display - -- -- false -- - - true - -@@ -73,4 +70,4 @@ - - false -- -\ No newline at end of file -+ -diff --git a/packages/CMSettingsProvider/src/org/cyanogenmod/cmsettings/CMDatabaseHelper.java b/packages/CMSettingsProvider/src/org/cyanogenmod/cmsettings/CMDatabaseHelper.java -index 4257c42..baee50a 100644 ---- a/packages/CMSettingsProvider/src/org/cyanogenmod/cmsettings/CMDatabaseHelper.java -+++ b/packages/CMSettingsProvider/src/org/cyanogenmod/cmsettings/CMDatabaseHelper.java -@@ -233,9 +233,6 @@ private void loadSecureSettings(SQLiteDatabase db) { - - loadBooleanSetting(db, CMTableNames.TABLE_SECURE, CMSettings.Secure.QS_USE_MAIN_TILES, - R.bool.def_sysui_qs_main_tiles); -- -- loadBooleanSetting(db, CMTableNames.TABLE_SECURE, CMSettings.Secure.STATS_COLLECTION, -- R.bool.def_stats_collection); - } - - private void loadSystemSettings(SQLiteDatabase db) { -diff --git a/src/java/cyanogenmod/providers/CMSettings.java b/src/java/cyanogenmod/providers/CMSettings.java -index 4b2fb7c..468b226 100644 ---- a/src/java/cyanogenmod/providers/CMSettings.java -+++ b/src/java/cyanogenmod/providers/CMSettings.java -@@ -2464,18 +2464,6 @@ public static boolean putFloatForUser(ContentResolver cr, String name, float val - public static final String QS_USE_MAIN_TILES = "sysui_qs_main_tiles"; - - /** -- * Global stats collection -- * @hide -- */ -- public static final String STATS_COLLECTION = "stats_collection"; -- -- /** -- * Whether the global stats collection setting has been successfully reported to server -- * @hide -- */ -- public static final String STATS_COLLECTION_REPORTED = "stats_collection_reported"; -- -- /** - * Boolean value whether to link ringtone and notification volume - * - * @hide -@@ -2619,7 +2607,6 @@ public static boolean putFloatForUser(ContentResolver cr, String name, float val - CMSettings.Secure.DEV_FORCE_SHOW_NAVBAR, - CMSettings.Secure.KEYBOARD_BRIGHTNESS, - CMSettings.Secure.POWER_MENU_ACTIONS, -- CMSettings.Secure.STATS_COLLECTION, - CMSettings.Secure.QS_SHOW_BRIGHTNESS_SLIDER, - CMSettings.Secure.QS_TILES, - CMSettings.Secure.QS_USE_MAIN_TILES, diff --git a/Patches/CyanogenMod-13.0/android_build/Change_Toolchain.patch b/Patches/CyanogenMod-13.0/android_build/Change_Toolchain.patch deleted file mode 100644 index 39acddad..00000000 --- a/Patches/CyanogenMod-13.0/android_build/Change_Toolchain.patch +++ /dev/null @@ -1,28 +0,0 @@ -From cadb44f5ff20d3e32c5eece6b6185a507f4e8bbf Mon Sep 17 00:00:00 2001 -From: Tad -Date: Tue, 5 Jan 2016 20:06:35 -0500 -Subject: [PATCH] Change toolchain - -Change-Id: Ib6df0dc6af32c755f828f4cfe9204a87b01c4551 ---- - core/combo/TARGET_linux-arm.mk | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/core/combo/TARGET_linux-arm.mk b/core/combo/TARGET_linux-arm.mk -index 5020865..dcc2e9a 100644 ---- a/core/combo/TARGET_linux-arm.mk -+++ b/core/combo/TARGET_linux-arm.mk -@@ -38,8 +38,8 @@ endif - $(combo_2nd_arch_prefix)TARGET_NDK_GCC_VERSION := 4.9 - - ifeq ($(strip $(TARGET_GCC_VERSION_EXP)),) --$(combo_2nd_arch_prefix)TARGET_GCC_VERSION := 4.9 --$(combo_2nd_arch_prefix)TARGET_LEGACY_GCC_VERSION := 4.8 -+$(combo_2nd_arch_prefix)TARGET_GCC_VERSION := 4.9-cortex-a15 -+$(combo_2nd_arch_prefix)TARGET_LEGACY_GCC_VERSION := 4.8-cortex-a15 - else - $(combo_2nd_arch_prefix)TARGET_GCC_VERSION := $(TARGET_GCC_VERSION_EXP) - endif --- -2.6.4 - diff --git a/Patches/CyanogenMod-13.0/android_build/Disable_Opt.patch b/Patches/CyanogenMod-13.0/android_build/Disable_Opt.patch deleted file mode 100644 index 3422f20b..00000000 --- a/Patches/CyanogenMod-13.0/android_build/Disable_Opt.patch +++ /dev/null @@ -1,26 +0,0 @@ -From d90bf77e8215c26ae50c221ae346894bc8b37568 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Thu, 25 Feb 2016 05:59:06 -0500 -Subject: [PATCH] Disable 5.3 opt - -Change-Id: I166e24efeeeec3555efbadf590363bc40fb5468c ---- - core/archidroid.mk | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/core/archidroid.mk b/core/archidroid.mk -index 9ab4918..29bd257 100644 ---- a/core/archidroid.mk -+++ b/core/archidroid.mk -@@ -45,7 +45,7 @@ ARCHIDROID_GCC_LDFLAGS := -Wl,-O3 -Wl,--as-needed -Wl,--gc-sections -Wl,--relax - # Flags below are applied to specific targets only, use them if your flag is not compatible for both compilers - - # We use GCC 5.3 for arm-linux-androideabi, make sure to remove flags below if you decided to stick with 4.9 --ARCHIDROID_GCC_CFLAGS_32 := -Wno-error=bool-compare -Wno-error=logical-not-parentheses -Wno-error=sizeof-array-argument -+#ARCHIDROID_GCC_CFLAGS_32 := -Wno-error=bool-compare -Wno-error=logical-not-parentheses -Wno-error=sizeof-array-argument - - # We use GCC 4.9 for aarch64-linux-android, so we don't have any extra flags for it - ARCHIDROID_GCC_CFLAGS_64 := --- -2.5.0 - diff --git a/Patches/CyanogenMod-13.0/android_build/Enable_Graphite.patch b/Patches/CyanogenMod-13.0/android_build/Enable_Graphite.patch deleted file mode 100644 index ffd05c65..00000000 --- a/Patches/CyanogenMod-13.0/android_build/Enable_Graphite.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 8076f19e43061cbc363c7a01f4485c65a266ab57 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Thu, 25 Feb 2016 19:40:24 -0500 -Subject: [PATCH] Enable graphite - -Change-Id: I799412c31dd0c30050657fbc6f1d0daec8d4d54c ---- - core/archidroid.mk | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/core/archidroid.mk b/core/archidroid.mk -index 9ab4918..2ace5f1 100644 ---- a/core/archidroid.mk -+++ b/core/archidroid.mk -@@ -64,7 +64,7 @@ ARCHIDROID_GCC_CFLAGS_64 := - # ARCHIDROID_GCC_CFLAGS += -ftracer -funroll-loops - - # These flags may cause ICEs in some compilers, but work fine in other ones, test carefully --# ARCHIDROID_GCC_CFLAGS += -fgraphite -fgraphite-identity -+ARCHIDROID_GCC_CFLAGS += -fgraphite -fgraphite-identity - - # The following flags (-floop) require that your GCC has been configured --with-isl - # Additionally, applying any of them will most likely cause ICE in your compiler, so they're disabled --- -2.5.0 - diff --git a/Patches/CyanogenMod-13.0/android_build/Silence.patch b/Patches/CyanogenMod-13.0/android_build/Silence.patch deleted file mode 100644 index cc0cb96c..00000000 --- a/Patches/CyanogenMod-13.0/android_build/Silence.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 2b18a46758ef5e6bc377315cd9bf8d08d1dd5b17 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Mon, 4 Jan 2016 07:41:10 -0500 -Subject: [PATCH] switch to SMSSecure as the messaging app - ---- - target/product/aosp_base_telephony.mk | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/target/product/aosp_base_telephony.mk b/target/product/aosp_base_telephony.mk -index 0d4e333..f43eec5 100644 ---- a/target/product/aosp_base_telephony.mk -+++ b/target/product/aosp_base_telephony.mk -@@ -16,4 +16,4 @@ - $(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk) - - PRODUCT_PACKAGES += \ -- messaging -+ SMSSecure diff --git a/Patches/CyanogenMod-13.0/android_external_bluetooth_bluedroid/Disable_Opt.patch b/Patches/CyanogenMod-13.0/android_external_bluetooth_bluedroid/Disable_Opt.patch deleted file mode 100644 index 13d19c48..00000000 --- a/Patches/CyanogenMod-13.0/android_external_bluetooth_bluedroid/Disable_Opt.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 8bff5fb1bf50db8e26ee64d1f15181f67a68fc7b Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=C5=81ukasz=20Domeradzki?= - -Date: Mon, 10 Aug 2015 02:01:37 +0200 -Subject: [PATCH] Fix O3 SIGBUS - ---- - main/Android.mk | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/main/Android.mk b/main/Android.mk -index d98d2ef..8cfee24 100644 ---- a/main/Android.mk -+++ b/main/Android.mk -@@ -134,7 +134,7 @@ ifeq ($(BOARD_USES_WIPOWER), true) - LOCAL_C_INCLUDES+= $(LOCAL_PATH)/../wipowerif/include - endif - --LOCAL_CFLAGS += -DBUILDCFG $(bdroid_CFLAGS) -Wno-error=maybe-uninitialized -Wno-error=uninitialized -Wno-error=unused-parameter -+LOCAL_CFLAGS += -DBUILDCFG $(bdroid_CFLAGS) -Os -Wno-error=maybe-uninitialized -Wno-error=uninitialized -Wno-error=unused-parameter - LOCAL_CONLYFLAGS := -std=c99 - - ifeq ($(TARGET_PRODUCT), full_crespo) --- -2.5.0 - diff --git a/Patches/CyanogenMod-13.0/android_frameworks_av/Disable_Opt.patch b/Patches/CyanogenMod-13.0/android_frameworks_av/Disable_Opt.patch deleted file mode 100644 index fee6aa5b..00000000 --- a/Patches/CyanogenMod-13.0/android_frameworks_av/Disable_Opt.patch +++ /dev/null @@ -1,26 +0,0 @@ -From d3774f2251a1fcaadd097de56f2494698b576034 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Thu, 25 Feb 2016 09:57:28 -0500 -Subject: [PATCH] Disable opt - -Change-Id: I53a1075347b33690ad694fb400d06290a19e2666 ---- - media/libstagefright/id3/ID3.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/media/libstagefright/id3/ID3.cpp b/media/libstagefright/id3/ID3.cpp -index 76d65f0..0ff541a 100644 ---- a/media/libstagefright/id3/ID3.cpp -+++ b/media/libstagefright/id3/ID3.cpp -@@ -500,7 +500,7 @@ void ID3::Iterator::getString(String8 *id, String8 *comment) const { - // comment fields (COM/COMM) contain an initial short descriptor, followed by \0, - // followed by more data. The data following the \0 can be retrieved by setting - // "otherdata" to true. --void ID3::Iterator::getstring(String8 *id, bool otherdata) const { -+void __attribute__((optimize("no-tree-vectorize"))) ID3::Iterator::getstring(String8 *id, bool otherdata) const { - id->setTo(""); - - size_t size; --- -2.7.1 - diff --git a/Patches/CyanogenMod-13.0/android_frameworks_av/Fix_Build-1.patch b/Patches/CyanogenMod-13.0/android_frameworks_av/Fix_Build-1.patch deleted file mode 100644 index a63b1150..00000000 --- a/Patches/CyanogenMod-13.0/android_frameworks_av/Fix_Build-1.patch +++ /dev/null @@ -1,91 +0,0 @@ -From c7995a8a49315d0e7378606c9208caa0400afdd2 Mon Sep 17 00:00:00 2001 -From: Kyle Repinski -Date: Sun, 19 Apr 2015 01:03:46 -0500 -Subject: [PATCH] Fix compiler issues uncovered at higher optimization levels. - -amrwbenc: Fix incorrect array-bounds warning/error. -m4v_h263: dec: Fix bogus strict-overflow warning/error. -af: Fix ICE in AudioMixer::track__NoResample. - -Change-Id: I2b44072eff6499026034a82107d9dfc6195a6810 ---- - media/libstagefright/codecs/amrwbenc/src/isp_az.c | 13 ++++++------- - .../codecs/m4v_h263/dec/src/deringing_luma.cpp | 4 ++-- - services/audioflinger/AudioMixer.cpp | 2 +- - 3 files changed, 9 insertions(+), 10 deletions(-) - -diff --git a/media/libstagefright/codecs/amrwbenc/src/isp_az.c b/media/libstagefright/codecs/amrwbenc/src/isp_az.c -index 62e29e7..6423ec8 100644 ---- a/media/libstagefright/codecs/amrwbenc/src/isp_az.c -+++ b/media/libstagefright/codecs/amrwbenc/src/isp_az.c -@@ -42,7 +42,7 @@ void Isp_Az( - /* 1 : adaptive scaling enabled */ - ) - { -- Word32 i, j; -+ Word16 i, j; - Word16 hi, lo; - Word32 f1[NC16k + 1], f2[NC16k]; - Word16 nc; -@@ -58,18 +58,17 @@ void Isp_Az( - { - f1[i] = f1[i] << 2; - } -- } else -- Get_isp_pol(&isp[0], f1, nc); -- -- if (nc > 8) -- { - Get_isp_pol_16kHz(&isp[1], f2, (nc - 1)); - for (i = 0; i <= nc - 1; i++) - { - f2[i] = f2[i] << 2; - } -- } else -+ } -+ else -+ { -+ Get_isp_pol(&isp[0], f1, nc); - Get_isp_pol(&isp[1], f2, (nc - 1)); -+ } - - /*-----------------------------------------------------* - * Multiply F2(z) by (1 - z^-2) * -diff --git a/media/libstagefright/codecs/m4v_h263/dec/src/deringing_luma.cpp b/media/libstagefright/codecs/m4v_h263/dec/src/deringing_luma.cpp -index b5574b4..1319251 100644 ---- a/media/libstagefright/codecs/m4v_h263/dec/src/deringing_luma.cpp -+++ b/media/libstagefright/codecs/m4v_h263/dec/src/deringing_luma.cpp -@@ -78,7 +78,7 @@ void Deringing_Luma( - for (v_blk = 0; v_blk < MBSIZE; v_blk += BLKSIZE) - { - v0 = ((v_blk - 1) >= 1) ? (v_blk - 1) : 1; -- for (h_blk = MB_H; h_blk < MB_H + MBSIZE; h_blk += BLKSIZE) -+ for (h_blk = MB_H; (unsigned int)h_blk < (unsigned int)((unsigned int)MB_H + (unsigned int)MBSIZE); h_blk += BLKSIZE) - { - h0 = ((h_blk - 1) >= 1) ? (h_blk - 1) : 1; - -@@ -129,7 +129,7 @@ void Deringing_Luma( - } - - blks = 0; -- for (v_blk = MB_V; v_blk < MB_V + MBSIZE; v_blk += BLKSIZE) -+ for (v_blk = MB_V; (unsigned int)v_blk < (unsigned int)((unsigned int)MB_V + (unsigned int)MBSIZE); v_blk += BLKSIZE) - { - v0 = v_blk - 1; - for (h_blk = 0; h_blk < MBSIZE; h_blk += BLKSIZE) -diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp -index 806eaf1..a12d595 100644 ---- a/services/audioflinger/AudioMixer.cpp -+++ b/services/audioflinger/AudioMixer.cpp -@@ -1934,7 +1934,7 @@ void AudioMixer::track__Resample(track_t* t, TO* out, size_t outFrameCount, TO* - * TA: int32_t (Q4.27) - */ - template --void AudioMixer::track__NoResample(track_t* t, TO* out, size_t frameCount, -+void __attribute__((optimize("no-tree-vectorize"))) AudioMixer::track__NoResample(track_t* t, TO* out, size_t frameCount, - TO* temp __unused, TA* aux) - { - ALOGVV("track__NoResample\n"); --- -2.7.1 - diff --git a/Patches/CyanogenMod-13.0/android_frameworks_base/Aggressive_Doze-old.patch b/Patches/CyanogenMod-13.0/android_frameworks_base/Aggressive_Doze-old.patch deleted file mode 100644 index d38be59b..00000000 --- a/Patches/CyanogenMod-13.0/android_frameworks_base/Aggressive_Doze-old.patch +++ /dev/null @@ -1,67 +0,0 @@ -From c293c1e3284e88ad4d6a19af6f9dde6722a487d9 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sat, 19 Mar 2016 10:43:15 -0400 -Subject: [PATCH] Aggressive Doze - -Change-Id: Ia5d7031f24f84afd3329090de0be5302b47f420e ---- - .../com/android/server/DeviceIdleController.java | 26 +++++++++++----------- - 1 file changed, 13 insertions(+), 13 deletions(-) - -diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java -index 71650c3..0f541d1 100644 ---- a/services/core/java/com/android/server/DeviceIdleController.java -+++ b/services/core/java/com/android/server/DeviceIdleController.java -@@ -554,36 +554,36 @@ public class DeviceIdleController extends SystemService - } - - INACTIVE_TIMEOUT = mParser.getLong(KEY_INACTIVE_TIMEOUT, -- !COMPRESS_TIME ? 30 * 60 * 1000L : 3 * 60 * 1000L); -+ 30000L); - SENSING_TIMEOUT = mParser.getLong(KEY_SENSING_TIMEOUT, -- !DEBUG ? 4 * 60 * 1000L : 60 * 1000L); -+ 0L); - LOCATING_TIMEOUT = mParser.getLong(KEY_LOCATING_TIMEOUT, -- !DEBUG ? 30 * 1000L : 15 * 1000L); -+ 0L); - LOCATION_ACCURACY = mParser.getFloat(KEY_LOCATION_ACCURACY, 20); - MOTION_INACTIVE_TIMEOUT = mParser.getLong(KEY_MOTION_INACTIVE_TIMEOUT, -- !COMPRESS_TIME ? 10 * 60 * 1000L : 60 * 1000L); -+ 0L); - IDLE_AFTER_INACTIVE_TIMEOUT = mParser.getLong(KEY_IDLE_AFTER_INACTIVE_TIMEOUT, -- !COMPRESS_TIME ? 30 * 60 * 1000L : 3 * 60 * 1000L); -+ 0L); - IDLE_PENDING_TIMEOUT = mParser.getLong(KEY_IDLE_PENDING_TIMEOUT, -- !COMPRESS_TIME ? 5 * 60 * 1000L : 30 * 1000L); -+ 12000L); - MAX_IDLE_PENDING_TIMEOUT = mParser.getLong(KEY_MAX_IDLE_PENDING_TIMEOUT, -- !COMPRESS_TIME ? 10 * 60 * 1000L : 60 * 1000L); -+ 12000L); - IDLE_PENDING_FACTOR = mParser.getFloat(KEY_IDLE_PENDING_FACTOR, - 2f); - IDLE_TIMEOUT = mParser.getLong(KEY_IDLE_TIMEOUT, -- !COMPRESS_TIME ? 60 * 60 * 1000L : 6 * 60 * 1000L); -+ 60000L); - MAX_IDLE_TIMEOUT = mParser.getLong(KEY_MAX_IDLE_TIMEOUT, -- !COMPRESS_TIME ? 6 * 60 * 60 * 1000L : 30 * 60 * 1000L); -+ 21600000L); - IDLE_FACTOR = mParser.getFloat(KEY_IDLE_FACTOR, - 2f); - MIN_TIME_TO_ALARM = mParser.getLong(KEY_MIN_TIME_TO_ALARM, -- !COMPRESS_TIME ? 60 * 60 * 1000L : 6 * 60 * 1000L); -+ 600000L); - MAX_TEMP_APP_WHITELIST_DURATION = mParser.getLong( -- KEY_MAX_TEMP_APP_WHITELIST_DURATION, 5 * 60 * 1000L); -+ KEY_MAX_TEMP_APP_WHITELIST_DURATION, 10000L); - MMS_TEMP_APP_WHITELIST_DURATION = mParser.getLong( -- KEY_MMS_TEMP_APP_WHITELIST_DURATION, 60 * 1000L); -+ KEY_MMS_TEMP_APP_WHITELIST_DURATION, 10000L); - SMS_TEMP_APP_WHITELIST_DURATION = mParser.getLong( -- KEY_SMS_TEMP_APP_WHITELIST_DURATION, 20 * 1000L); -+ KEY_SMS_TEMP_APP_WHITELIST_DURATION, 10000L); - } - } - --- -2.7.4 - diff --git a/Patches/CyanogenMod-13.0/android_frameworks_base/Aggressive_Doze-old1.patch b/Patches/CyanogenMod-13.0/android_frameworks_base/Aggressive_Doze-old1.patch deleted file mode 100644 index ebecffad..00000000 --- a/Patches/CyanogenMod-13.0/android_frameworks_base/Aggressive_Doze-old1.patch +++ /dev/null @@ -1,71 +0,0 @@ -From e565d5688ac11ee1440d7622a84ae5a688f7f3b5 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sat, 16 Apr 2016 22:49:51 -0400 -Subject: [PATCH] Aggressive Doze - -Change-Id: If28d95b48fc283d88999a200112ee579dd9a4bc2 ---- - .../com/android/server/DeviceIdleController.java | 47 ++++++++-------------- - 1 file changed, 16 insertions(+), 31 deletions(-) - -diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java -index 0f541d1..44cc490 100644 ---- a/services/core/java/com/android/server/DeviceIdleController.java -+++ b/services/core/java/com/android/server/DeviceIdleController.java -@@ -553,37 +553,22 @@ public class DeviceIdleController extends SystemService - Slog.e(TAG, "Bad device idle settings", e); - } - -- INACTIVE_TIMEOUT = mParser.getLong(KEY_INACTIVE_TIMEOUT, -- 30000L); -- SENSING_TIMEOUT = mParser.getLong(KEY_SENSING_TIMEOUT, -- 0L); -- LOCATING_TIMEOUT = mParser.getLong(KEY_LOCATING_TIMEOUT, -- 0L); -- LOCATION_ACCURACY = mParser.getFloat(KEY_LOCATION_ACCURACY, 20); -- MOTION_INACTIVE_TIMEOUT = mParser.getLong(KEY_MOTION_INACTIVE_TIMEOUT, -- 0L); -- IDLE_AFTER_INACTIVE_TIMEOUT = mParser.getLong(KEY_IDLE_AFTER_INACTIVE_TIMEOUT, -- 0L); -- IDLE_PENDING_TIMEOUT = mParser.getLong(KEY_IDLE_PENDING_TIMEOUT, -- 12000L); -- MAX_IDLE_PENDING_TIMEOUT = mParser.getLong(KEY_MAX_IDLE_PENDING_TIMEOUT, -- 12000L); -- IDLE_PENDING_FACTOR = mParser.getFloat(KEY_IDLE_PENDING_FACTOR, -- 2f); -- IDLE_TIMEOUT = mParser.getLong(KEY_IDLE_TIMEOUT, -- 60000L); -- MAX_IDLE_TIMEOUT = mParser.getLong(KEY_MAX_IDLE_TIMEOUT, -- 21600000L); -- IDLE_FACTOR = mParser.getFloat(KEY_IDLE_FACTOR, -- 2f); -- MIN_TIME_TO_ALARM = mParser.getLong(KEY_MIN_TIME_TO_ALARM, -- 600000L); -- MAX_TEMP_APP_WHITELIST_DURATION = mParser.getLong( -- KEY_MAX_TEMP_APP_WHITELIST_DURATION, 10000L); -- MMS_TEMP_APP_WHITELIST_DURATION = mParser.getLong( -- KEY_MMS_TEMP_APP_WHITELIST_DURATION, 10000L); -- SMS_TEMP_APP_WHITELIST_DURATION = mParser.getLong( -- KEY_SMS_TEMP_APP_WHITELIST_DURATION, 10000L); -+ INACTIVE_TIMEOUT = 300000L;//5m -+ SENSING_TIMEOUT = 15000L;//15s -+ LOCATING_TIMEOUT = 15000L;//15s -+ LOCATION_ACCURACY = 30f; -+ MOTION_INACTIVE_TIMEOUT = 15000L;//15s -+ IDLE_AFTER_INACTIVE_TIMEOUT = 15000L;//15s -+ IDLE_PENDING_TIMEOUT = 15000L;//15s -+ MAX_IDLE_PENDING_TIMEOUT = 60000L;//60s -+ IDLE_PENDING_FACTOR = 2f; -+ IDLE_TIMEOUT = 600000L;//10m -+ MAX_IDLE_TIMEOUT = 21600000L;//6h -+ IDLE_FACTOR = 2f; -+ MIN_TIME_TO_ALARM = 600000L;//10m -+ MAX_TEMP_APP_WHITELIST_DURATION = 120000L;//2m -+ MMS_TEMP_APP_WHITELIST_DURATION = 60000L;//1m -+ SMS_TEMP_APP_WHITELIST_DURATION = 30000L;//30s - } - } - --- -2.8.0 - diff --git a/Patches/CyanogenMod-13.0/android_frameworks_base/Aggressive_Doze.patch b/Patches/CyanogenMod-13.0/android_frameworks_base/Aggressive_Doze.patch deleted file mode 100644 index fb2f8436..00000000 --- a/Patches/CyanogenMod-13.0/android_frameworks_base/Aggressive_Doze.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 23763f4eb6fba1a9031bc5d46fdd81bfc1a35c0c Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sat, 23 Apr 2016 18:46:05 -0400 -Subject: [PATCH] Aggressive Doze - -Change-Id: If7b7776ca634d9bb63cd77458a5d1c93fe38bc8f ---- - .../com/android/server/DeviceIdleController.java | 47 ++++++++-------------- - 1 file changed, 16 insertions(+), 31 deletions(-) - -diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java -index 71650c3..44cc490 100644 ---- a/services/core/java/com/android/server/DeviceIdleController.java -+++ b/services/core/java/com/android/server/DeviceIdleController.java -@@ -553,37 +553,22 @@ public class DeviceIdleController extends SystemService - Slog.e(TAG, "Bad device idle settings", e); - } - -- INACTIVE_TIMEOUT = mParser.getLong(KEY_INACTIVE_TIMEOUT, -- !COMPRESS_TIME ? 30 * 60 * 1000L : 3 * 60 * 1000L); -- SENSING_TIMEOUT = mParser.getLong(KEY_SENSING_TIMEOUT, -- !DEBUG ? 4 * 60 * 1000L : 60 * 1000L); -- LOCATING_TIMEOUT = mParser.getLong(KEY_LOCATING_TIMEOUT, -- !DEBUG ? 30 * 1000L : 15 * 1000L); -- LOCATION_ACCURACY = mParser.getFloat(KEY_LOCATION_ACCURACY, 20); -- MOTION_INACTIVE_TIMEOUT = mParser.getLong(KEY_MOTION_INACTIVE_TIMEOUT, -- !COMPRESS_TIME ? 10 * 60 * 1000L : 60 * 1000L); -- IDLE_AFTER_INACTIVE_TIMEOUT = mParser.getLong(KEY_IDLE_AFTER_INACTIVE_TIMEOUT, -- !COMPRESS_TIME ? 30 * 60 * 1000L : 3 * 60 * 1000L); -- IDLE_PENDING_TIMEOUT = mParser.getLong(KEY_IDLE_PENDING_TIMEOUT, -- !COMPRESS_TIME ? 5 * 60 * 1000L : 30 * 1000L); -- MAX_IDLE_PENDING_TIMEOUT = mParser.getLong(KEY_MAX_IDLE_PENDING_TIMEOUT, -- !COMPRESS_TIME ? 10 * 60 * 1000L : 60 * 1000L); -- IDLE_PENDING_FACTOR = mParser.getFloat(KEY_IDLE_PENDING_FACTOR, -- 2f); -- IDLE_TIMEOUT = mParser.getLong(KEY_IDLE_TIMEOUT, -- !COMPRESS_TIME ? 60 * 60 * 1000L : 6 * 60 * 1000L); -- MAX_IDLE_TIMEOUT = mParser.getLong(KEY_MAX_IDLE_TIMEOUT, -- !COMPRESS_TIME ? 6 * 60 * 60 * 1000L : 30 * 60 * 1000L); -- IDLE_FACTOR = mParser.getFloat(KEY_IDLE_FACTOR, -- 2f); -- MIN_TIME_TO_ALARM = mParser.getLong(KEY_MIN_TIME_TO_ALARM, -- !COMPRESS_TIME ? 60 * 60 * 1000L : 6 * 60 * 1000L); -- MAX_TEMP_APP_WHITELIST_DURATION = mParser.getLong( -- KEY_MAX_TEMP_APP_WHITELIST_DURATION, 5 * 60 * 1000L); -- MMS_TEMP_APP_WHITELIST_DURATION = mParser.getLong( -- KEY_MMS_TEMP_APP_WHITELIST_DURATION, 60 * 1000L); -- SMS_TEMP_APP_WHITELIST_DURATION = mParser.getLong( -- KEY_SMS_TEMP_APP_WHITELIST_DURATION, 20 * 1000L); -+ INACTIVE_TIMEOUT = 300000L;//5m -+ SENSING_TIMEOUT = 15000L;//15s -+ LOCATING_TIMEOUT = 15000L;//15s -+ LOCATION_ACCURACY = 30f; -+ MOTION_INACTIVE_TIMEOUT = 15000L;//15s -+ IDLE_AFTER_INACTIVE_TIMEOUT = 15000L;//15s -+ IDLE_PENDING_TIMEOUT = 15000L;//15s -+ MAX_IDLE_PENDING_TIMEOUT = 60000L;//60s -+ IDLE_PENDING_FACTOR = 2f; -+ IDLE_TIMEOUT = 600000L;//10m -+ MAX_IDLE_TIMEOUT = 21600000L;//6h -+ IDLE_FACTOR = 2f; -+ MIN_TIME_TO_ALARM = 600000L;//10m -+ MAX_TEMP_APP_WHITELIST_DURATION = 120000L;//2m -+ MMS_TEMP_APP_WHITELIST_DURATION = 60000L;//1m -+ SMS_TEMP_APP_WHITELIST_DURATION = 30000L;//30s - } - } - --- -2.8.0 - diff --git a/Patches/CyanogenMod-13.0/android_frameworks_base/Connectivity.patch b/Patches/CyanogenMod-13.0/android_frameworks_base/Connectivity.patch deleted file mode 100644 index b734e469..00000000 --- a/Patches/CyanogenMod-13.0/android_frameworks_base/Connectivity.patch +++ /dev/null @@ -1,40 +0,0 @@ -From bffe81a931165fbc57bbf7a7ff688f6b09b911cd Mon Sep 17 00:00:00 2001 -From: Tad -Date: Wed, 20 Jul 2016 00:06:16 -0400 -Subject: [PATCH] Change default connectivity check URLs - -Change-Id: I8d75ab078f179e23b2ae983b7a4e5653f1eca08e ---- - .../src/com/android/captiveportallogin/CaptivePortalLoginActivity.java | 2 +- - services/core/java/com/android/server/connectivity/NetworkMonitor.java | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java -index ed9c111..09a8898 100644 ---- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java -+++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java -@@ -86,7 +86,7 @@ public class CaptivePortalLoginActivity extends Activity { - if (server == null) server = DEFAULT_SERVER; - mCm = ConnectivityManager.from(this); - try { -- mURL = new URL("http", server, "/generate_204"); -+ mURL = new URL("https://spotco.us/gen204.php"); - } catch (MalformedURLException e) { - // System misconfigured, bail out in a way that at least provides network access. - Log.e(TAG, "Invalid captive portal URL, server=" + server); -diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java -index 5108564..0ebf739 100644 ---- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java -+++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java -@@ -640,7 +640,7 @@ public class NetworkMonitor extends StateMachine { - HttpURLConnection urlConnection = null; - int httpResponseCode = 599; - try { -- URL url = new URL("http", mServer, "/generate_204"); -+ URL url = new URL("https://spotco.us/gen204.php"); - // On networks with a PAC instead of fetching a URL that should result in a 204 - // reponse, we instead simply fetch the PAC script. This is done for a few reasons: - // 1. At present our PAC code does not yet handle multiple PACs on multiple networks --- -2.7.4 - diff --git a/Patches/CyanogenMod-13.0/android_frameworks_base/DNSCrypt.patch b/Patches/CyanogenMod-13.0/android_frameworks_base/DNSCrypt.patch deleted file mode 100644 index ee5703e0..00000000 --- a/Patches/CyanogenMod-13.0/android_frameworks_base/DNSCrypt.patch +++ /dev/null @@ -1,226 +0,0 @@ -From 322f9019c0ca410c0d72190dd17bc316351d35db Mon Sep 17 00:00:00 2001 -From: Martin Brabham -Date: Fri, 9 Jan 2015 16:20:34 -0800 -Subject: [PATCH] DNSCrypt: Encrypt dns queries - Add DNS encryption settings - constants. - Listen for settings changes and handle rerouting dns queries - - Handle switching servers - -Change-Id: Ic97285ac6924aa0c930ff59709da384e197cd3ca ---- - core/java/android/provider/Settings.java | 22 ++++ - .../com/android/server/ConnectivityService.java | 116 ++++++++++++++++++--- - 2 files changed, 123 insertions(+), 15 deletions(-) - -diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java -index f6642d8..9905483 100644 ---- a/core/java/android/provider/Settings.java -+++ b/core/java/android/provider/Settings.java -@@ -4058,6 +4058,28 @@ public final class Settings { - public static final class Secure extends NameValueTable { - public static final String SYS_PROP_SETTING_VERSION = "sys.settings_secure_version"; - -+ // DNS Encryption -+ -+ /** -+ * @hide -+ */ -+ public static final String DNS_ENCRYPTION_TOGGLE = "dns_enc_toggle"; -+ -+ /** -+ * @hide -+ */ -+ public static final int DNS_ENCRYPTION_TOGGLE_DEFAULT = 0; -+ -+ /** -+ * @hide -+ */ -+ public static final String DNS_ENCRYPTION_SERVER = "dns_enc_server"; -+ -+ /** -+ * @hide -+ */ -+ public static final String DNS_ENCRYPTION_SERVER_DEFAULT = "opendns"; -+ - /** - * The content:// style URL for this table - */ -diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java -index 2a47460..0e6578f 100644 ---- a/services/core/java/com/android/server/ConnectivityService.java -+++ b/services/core/java/com/android/server/ConnectivityService.java -@@ -91,6 +91,8 @@ import android.os.SystemProperties; - import android.os.UserHandle; - import android.os.UserManager; - import android.provider.Settings; -+import android.provider.Settings.Secure; -+import android.provider.Settings.SettingNotFoundException; - import android.security.Credentials; - import android.security.KeyStore; - import android.telephony.TelephonyManager; -@@ -167,6 +169,9 @@ public class ConnectivityService extends IConnectivityManager.Stub - implements PendingIntent.OnFinished { - private static final String TAG = "ConnectivityService"; - -+ private static final String NETID_UPDATE = -+ "org.codeaurora.NETID_UPDATE"; -+ - private static final boolean DBG = true; - private static final boolean VDBG = false; - -@@ -229,6 +234,16 @@ public class ConnectivityService extends IConnectivityManager.Stub - private static final int ENABLED = 1; - private static final int DISABLED = 0; - -+ // DNS Encryption variables -+ private static final String DNSCRYPT_SERVICE = "dnscrypt-proxy"; -+ private static final String LOOPBACK_ADDR = "127.0.0.1"; -+ private static final String NULL_DOMAIN = ""; -+ private boolean mDnsEncryptionEnabled = false; -+ private String mDnsEncryptionServer = Secure.DNS_ENCRYPTION_SERVER_DEFAULT; -+ private Collection mActualDnses = new ArrayList(); -+ private int mNetId = -1; -+ private String mActualDomains = null; -+ - private enum ReapUnvalidatedNetworks { - // Tear down networks that have no chance (e.g. even if validated) of becoming - // the highest scoring network satisfying a NetworkRequest. This should be passed when -@@ -827,6 +842,13 @@ public class ConnectivityService extends IConnectivityManager.Stub - mSettingsObserver.observe( - Settings.Global.getUriFor(Settings.Global.MOBILE_DATA_ALWAYS_ON), - EVENT_CONFIGURE_MOBILE_DATA_ALWAYS_ON); -+ -+ // Watch for whether or not to use DNScrypt -+ resolver.registerContentObserver(Settings.Secure.getUriFor( -+ Secure.DNS_ENCRYPTION_TOGGLE), false, this); -+ resolver.registerContentObserver(Settings.Secure.getUriFor(Secure -+ .DNS_ENCRYPTION_SERVER), false, this); -+ onPreferencesChanged(); - } - - private synchronized int nextNetworkRequestId() { -@@ -3027,7 +3049,7 @@ public class ConnectivityService extends IConnectivityManager.Stub - } - } - -- private static class SettingsObserver extends ContentObserver { -+ private class SettingsObserver extends ContentObserver { - final private HashMap mUriEventMap; - final private Context mContext; - final private Handler mHandler; -@@ -3058,7 +3080,70 @@ public class ConnectivityService extends IConnectivityManager.Stub - } else { - loge("No matching event to send for URI=" + uri); - } -+ onPreferencesChanged(); -+ } -+ } -+ -+ /** -+ * Called when preference are updated from Settings -+ * {@hide} -+ */ -+ private void onPreferencesChanged() { -+ setDnsEncryptionDns(); -+ } -+ -+ /** -+ * Updates the DNS to either encrypted or regular -+ */ -+ private void setDnsEncryptionDns() { -+ try { -+ mDnsEncryptionEnabled = Secure.getIntForUser(mContext.getContentResolver(), -+ Secure.DNS_ENCRYPTION_TOGGLE, UserHandle.USER_CURRENT) != 0; -+ } catch (SettingNotFoundException e) { -+ loge("Exception getting dns enabled setting: " + e); -+ } -+ String serverName = Secure.getStringForUser(mContext.getContentResolver(), -+ Secure.DNS_ENCRYPTION_SERVER, UserHandle.USER_CURRENT); -+ serverName = (TextUtils.isEmpty(serverName)) ? Secure.DNS_ENCRYPTION_SERVER_DEFAULT : -+ serverName; -+ -+ // If they aren't equal, then we have a change! -+ boolean changed = !mDnsEncryptionServer.equals(serverName); -+ -+ // Set last server name -+ mDnsEncryptionServer = serverName; -+ -+ log("DNS Encryption Enabled: " + mDnsEncryptionEnabled); -+ Collection dnses = mActualDnses; -+ String domains = mActualDomains; -+ if (mDnsEncryptionEnabled) { -+ if (changed) { -+ // If we had a server change, need to restart service to pick up new server -+ SystemProperties.set("ctl.stop", DNSCRYPT_SERVICE); -+ SystemProperties.set("net.dnscrypt_resolver", mDnsEncryptionServer); -+ } -+ SystemProperties.set("ctl.start", DNSCRYPT_SERVICE); -+ dnses = new ArrayList(); -+ dnses.add(NetworkUtils.numericToInetAddress(LOOPBACK_ADDR)); -+ domains = NULL_DOMAIN; -+ } else { -+ SystemProperties.set("ctl.stop", DNSCRYPT_SERVICE); -+ } -+ updateDnsesInternal(dnses, mNetId, domains); -+ } -+ -+ private void updateDnsesInternal(Collection dnses, int netId, String domains) { -+ if (DBG) log("Setting Dns servers for network " + netId + " to " + dnses); -+ try { -+ mNetd.setDnsServersForNetwork(netId, NetworkUtils.makeStrings(dnses), domains); -+ } catch (Exception e) { -+ loge("Exception in setDnsServersForNetwork: " + e); -+ } -+ NetworkAgentInfo defaultNai = mNetworkForRequestId.get(mDefaultRequest.requestId); -+ if (defaultNai != null && defaultNai.network.netId == netId) { -+ setDefaultDnsSystemProperties(dnses); - } -+ flushVmDnsCache(); - } - - private static void log(String s) { -@@ -4122,27 +4207,28 @@ public class ConnectivityService extends IConnectivityManager.Stub - - private void updateDnses(LinkProperties newLp, LinkProperties oldLp, int netId, - boolean flush, boolean useDefaultDns) { -- if (oldLp == null || (newLp.isIdenticalDnses(oldLp) == false)) { -- Collection dnses = newLp.getDnsServers(); -+ if (oldLp == null || !newLp.isIdenticalDnses(oldLp)) { -+ Collection dnses = newLp.getDnsServers(); - if (dnses.size() == 0 && mDefaultDns != null && useDefaultDns) { -- dnses = new ArrayList(); -+ dnses = new ArrayList(); - dnses.add(mDefaultDns); - if (DBG) { - loge("no dns provided for netId " + netId + ", so using defaults"); - } - } -- if (DBG) log("Setting Dns servers for network " + netId + " to " + dnses); -- try { -- mNetd.setDnsServersForNetwork(netId, NetworkUtils.makeStrings(dnses), -- newLp.getDomains()); -- } catch (Exception e) { -- loge("Exception in setDnsServersForNetwork: " + e); -- } -- final NetworkAgentInfo defaultNai = getDefaultNetwork(); -- if (defaultNai != null && defaultNai.network.netId == netId) { -- setDefaultDnsSystemProperties(dnses); -+ -+ // Set tracking fields -+ mNetId = netId; -+ mActualDnses = dnses; -+ mActualDomains = newLp.getDomains(); -+ -+ String domains = mActualDomains; -+ if (mDnsEncryptionEnabled) { -+ dnses = new ArrayList(); -+ dnses.add(NetworkUtils.numericToInetAddress(LOOPBACK_ADDR)); -+ domains = NULL_DOMAIN; - } -- flushVmDnsCache(); -+ updateDnsesInternal(dnses, netId, domains); - } else if (flush) { - try { - mNetd.flushNetworkDnsCache(netId); --- -2.7.4 - diff --git a/Patches/CyanogenMod-13.0/android_frameworks_base/FailedUnlockShutdown.patch b/Patches/CyanogenMod-13.0/android_frameworks_base/FailedUnlockShutdown.patch deleted file mode 100644 index cfe43b61..00000000 --- a/Patches/CyanogenMod-13.0/android_frameworks_base/FailedUnlockShutdown.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 9b8ea26004ada2b15d0403f55a23a0c02d16c5b2 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sat, 2 Apr 2016 11:28:50 -0400 -Subject: [PATCH] Shutdown after 5 failed unlock attempts - -Change-Id: If18654ff5816a1c7b31187b4c511b940772c20cf ---- - .../Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java | 5 +++++ - packages/SystemUI/AndroidManifest.xml | 1 + - 2 files changed, 6 insertions(+) - -diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java -index 827b378..3bb587b 100644 ---- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java -+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java -@@ -19,6 +19,7 @@ import android.app.Activity; - import android.app.AlertDialog; - import android.app.admin.DevicePolicyManager; - import android.content.Context; -+import android.os.PowerManager; - import android.os.RemoteException; - import android.os.UserHandle; - import android.util.AttributeSet; -@@ -294,6 +295,10 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe - if (timeoutMs > 0) { - showTimeoutDialog(timeoutMs); - } -+ if(failedAttempts >= 5) { -+ final PowerManager powerManager = mContext.getSystemService(PowerManager.class); -+ powerManager.shutdown(false, false); -+ } - } - - /** -diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml -index 1562901..add89a4 100644 ---- a/packages/SystemUI/AndroidManifest.xml -+++ b/packages/SystemUI/AndroidManifest.xml -@@ -109,6 +109,7 @@ - - - -+ - - - --- -2.8.0 - diff --git a/Patches/CyanogenMod-13.0/android_frameworks_base/Hostname_Rand.patch b/Patches/CyanogenMod-13.0/android_frameworks_base/Hostname_Rand.patch deleted file mode 100644 index d9dec323..00000000 --- a/Patches/CyanogenMod-13.0/android_frameworks_base/Hostname_Rand.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 6ee2fef0118b2e2955bcec974af36c5ed107deb3 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Mon, 18 Apr 2016 09:21:48 -0400 -Subject: [PATCH] Implement hostname Randomization - -Change-Id: I938b7e896716ea4cb79b4a2e9d852dbe968a778d ---- - services/core/java/com/android/server/ConnectivityService.java | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java -index 2a47460..4dccc03 100644 ---- a/services/core/java/com/android/server/ConnectivityService.java -+++ b/services/core/java/com/android/server/ConnectivityService.java -@@ -146,6 +146,7 @@ import java.io.PrintWriter; - import java.net.Inet4Address; - import java.net.InetAddress; - import java.net.UnknownHostException; -+import java.security.SecureRandom; - import java.util.ArrayDeque; - import java.util.ArrayList; - import java.util.Arrays; -@@ -646,8 +647,13 @@ public class ConnectivityService extends IConnectivityManager.Stub - mTrackerHandler = new NetworkStateTrackerHandler(mHandlerThread.getLooper()); - - // setup our unique device name -- String hostname = CMSettings.Secure.getString(context.getContentResolver(), -+ String hostname; -+ if(SystemProperties.getBoolean("persist.privacy.randomize_host", true)) { -+ hostname = Long.toHexString(new SecureRandom().nextLong()); -+ } else { -+ hostname = CMSettings.Secure.getString(context.getContentResolver(), - CMSettings.Secure.DEVICE_HOSTNAME); -+ } - if (TextUtils.isEmpty(hostname) && - TextUtils.isEmpty(SystemProperties.get("net.hostname"))) { - String id = Settings.Secure.getString(context.getContentResolver(), --- -2.8.0 - diff --git a/Patches/CyanogenMod-13.0/android_frameworks_base/Radio-1.patch b/Patches/CyanogenMod-13.0/android_frameworks_base/Radio-1.patch deleted file mode 100644 index e5efe64f..00000000 --- a/Patches/CyanogenMod-13.0/android_frameworks_base/Radio-1.patch +++ /dev/null @@ -1,198 +0,0 @@ -From f00b971d99ae9320cf463f32c860640a4b67b179 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Mon, 8 Aug 2016 16:01:07 -0400 -Subject: [PATCH] Add radio tile (1/2) - -Change-Id: I5d1cb2fede884b9aa044e0de0cf6459d225e0016 ---- - packages/SystemUI/res/drawable/ic_qs_radio_off.xml | 10 +++ - packages/SystemUI/res/drawable/ic_qs_radio_on.xml | 10 +++ - packages/SystemUI/res/values/cm_strings.xml | 1 + - .../src/com/android/systemui/qs/RadioTile.java | 92 ++++++++++++++++++++++ - .../systemui/statusbar/phone/QSTileHost.java | 4 + - 5 files changed, 117 insertions(+) - create mode 100644 packages/SystemUI/res/drawable/ic_qs_radio_off.xml - create mode 100644 packages/SystemUI/res/drawable/ic_qs_radio_on.xml - create mode 100644 packages/SystemUI/src/com/android/systemui/qs/RadioTile.java - -diff --git a/packages/SystemUI/res/drawable/ic_qs_radio_off.xml b/packages/SystemUI/res/drawable/ic_qs_radio_off.xml -new file mode 100644 -index 0000000..1cb4918 ---- /dev/null -+++ b/packages/SystemUI/res/drawable/ic_qs_radio_off.xml -@@ -0,0 +1,10 @@ -+ -+ -+ -+ -diff --git a/packages/SystemUI/res/drawable/ic_qs_radio_on.xml b/packages/SystemUI/res/drawable/ic_qs_radio_on.xml -new file mode 100644 -index 0000000..d446deb ---- /dev/null -+++ b/packages/SystemUI/res/drawable/ic_qs_radio_on.xml -@@ -0,0 +1,10 @@ -+ -+ -+ -+ -diff --git a/packages/SystemUI/res/values/cm_strings.xml b/packages/SystemUI/res/values/cm_strings.xml -index 2996d21..41b65ae 100644 ---- a/packages/SystemUI/res/values/cm_strings.xml -+++ b/packages/SystemUI/res/values/cm_strings.xml -@@ -103,6 +103,7 @@ - System profiles - Profiles disabled - Heads up -+ Radio power - Battery saver - - Battery saver (charging) -diff --git a/packages/SystemUI/src/com/android/systemui/qs/RadioTile.java b/packages/SystemUI/src/com/android/systemui/qs/RadioTile.java -new file mode 100644 -index 0000000..74cc6c0 ---- /dev/null -+++ b/packages/SystemUI/src/com/android/systemui/qs/RadioTile.java -@@ -0,0 +1,92 @@ -+package com.android.systemui.qs.tiles; -+ -+import android.content.BroadcastReceiver; -+import android.content.Context; -+import android.content.Intent; -+import android.content.IntentFilter; -+ -+import android.util.Log; -+import com.android.systemui.R; -+import com.android.systemui.qs.QSTile; -+import org.cyanogenmod.internal.util.QSUtils; -+ -+import com.android.internal.telephony.Phone; -+import com.android.internal.telephony.PhoneFactory; -+ -+public class RadioTile extends QSTile { -+ -+ private boolean mListening; -+ private Phone phone = null; -+ -+ private BroadcastReceiver mReceiver = new BroadcastReceiver() { -+ @Override -+ public void onReceive(Context context, Intent intent) { -+ refreshState(); -+ } -+ }; -+ -+ public RadioTile(Host host) { -+ super(host); -+ phone = PhoneFactory.getDefaultPhone(); -+ } -+ -+ @Override -+ protected BooleanState newTileState() { -+ return new BooleanState(); -+ } -+ -+ @Override -+ protected void handleClick() { -+ boolean newState = !getState().value; -+ setState(newState); -+ refreshState(); -+ } -+ -+ @Override -+ protected void handleLongClick() { -+ Intent lauchRadioInfo = new Intent(); -+ launchRadioInfo.setClassName("com.android.settings", "com.android.settings.RadioInfo"); -+ mHost.startActivityDismissingKeyguard(lauchRadioInfo); -+ } -+ -+ private void setEnabled(boolean enabled) { -+ phone.setRadioPower(enabled); -+ } -+ -+ @Override -+ protected void handleUpdateState(BooleanState state, Object arg) { -+ state.visible = true; -+ final boolean radioPower = arg instanceof Boolean ? (boolean) arg : phone.isRadioOn(); -+ state.value = radioPower; -+ state.label = mContext.getString(R.string.quick_settings_radio_power_label); -+ if(state.value) { -+ state.icon = ResourceIcon.get(R.drawable.ic_qs_radio_on); -+ } else { -+ state.icon = ResourceIcon.get(R.drawable.ic_qs_radio_off); -+ } -+ } -+ -+ @Override -+ public void setListening(boolean listening) { -+ if (mListening == listening) return; -+ mListening = listening; -+ if (listening) { -+ final IntentFilter filter = new IntentFilter(); -+ filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); -+ mContext.registerReceiver(mReceiver, filter); -+ } else { -+ mContext.unregisterReceiver(mReceiver); -+ } -+ mSetting.setListening(listening); -+ } -+ -+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() { -+ @Override -+ public void onReceive(Context context, Intent intent) { -+ if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())) { -+ refreshState(); -+ } -+ } -+ }; -+} -+} -diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java -index e88ed73..e6116b7 100644 ---- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java -+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java -@@ -59,6 +59,7 @@ import com.android.systemui.qs.tiles.LockscreenToggleTile; - import com.android.systemui.qs.tiles.NfcTile; - import com.android.systemui.qs.tiles.PerfProfileTile; - import com.android.systemui.qs.tiles.ProfilesTile; -+import com.android.systemui.qs.tiles.RadioTile; - import com.android.systemui.qs.tiles.RotationLockTile; - import com.android.systemui.qs.tiles.ScreenTimeoutTile; - import com.android.systemui.qs.tiles.SyncTile; -@@ -371,6 +372,7 @@ public class QSTileHost implements QSTile.Host, Tunable { - else if (tileSpec.equals("lockscreen")) return new LockscreenToggleTile(this); - else if (tileSpec.equals("ambient_display")) return new AmbientDisplayTile(this); - else if (tileSpec.equals("heads_up")) return new HeadsUpTile(this); -+ else if (tileSpec.equals("radio_power")) return new RadioTile(this); - else if (tileSpec.equals("battery_saver")) return new BatterySaverTile(this); - else if (tileSpec.equals("caffeine")) return new CaffeineTile(this); - else if (tileSpec.startsWith(IntentTile.PREFIX)) return IntentTile.create(this,tileSpec); -@@ -468,6 +470,7 @@ public class QSTileHost implements QSTile.Host, Tunable { - else if (spec.equals("lockscreen")) return R.string.quick_settings_lockscreen_label; - else if (spec.equals("ambient_display")) return R.string.quick_settings_ambient_display_label; - else if (spec.equals("heads_up")) return R.string.quick_settings_heads_up_label; -+ else if (spec.equals("radio_power")) return R.string.quick_settings_radio_power_label; - else if (spec.equals("battery_saver")) return R.string.quick_settings_battery_saver_label; - else if (spec.equals("caffeine")) return R.string.quick_settings_caffeine_label; - return 0; -@@ -498,6 +501,7 @@ public class QSTileHost implements QSTile.Host, Tunable { - else if (spec.equals("lockscreen")) return R.drawable.ic_qs_lock_screen_on; - else if (spec.equals("ambient_display")) return R.drawable.ic_qs_ambientdisplay_on; - else if (spec.equals("heads_up")) return R.drawable.ic_qs_heads_up_on; -+ else if (spec.equals("radio_power")) return R.drawable.ic_qs_radio_on; - else if (spec.equals("battery_saver")) return R.drawable.ic_qs_battery_saver_on; - else if (spec.equals("caffeine")) return R.drawable.ic_qs_caffeine_on; - return 0; --- -2.7.4 - diff --git a/Patches/CyanogenMod-13.0/android_frameworks_base/Remove_Analytics.patch b/Patches/CyanogenMod-13.0/android_frameworks_base/Remove_Analytics.patch deleted file mode 100644 index 88d9a648..00000000 --- a/Patches/CyanogenMod-13.0/android_frameworks_base/Remove_Analytics.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 367e1be44a79ed50b95c78f06ede4532294e96f6 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Wed, 24 Feb 2016 08:53:20 -0500 -Subject: [PATCH] Remove analytics - -Change-Id: Icbf1deb4fd0cd6696f3fa8e2edab2c30960b121b ---- - .../src/com/android/providers/settings/DatabaseHelper.java | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java -index 2b5c14f..0b094a0 100644 ---- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java -+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java -@@ -1917,8 +1917,6 @@ class DatabaseHelper extends SQLiteOpenHelper { - } - - if (upgradeVersion < 115) { -- moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_SECURE, -- new String[] { CMSettings.Secure.STATS_COLLECTION }, true); - if (mUserHandle == UserHandle.USER_OWNER) { - db.beginTransaction(); - SQLiteStatement stmt = null; --- -2.7.1 - diff --git a/Patches/CyanogenMod-13.0/android_frameworks_base/SignatureSpoofing.patch b/Patches/CyanogenMod-13.0/android_frameworks_base/SignatureSpoofing.patch deleted file mode 100644 index d132890e..00000000 --- a/Patches/CyanogenMod-13.0/android_frameworks_base/SignatureSpoofing.patch +++ /dev/null @@ -1,97 +0,0 @@ -From d3ec926a99694ed258f60f197a85b83b5f0e75f3 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Tue, 22 Mar 2016 15:10:47 -0400 -Subject: [PATCH] Allow packages to fake their signature - -Change-Id: Iba3b34256161926886c27ef63271795fd8b93f1a ---- - core/res/AndroidManifest.xml | 7 +++++++ - core/res/res/values/config.xml | 2 ++ - core/res/res/values/strings.xml | 5 +++++ - .../android/server/pm/PackageManagerService.java | 23 ++++++++++++++++++++-- - 4 files changed, 35 insertions(+), 2 deletions(-) - -diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml -index 50a4b38..9be1bcb 100644 ---- a/core/res/AndroidManifest.xml -+++ b/core/res/AndroidManifest.xml -@@ -1654,6 +1654,13 @@ - android:description="@string/permdesc_getPackageSize" - android:protectionLevel="normal" /> - -+ -+ -+ - -diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml -index 5cdce93..ac23bb6 100644 ---- a/core/res/res/values/config.xml -+++ b/core/res/res/values/config.xml -@@ -1298,6 +1298,8 @@ - - - com.android.location.fused -+ -+ com.google.android.gms - - - -diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml -index 1fef7e7..0924463 100644 ---- a/core/res/res/values/strings.xml -+++ b/core/res/res/values/strings.xml -@@ -615,6 +615,11 @@ - - - -+ -+ Spoof package signature -+ -+ Allows the app to pretend to be a different app. Malicious applications might be able to use this to access private application data. Grant this permission with caution only! -+ - - disable or modify status bar - -diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java -index d5c58df..7b68c3e 100644 ---- a/services/core/java/com/android/server/pm/PackageManagerService.java -+++ b/services/core/java/com/android/server/pm/PackageManagerService.java -@@ -2805,8 +2805,27 @@ public class PackageManagerService extends IPackageManager.Stub { - final Set permissions = permissionsState.getPermissions(userId); - final PackageUserState state = ps.readUserState(userId); - -- return PackageParser.generatePackageInfo(p, gids, flags, -- ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId); -+ return mayFakeSignature(p, PackageParser.generatePackageInfo(p, gids, flags, -+ ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId), -+ permissions); -+ } -+ -+ private PackageInfo mayFakeSignature(PackageParser.Package p, PackageInfo pi, -+ Set permissions) { -+ try { -+ if (permissions.contains("android.permission.FAKE_PACKAGE_SIGNATURE") -+ && p.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1 -+ && p.mAppMetaData != null) { -+ String sig = p.mAppMetaData.getString("fake-signature"); -+ if (sig != null) { -+ pi.signatures = new Signature[] {new Signature(sig)}; -+ } -+ } -+ } catch (Throwable t) { -+ // We should never die because of any failures, this is system code! -+ Log.w("PackageManagerService.FAKE_PACKAGE_SIGNATURE", t); -+ } -+ return pi; - } - - @Override --- -2.7.4 - diff --git a/Patches/CyanogenMod-13.0/android_frameworks_base/SignatureSpoofing2.patch b/Patches/CyanogenMod-13.0/android_frameworks_base/SignatureSpoofing2.patch deleted file mode 100644 index 72d68e7e..00000000 --- a/Patches/CyanogenMod-13.0/android_frameworks_base/SignatureSpoofing2.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 7357f8c0c8a6bdc09555ab47dae83f28346b8470 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Beno=C3=AEt=20Mauduit?= -Date: Wed, 22 Jun 2016 15:04:56 +0200 -Subject: [PATCH 1/1] Add signature Spoofing permission -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This is needed by GmsCore (https://microg.org/) to pretend -the existence of the official Play Services to applications calling -Google APIs. - -Signed-off-by: Benoît Mauduit ---- - core/res/AndroidManifest.xml | 7 +++++++ - core/res/res/values/config.xml | 2 ++ - core/res/res/values/strings.xml | 5 +++++ - .../android/server/pm/PackageManagerService.java | 23 ++++++++++++++++++++-- - 4 files changed, 35 insertions(+), 2 deletions(-) - -diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml -index ea0e39c..a936983 100644 ---- a/core/res/AndroidManifest.xml -+++ b/core/res/AndroidManifest.xml -@@ -1654,6 +1654,13 @@ - android:description="@string/permdesc_getPackageSize" - android:protectionLevel="normal" /> - -+ -+ -+ - -diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml -index c7846cf..916d8a5 100644 ---- a/core/res/res/values/config.xml -+++ b/core/res/res/values/config.xml -@@ -1298,6 +1298,8 @@ - - - com.android.location.fused -+ -+ com.google.android.gms - - - -diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml -index 58135db..e65367a 100644 ---- a/core/res/res/values/strings.xml -+++ b/core/res/res/values/strings.xml -@@ -616,6 +616,11 @@ - - - -+ Spoof package signature -+ -+ Allows the app to pretend to be a different app. Malicious applications might be able to use this to access private application data. Grant this permission with caution only! -+ -+ - disable or modify status bar - - Allows the app to disable the status bar or add and remove system icons. -diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java -index 0493180..35f49d7 100644 ---- a/services/core/java/com/android/server/pm/PackageManagerService.java -+++ b/services/core/java/com/android/server/pm/PackageManagerService.java -@@ -2816,8 +2816,27 @@ public class PackageManagerService extends IPackageManager.Stub { - final Set permissions = permissionsState.getPermissions(userId); - final PackageUserState state = ps.readUserState(userId); - -- return PackageParser.generatePackageInfo(p, gids, flags, -- ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId); -+ return mayFakeSignature(p, PackageParser.generatePackageInfo(p, gids, flags, -+ ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId), -+ permissions); -+ } -+ -+ private PackageInfo mayFakeSignature(PackageParser.Package p, PackageInfo pi, -+ Set permissions) { -+ try { -+ if (permissions.contains("android.permission.FAKE_PACKAGE_SIGNATURE") -+ && p.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1 -+ && p.mAppMetaData != null) { -+ String sig = p.mAppMetaData.getString("fake-signature"); -+ if (sig != null) { -+ pi.signatures = new Signature[] {new Signature(sig)}; -+ } -+ } -+ } catch (Throwable t) { -+ // We should never die because of any failures, this is system code! -+ Log.w("PackageManagerService.FAKE_PACKAGE_SIGNATURE", t); -+ } -+ return pi; - } - - @Override --- -2.8.1 - diff --git a/Patches/CyanogenMod-13.0/android_packages_apps_AudioFX/Fix.patch b/Patches/CyanogenMod-13.0/android_packages_apps_AudioFX/Fix.patch deleted file mode 100644 index 3e700c0b..00000000 --- a/Patches/CyanogenMod-13.0/android_packages_apps_AudioFX/Fix.patch +++ /dev/null @@ -1,7186 +0,0 @@ -From 3d3bef77e43c5c90c485e43047f1111386ca0e17 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Thu, 8 Sep 2016 07:01:19 -0400 -Subject: [PATCH] Build fixes - -Change-Id: I6428cca99c2b34a07a17843dcc8656a884b27873 ---- - res/values-af/cm_strings.xml | 49 ----------------- - res/values-af/strings.xml | 27 ---------- - res/values-am/cm_strings.xml | 18 ------- - res/values-am/strings.xml | 27 ---------- - res/values-ar/cm_strings.xml | 49 ----------------- - res/values-ar/strings.xml | 27 ---------- - res/values-as-rIN/cm_strings.xml | 48 ----------------- - res/values-as-rIN/strings.xml | 20 ------- - res/values-ast-rES/cm_strings.xml | 49 ----------------- - res/values-ast-rES/strings.xml | 31 ----------- - res/values-az-rAZ/cm_strings.xml | 48 ----------------- - res/values-be/cm_strings.xml | 48 ----------------- - res/values-be/strings.xml | 20 ------- - res/values-bg/cm_strings.xml | 49 ----------------- - res/values-bg/strings.xml | 27 ---------- - res/values-bn-rBD/cm_strings.xml | 48 ----------------- - res/values-bn-rBD/strings.xml | 28 ---------- - res/values-bn/cm_strings.xml | 48 ----------------- - res/values-br-rFR/cm_strings.xml | 18 ------- - res/values-br-rFR/strings.xml | 20 ------- - res/values-bs-rBA/cm_strings.xml | 18 ------- - res/values-bs-rBA/strings.xml | 20 ------- - res/values-ca/cm_strings.xml | 49 ----------------- - res/values-ca/strings.xml | 27 ---------- - res/values-cs/cm_strings.xml | 49 ----------------- - res/values-cs/strings.xml | 27 ---------- - res/values-csb-rPL/cm_strings.xml | 18 ------- - res/values-csb-rPL/strings.xml | 20 ------- - res/values-cy/cm_strings.xml | 18 ------- - res/values-cy/strings.xml | 20 ------- - res/values-da/cm_strings.xml | 49 ----------------- - res/values-da/strings.xml | 27 ---------- - res/values-de/cm_strings.xml | 49 ----------------- - res/values-de/strings.xml | 27 ---------- - res/values-el/cm_strings.xml | 49 ----------------- - res/values-el/strings.xml | 27 ---------- - res/values-en-rAU/cm_strings.xml | 48 ----------------- - res/values-en-rAU/strings.xml | 27 ---------- - res/values-en-rGB/cm_strings.xml | 18 ------- - res/values-en-rGB/strings.xml | 27 ---------- - res/values-en-rIN/cm_strings.xml | 48 ----------------- - res/values-en-rIN/strings.xml | 27 ---------- - res/values-en-rPT/cm_strings.xml | 18 ------- - res/values-en-rPT/strings.xml | 20 ------- - res/values-eo/cm_strings.xml | 48 ----------------- - res/values-eo/strings.xml | 20 ------- - res/values-es-rCO/cm_strings.xml | 18 ------- - res/values-es-rCO/strings.xml | 20 ------- - res/values-es-rMX/cm_strings.xml | 18 ------- - res/values-es-rMX/strings.xml | 20 ------- - res/values-es-rUS/cm_strings.xml | 49 ----------------- - res/values-es-rUS/strings.xml | 27 ---------- - res/values-es-rXA/strings.xml | 28 ---------- - res/values-es/cm_strings.xml | 49 ----------------- - res/values-es/strings.xml | 27 ---------- - res/values-et-rEE/cm_strings.xml | 49 ----------------- - res/values-et-rEE/strings.xml | 27 ---------- - res/values-eu-rES/cm_strings.xml | 49 ----------------- - res/values-fa/cm_strings.xml | 48 ----------------- - res/values-fa/strings.xml | 27 ---------- - res/values-fi/cm_strings.xml | 63 ---------------------- - res/values-fi/strings.xml | 27 ---------- - res/values-fil-rPH/cm_strings.xml | 18 ------- - res/values-fr-rCA/cm_strings.xml | 18 ------- - res/values-fr-rCA/strings.xml | 27 ---------- - res/values-fr/cm_strings.xml | 49 ----------------- - res/values-fr/strings.xml | 27 ---------- - res/values-frp-rIT/cm_strings.xml | 18 ------- - res/values-frp-rIT/strings.xml | 20 ------- - res/values-fy-rNL/cm_strings.xml | 18 ------- - res/values-fy-rNL/strings.xml | 20 ------- - res/values-ga-rIE/cm_strings.xml | 18 ------- - res/values-ga-rIE/strings.xml | 20 ------- - res/values-gd-rGB/cm_strings.xml | 18 ------- - res/values-gd-rGB/strings.xml | 20 ------- - res/values-gl-rES/cm_strings.xml | 48 ----------------- - res/values-gl/cm_strings.xml | 36 ------------- - res/values-gu-rIN/cm_strings.xml | 48 ----------------- - res/values-hdpi/knobs.xml | 20 ------- - res/values-hi/cm_strings.xml | 48 ----------------- - res/values-hi/strings.xml | 27 ---------- - res/values-hr/cm_strings.xml | 49 ----------------- - res/values-hr/strings.xml | 27 ---------- - res/values-hu/cm_strings.xml | 63 ---------------------- - res/values-hu/strings.xml | 27 ---------- - res/values-hy-rAM/cm_strings.xml | 18 ------- - res/values-in/cm_strings.xml | 49 ----------------- - res/values-in/strings.xml | 27 ---------- - res/values-is-rIS/cm_strings.xml | 18 ------- - res/values-it/cm_strings.xml | 63 ---------------------- - res/values-it/strings.xml | 27 ---------- - res/values-iw/cm_strings.xml | 49 ----------------- - res/values-iw/strings.xml | 27 ---------- - res/values-ja/cm_strings.xml | 49 ----------------- - res/values-ja/strings.xml | 27 ---------- - res/values-ka-rGE/cm_strings.xml | 18 ------- - res/values-kk-rKZ/cm_strings.xml | 18 ------- - res/values-km-rKH/cm_strings.xml | 18 ------- - res/values-kn-rIN/cm_strings.xml | 48 ----------------- - res/values-ko/cm_strings.xml | 49 ----------------- - res/values-ko/strings.xml | 27 ---------- - res/values-ku/cm_strings.xml | 48 ----------------- - res/values-ku/strings.xml | 31 ----------- - res/values-ky-rKG/cm_strings.xml | 18 ------- - res/values-land/dimens.xml | 20 ------- - res/values-lb/cm_strings.xml | 49 ----------------- - res/values-lb/strings.xml | 31 ----------- - res/values-lo-rLA/cm_strings.xml | 18 ------- - res/values-lt/cm_strings.xml | 48 ----------------- - res/values-lt/strings.xml | 27 ---------- - res/values-lv/cm_strings.xml | 48 ----------------- - res/values-lv/strings.xml | 27 ---------- - res/values-mk-rMK/cm_strings.xml | 18 ------- - res/values-ml-rIN/cm_strings.xml | 48 ----------------- - res/values-mn-rMN/cm_strings.xml | 18 ------- - res/values-mr-rIN/cm_strings.xml | 48 ----------------- - res/values-ms-rMY/cm_strings.xml | 18 ------- - res/values-ms-rMY/strings.xml | 27 ---------- - res/values-my-rMM/cm_strings.xml | 18 ------- - res/values-nb/cm_strings.xml | 49 ----------------- - res/values-nb/strings.xml | 27 ---------- - res/values-ne-rNP/cm_strings.xml | 18 ------- - res/values-nl/cm_strings.xml | 49 ----------------- - res/values-nl/strings.xml | 27 ---------- - res/values-oc-rFR/cm_strings.xml | 18 ------- - res/values-oc-rFR/strings.xml | 20 ------- - res/values-or-rIN/cm_strings.xml | 48 ----------------- - res/values-or-rIN/strings.xml | 20 ------- - res/values-pa-rIN/cm_strings.xml | 18 ------- - res/values-pl/cm_strings.xml | 49 ----------------- - res/values-pl/strings.xml | 27 ---------- - res/values-pt-rBR/cm_strings.xml | 49 ----------------- - res/values-pt-rPT/cm_strings.xml | 49 ----------------- - res/values-pt-rPT/strings.xml | 27 ---------- - res/values-pt/strings.xml | 27 ---------- - res/values-rm/cm_strings.xml | 18 ------- - res/values-ro/cm_strings.xml | 48 ----------------- - res/values-ro/strings.xml | 27 ---------- - res/values-ru/cm_strings.xml | 49 ----------------- - res/values-ru/strings.xml | 27 ---------- - res/values-si-rLK/cm_strings.xml | 48 ----------------- - res/values-sk/cm_strings.xml | 48 ----------------- - res/values-sk/strings.xml | 27 ---------- - res/values-sl/cm_strings.xml | 49 ----------------- - res/values-sl/strings.xml | 27 ---------- - res/values-sq-rAL/cm_strings.xml | 18 ------- - res/values-sr/cm_strings.xml | 49 ----------------- - res/values-sr/strings.xml | 27 ---------- - res/values-sv/cm_strings.xml | 49 ----------------- - res/values-sv/strings.xml | 27 ---------- - res/values-sw/cm_strings.xml | 18 ------- - res/values-sw/strings.xml | 27 ---------- - res/values-ta-rIN/cm_strings.xml | 48 ----------------- - res/values-te-rIN/cm_strings.xml | 48 ----------------- - res/values-th/cm_strings.xml | 49 ----------------- - res/values-th/strings.xml | 27 ---------- - res/values-tl/strings.xml | 27 ---------- - res/values-tr/cm_strings.xml | 49 ----------------- - res/values-tr/strings.xml | 27 ---------- - res/values-ug/cm_strings.xml | 48 ----------------- - res/values-ug/strings.xml | 27 ---------- - res/values-uk/cm_strings.xml | 48 ----------------- - res/values-uk/strings.xml | 27 ---------- - res/values-ur-rPK/cm_strings.xml | 18 ------- - res/values-uz-rUZ/cm_strings.xml | 18 ------- - res/values-vi/cm_strings.xml | 49 ----------------- - res/values-vi/strings.xml | 27 ---------- - res/values-xlarge/dimens.xml | 20 ------- - res/values-zh-rCN/cm_strings.xml | 49 ----------------- - res/values-zh-rCN/strings.xml | 27 ---------- - res/values-zh-rHK/cm_strings.xml | 48 ----------------- - res/values-zh-rHK/strings.xml | 27 ---------- - res/values-zh-rTW/cm_strings.xml | 49 ----------------- - res/values-zh-rTW/strings.xml | 27 ---------- - res/values-zu/cm_strings.xml | 18 ------- - res/values-zu/strings.xml | 27 ---------- - .../cyanogenmod/audiofx/AudioFxApplication.java | 6 --- - 177 files changed, 5756 deletions(-) - delete mode 100644 res/values-af/cm_strings.xml - delete mode 100644 res/values-af/strings.xml - delete mode 100644 res/values-am/cm_strings.xml - delete mode 100644 res/values-am/strings.xml - delete mode 100644 res/values-ar/cm_strings.xml - delete mode 100644 res/values-ar/strings.xml - delete mode 100644 res/values-as-rIN/cm_strings.xml - delete mode 100644 res/values-as-rIN/strings.xml - delete mode 100644 res/values-ast-rES/cm_strings.xml - delete mode 100644 res/values-ast-rES/strings.xml - delete mode 100644 res/values-az-rAZ/cm_strings.xml - delete mode 100644 res/values-be/cm_strings.xml - delete mode 100644 res/values-be/strings.xml - delete mode 100644 res/values-bg/cm_strings.xml - delete mode 100644 res/values-bg/strings.xml - delete mode 100644 res/values-bn-rBD/cm_strings.xml - delete mode 100644 res/values-bn-rBD/strings.xml - delete mode 100644 res/values-bn/cm_strings.xml - delete mode 100644 res/values-br-rFR/cm_strings.xml - delete mode 100644 res/values-br-rFR/strings.xml - delete mode 100644 res/values-bs-rBA/cm_strings.xml - delete mode 100644 res/values-bs-rBA/strings.xml - delete mode 100644 res/values-ca/cm_strings.xml - delete mode 100644 res/values-ca/strings.xml - delete mode 100644 res/values-cs/cm_strings.xml - delete mode 100644 res/values-cs/strings.xml - delete mode 100644 res/values-csb-rPL/cm_strings.xml - delete mode 100644 res/values-csb-rPL/strings.xml - delete mode 100644 res/values-cy/cm_strings.xml - delete mode 100644 res/values-cy/strings.xml - delete mode 100644 res/values-da/cm_strings.xml - delete mode 100644 res/values-da/strings.xml - delete mode 100644 res/values-de/cm_strings.xml - delete mode 100644 res/values-de/strings.xml - delete mode 100644 res/values-el/cm_strings.xml - delete mode 100644 res/values-el/strings.xml - delete mode 100644 res/values-en-rAU/cm_strings.xml - delete mode 100644 res/values-en-rAU/strings.xml - delete mode 100644 res/values-en-rGB/cm_strings.xml - delete mode 100644 res/values-en-rGB/strings.xml - delete mode 100644 res/values-en-rIN/cm_strings.xml - delete mode 100644 res/values-en-rIN/strings.xml - delete mode 100644 res/values-en-rPT/cm_strings.xml - delete mode 100644 res/values-en-rPT/strings.xml - delete mode 100644 res/values-eo/cm_strings.xml - delete mode 100644 res/values-eo/strings.xml - delete mode 100644 res/values-es-rCO/cm_strings.xml - delete mode 100644 res/values-es-rCO/strings.xml - delete mode 100644 res/values-es-rMX/cm_strings.xml - delete mode 100644 res/values-es-rMX/strings.xml - delete mode 100644 res/values-es-rUS/cm_strings.xml - delete mode 100644 res/values-es-rUS/strings.xml - delete mode 100644 res/values-es-rXA/strings.xml - delete mode 100644 res/values-es/cm_strings.xml - delete mode 100644 res/values-es/strings.xml - delete mode 100644 res/values-et-rEE/cm_strings.xml - delete mode 100644 res/values-et-rEE/strings.xml - delete mode 100644 res/values-eu-rES/cm_strings.xml - delete mode 100644 res/values-fa/cm_strings.xml - delete mode 100644 res/values-fa/strings.xml - delete mode 100644 res/values-fi/cm_strings.xml - delete mode 100644 res/values-fi/strings.xml - delete mode 100644 res/values-fil-rPH/cm_strings.xml - delete mode 100644 res/values-fr-rCA/cm_strings.xml - delete mode 100644 res/values-fr-rCA/strings.xml - delete mode 100644 res/values-fr/cm_strings.xml - delete mode 100644 res/values-fr/strings.xml - delete mode 100644 res/values-frp-rIT/cm_strings.xml - delete mode 100644 res/values-frp-rIT/strings.xml - delete mode 100644 res/values-fy-rNL/cm_strings.xml - delete mode 100644 res/values-fy-rNL/strings.xml - delete mode 100644 res/values-ga-rIE/cm_strings.xml - delete mode 100644 res/values-ga-rIE/strings.xml - delete mode 100644 res/values-gd-rGB/cm_strings.xml - delete mode 100644 res/values-gd-rGB/strings.xml - delete mode 100644 res/values-gl-rES/cm_strings.xml - delete mode 100644 res/values-gl/cm_strings.xml - delete mode 100644 res/values-gu-rIN/cm_strings.xml - delete mode 100644 res/values-hdpi/knobs.xml - delete mode 100644 res/values-hi/cm_strings.xml - delete mode 100644 res/values-hi/strings.xml - delete mode 100644 res/values-hr/cm_strings.xml - delete mode 100644 res/values-hr/strings.xml - delete mode 100644 res/values-hu/cm_strings.xml - delete mode 100644 res/values-hu/strings.xml - delete mode 100644 res/values-hy-rAM/cm_strings.xml - delete mode 100644 res/values-in/cm_strings.xml - delete mode 100644 res/values-in/strings.xml - delete mode 100644 res/values-is-rIS/cm_strings.xml - delete mode 100644 res/values-it/cm_strings.xml - delete mode 100644 res/values-it/strings.xml - delete mode 100644 res/values-iw/cm_strings.xml - delete mode 100644 res/values-iw/strings.xml - delete mode 100644 res/values-ja/cm_strings.xml - delete mode 100644 res/values-ja/strings.xml - delete mode 100644 res/values-ka-rGE/cm_strings.xml - delete mode 100644 res/values-kk-rKZ/cm_strings.xml - delete mode 100644 res/values-km-rKH/cm_strings.xml - delete mode 100644 res/values-kn-rIN/cm_strings.xml - delete mode 100644 res/values-ko/cm_strings.xml - delete mode 100644 res/values-ko/strings.xml - delete mode 100644 res/values-ku/cm_strings.xml - delete mode 100644 res/values-ku/strings.xml - delete mode 100644 res/values-ky-rKG/cm_strings.xml - delete mode 100644 res/values-land/dimens.xml - delete mode 100644 res/values-lb/cm_strings.xml - delete mode 100644 res/values-lb/strings.xml - delete mode 100644 res/values-lo-rLA/cm_strings.xml - delete mode 100644 res/values-lt/cm_strings.xml - delete mode 100644 res/values-lt/strings.xml - delete mode 100644 res/values-lv/cm_strings.xml - delete mode 100644 res/values-lv/strings.xml - delete mode 100644 res/values-mk-rMK/cm_strings.xml - delete mode 100644 res/values-ml-rIN/cm_strings.xml - delete mode 100644 res/values-mn-rMN/cm_strings.xml - delete mode 100644 res/values-mr-rIN/cm_strings.xml - delete mode 100644 res/values-ms-rMY/cm_strings.xml - delete mode 100644 res/values-ms-rMY/strings.xml - delete mode 100644 res/values-my-rMM/cm_strings.xml - delete mode 100644 res/values-nb/cm_strings.xml - delete mode 100644 res/values-nb/strings.xml - delete mode 100644 res/values-ne-rNP/cm_strings.xml - delete mode 100644 res/values-nl/cm_strings.xml - delete mode 100644 res/values-nl/strings.xml - delete mode 100644 res/values-oc-rFR/cm_strings.xml - delete mode 100644 res/values-oc-rFR/strings.xml - delete mode 100644 res/values-or-rIN/cm_strings.xml - delete mode 100644 res/values-or-rIN/strings.xml - delete mode 100644 res/values-pa-rIN/cm_strings.xml - delete mode 100644 res/values-pl/cm_strings.xml - delete mode 100644 res/values-pl/strings.xml - delete mode 100644 res/values-pt-rBR/cm_strings.xml - delete mode 100644 res/values-pt-rPT/cm_strings.xml - delete mode 100644 res/values-pt-rPT/strings.xml - delete mode 100644 res/values-pt/strings.xml - delete mode 100644 res/values-rm/cm_strings.xml - delete mode 100644 res/values-ro/cm_strings.xml - delete mode 100644 res/values-ro/strings.xml - delete mode 100644 res/values-ru/cm_strings.xml - delete mode 100644 res/values-ru/strings.xml - delete mode 100644 res/values-si-rLK/cm_strings.xml - delete mode 100644 res/values-sk/cm_strings.xml - delete mode 100644 res/values-sk/strings.xml - delete mode 100644 res/values-sl/cm_strings.xml - delete mode 100644 res/values-sl/strings.xml - delete mode 100644 res/values-sq-rAL/cm_strings.xml - delete mode 100644 res/values-sr/cm_strings.xml - delete mode 100644 res/values-sr/strings.xml - delete mode 100644 res/values-sv/cm_strings.xml - delete mode 100644 res/values-sv/strings.xml - delete mode 100644 res/values-sw/cm_strings.xml - delete mode 100644 res/values-sw/strings.xml - delete mode 100644 res/values-ta-rIN/cm_strings.xml - delete mode 100644 res/values-te-rIN/cm_strings.xml - delete mode 100644 res/values-th/cm_strings.xml - delete mode 100644 res/values-th/strings.xml - delete mode 100644 res/values-tl/strings.xml - delete mode 100644 res/values-tr/cm_strings.xml - delete mode 100644 res/values-tr/strings.xml - delete mode 100644 res/values-ug/cm_strings.xml - delete mode 100644 res/values-ug/strings.xml - delete mode 100644 res/values-uk/cm_strings.xml - delete mode 100644 res/values-uk/strings.xml - delete mode 100644 res/values-ur-rPK/cm_strings.xml - delete mode 100644 res/values-uz-rUZ/cm_strings.xml - delete mode 100644 res/values-vi/cm_strings.xml - delete mode 100644 res/values-vi/strings.xml - delete mode 100644 res/values-xlarge/dimens.xml - delete mode 100644 res/values-zh-rCN/cm_strings.xml - delete mode 100644 res/values-zh-rCN/strings.xml - delete mode 100644 res/values-zh-rHK/cm_strings.xml - delete mode 100644 res/values-zh-rHK/strings.xml - delete mode 100644 res/values-zh-rTW/cm_strings.xml - delete mode 100644 res/values-zh-rTW/strings.xml - delete mode 100644 res/values-zu/cm_strings.xml - delete mode 100644 res/values-zu/strings.xml - -diff --git a/res/values-af/cm_strings.xml b/res/values-af/cm_strings.xml -deleted file mode 100644 -index 91468c7..0000000 ---- a/res/values-af/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normaal -- Klassiek -- Dans -- Plat -- Volksmusiek -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Elektronies -- Klein luidsprekers -- Persoonlik -- Geen -- Klein kamer -- Medium kamer -- Groot kamer -- Medium saal -- Groot saal -- Plate -- Druk krag-knoppie bo-regs -- Effek nie beskikbaar vir Luidspreker modus. -- Oorfone -- Luidspreker -- USB -- Bluetooth -- Koordloos -- Line out -- Galm -- Voorafbepaalde gelykmaker -- -diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml -deleted file mode 100644 -index 120d1f4..0000000 ---- a/res/values-af/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Effekte nie beskikbaar nie." -- "Prop oorfone in vir hierdie effekte." -- "Basversterker" -- "Omringklank" -- "Stel op" -- "FX-versterker" -- "Gebruiker" -- "Beheerpaneel vir musiekeffekte" -- -diff --git a/res/values-am/cm_strings.xml b/res/values-am/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-am/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml -deleted file mode 100644 -index d261cd1..0000000 ---- a/res/values-am/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "ኢፌክት አልተገኘም" -- "እባክህ ለእነዚህ ኢፌክቶች የጆሮ ማዳመጫዎች ሰካ፡፡" -- "ወፍራም ደምጽ መጨመር" -- "የዙሪያ ድምጽ" -- "አዋቅር" -- "የኢፌክት መጨመሪያ" -- "ተጠቃሚ" -- "የሙዚቃ ተፅዕኖ መቆጣጠሪያ ፓናል" -- -diff --git a/res/values-ar/cm_strings.xml b/res/values-ar/cm_strings.xml -deleted file mode 100644 -index c3eaa56..0000000 ---- a/res/values-ar/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- عادي -- كلاسيكي -- رقص -- معتدل -- شعبي -- المعادن الثقيلة -- الهيب هوب -- الجاز -- البوب -- روك -- إلكتروني -- سماعات صغيرة -- مخصص -- بلا -- غرفة صغيرة -- غرفة متوسطة -- غرفة كبيرة -- قاعة متوسطة -- قاعة كبيرة -- لوح -- اضغط على زر الطاقة في الجزء الأيمن العلوي. -- التأثير غير متاح لوضع السماعة. -- سماعة الرأس -- سماعة -- USB -- بلوتوث -- لاسلكي -- توصيل -- الصدى -- التعيين المسبق للمعادل -- -diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml -deleted file mode 100644 -index 74720c9..0000000 ---- a/res/values-ar/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "التأثيرات غير متاحة." -- "يمكنك توصيل سماعات الرأس للاستماع إلى هذه التأثيرات" -- "تحسين الجهير" -- "الصوت المحيطي" -- "الإعداد" -- "FX Booster" -- "المستخدم" -- "لوحة تحكم التأثيرات الموسيقية" -- -diff --git a/res/values-as-rIN/cm_strings.xml b/res/values-as-rIN/cm_strings.xml -deleted file mode 100644 -index 6745dd5..0000000 ---- a/res/values-as-rIN/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- সাধাৰণ -- ধ্ৰুপদী -- নৃত্য -- ফ্লেট -- লোক -- বেভী মেটেল -- হিপ হপ -- জেজ -- পপ -- ৰক -- ইলেক্ট্ৰনিক -- সৰু স্পিকাৰ -- কাষ্টম -- হাল্লা -- সৰু কোঠা -- মধ্যমীয়া কোঠা -- বিশাল কোঠা -- মধ্যমীয়া হ\'ল -- বিশাল হল -- প্লেট -- ওপৰৰ সোঁফালে থকা পাৱাৰ বুটামটো টিপক -- স্পিকাৰ মোডত প্ৰভাৱ উপলব্ধ নহয়। -- হেডছেট -- স্পীকাৰ -- USB -- ব্লুটুথ -- বেতাঁৰ -- ৰিভাৰ্ব -- ইকুইলাইজাৰ প্ৰিছেট -- -diff --git a/res/values-as-rIN/strings.xml b/res/values-as-rIN/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-as-rIN/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-ast-rES/cm_strings.xml b/res/values-ast-rES/cm_strings.xml -deleted file mode 100644 -index 9a5e970..0000000 ---- a/res/values-ast-rES/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normal -- Clásica -- Dance -- Plana -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Electronic -- Altavoces pequeños -- Custom -- Nengún -- Habitación pequeña -- Habitación media -- Habitación grande -- Sala media -- Sala grande -- Estudiu -- Calca nel botón d\'apagar na parte superior a mandrecha. -- L\'efeutu nun ta disponible nel mou altavoz. -- Auriculares -- Altavoz -- USB -- Bluetooth -- Wireless -- Salida de llinia -- Reverberación -- Ecualizador preestablecíu -- -diff --git a/res/values-ast-rES/strings.xml b/res/values-ast-rES/strings.xml -deleted file mode 100644 -index fc3a103..0000000 ---- a/res/values-ast-rES/strings.xml -+++ /dev/null -@@ -1,31 +0,0 @@ -- -- -- -- -- -- AudioFX -- Efeutos non disponibles. -- Efeutos d\'audiu -- Coneuta los cascos pa estos efeutos. -- Bass boost -- Soníu envolvente -- Reverberación: -- Efeutos de reverberación de sala adicionales -- Preaxuste de reverberación -- Configuración -- -- Panel de control d\'efeutos de música\" -- -diff --git a/res/values-az-rAZ/cm_strings.xml b/res/values-az-rAZ/cm_strings.xml -deleted file mode 100644 -index fbd54b8..0000000 ---- a/res/values-az-rAZ/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- Normal -- Klassik -- Rәqs -- Düz -- Xalq -- Ağır Metal -- Hip Hop -- Jazz -- Pop -- Rok -- Elektronik -- Kiçik səsucaldanlar -- Özəl -- Yoxdur -- Balaca otaq -- Orta otaq -- Böyük otaq -- Orta zal -- Böyük zal -- Boşqab -- Sağ yuxarıdakı güç düyməsinə basın. -- Effekt Səsucaldan rejimində mövcud deyil. -- Qulaqlıq -- Səsucaldan -- USB -- Bluetooth -- Simsiz -- Əks-səda -- Ekvalayzer hazır tənzimləmələri -- -diff --git a/res/values-be/cm_strings.xml b/res/values-be/cm_strings.xml -deleted file mode 100644 -index 1753ea8..0000000 ---- a/res/values-be/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- Звычайная -- Класічная -- Танцы -- Пляската -- Фолк -- Хэві-метал -- Хіп-хоп -- Джаз -- Поп -- Рок -- Электронная музыка -- Малыя дынамікі -- Карыстальніцкія -- Няма -- Маленькі пакой -- Сярэдні пакой -- Вялікі пакой -- Сярэдняя зала -- Вялікая зала -- Пласцінка -- Націсніце вымыкач у правым верхнім куце. -- Эфект недаступны для дынамікаў. -- Слухаўкі -- Дынамік -- USB -- Bluetooth -- Бесправодныя прылады -- Рэверберацыя -- Прадусталёўкі эквалайзера -- -diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-be/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-bg/cm_strings.xml b/res/values-bg/cm_strings.xml -deleted file mode 100644 -index 628a598..0000000 ---- a/res/values-bg/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Нормална -- Класическа -- Танцувална -- Плосък -- Фолк -- Хеви метъл -- Хип-хоп -- Джаз -- Поп -- Рок -- Електронна -- Малки говорители -- По избор -- Без -- Малка стая -- Среднa стая -- Голяма стая -- Средна зала -- Голяма зала -- Грамофонна плоча -- Натиснете бутона за включване от горе вдясно. -- Ефекта не е достъпен за високоговорителя. -- Слушалки -- Говорител -- USB -- Bluetooth -- Безжичен -- Линеен изход -- Ехо -- Настройки на еквалайзера -- -diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml -deleted file mode 100644 -index a94544a..0000000 ---- a/res/values-bg/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Ефектите не са налични." -- "Включете слушалки за тези ефекти." -- "Усилване на ниските честоти" -- "Съраунд звук" -- "Настройка" -- "FX Booster" -- "Потребител" -- "Муз. ефекти: Контролен панел" -- -diff --git a/res/values-bn-rBD/cm_strings.xml b/res/values-bn-rBD/cm_strings.xml -deleted file mode 100644 -index e0f0f01..0000000 ---- a/res/values-bn-rBD/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- স্বাভাবিক -- ধ্রুপদী -- নৃত্য -- ফ্ল্যাট -- লোকগীতি -- হেভি মেটাল -- হিপ-হপ -- জ্যাজ -- পপ -- রক -- ইলেকট্রনিক -- ছোট স্পিকার -- পছন্দসই -- কোনটি না -- ছোট ঘর -- মধ্যম ঘর -- বড় ঘর -- মধ্যম হল -- বড় হল -- প্লেট -- উপরের-ডানে পাওয়ার বোতাম চাপুন। -- স্পীকারের জন্য প্রভাব উপলব্ধ নয়। -- হেডসেট -- স্পীকার -- ইউএসবি -- ব্লুটুথ -- ওয়্যারলেস -- প্রতিধ্বনি -- ইকুয়ালাইজার বিন্যাস-পূর্বাবস্থা -- -diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml -deleted file mode 100644 -index 50cbbe6..0000000 ---- a/res/values-bn-rBD/strings.xml -+++ /dev/null -@@ -1,28 +0,0 @@ -- -- -- -- -- "Effekter er ikke tilgjengelige." -- "Sett inn hodetelefoner for å oppleve disse effektene." -- "Bassforsterking" -- -- -- "Konfigurering" -- "FX booster" -- "Bruker" -- "Kontr.panel for musikkeffekter" -- -diff --git a/res/values-bn/cm_strings.xml b/res/values-bn/cm_strings.xml -deleted file mode 100644 -index a9bcf85..0000000 ---- a/res/values-bn/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- স্বাভাবিক -- ধ্রুপদী -- নৃত্য -- ফ্ল্যাট -- লোকগীতি -- হেভি মেটাল -- হিপ-হপ -- জ্যাজ -- পপ -- রক -- ইলেকট্রনিক -- ছোট স্পিকার -- পছন্দসই -- কোনটি না -- ছোট ঘর -- মধ্যম ঘর -- বড় ঘর -- মধ্যম হল -- বড় হল -- প্লেট -- উপরের-ডানে পাওয়ার বোতাম চাপুন। -- স্পীকারের জন্য প্রভাব উপলব্ধ নয়। -- হেডসেট -- স্পীকার -- ইউএসবি -- ব্লুটুথ -- ওয়্যারলেস -- ইকুয়ালাইজার বিন্যাস-পূর্বাবস্থা -- প্রতিধ্বনি -- -diff --git a/res/values-br-rFR/cm_strings.xml b/res/values-br-rFR/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-br-rFR/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-br-rFR/strings.xml b/res/values-br-rFR/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-br-rFR/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-bs-rBA/cm_strings.xml b/res/values-bs-rBA/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-bs-rBA/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-bs-rBA/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-ca/cm_strings.xml b/res/values-ca/cm_strings.xml -deleted file mode 100644 -index e9d874c..0000000 ---- a/res/values-ca/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normal -- Clàssica -- Dance -- Plana -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Electrònica -- Altaveus petits -- Personalitzat -- Cap -- Habitació petita -- Habitació mitjana -- Habitació gran -- Sala mitjana -- Sala gran -- Estudi -- Apreta el botó d\'apagat a la part superior dreta. -- L\'efecte no està disponible en el mode Altaveu. -- Auriculars -- Altaveu -- USB -- Bluetooth -- Sense fils -- Sortida de línia -- Reverberació -- Presintonia de l\'equalitzador -- -diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml -deleted file mode 100644 -index fcf5a8d..0000000 ---- a/res/values-ca/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Efectes no disponibles." -- "Connecta els auriculars per a aquests efectes." -- "Accentuació de baixos" -- "So envoltant" -- "Configura" -- "FX booster" -- "Usuari" -- "Tauler de control dels efectes musicals" -- -diff --git a/res/values-cs/cm_strings.xml b/res/values-cs/cm_strings.xml -deleted file mode 100644 -index 2aed2ba..0000000 ---- a/res/values-cs/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normalní -- Klasická hudba -- Taneční -- Plochý -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Elektronická -- Malé reproduktory -- Vlastní -- Žádný -- Malá místnost -- Střední místnost -- Velká místnost -- Střední sál -- Velký sál -- Plochý -- Stiskněte tlačítko napájení v pravém horním rohu. -- Efekt není pro režim reproduktoru dostupný. -- Sluchátka -- Reproduktor -- USB -- Bluetooth -- Bezdrátové -- Linkový výstup -- Dozvuku -- Předvolba ekvalizéru -- -diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml -deleted file mode 100644 -index 0808eb3..0000000 ---- a/res/values-cs/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Efekty nejsou k dispozici." -- "Tyto efekty lze aktivovat pouze se zapojenými sluchátky." -- "Zvýraznění basů" -- "Prostorový zvuk" -- "Konfigurace" -- "FX Booster" -- "Vlastní" -- "Ovládací panel hudebních efektů" -- -diff --git a/res/values-csb-rPL/cm_strings.xml b/res/values-csb-rPL/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-csb-rPL/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-csb-rPL/strings.xml b/res/values-csb-rPL/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-csb-rPL/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-cy/cm_strings.xml b/res/values-cy/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-cy/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-cy/strings.xml b/res/values-cy/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-cy/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-da/cm_strings.xml b/res/values-da/cm_strings.xml -deleted file mode 100644 -index d81d8d1..0000000 ---- a/res/values-da/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normal -- Klassisk -- Dance -- Flad -- Folkemusik -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Elektronisk -- Små højttalere -- Brugerdefineret -- Ingen -- Lille værelse -- Mellemstort værelse -- Stort værelse -- Mellemstor hal -- Stor hal -- Plade -- Tryk på strømknappen øverst til højre. -- Effekt ikke tilgængelig i Højttalertilstand. -- Håndfri -- Højttaler -- USB -- Bluetooth -- Trådløs -- Linjeudgang -- Rumklang -- Equalizer-forudindstilling -- -diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml -deleted file mode 100644 -index dce99c2..0000000 ---- a/res/values-da/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Effekterne er ikke tilgængelige." -- "Tilslut hovedtelefoner for at få disse effekter." -- "Bass boost" -- "Surroundsound" -- "Opsætning" -- "FX booster" -- "Tilpasset" -- "Kontrolpanel for musikeffekter" -- -diff --git a/res/values-de/cm_strings.xml b/res/values-de/cm_strings.xml -deleted file mode 100644 -index a0fde18..0000000 ---- a/res/values-de/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normal -- Klassik -- Dance -- Aus -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Elektronisch -- Kleine Lautsprecher -- Benutzerdefiniert -- Keiner -- Kleiner Raum -- Mittlerer Raum -- Großer Raum -- Mittlerer Saal -- Großer Saal -- Hallplatte -- Drücken Sie den Einschaltknopf oben rechts. -- Effekt für Lautsprecher-Modus nicht verfügbar. -- Kopfhörer -- Lautsprecher -- USB -- Bluetooth -- Drahtlos -- Line-Ausgang -- Halleffekt -- Equalizer-Voreinstellung -- -diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml -deleted file mode 100644 -index 5147ba6..0000000 ---- a/res/values-de/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Effekte nicht verfügbar" -- "Für diese Effekte brauchst du Kopfhörer." -- "Bassverstärkung" -- "Surround-Sound" -- "Einrichtung" -- "FX-Verstärker" -- "Nutzer" -- "Steuerfeld für Musikeffekte" -- -diff --git a/res/values-el/cm_strings.xml b/res/values-el/cm_strings.xml -deleted file mode 100644 -index 64d2973..0000000 ---- a/res/values-el/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Κανονικό -- Κλασική -- Χορευτική -- Επίπεδο -- Λαϊκή -- Heavy Metal -- Χιπ χοπ -- Τζαζ -- Ποπ -- Ροκ -- Ηλεκτρονική -- Μικρά ηχεία -- Προσαρμοσμένο -- Κανένα -- Μικρό δωμάτιο -- Μεσαίο δωμάτιο -- Μεγάλο δωμάτιο -- Μεσαία αίθουσα -- Μεγάλη αίθουσα -- Πλάκα -- Πιέστε το πλήκτρο ενεργειών επάνω δεξιά. -- Το εφέ δεν είναι διαθέσιμο κατά την αναπαραγωγή από το ηχείο. -- Ακουστικά -- Ήχειο -- USB -- Bluetooth -- Ασύρματα -- Έξοδος -- Αντήχηση -- Προκαθορισμένη ρύθμιση ισοσταθμιστή -- -diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml -deleted file mode 100644 -index 288c95c..0000000 ---- a/res/values-el/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Τα εφέ δεν είναι διαθέσιμα." -- "Συνδέστε τα ακουστικά για αυτά τα εφέ." -- "Ενίσχυση μπάσων" -- "Περιφερειακός ήχος" -- "Ρύθμιση" -- "FX Booster" -- "Xρήστης" -- "Πίνακας ελέγχου μουσικών εφέ" -- -diff --git a/res/values-en-rAU/cm_strings.xml b/res/values-en-rAU/cm_strings.xml -deleted file mode 100644 -index 3bc92c4..0000000 ---- a/res/values-en-rAU/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- Normal -- Classical -- Dance -- Flat -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Electronic -- Small speakers -- Custom -- None -- Small room -- Medium room -- Large room -- Medium hall -- Large hall -- Plate -- Press the power button on the top-right. -- Effect not available for Speaker mode. -- Headset -- Speaker -- USB -- Bluetooth -- Wireless -- Reverb -- Equaliser preset -- -diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml -deleted file mode 100644 -index ad258f3..0000000 ---- a/res/values-en-rAU/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Effects not available." -- "Plug in headphones for these effects." -- "Bass boost" -- "Surround sound" -- "Setup" -- "FX booster" -- "User" -- "Music effects control panel" -- -diff --git a/res/values-en-rGB/cm_strings.xml b/res/values-en-rGB/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-en-rGB/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml -deleted file mode 100644 -index ad258f3..0000000 ---- a/res/values-en-rGB/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Effects not available." -- "Plug in headphones for these effects." -- "Bass boost" -- "Surround sound" -- "Setup" -- "FX booster" -- "User" -- "Music effects control panel" -- -diff --git a/res/values-en-rIN/cm_strings.xml b/res/values-en-rIN/cm_strings.xml -deleted file mode 100644 -index 5839260..0000000 ---- a/res/values-en-rIN/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- Normal -- Classical -- Dance -- Flat -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Electronic -- Small speakers -- Custom -- None -- Small room -- Medium room -- Large room -- Medium hall -- Large hall -- Plate -- Press the power button on the top-right. -- Effect not available for Speaker mode. -- Headset -- Speaker -- USB -- Bluetooth -- Wireless -- Reverb -- Equalizer preset -- -diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml -deleted file mode 100644 -index ad258f3..0000000 ---- a/res/values-en-rIN/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Effects not available." -- "Plug in headphones for these effects." -- "Bass boost" -- "Surround sound" -- "Setup" -- "FX booster" -- "User" -- "Music effects control panel" -- -diff --git a/res/values-en-rPT/cm_strings.xml b/res/values-en-rPT/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-en-rPT/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-en-rPT/strings.xml b/res/values-en-rPT/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-en-rPT/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-eo/cm_strings.xml b/res/values-eo/cm_strings.xml -deleted file mode 100644 -index d2eb21c..0000000 ---- a/res/values-eo/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- Normale -- Klasika -- Dancmuziko -- Plata -- Folko -- Metalroko -- Hiphopo -- Ĵazo -- Popo -- Roko -- Elektronika -- Malgranda laŭtparolilo -- Propra -- Nenio -- Malgranda ĉambro -- Mezgranda ĉambro -- Granda ĉambro -- Mezgranda halo -- Granda halo -- Plata -- Premu ŝaltilon supr-desktre. -- Efekto ne disponeblas por la laŭtparolila modo. -- Kapaŭskultilo -- Parolilo -- USB -- Bludento -- Sendrata -- Resono -- Filtrilo antaŭagordo -- -diff --git a/res/values-eo/strings.xml b/res/values-eo/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-eo/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-es-rCO/cm_strings.xml b/res/values-es-rCO/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-es-rCO/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-es-rCO/strings.xml b/res/values-es-rCO/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-es-rCO/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-es-rMX/cm_strings.xml b/res/values-es-rMX/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-es-rMX/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-es-rMX/strings.xml b/res/values-es-rMX/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-es-rMX/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-es-rUS/cm_strings.xml b/res/values-es-rUS/cm_strings.xml -deleted file mode 100644 -index 398afc7..0000000 ---- a/res/values-es-rUS/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normal -- Clásica -- Dance -- Plana -- Folk -- Heavy Metal -- Hip-Hop -- Jazz -- Pop -- Rock -- Electrónica -- Altavoces pequeños -- Personalizado -- Ninguno -- Habitación pequeña -- Habitación mediana -- Habitación grande -- Sala mediana -- Sala grande -- Vinilo -- Pulsar el botón de encendido en la parte superior derecha. -- Efecto no disponible para el modo altavoz. -- Auriculares -- Altavoz -- USB -- Bluetooth -- Inalámbrico -- Salida de línea -- Reverberación -- Ecualizador preestablecido -- -diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml -deleted file mode 100644 -index e8c55d2..0000000 ---- a/res/values-es-rUS/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Efectos no disponibles" -- "Conecta los auriculares para usar estos efectos." -- "Refuerzo de graves" -- "Sonido envolvente" -- "Configuración" -- "FX booster" -- "Usuario" -- "Panel control efectos música" -- -diff --git a/res/values-es-rXA/strings.xml b/res/values-es-rXA/strings.xml -deleted file mode 100644 -index 42ebed4..0000000 ---- a/res/values-es-rXA/strings.xml -+++ /dev/null -@@ -1,28 +0,0 @@ -- -- -- -- -- Efeutos non disponibles. -- Efeutos d\'audiu -- Coneuta los auriculares pa estos efectos. -- Bass boost -- Soníu envolvente -- Reverberación: -- Efeutos de reverberación de sala adicionales -- Preaxuste de reverberación -- Configuración -- Panel de control d\'efeutos de música\" -- -diff --git a/res/values-es/cm_strings.xml b/res/values-es/cm_strings.xml -deleted file mode 100644 -index 9289cec..0000000 ---- a/res/values-es/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normal -- Clásica -- Dance -- Plana -- Folk -- Heavy Metal -- Hip-Hop -- Jazz -- Pop -- Rock -- Electrónica -- Altavoces pequeños -- Personalizado -- Ninguno -- Habitación pequeña -- Habitación mediana -- Gran habitación -- Sala mediana -- Gran sala -- Vinilo -- Pulsa el botón de encendido en la parte superior derecha. -- Efecto no disponible para el modo altavoz. -- Auriculares -- Altavoz -- USB -- Bluetooth -- Inalámbrico -- Salida de línea -- Reverberación -- Ecualizador preestablecido -- -diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml -deleted file mode 100644 -index 878c028..0000000 ---- a/res/values-es/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Efectos no disponibles" -- "Para disfrutar de los efectos, debes conectar los auriculares." -- "Refuerzo de graves" -- "Sonido envolvente" -- "Configuración" -- "FX booster" -- "Usuario" -- "Panel de control de efectos de música" -- -diff --git a/res/values-et-rEE/cm_strings.xml b/res/values-et-rEE/cm_strings.xml -deleted file mode 100644 -index 48bb1e6..0000000 ---- a/res/values-et-rEE/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Tavaline -- Klassika -- Tants -- Tasane -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rokk -- Elektrooniline -- Väiksed kõlarid -- Kohandatud -- Puudub -- Väike tuba -- Keskmine tuba -- Suur tuba -- Keskmine hall -- Suur hall -- Plate -- Vajutage power nuppu üleval paremal. -- Efekt puudub Kõlari-režiimis. -- Peakomplekt -- Kõlar -- USB -- Bluetooth -- Juhtmeta -- Heliväljund -- Peegeldus -- Ekvalaiseri eelsäte -- -diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml -deleted file mode 100644 -index c7cf33f..0000000 ---- a/res/values-et-rEE/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Efektid pole saadaval" -- "Nende efektide jaoks ühendage kõrvaklapid" -- "Bassivõimendi" -- "Ruumiline heli" -- "Seadista" -- "FX-võimendi" -- "Kasutaja" -- "Muusikaefektide juhtpaneel" -- -diff --git a/res/values-eu-rES/cm_strings.xml b/res/values-eu-rES/cm_strings.xml -deleted file mode 100644 -index e73eb97..0000000 ---- a/res/values-eu-rES/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Arrunta -- Klasikoa -- Dance -- Laua -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Elektronikoa -- Bozgorailu txikiak -- Pertsonalizatua -- Bat ere ez -- Gela txikia -- Gela ertaina -- Gela handia -- Areto ertaina -- Areto handia -- Biniloa -- Sakatu goi-eskumako pizte botoia. -- Efektua ez dago bozgorailu modurako eskuragarri. -- Aurikularrak -- Bozgorailua -- USB -- Bluetooth -- Haririk gabe -- Linea irteera -- Erreberberazioa -- Ekualizadore aurre-ezarpena -- -diff --git a/res/values-fa/cm_strings.xml b/res/values-fa/cm_strings.xml -deleted file mode 100644 -index 4f742ce..0000000 ---- a/res/values-fa/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- عادی -- کلاسیک -- رقص -- صاف -- محلی -- هوی متال -- هیپ هاپ -- جاز -- پاپ -- راک -- الکترونیک -- بلندگوهای کوچک -- سفارشی -- هیچ‌کدام -- اتاق کوچک -- اتاق متوسط -- اتاق بزرگ -- سالن متوسط -- سالن بزرگ -- صفحه -- دکمه روشن کردن را در بالا سمت راست بزنید. -- این افکت در حالت بلندگو فعال نیست. -- هدست -- بلندگو -- یواس‌بی -- بلوتوث -- بی‌سیم -- طنین -- اکولایزر تنظیم شده -- -diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml -deleted file mode 100644 -index a8cfc3f..0000000 ---- a/res/values-fa/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "جلوه‌ها در دسترس نیستند." -- "برای این جلوه‌ها هدفون را وصل کنید." -- "تقویت باس" -- "صدای فراگیر" -- "تنظیم" -- "تقویت‌کننده FX" -- "کاربر" -- "مرکز کنترل جلوه‌های موسیقی" -- -diff --git a/res/values-fi/cm_strings.xml b/res/values-fi/cm_strings.xml -deleted file mode 100644 -index b0e1cd0..0000000 ---- a/res/values-fi/cm_strings.xml -+++ /dev/null -@@ -1,63 +0,0 @@ -- -- -- -- -- AudioFX ei ole ääniefektien ohjauksen oletussovelluksena. -- Aseta oletukseksi -- Ei nyt -- Ota AudioFX käyttöön/pois käytöstä nykyiselle laitteelle -- AudioFX (%1$s) -- Normaali -- Klassinen -- Tanssi -- Tasainen -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Elektroninen -- Pienet kaiuttimet -- Multimedia -- Muokattu -- Mukautettu %1$d -- Ei mitään -- Pieni huone -- Keskikokoinen huone -- Iso huone -- Keskikokoinen sali -- Suuri sali -- Vinyyli -- Paina virtanäppäintä oikeassa yläkulmassa. -- Efekti ei käytettävissä kaiutintilassa. -- Kuulokkeet -- Kaiutin -- USB -- Bluetooth -- Langaton -- Ulostulo -- Kaikuefekti -- Taajuuskorjaimen esiasetus -- Laitteet -- Virtualizer -- Diskantti -- Basso -- Nimeä uudelleen -- Haluatko varmasti poistaa asetusen %1$s? -- powered by -- -diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml -deleted file mode 100644 -index c88480a..0000000 ---- a/res/values-fi/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Tehosteet eivät ole käytettävissä." -- "Liitä kuulokkeet kuullaksesi tehosteet." -- "Basson tehostus" -- "Surround-ääni" -- "Alkutoimet" -- "FX booster" -- "Käyttäjä" -- "Musiikkitehost. hallintapaneeli" -- -diff --git a/res/values-fil-rPH/cm_strings.xml b/res/values-fil-rPH/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-fil-rPH/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-fr-rCA/cm_strings.xml b/res/values-fr-rCA/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-fr-rCA/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml -deleted file mode 100644 -index 573eeee..0000000 ---- a/res/values-fr-rCA/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Effets indisponibles." -- "Veuillez brancher un casque pour ces effets." -- "Amplification des basses" -- "Son ambiophonique" -- "Configuration" -- "FX booster" -- "Utilisateur" -- "Configuration effets musicaux" -- -diff --git a/res/values-fr/cm_strings.xml b/res/values-fr/cm_strings.xml -deleted file mode 100644 -index 3ea7aa3..0000000 ---- a/res/values-fr/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normal -- Classique -- Dance -- Plat -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Électronique -- Petits haut-parleurs -- Personnalisé -- Aucun -- Petite salle -- Salle moyenne -- Grande salle -- Salle moyenne -- Grande salle -- Plaque -- Appuyez sur le bouton d\'activation en haut à droite. -- Effet non disponible pour le mode haut-parleur. -- Casque -- Haut-parleur -- USB -- Bluetooth -- Sans fil -- Sortie ligne -- Réverbération -- Égaliseur prédéfini -- -diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml -deleted file mode 100644 -index 5145d86..0000000 ---- a/res/values-fr/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Effets indisponibles." -- "Veuillez brancher un casque pour ces effets." -- "Amplification des basses" -- "Son surround" -- "Configuration" -- "FX booster" -- "Utilisateur" -- "Configuration effets musicaux" -- -diff --git a/res/values-frp-rIT/cm_strings.xml b/res/values-frp-rIT/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-frp-rIT/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-frp-rIT/strings.xml b/res/values-frp-rIT/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-frp-rIT/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-fy-rNL/cm_strings.xml b/res/values-fy-rNL/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-fy-rNL/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-fy-rNL/strings.xml b/res/values-fy-rNL/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-fy-rNL/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-ga-rIE/cm_strings.xml b/res/values-ga-rIE/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-ga-rIE/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-ga-rIE/strings.xml b/res/values-ga-rIE/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-ga-rIE/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-gd-rGB/cm_strings.xml b/res/values-gd-rGB/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-gd-rGB/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-gd-rGB/strings.xml b/res/values-gd-rGB/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-gd-rGB/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-gl-rES/cm_strings.xml b/res/values-gl-rES/cm_strings.xml -deleted file mode 100644 -index ecde62e..0000000 ---- a/res/values-gl-rES/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- Normal -- Clásica -- Dance -- Plano -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Electrónica -- Altofalantes pequenos -- Personalizado -- Ningunha -- Cuarto pequeno -- Cuarto mediano -- Cuarto grande -- Sala mediana -- Sala grande -- Disco -- Prema o botón de acendido na esquina dereita. -- O efecto non está dispoñíbel no modo altavoz. -- Auriculares -- Altofalante -- USB -- Bluetooth -- Sen fíos -- Reverberar -- Ecualizador predefinido -- -diff --git a/res/values-gl/cm_strings.xml b/res/values-gl/cm_strings.xml -deleted file mode 100644 -index ce67498..0000000 ---- a/res/values-gl/cm_strings.xml -+++ /dev/null -@@ -1,36 +0,0 @@ -- -- -- -- -- Normal -- Clásica -- Dance -- Plano -- Jazz -- Rock -- Electrónica -- Personalizado -- Ningunha -- Cuarto pequeno -- Cuarto mediano -- Cuarto grande -- Sala mediana -- Sala grande -- Altofalante -- USB -- Bluetooth -- -diff --git a/res/values-gu-rIN/cm_strings.xml b/res/values-gu-rIN/cm_strings.xml -deleted file mode 100644 -index 67c2634..0000000 ---- a/res/values-gu-rIN/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- સામાન્ય -- શાસ્ત્રીય -- નૃત્ય -- સપાટ -- જનતા -- ભારે ધાતુ -- હિપ હોપ -- જેઝ -- પોપ -- ઝુમવુ -- ઇલેક્ટ્રોનિક -- નાના સ્પીકરો -- કસ્ટમ -- કોઈ નહીં -- નાનો ઓરડો -- મધ્યમ ઓરડો -- મોટો ઓરડો -- મધ્યમ હૉલ -- મોટો હૉલ -- પ્લેટ -- ટોચ પર-જમણે રહેલ પાવર બટન દબાવો. -- સ્પીકર મોડ પર અસરકારક ઉપલબ્ધ નથી. -- હેડસેટ -- સ્પીકર -- USB -- Bluetooth -- વાયરલેસ -- રિવર્બ -- ઇક્વિલાઇઝર પ્રિસેટ -- -diff --git a/res/values-hdpi/knobs.xml b/res/values-hdpi/knobs.xml -deleted file mode 100644 -index 216f472..0000000 ---- a/res/values-hdpi/knobs.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- 8dp -- 15dp -- -diff --git a/res/values-hi/cm_strings.xml b/res/values-hi/cm_strings.xml -deleted file mode 100644 -index 27c830b..0000000 ---- a/res/values-hi/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- सामान्य -- शास्त्रीय -- नृत्य -- सपाट -- लोक -- भारी धातु -- हिप हॉप -- जैस -- पॉप -- रॉक -- इलेक्ट्रॉनिक -- छोटे स्पीकर -- मनपसंद -- कोई नहीं -- छोटा कमरा -- मध्यम कमरा -- बड़ा कमरा -- मध्यम सभा-मंडप -- बड़ा सभा-मंडप -- प्लेट -- ऊपर दाएँ स्थित पावर बटन को दबाएँ। -- स्पीकर मोड के लिए प्रभाव उपलब्ध नहीं है। -- हेडसेट -- स्पीकर -- यूएसबी -- ब्लूटूथ -- बेतार -- प्रतिध्वनि -- तुल्यकारक पूर्वसेट -- -diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml -deleted file mode 100644 -index 7dac0ab..0000000 ---- a/res/values-hi/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "प्रभाव उपलब्ध नहीं." -- "इन प्रभावों के लिए हेडफ़ोन प्‍लग इन करें." -- "बेस बढ़ाएं" -- "सराउंड साउंड" -- "सेटअप" -- "FX बूस्‍टर" -- "उपयोगकर्ता" -- "संगीत प्रभाव कंट्रोल फलक" -- -diff --git a/res/values-hr/cm_strings.xml b/res/values-hr/cm_strings.xml -deleted file mode 100644 -index fdbd4b4..0000000 ---- a/res/values-hr/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normalno -- Klasika -- Ples -- Ravno -- Narodne -- Heavy Metal -- Hip-hop -- Jazz -- Pop -- Rock -- Elektronska -- Mali zvučnici -- Prilagođeno -- Ništa -- Mala soba -- Srednja soba -- Velika soba -- Srednja dvorana -- Velika dvorana -- Ploča -- Pritisnite gumb za uključivanje gore desno. -- Efekt nije dostupan za način Zvučnika. -- Slušalice -- Zvučnik -- USB -- Bluetooth -- Bežično -- Izlaz za slušalice -- Odjek -- Predlošci ekvilajzera -- -diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml -deleted file mode 100644 -index 9305b07..0000000 ---- a/res/values-hr/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Efekti nisu dostupni." -- "Priključite slušalice za ove efekte." -- "Pojačanje basova" -- "Okružujući zvuk" -- "Postavljanje" -- "FX booster" -- "Korisnik" -- "Upravljačka ploča glazbenih efekata" -- -diff --git a/res/values-hu/cm_strings.xml b/res/values-hu/cm_strings.xml -deleted file mode 100644 -index e15c52e..0000000 ---- a/res/values-hu/cm_strings.xml -+++ /dev/null -@@ -1,63 +0,0 @@ -- -- -- -- -- AudioFX nem az alapértelmezett hanghatás kezelő. -- Alapértelmezettnek beállít -- Ne most -- AudioFX ki/bekapcsolása a jelenlegi eszközön -- AudioFX (%1$s) -- Normál -- Klasszikus -- Dance -- Lapos -- Népi -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Elektronikus -- Kis hangszórók -- Multimédia -- Egyéni -- Egyéni %1$d -- Nincs -- Kis szoba -- Közepes szoba -- Nagy szoba -- Közepes terem -- Nagy terem -- Lemez -- Nyomja meg a bekapcsológombot a jobb felső sarokban. -- Hangszórót használva az effekt nem elérhető. -- Fejhallgató -- Hangszóró -- USB -- Bluetooth -- Vezeték nélküli -- Vonal kimenet -- Zengetés -- Hangszín minták -- Eszközök -- Virtualizáló -- Magas hang -- Mélyhang -- Átnevezés -- Biztosan el szeretné távolítani: %1$s? -- üzemeltető -- -diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml -deleted file mode 100644 -index 7c228b3..0000000 ---- a/res/values-hu/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Nem állnak rendelkezésre effektek." -- "Dugd be a fejhallgatót ezekhez az effektekhez." -- "Mélyhangkiemelő" -- "Térhatású hangzás" -- "Beállítás" -- "FX booster" -- "Felhasználó" -- "Zenei effektek kezelőpanelje" -- -diff --git a/res/values-hy-rAM/cm_strings.xml b/res/values-hy-rAM/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-hy-rAM/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-in/cm_strings.xml b/res/values-in/cm_strings.xml -deleted file mode 100644 -index 293b7f6..0000000 ---- a/res/values-in/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normal -- Klasik -- Dansa -- Datar -- Rakyat -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Elektronik -- Speaker kecil -- Khusus -- Tidak Ada -- Ruang kecil -- Ruang sedang -- Ruang besar -- Aula sedang -- Aula besar -- Pelat -- Tekan tombol power pada bagian kanan atas. -- Efek tidak tersedia untuk mode Speaker. -- Headset -- Speaker -- USB -- Bluetooth -- Nirkabel -- Sambungan keluar -- Gema -- Preset equalizer -- -diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml -deleted file mode 100644 -index d8f8ad8..0000000 ---- a/res/values-in/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Efek tidak tersedia." -- "Pasang headphone untuk efek ini." -- "Peningkatan bass" -- "Suara surround" -- "Penyiapan" -- "Penguat FX" -- "Pengguna" -- "Panel kontrol efek musik" -- -diff --git a/res/values-is-rIS/cm_strings.xml b/res/values-is-rIS/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-is-rIS/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-it/cm_strings.xml b/res/values-it/cm_strings.xml -deleted file mode 100644 -index b4f2efb..0000000 ---- a/res/values-it/cm_strings.xml -+++ /dev/null -@@ -1,63 +0,0 @@ -- -- -- -- -- AudioFX non è il tuo equalizzatore predefinito. -- Imposta come predefinito -- Non ora -- Attiva/disattiva AudioFX per il dispositivo in uso -- AudioFX (%1$s) -- Normale -- Classica -- Dance -- Uniforme -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Elettronica -- Altoparlanti piccoli -- Multimedia -- Personalizzato -- Personalizzato %1$d -- Nessuno -- Stanza piccola -- Stanza media -- Stanza grande -- Sala media -- Sala grande -- Piatto -- Premi il tasto di accensione in alto a destra. -- Effetto non disponibile per la modalità vivavoce. -- Cuffie -- Altoparlante -- USB -- Bluetooth -- Wireless -- Line out -- Riverbero -- Equalizzatore predefinito -- Dispositivi -- Virtualizzatore -- Alti -- Bassi -- Rinomina -- Sei sicuro di voler rimuovere %1$s? -- powered by -- -diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml -deleted file mode 100644 -index 967ec5c..0000000 ---- a/res/values-it/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Effetti non disponibili." -- "Collega le cuffie per questi effetti." -- "Bassi più intensi" -- "Audio surround" -- "Configurazione" -- "FX booster" -- "Utente" -- "Pann. controllo effetti music." -- -diff --git a/res/values-iw/cm_strings.xml b/res/values-iw/cm_strings.xml -deleted file mode 100644 -index 1069d9f..0000000 ---- a/res/values-iw/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- רגיל -- קלאסי -- דאנס -- שטוח -- פולק -- הבי מטאל -- היפ הופ -- ג\'אז -- פופ -- רוק -- אלקטרוני -- רמקולים קטנים -- מותאם אישית -- ללא -- חדר קטן -- חדר בינוני -- חדר גדול -- אולם בינוני -- אולם גדול -- צלחת -- לחץ על לחצן ההפעלה למעלה מימין. -- האפקט אינו זמין במצב רמקול. -- אזניות -- רמקול -- USB -- Bluetooth -- אלחוטי -- יציאת שמע -- תהודה -- אקולייזר קבוע מראש -- -diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml -deleted file mode 100644 -index 791f805..0000000 ---- a/res/values-iw/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "האפקטים אינם זמינים." -- "חבר אוזניות כדי לשמוע אפקטים אלה." -- "הגברת הבס" -- "סראונד" -- "התקן" -- "FX Booster" -- "משתמש" -- "חלונית בקרה של אפקטים מוסיקליים" -- -diff --git a/res/values-ja/cm_strings.xml b/res/values-ja/cm_strings.xml -deleted file mode 100644 -index b763d90..0000000 ---- a/res/values-ja/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normal -- Classical -- Dance -- Flat -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Electronic -- Small speakers -- カスタム -- なし -- 小さい部屋 -- 中くらいの部屋 -- 大きい部屋 -- 中くらいのホール -- 大きいホール -- プレート -- 右上の電源ボタンを押してください -- スピーカーモードでは効果は利用できません。 -- ヘッドセット -- スピーカー -- USB -- Bluetooth -- ワイヤレス -- ライン出力 -- リバーブ -- イコライザープリセット -- -diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml -deleted file mode 100644 -index 02cd917..0000000 ---- a/res/values-ja/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "効果は利用できません。" -- "これらの効果はヘッドホンで聴いてください。" -- "バスブースト" -- "サラウンドサウンド" -- "セットアップ" -- "FXブースター" -- "ユーザー" -- "サウンド効果コントロールパネル" -- -diff --git a/res/values-ka-rGE/cm_strings.xml b/res/values-ka-rGE/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-ka-rGE/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-kk-rKZ/cm_strings.xml b/res/values-kk-rKZ/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-kk-rKZ/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-km-rKH/cm_strings.xml b/res/values-km-rKH/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-km-rKH/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-kn-rIN/cm_strings.xml b/res/values-kn-rIN/cm_strings.xml -deleted file mode 100644 -index 481d1ac..0000000 ---- a/res/values-kn-rIN/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- ಸಹಜ -- ಶಾಸ್ತ್ರೀಯ -- ನೃತ್ಯ -- ಫ್ಲಾಟ್ -- ಜಾನಪದ -- ಹೆವಿ ಮೆಟಲ್ -- ಹಿಪ್ ಹಾಪ್ -- ಜಾಝ್ -- ಪಾಪ್ -- ರಾಕ್ -- ಎಲೆಕ್ಟ್ರಾನಿಕ್ -- ಚಿಕ್ಕ ಸ್ಪೀಕರ್‍ಗಳು -- ಕಸ್ಟಮ್ -- ಶೂನ್ಯ -- ಸಣ್ಣ ಕೋಣೆ -- ಮಧ್ಯಮ ಕೊಣೆ -- ದೊಡ್ಡ ಕೋಣೆ -- ಮಧ್ಯಮ ಹಾಲ್ -- ದೊಡ್ಡ ಹಾಲ್ -- ಪ್ಲೇಟ್ -- ಬಲ-ಮೇಲ್ಭಾಗದಲ್ಲಿರುವ ಪವರ್ ಬಟನ್ ಒತ್ತಿ. -- ಸ್ಪೀಕರ್ ಮೋಡ್ ಪರಿಣಾಮಗಳು ಲಭ್ಯವಿಲ್ಲ. -- ಹೆಡ್‍ಸೆಟ್ -- ಸ್ಪೀಕರ್ -- ಯುಎಸ್‍ಬಿ -- ಬ್ಲೂಟೂತ್ -- ನಿಸ್ತಂತು -- ಪ್ರತಿಫಲನ -- ಸಮಕಾರಕ ಪೂರ್ವನಿಗದಿ -- -diff --git a/res/values-ko/cm_strings.xml b/res/values-ko/cm_strings.xml -deleted file mode 100644 -index 794be73..0000000 ---- a/res/values-ko/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- 일반 -- 클래식 -- 댄스 -- 플랫 -- 포크 -- 헤비 메탈 -- 힙합 -- 재즈 -- -- -- 일렉트로닉 -- 작은 스피커 -- 사용자 정의 -- 없음 -- 작은 방 -- 중간 방 -- 큰 방 -- 중형 홀 -- 대형 홀 -- 플레이트 -- 오른쪽 상단의 전원 버튼을 눌러주십시오. -- 스피커로는 이 음향효과를 사용할 수 없습니다. -- 헤드셋 -- 스피커 -- USB -- 블루투스 -- 무선 -- 출력 -- 리버브 -- 이퀄라이저 프리셋 -- -diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml -deleted file mode 100644 -index db54bf9..0000000 ---- a/res/values-ko/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "효과를 사용할 수 없습니다." -- "이 효과를 사용하려면 헤드폰을 연결하시기 바랍니다." -- "중저음 강화" -- "서라운드 사운드" -- "설정" -- "FX 부스터" -- "사용자" -- "음악 효과 제어판" -- -diff --git a/res/values-ku/cm_strings.xml b/res/values-ku/cm_strings.xml -deleted file mode 100644 -index 64193ca..0000000 ---- a/res/values-ku/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- ئاسایی -- كلاسیكی -- سه‌ما -- تەخت -- خەڵك -- هوای موتاڵ -- هیپ هۆپ -- جاز -- پۆپ -- ڕۆک -- ئەلیکترۆنیك -- دەنگدەری بچووک -- داواکراو -- هیچ -- ژوری بچوک -- ژوری ئاسایی -- ژوری گەورە -- هۆڵی بچوک -- هۆڵی گەورە -- دەشت -- پەنجە بنێ بە دوگمەی داخستندا -- کاریگه‌ری ئاماده‌نییه‌ بۆ باری سپیکه‌ر. -- هێدفۆن -- بڵندگۆ -- USB -- بلوتوس -- بێتەل -- Reverb -- ئاماده‌کراوی یه‌کسانکه‌ری ده‌نگ -- -diff --git a/res/values-ku/strings.xml b/res/values-ku/strings.xml -deleted file mode 100644 -index 88b7611..0000000 ---- a/res/values-ku/strings.xml -+++ /dev/null -@@ -1,31 +0,0 @@ -- -- -- -- -- -- دەنگڕێخەر -- کاریگەر لەکارەنیە. -- کاریگه‌ری ده‌نگ -- تکایه‌ بیستۆکی پێوه‌بکه‌ بۆ کاریگه‌ری. -- زیادکردنی دەنگی دور -- دەوردانی دەنگ -- هەمیشەی: -- زیادکردنی کاریگەری دەنگ -- هەمیشە ڕێخستن -- دامه‌زراندن -- -- پەڕەی ڕێکخستنی کاریگەری دەنگ\" -- -diff --git a/res/values-ky-rKG/cm_strings.xml b/res/values-ky-rKG/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-ky-rKG/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml -deleted file mode 100644 -index f195fa3..0000000 ---- a/res/values-land/dimens.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- 5dip -- 150dip -- -diff --git a/res/values-lb/cm_strings.xml b/res/values-lb/cm_strings.xml -deleted file mode 100644 -index c06d2c0..0000000 ---- a/res/values-lb/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normal -- Klassesch -- Danzmusek -- Flaach -- Volleksmusek -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Elektronesch -- Kleng Boxen -- Personaliséiert -- Keen -- Klenge Raum -- Mëttlere Raum -- Grousse Raum -- Mëttlere Sall -- Grousse Sall -- Hallplack -- Uschaltknäppche riets uewen drécken. -- Effekt am Lautsprecher-Modus net disponibel. -- Kopfhörer -- Lautsprecher -- USB -- Bluetooth -- Ouni Kabel -- Line-Ausgank -- Halleffekt -- Equalizer-Virastellung -- -diff --git a/res/values-lb/strings.xml b/res/values-lb/strings.xml -deleted file mode 100644 -index a35f29c..0000000 ---- a/res/values-lb/strings.xml -+++ /dev/null -@@ -1,31 +0,0 @@ -- -- -- -- -- -- TounFX -- Effekter net disponibel. -- Touneffekter -- Schléiss Kopfhörer u fir dës Effekter. -- Bassunhiewung -- Surround-Toun -- Halleffekt: -- Zousätzlech Raum-Halleffekter -- Virastellunge fir den Hall -- Astellen -- -- Steierelementer fir Touneffekter -- -diff --git a/res/values-lo-rLA/cm_strings.xml b/res/values-lo-rLA/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-lo-rLA/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-lt/cm_strings.xml b/res/values-lt/cm_strings.xml -deleted file mode 100644 -index 4b9f5a0..0000000 ---- a/res/values-lt/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- Normalus -- Klasikinis -- Šokių -- Lygus -- Liaudies -- Sunkusis metalas -- Hiphopas -- Džiazas -- Popsas -- Rokas -- Elektronika -- Maži garsiakalbiai -- Priskirtas -- Joks -- Mažas kambarys -- Vidutinio dydžio kambarys -- Didelis kambarys -- Vidutinio dydžio salė -- Didelė salė -- Platforma -- Paspauskite maitinimo mygtuką viršuje dešinėje. -- Efektas negalimas garsiakalbio režime. -- Laisvų rankų įranga -- Garsiakalbis -- USB -- Bluetooth -- Belaidis -- Aidas -- Vienodintuvo išankstiniai nustatymai -- -diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml -deleted file mode 100644 -index f08af39..0000000 ---- a/res/values-lt/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Efektai nepasiekiami." -- "Įkiškite ausines, kad būtų pateikti šie efektai." -- "Žemų tonų išryškinimas" -- "Erdvinis garsas" -- "Sąranka" -- "FX booster" -- "Naudotojas" -- "Muzikos efektų valdymo skyd." -- -diff --git a/res/values-lv/cm_strings.xml b/res/values-lv/cm_strings.xml -deleted file mode 100644 -index 7e33997..0000000 ---- a/res/values-lv/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- Normāls -- Klasika -- Dejas -- Dzīvoklis -- Tautas -- Smagais metāls -- Hiphops -- Džezs -- Pops -- Roks -- Elektronika -- Mazi skaļruņi -- Pielāgots -- Nekas -- Maza istaba -- Vidēja istaba -- Liela istaba -- Vidēja zāle -- Liela zāle -- Plate -- Nospiediet ieslēgšanas pogu augšējā labajā pusē. -- Efekts nav pieejams skaļruņa režīmā. -- Austiņas -- Skaļrunis -- USB -- Bluetooth -- Bezvadu -- Atbalss -- Ekvalaizera pirmstatījumi -- -diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml -deleted file mode 100644 -index e1bdef4..0000000 ---- a/res/values-lv/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Efekti nav pieejami." -- "Pievienojiet austiņas, lai dzirdētu šos efektus." -- "Basu pastiprināšana" -- "Ieskaujošā skaņa" -- "Iestatīšana" -- "FX Booster" -- "Lietotājs" -- "Mūzikas efekti vadības panelī" -- -diff --git a/res/values-mk-rMK/cm_strings.xml b/res/values-mk-rMK/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-mk-rMK/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-ml-rIN/cm_strings.xml b/res/values-ml-rIN/cm_strings.xml -deleted file mode 100644 -index af1ab77..0000000 ---- a/res/values-ml-rIN/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- സാധാരണ -- ക്ലാസിക്കൽ -- ഡാൻസ് -- ഫ്ലാറ്റ് -- ഫോക്ക് -- ഹെവി മെറ്റൽ -- ഹിപ്പ് ഹോപ്പ് -- ജാസ്സ് -- പോപ്പ് -- റോക്ക് -- ഇലക്ട്രോണിക് -- ചെറിയ സ്പീക്കറുകൾ -- ഇഷ്‌ടാനുസൃതം -- ആരിൽ നിന്നും വേണ്ട -- ചെറിയ റൂം -- ഇടത്തരം റൂം -- വലിയ റൂം -- ഇടത്തരം ഹാൾ -- വലിയ ഹാൾ -- പ്ലേറ്റ് -- മുകളിൽ-വലതുഭാഗത്തുള്ള പവർ ബട്ടൺ അമർത്തുക. -- സ്പീക്കർ മോഡിൽ ഇഫക്‌ട് ലഭ്യമല്ല. -- ഹെഡ്സെറ്റ് -- സ്പീക്കർ -- USB -- ബ്ലൂടൂത്ത് -- വയർലെസ് -- പ്രതിധ്വനി -- ഈക്വലൈസര്‍ പ്രീസെറ്റ് -- -diff --git a/res/values-mn-rMN/cm_strings.xml b/res/values-mn-rMN/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-mn-rMN/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-mr-rIN/cm_strings.xml b/res/values-mr-rIN/cm_strings.xml -deleted file mode 100644 -index 561d8d4..0000000 ---- a/res/values-mr-rIN/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- सामान्य -- शास्त्रीय -- नृत्य -- फ्लॅट -- लोक -- हेवी मेटल -- हिप हॉप -- जॅझ -- पॉप -- रॉक -- इलेक्ट्रॉनिक -- लहान स्पीकर्स -- सानुकूल -- काहीही नाही -- लहान खोली -- मध्यम खोली -- मोठी खोली -- मध्यम हॉल -- मोठा हॉल -- प्लेट -- शीर्षाशी-उजवीकडे पॉवर बटण दाबा. -- स्पीकर मोडसाठी प्रभाव उपलब्ध नाही. -- हेडसेट -- स्पीकर -- USB -- -- बिनतारी -- रिव्हर्ब -- इक्वेलायझर प्रीसेट -- -diff --git a/res/values-ms-rMY/cm_strings.xml b/res/values-ms-rMY/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-ms-rMY/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml -deleted file mode 100644 -index e0cd42a..0000000 ---- a/res/values-ms-rMY/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Kesan tidak tersedia." -- "Pasangkan fon kepala untuk kesan ini." -- "Galak bes" -- "Bunyi keliling" -- "Persediaan" -- "Penggalak FX" -- "Pengguna" -- "Panel kawalan kesan muzik" -- -diff --git a/res/values-my-rMM/cm_strings.xml b/res/values-my-rMM/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-my-rMM/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-nb/cm_strings.xml b/res/values-nb/cm_strings.xml -deleted file mode 100644 -index 7a4263a..0000000 ---- a/res/values-nb/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normal -- Klassisk -- Dans -- Flat -- Folkemusikk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Elektronisk -- Små høyttalere -- Egendefinert -- Ingen -- Lite rom -- Medium rom -- Stort rom -- Middels hall -- Stor hall -- Plate -- Trykk på strømknappen øverst til høyre. -- Effekten er ikke tilgjengelig for høyttaler-modus. -- Hodetelefon -- Høyttaler -- USB -- Bluetooth -- Trådløs -- Linje ut -- Romklang -- Equalizer forhåndsinnstilling -- -diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml -deleted file mode 100644 -index cb46c83..0000000 ---- a/res/values-nb/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Effekter er ikke tilgjengelige." -- "Sett inn hodetelefoner for å oppleve disse effektene." -- "Bassforsterking" -- "Surround-lyd" -- "Konfigurering" -- "Effekt" -- "Bruker" -- "Kontr.panel for musikkeffekter" -- -diff --git a/res/values-ne-rNP/cm_strings.xml b/res/values-ne-rNP/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-ne-rNP/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-nl/cm_strings.xml b/res/values-nl/cm_strings.xml -deleted file mode 100644 -index 6290de1..0000000 ---- a/res/values-nl/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normaal -- Klassiek -- Dance -- Vlak -- Volksmuziek -- Heavy Metal -- Hiphop -- Jazz -- Pop -- Rock -- Elektronisch -- Kleine luidsprekers -- Aangepast -- Geen -- Kleine ruimte -- Middelgrote ruimte -- Grote ruimte -- Middelgrote zaal -- Grote zaal -- Lp -- Druk op de aan/uit-knop rechtsboven. -- Effect niet beschikbaar voor luidsprekermodus. -- Koptelefoon -- Luidspreker -- USB -- Bluetooth -- Draadloos -- Lijnuitgang -- Galm -- Equalizer-preset -- -diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml -deleted file mode 100644 -index 578304b..0000000 ---- a/res/values-nl/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Effecten niet beschikbaar." -- "Gebruik een hoofdtelefoon om deze effecten te beluisteren." -- "Basversterking" -- "Surround sound" -- "Instellen" -- "FX Booster" -- "Gebruiker" -- "Bedieningspaneel voor muziekeffecten" -- -diff --git a/res/values-oc-rFR/cm_strings.xml b/res/values-oc-rFR/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-oc-rFR/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-oc-rFR/strings.xml b/res/values-oc-rFR/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-oc-rFR/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-or-rIN/cm_strings.xml b/res/values-or-rIN/cm_strings.xml -deleted file mode 100644 -index b7e66ee..0000000 ---- a/res/values-or-rIN/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- ସାଧାରଣ -- କ୍ଲାସିକାଲ୍ -- ନୃତ୍ୟ -- ସିଧା -- ଫୋକ୍ -- ଭାରି ଧାତୁ -- ହିପ୍ ହପ୍ -- ଜାଜ୍ -- ପପ୍‌ -- ରକ୍ -- ବୈଦ୍ୟୁତିକ -- ଛୋଟ ସ୍ପିକର୍‍ଗୁଡିକ -- କଷ୍ଟମ୍ -- କିଛି ନୁହେଁ -- ଛୋଟ ରୁମ୍‍ -- ମଧ୍ୟମ ରୁମ୍ -- ବୃହତ୍ ରୁମ୍ -- ମଧ୍ୟମ ହଲ୍‌ -- ବୃହତ୍ ହଲ୍ -- ପ୍ଲେଟ୍‍ -- ଶୀଷ ଡାହାଣ ପାର୍ଶ୍ୱରେ ଥିବା ପାୱାର୍‍ ବଟନ୍‍ ଦବାନ୍ତୁ। -- ସ୍ପିଅକର୍‍ ମୋଡ୍‍ ପାଇଁ ପ୍ରଭାବ ଉପଲ‍ବ୍ଧ ନାହିଁ -- ହେଡ୍‍ସେଟ୍‍ -- ସ୍ପିକର୍ -- USB -- ବ୍ଲୁଟୁଥ୍ -- ଓୟାର୍‍ଲେସ୍‍ -- ର୍ରିଭର୍ବ: -- ଇକ୍ୱାଲାଇଜର୍‍ ପ୍ରିସେଟ୍‍ -- -diff --git a/res/values-or-rIN/strings.xml b/res/values-or-rIN/strings.xml -deleted file mode 100644 -index 5b86c61..0000000 ---- a/res/values-or-rIN/strings.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/res/values-pa-rIN/cm_strings.xml b/res/values-pa-rIN/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-pa-rIN/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-pl/cm_strings.xml b/res/values-pl/cm_strings.xml -deleted file mode 100644 -index 2a1c558..0000000 ---- a/res/values-pl/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normalna -- Klasyczna -- Taneczna -- Płaska -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Elektroniczna -- Małe głośniki -- Własne -- Brak -- Mały pokój -- Średni pokój -- Duży pokój -- Średnia sala -- Duża sala -- Płyta gramofonowa -- Naciśnij przycisk zasilania w prawym górnym rogu. -- Efekt nie jest dostępny dla Głośnika urządzenia. -- Słuchawki -- Głośnik -- USB -- Bluetooth -- Bezprzewodowe -- Wyjście analogowe -- Pogłos -- Ustawienia korektora -- -diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml -deleted file mode 100644 -index 311474d..0000000 ---- a/res/values-pl/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Efekty niedostępne" -- "Podłącz słuchawki, aby usłyszeć te efekty." -- "Basy" -- "Dźwięk przestrzenny" -- "Konfiguracja" -- "Wzmocnienie" -- "Własne" -- "Panel efektów muzycznych" -- -diff --git a/res/values-pt-rBR/cm_strings.xml b/res/values-pt-rBR/cm_strings.xml -deleted file mode 100644 -index 763c564..0000000 ---- a/res/values-pt-rBR/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normal -- Clássica -- Dance -- Plano -- Folk -- Heavy metal -- Hip-hop -- Jazz -- Pop -- Rock -- Eletrônica -- Falantes pequenos -- Personalizado -- Nenhum -- Sala pequena -- Sala média -- Sala grande -- Salão médio -- Salão grande -- Placa -- Pressione o botão de energia na parte superior direita. -- Efeito não disponível no modo de alto-falante. -- Fone de ouvido -- Alto-falante -- USB -- Bluetooth -- Sem fio -- Saída de linha -- Reverb -- Predefinição do equalizador -- -diff --git a/res/values-pt-rPT/cm_strings.xml b/res/values-pt-rPT/cm_strings.xml -deleted file mode 100644 -index 3065d78..0000000 ---- a/res/values-pt-rPT/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normal -- Clássica -- Dança -- Plano -- Popular -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Eletrónica -- Altifalantes pequenos -- Personalizado -- Nenhum -- Quarto pequeno -- Quarto médio -- Quarto grande -- Salão médio -- Salão grande -- Prato -- Pressione o botão ligar/desligar na parte superior direita. -- Efeito não disponível no modo de altifalante. -- Auricular -- Altifalante -- USB -- Bluetooth -- Sem fios -- Saída de linha -- Reverb -- Predefinição do equalizador -- -diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml -deleted file mode 100644 -index 4fca190..0000000 ---- a/res/values-pt-rPT/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Efeitos não disponíveis." -- "Ligue os auscultadores para estes efeitos." -- "Aumento de graves" -- "Som surround" -- "Configuração" -- "Amplificador FX" -- "Utilizador" -- "Painel de efeitos musicais" -- -diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml -deleted file mode 100644 -index b21ecb9..0000000 ---- a/res/values-pt/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Efeitos não disponíveis." -- "Conecte fones de ouvido para ativar estes efeitos." -- "Realçar graves" -- "Sistema surround" -- "Configuração" -- "Amplificador FX" -- "Usuário" -- "Painel contr. efeitos sonoros" -- -diff --git a/res/values-rm/cm_strings.xml b/res/values-rm/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-rm/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-ro/cm_strings.xml b/res/values-ro/cm_strings.xml -deleted file mode 100644 -index dd9a4db..0000000 ---- a/res/values-ro/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- Normal -- Clasică -- Dance -- Neutru -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Electronică -- Difuzoare Mici -- Personalizat -- Niciunul -- Cameră mică -- Cameră medie -- Cameră mare -- Sală medie -- Sală mare -- Spațiu întins -- Apasă butonul de alimentare din dreapta-sus. -- Efectul nu este disponibil pentru modul Difuzor. -- Căști -- Difuzor -- USB -- Bluetooth -- Wireless -- Reverberație -- Preset egalizator -- -diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml -deleted file mode 100644 -index 440a21f..0000000 ---- a/res/values-ro/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Efectele nu sunt disponibile." -- "Pentru aceste efecte trebuie să conectați căștile." -- "Amplificare bas" -- "Sunet surround" -- "Configurați" -- "Amplificator FX" -- "Utilizator" -- "Pan. de cont. cu efecte muz." -- -diff --git a/res/values-ru/cm_strings.xml b/res/values-ru/cm_strings.xml -deleted file mode 100644 -index d0d2e71..0000000 ---- a/res/values-ru/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Стандартный -- Классика -- Танцевальная музыка -- Плоско -- Фолк -- Хэви-метал -- Хип-хоп -- Джаз -- Поп -- Рок -- Электронная музыка -- Маленькие динамики -- Пользовательские настр. -- Нет -- Маленькая комната -- Средняя комната -- Большая комната -- Средний зал -- Большой зал -- Пластинка -- Нажмите выключатель в правом верхнем углу. -- Эффект недоступен для динамиков. -- Наушники -- Динамик -- USB -- Bluetooth -- Беспров. устр. -- Линейный выход -- Реверберация -- Предуст. эквалайзера -- -diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml -deleted file mode 100644 -index cbdfd38..0000000 ---- a/res/values-ru/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Эффекты недоступны." -- "Чтобы услышать эти эффекты, подключите наушники." -- "Усиление басов" -- "Объемный звук" -- "Настройка" -- "Усилитель FX" -- "Своя настройка" -- "Управление звуковыми эффектами" -- -diff --git a/res/values-si-rLK/cm_strings.xml b/res/values-si-rLK/cm_strings.xml -deleted file mode 100644 -index bf9ce5c..0000000 ---- a/res/values-si-rLK/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- සාමාන්‍ය -- ශාස්ත්‍රීය -- නටන්න -- තැනිතලා -- ගැමි -- බර ලෝහ -- හිප් හොප් -- ජෑස් -- පොප් -- රොක් -- ඉලෙක්ට්‍රොනික -- කුඩා ස්පීකර -- රිසිවූ -- කිසිවක් නැත -- කුඩා කාමරය -- මධ්‍යම කාමරය -- විශාල කාමරය -- මධ්‍යම ශාලාව -- විශාල ශාලාව -- තහඩුව -- ඉහළින් දකුණේ ඇති බල බොත්තම ඔබන්න. -- ස්පීකර ප්‍රකාරය සඳහා බලපෑම ලබාගත නොහැක. -- කන්යොමුව -- ස්පීකරය -- USB -- බ්ලූටූත් -- රැහැන් රහිත -- ආඛ්‍යාතය -- සමකරකයේ පෙරසැකසීම -- -diff --git a/res/values-sk/cm_strings.xml b/res/values-sk/cm_strings.xml -deleted file mode 100644 -index a3e2e11..0000000 ---- a/res/values-sk/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- Normálne -- Klasická hudba -- Tanec -- Flat -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Elektronická hudba -- Malé reproduktory -- Vlastné -- Žiadny -- Malá miestnosť -- Stredná miestnosť -- Veľká miestnosť -- Stredná sála -- Veľká sála -- Platňa -- Stlačte prepínacie tlačidlo vpravo hore. -- Efekt nie je dostupný pre režim reproduktora. -- Slúchadlá -- Reproduktor -- USB -- Bluetooth -- Bezdrôtové -- Reverb -- Predvoľba ekvalizéra -- -diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml -deleted file mode 100644 -index c4851fc..0000000 ---- a/res/values-sk/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Efekty nie sú k dispozícii." -- "Ak chcete počuť tieto efekty, pripojte slúchadlá" -- "Zosilnenie basov" -- "Priestorový zvuk" -- "Nastavenie" -- "FX Booster" -- "Vlastné" -- "Ovládací panel hudobných efektov" -- -diff --git a/res/values-sl/cm_strings.xml b/res/values-sl/cm_strings.xml -deleted file mode 100644 -index caf42d8..0000000 ---- a/res/values-sl/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Običajna -- Klasična -- Plesna -- Ploska -- Ljudska -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Elektronska -- Majhni zvočniki -- Po meri -- Brez -- Majhna soba -- Srednja soba -- Velika soba -- Srednje velika dvorana -- Velika dvorana -- Plošča -- Pritisnite gumb za vklop na zgornji desni strani. -- Učinek ni na voljo v načinu Zvočnika. -- Slušalke -- Zvočnik -- USB -- Bluetooth -- Brezžično -- Izhod za slušalke -- Odmev -- Prednastavitev izenačevalnika -- -diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml -deleted file mode 100644 -index 796a4ee..0000000 ---- a/res/values-sl/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Učinki niso na voljo." -- "Za te učinke priključite slušalke." -- "Povečanje nizkih tonov" -- "Prostorski zvok" -- "Namestitev" -- "Izboljšanje učinkov" -- "Uporabnik" -- "Nadzorna plošča glasbenih učinkov" -- -diff --git a/res/values-sq-rAL/cm_strings.xml b/res/values-sq-rAL/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-sq-rAL/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-sr/cm_strings.xml b/res/values-sr/cm_strings.xml -deleted file mode 100644 -index 3e27bb6..0000000 ---- a/res/values-sr/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Нормално -- Класика -- Денс -- Равно -- Фолк -- Хеви метал -- Хип хоп -- Џез -- Поп -- Рок -- Електроника -- Мали звучници -- Прилагођено -- Ниједно -- Мала соба -- Средња соба -- Велика соба -- Средњи ходник -- Велики ходник -- Плато -- Притисни дугме за напајање горе-десно. -- Ефекат није доступан за режим Звучника. -- Слушалице -- Звучник -- USB -- Bluetooth -- Wireless -- Излаз -- Reverb -- Еквилајзер унапред постављен -- -diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml -deleted file mode 100644 -index 3dba735..0000000 ---- a/res/values-sr/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Ефекти нису доступни." -- "Прикључите слушалице за ове ефекте." -- "Појачавање басова" -- "Звучни систем" -- "Подешавање" -- "FX booster" -- "Корисник" -- "Контр. табла музичких ефеката" -- -diff --git a/res/values-sv/cm_strings.xml b/res/values-sv/cm_strings.xml -deleted file mode 100644 -index 146d6e9..0000000 ---- a/res/values-sv/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normal -- Klassisk -- Dance -- Platt -- Folk -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Elektronisk -- Små högtalare -- Anpassad -- Ingen -- Litet rum -- Medelstort rum -- Stort rum -- Medelstor sal -- Stor sal -- Plåt -- Tryck på avstängningsknappen uppe till höger. -- Effekten finns inte tillgänglig för högtalarläge. -- Hörlurar -- Högtalare -- USB -- Bluetooth -- Trådlös -- Linjeutgång -- Rumsklang -- Equalizerförval -- -diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml -deleted file mode 100644 -index 28925c3..0000000 ---- a/res/values-sv/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Effekter är inte tillgängliga." -- "Du måste ansluta hörlurar för att kunna höra effekterna." -- "Basförstärkning" -- "Surroundljud" -- "Konfiguration" -- "FX Booster" -- "Användare" -- "Musikeffektspanel" -- -diff --git a/res/values-sw/cm_strings.xml b/res/values-sw/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-sw/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml -deleted file mode 100644 -index cf69dd8..0000000 ---- a/res/values-sw/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Athari hazipatikani" -- "Kwa athari hizi weka vipokea sauti." -- "Kuongeza besi" -- "Sauti ya mzunguko" -- "Weka" -- "Nyongeza ya FX" -- "Mtumiaji" -- "Paneli kidhibiti cha athari za muziki" -- -diff --git a/res/values-ta-rIN/cm_strings.xml b/res/values-ta-rIN/cm_strings.xml -deleted file mode 100644 -index 5b3d566..0000000 ---- a/res/values-ta-rIN/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- இயல்பு -- கிளாசிக்கல் -- டான்ஸ் -- தட்டையான -- நாட்டுப்புறக் கலை -- ஹெவி மெட்டல் -- ஹிப் ஹாப் -- ஜாஸ் -- பாப் -- ராக் -- மின்னணு -- சிறிய ஒலிபெருக்கிகள் -- தனிப்பயன் -- ஏதுமில்லை -- சிறிய அறை -- நடுத்தர அறை -- பெரிய அறை -- நடுத்தர வரவேற்பறை -- பெரிய வரவேற்பறை -- தட்டு -- மேல்-வலது பக்கம் உள்ள மின்சக்தி பொத்தானை அழுத்தவும் -- ஒலிப்பெருக்கி பயன்முறையில் விளைவு கிடைக்கவில்லை. -- தலையணி -- ஸ்பீக்கர் -- USB -- புளூடூத் -- கம்பியில்லா -- எதிர்முழக்கம் -- சமனாக்கி முன்னமை -- -diff --git a/res/values-te-rIN/cm_strings.xml b/res/values-te-rIN/cm_strings.xml -deleted file mode 100644 -index 5a51089..0000000 ---- a/res/values-te-rIN/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- సాధారణం -- క్లాసికల్ -- నృత్యం -- ప్లాట్ -- ఫోక్ -- భారీలోహం -- హిప్ హాప్ -- జాజ్ -- పాప్ -- రాక్ -- ఎలక్ట్రానిక్ -- చిన్న స్పీకర్లు -- అనుకూలం -- ఏదీ లేదు -- చిన్న గది -- మధ్యస్థం గది -- పెద్ద గది -- మధ్యస్థం హాల్ -- పెద్ద గది -- ప్లేటు -- పైన కుడి వైపున ఉన్న పవర్ బటన్ నొక్కండి. -- స్పీకర్ రీతి కొరకు ప్రభావం అందుబాటులో లేదు. -- హెడ్‌సెట్ -- స్పీకర్ -- USB -- బ్లూటూత్ -- నిస్తంత్రి -- ప్రతిధ్వని -- ముందుగా అమర్చిన ఈక్విలైజర్ -- -diff --git a/res/values-th/cm_strings.xml b/res/values-th/cm_strings.xml -deleted file mode 100644 -index 00a15f2..0000000 ---- a/res/values-th/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- ปกติ -- คลาสสิก -- แดนซ์ -- เรียบ -- โฟล์ค -- เฮฟวี่เมทัล -- ฮิปฮอป -- แจ๊ส -- ป๊อป -- ร็อค -- อิเล็กทรอนิก -- ลำโพงเล็ก -- กำหนดเอง -- ไม่มี -- ห้องขนาดเล็ก -- ห้องขนาดกลาง -- ห้องขนาดใหญ่ -- โถงขนาดกลาง -- โถงขนาดใหญ่ -- เวที -- กดปุ่มเพาเวอร์ด้านบนขวา -- เอฟเฟกต์นี้ไม่สามารถใช้ได้กับรูปแบบลำโพง -- หูฟัง -- ลำโพง -- USB -- บลูทูธ -- แบบไร้สาย -- สายออก -- เสียงก้อง -- ชุดรูปแบบปรับแต่งเสียง -- -diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml -deleted file mode 100644 -index cf5b496..0000000 ---- a/res/values-th/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "ไม่มีเอฟเฟ็กต์" -- "ใช้หูฟังสำหรับเอฟเฟ็กต์เหล่านี้" -- "เพิ่มเสียงเบส" -- "เสียงเซอร์ราวด์" -- "ตั้งค่าระบบ" -- "FX Booster" -- "ผู้ใช้" -- "แผงควบคุมเอฟเฟ็กต์เพลง" -- -diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml -deleted file mode 100644 -index 94a525c..0000000 ---- a/res/values-tl/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Hindi available ang mga effect." -- "I-plug in ang mga headphone para sa mga effect na ito." -- "Bass Boost" -- "Surround sound" -- "Setup" -- "FX booster" -- "User" -- "Control panel ng mga effect sa musika" -- -diff --git a/res/values-tr/cm_strings.xml b/res/values-tr/cm_strings.xml -deleted file mode 100644 -index 92fbdbb..0000000 ---- a/res/values-tr/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Normal -- Klasik -- Dans -- Düz -- Halk -- Heavy Metal -- Hip Hop -- Caz -- Pop -- Rock -- Elektronik -- Küçük hoparlörler -- Özel -- Yok -- Küçük oda -- Orta boy oda -- Geniş oda -- Orta boy salon -- Geniş salon -- Plak -- Sağ üstteki güç tuşuna basın. -- Efekt Hoparlör modunda kullanılamıyor. -- Kulaklık -- Hoparlör -- USB -- Bluetooth -- Kablosuz -- Hat çıkışı -- Yankı -- Equalizer önayarı -- -diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml -deleted file mode 100644 -index 427f062..0000000 ---- a/res/values-tr/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Efektler kullanılamıyor." -- "Bu efektler için kulaklığı takın." -- "Güçlü bas" -- "Surround ses" -- "Kurulum" -- "FX booster" -- "Kullanıcı" -- "Müzik efektleri kontrol paneli" -- -diff --git a/res/values-ug/cm_strings.xml b/res/values-ug/cm_strings.xml -deleted file mode 100644 -index 309d7c6..0000000 ---- a/res/values-ug/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- ئادەتتىكى -- كىلاسسىك -- ئۇسسۇل -- تەكشىلىك -- خەلق ناخشىسى -- ئېغىر مېتال -- Hip Hop -- جاز -- مودا نەغمە -- تولغىما ئۇسسۇل -- ئېلېكتىرونلۇق -- كىچىك ياڭراتقۇلار -- ئىختىيارىي -- يوق -- كىچىك ئۆي -- ئوتتۇرىھال ئۆي -- چوڭ ئۆي -- ئوتتۇرىھال زال -- چوڭ زال -- تەخسە -- ئوڭ يۇقىرىدىكى توك مەنبە توپچىسىنى بېسىڭ. -- ياڭراتقۇ ھالىتىدە ئۈنۈمنى ئىشلەتكىلى بولمايدۇ. -- تىڭشىغۇچ -- ياڭراتقۇ -- USB -- كۆكچىش -- سىمسىز -- ئارىلاش ئاۋاز -- تەڭشىگۈچنى ئالدىن تەڭشەش -- -diff --git a/res/values-ug/strings.xml b/res/values-ug/strings.xml -deleted file mode 100644 -index 36b2437..0000000 ---- a/res/values-ug/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- -- AudioFX -- ئۈنۈملەرنى ئىشلەتكىلى بولمايدۇ. -- ئاۋاز ئۈنۈملىرى -- بۇ ئۈنۈمدىن ھۇزۇرلىنىش ئۈچۈن تىڭشىغۇچنى قىستۇرۇڭ. -- تۆۋەن ئاۋازنى يۇقىرىلىتىش -- مۇھىت ئاۋازى -- ئارىلاش ئاۋاز: -- -- -diff --git a/res/values-uk/cm_strings.xml b/res/values-uk/cm_strings.xml -deleted file mode 100644 -index f9498be..0000000 ---- a/res/values-uk/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- Нормальний -- Класика -- Танцювальна -- Плоско -- Народна -- Хеві-метал -- Хіп-хоп -- Джаз -- Поп -- Рок -- Електронна -- Маленькі динаміки -- Користувач -- Немає -- Мала кімната -- Середня кімната -- Велика кімната -- Середній зал -- Великий зал -- Платівка -- Натисніть кнопку живлення в правому верхньому куті. -- Ефект не впливає на режим динаміка. -- Гарнітура -- Динамік -- USB -- Bluetooth -- Бездротові -- Реверберація -- Налаштування еквалайзера -- -diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml -deleted file mode 100644 -index f1744f6..0000000 ---- a/res/values-uk/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Ефекти не доступні" -- "Для цих ефектів підключіть гарнітуру." -- "Підсилення басів" -- "Об’ємний звук" -- "Налаштування" -- "FX booster" -- "Користувач" -- "Панель керув. музичн. ефектами" -- -diff --git a/res/values-ur-rPK/cm_strings.xml b/res/values-ur-rPK/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-ur-rPK/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-uz-rUZ/cm_strings.xml b/res/values-uz-rUZ/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-uz-rUZ/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-vi/cm_strings.xml b/res/values-vi/cm_strings.xml -deleted file mode 100644 -index e7e78e6..0000000 ---- a/res/values-vi/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- Bình thường -- Cổ điển -- Dance -- Flat -- Dân ca -- Heavy Metal -- Hip Hop -- Jazz -- Pop -- Rock -- Electronic -- Loa nhỏ -- Tùy chỉnh -- Không -- Phòng nhỏ -- Phòng trung bình -- Phòng lớn -- Hội trường trung bình -- Hội trường lớn -- Đĩa -- Nhấn nút nguồn điện ở trên cùng bên phải. -- Hiệu ứng không khả dụng với chế độ Loa ngoài. -- Tai nghe -- Loa ngoài -- USB -- Bluetooth -- Không dây -- Đường tín hiệu cho đầu ra -- Âm vang -- Cài sẵn bộ chỉnh âm -- -diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml -deleted file mode 100644 -index 8d027e5..0000000 ---- a/res/values-vi/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Không có hiệu ứng." -- "Cắm tai nghe đối với những hiệu ứng này." -- "Tăng âm trầm" -- "Âm thanh vòm" -- "Thiết lập" -- "Bộ tăng FX" -- "Người dùng" -- "Bảng đ.khiển hiệu ứng âm nhạc" -- -diff --git a/res/values-xlarge/dimens.xml b/res/values-xlarge/dimens.xml -deleted file mode 100644 -index 644ee63..0000000 ---- a/res/values-xlarge/dimens.xml -+++ /dev/null -@@ -1,20 +0,0 @@ -- -- -- -- -- 25dip -- 380dip -- -diff --git a/res/values-zh-rCN/cm_strings.xml b/res/values-zh-rCN/cm_strings.xml -deleted file mode 100644 -index 8266a2a..0000000 ---- a/res/values-zh-rCN/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- 正常 -- 古典音乐 -- 舞曲 -- 平淡 -- 民谣 -- 重金属 -- 嘻哈 -- 爵士 -- 流行 -- 摇滚 -- 电子 -- 小型喇叭 -- 自定义 -- -- 小房间 -- 中等房间 -- 大房间 -- 中厅 -- 大厅 -- -- 按上右上角的电源按钮。 -- 效果不适用于扬声器模式。 -- 耳机 -- 扬声器​​​​ -- USB -- 蓝牙 -- 无线 -- 线路输出 -- 混响 -- 均衡器预设 -- -diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml -deleted file mode 100644 -index 5d734e4..0000000 ---- a/res/values-zh-rCN/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "没有音效。" -- "插上耳机感受各种音效。" -- "低音增强" -- "环绕声" -- "设置" -- "音效增强器" -- "用户" -- "音乐效果控制面板" -- -diff --git a/res/values-zh-rHK/cm_strings.xml b/res/values-zh-rHK/cm_strings.xml -deleted file mode 100644 -index f3ebdfc..0000000 ---- a/res/values-zh-rHK/cm_strings.xml -+++ /dev/null -@@ -1,48 +0,0 @@ -- -- -- -- -- 正常 -- 古典音樂 -- 舞曲 -- 平淡 -- 民謠 -- 重金屬 -- 嘻哈饒舌 -- 爵士樂 -- 流行音樂 -- 搖滾 -- 電子音樂 -- 小型喇叭 -- 自訂 -- -- 小型房間 -- 中型房間 -- 大型房間 -- 中型大廳 -- 寬敞大廳 -- 唱片 -- 按下電源按鈕。 -- 效果不適用於喇叭模式。 -- 耳機 -- 喇叭 -- USB -- 藍牙 -- 無綫 -- 混響效果 -- 等化器預設 -- -diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml -deleted file mode 100644 -index 20de96e..0000000 ---- a/res/values-zh-rHK/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "無效果。" -- "如要體驗這些效果,請插入耳機。" -- "重低音" -- "環迴音響" -- "設定" -- "FX 輔助器" -- "用戶" -- "音樂效果控制台" -- -diff --git a/res/values-zh-rTW/cm_strings.xml b/res/values-zh-rTW/cm_strings.xml -deleted file mode 100644 -index 6cf1ba4..0000000 ---- a/res/values-zh-rTW/cm_strings.xml -+++ /dev/null -@@ -1,49 +0,0 @@ -- -- -- -- -- 正常 -- 古典 -- 舞曲 -- 平淡 -- 民謠 -- 重金屬 -- 嘻哈 -- 爵士樂 -- 流行 -- 搖滾 -- 電子 -- 小型揚聲器 -- 自訂 -- -- 小型房間 -- 中型房間 -- 大型房間 -- 中型大廳 -- 寬敞大廳 -- 唱片 -- 按下右上方的電源鍵。 -- 效果不適用於擴音器模式。 -- 耳機 -- 揚聲器 -- USB -- 藍牙 -- 無線裝置 -- 線路輸出 -- 混響 -- 預設等化器 -- -diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml -deleted file mode 100644 -index ae08749..0000000 ---- a/res/values-zh-rTW/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "無法使用效果。" -- "接上耳機即可體驗這些效果。" -- "低音加強" -- "環繞音效" -- "設定" -- "FX 輔助器" -- "使用者" -- "音樂效果控制台" -- -diff --git a/res/values-zu/cm_strings.xml b/res/values-zu/cm_strings.xml -deleted file mode 100644 -index f4332ba..0000000 ---- a/res/values-zu/cm_strings.xml -+++ /dev/null -@@ -1,18 +0,0 @@ -- -- -- -- -diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml -deleted file mode 100644 -index 0a4d9a5..0000000 ---- a/res/values-zu/strings.xml -+++ /dev/null -@@ -1,27 +0,0 @@ -- -- -- -- -- "Imiphumela ayitholakali" -- "Xhuma okwasekhanda kule miphumela." -- "Bass boost" -- "Umsindo ozungelezile" -- "Isethaphu" -- "Ukulekelela kwe-FX" -- "Umsebenzisi" -- "Iphaneli yokuphatha imphumela yomculo" -- -diff --git a/src/org/cyanogenmod/audiofx/AudioFxApplication.java b/src/org/cyanogenmod/audiofx/AudioFxApplication.java -index 54819fe..36317e1 100644 ---- a/src/org/cyanogenmod/audiofx/AudioFxApplication.java -+++ b/src/org/cyanogenmod/audiofx/AudioFxApplication.java -@@ -27,10 +27,4 @@ public class AudioFxApplication extends Application { - public void onCreate() { - super.onCreate(); - } -- -- public void sendEvent(Event event) { -- if (DEBUG) { -- Log.i(TAG, "sendEvent() called with event = [" + event + "]"); -- } -- } - } --- -2.7.4 - diff --git a/Patches/CyanogenMod-13.0/android_packages_apps_AudioFX/Remove_Analytics.patch b/Patches/CyanogenMod-13.0/android_packages_apps_AudioFX/Remove_Analytics.patch deleted file mode 100644 index aa26c24b..00000000 --- a/Patches/CyanogenMod-13.0/android_packages_apps_AudioFX/Remove_Analytics.patch +++ /dev/null @@ -1,535 +0,0 @@ -From 7af4441cada12ddb125c2b747eab897729b62961 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Thu, 13 Oct 2016 19:10:14 -0400 -Subject: [PATCH] Remove analytics - -Change-Id: Idc9e1bd67d81ffbf62fc5cb8680828603f94c886 ---- - Android.mk | 2 - - .../cyanogenmod/audiofx/AudioFxApplication.java | 11 -- - .../audiofx/activity/ActivityMusic.java | 13 -- - .../audiofx/activity/EqualizerManager.java | 13 -- - .../audiofx/fragment/AudioFxFragment.java | 2 - - .../audiofx/fragment/ControlsFragment.java | 4 - - .../audiofx/fragment/EqualizerFragment.java | 4 - - src/org/cyanogenmod/audiofx/knobs/RadialKnob.java | 3 - - src/org/cyanogenmod/audiofx/stats/AppState.java | 53 ----- - src/org/cyanogenmod/audiofx/stats/UserSession.java | 215 --------------------- - 10 files changed, 320 deletions(-) - delete mode 100644 src/org/cyanogenmod/audiofx/stats/AppState.java - delete mode 100644 src/org/cyanogenmod/audiofx/stats/UserSession.java - -diff --git a/Android.mk b/Android.mk -index e2553d0..d9a1b99 100644 ---- a/Android.mk -+++ b/Android.mk -@@ -20,9 +20,7 @@ LOCAL_PROGUARD_ENABLED := disabled - - LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, res) - LOCAL_AAPT_FLAGS := --auto-add-overlay --LOCAL_AAPT_FLAGS += --extra-packages com.cyanogen.ambient - --LOCAL_STATIC_JAVA_AAR_LIBRARIES := ambientsdk - - LOCAL_PRIVILEGED_MODULE := true - LOCAL_CERTIFICATE := platform -diff --git a/src/org/cyanogenmod/audiofx/AudioFxApplication.java b/src/org/cyanogenmod/audiofx/AudioFxApplication.java -index 9f08a0c..54819fe 100644 ---- a/src/org/cyanogenmod/audiofx/AudioFxApplication.java -+++ b/src/org/cyanogenmod/audiofx/AudioFxApplication.java -@@ -18,30 +18,19 @@ package org.cyanogenmod.audiofx; - import android.app.Application; - import android.util.Log; - --import com.cyanogen.ambient.analytics.AnalyticsServices; --import com.cyanogen.ambient.analytics.Event; --import com.cyanogen.ambient.common.api.AmbientApiClient; -- - public class AudioFxApplication extends Application { - - private static final String TAG = AudioFxApplication.class.getSimpleName(); - private static final boolean DEBUG = false; - -- private AmbientApiClient mClient; -- - @Override - public void onCreate() { - super.onCreate(); -- mClient = new AmbientApiClient.Builder(this) -- .addApi(AnalyticsServices.API) -- .build(); -- mClient.connect(); - } - - public void sendEvent(Event event) { - if (DEBUG) { - Log.i(TAG, "sendEvent() called with event = [" + event + "]"); - } -- AnalyticsServices.AnalyticsApi.sendEvent(mClient, event); - } - } -diff --git a/src/org/cyanogenmod/audiofx/activity/ActivityMusic.java b/src/org/cyanogenmod/audiofx/activity/ActivityMusic.java -index 411ba45..54ede87 100644 ---- a/src/org/cyanogenmod/audiofx/activity/ActivityMusic.java -+++ b/src/org/cyanogenmod/audiofx/activity/ActivityMusic.java -@@ -28,7 +28,6 @@ import android.view.View; - import android.view.ViewStub; - import android.widget.CheckBox; - import android.widget.CompoundButton; --import com.cyanogen.ambient.analytics.Event; - import org.cyanogenmod.audiofx.AudioFxApplication; - import org.cyanogenmod.audiofx.Constants; - import org.cyanogenmod.audiofx.R; -@@ -36,8 +35,6 @@ import org.cyanogenmod.audiofx.fragment.AudioFxFragment; - import org.cyanogenmod.audiofx.knobs.KnobCommander; - import org.cyanogenmod.audiofx.service.AudioFxService; - import org.cyanogenmod.audiofx.service.DevicePreferenceManager; --import org.cyanogenmod.audiofx.stats.AppState; --import org.cyanogenmod.audiofx.stats.UserSession; - - public class ActivityMusic extends Activity { - -@@ -59,9 +56,6 @@ public class ActivityMusic extends Activity { - @Override - public void onCheckedChanged(final CompoundButton buttonView, - final boolean isChecked) { -- if (UserSession.getInstance() != null) { -- UserSession.getInstance().deviceEnabledDisabled(); -- } - mConfig.setCurrentDeviceEnabled(isChecked); - } - }; -@@ -174,20 +168,13 @@ public class ActivityMusic extends Activity { - if (DEBUG) Log.i(TAG, "onResume() called with " + ""); - super.onResume(); - -- // initiate a new session -- new UserSession(mCallingPackage); - } - - @Override - protected void onPause() { - super.onPause(); - -- if (DEBUG) Log.d(TAG, "Session: " + UserSession.getInstance()); - -- final Event.Builder builder = new Event.Builder("session", "ended"); -- UserSession.getInstance().append(builder); -- AppState.appendState(mConfig, KnobCommander.getInstance(this), builder); -- ((AudioFxApplication) getApplicationContext()).sendEvent(builder.build()); - } - - @Override -diff --git a/src/org/cyanogenmod/audiofx/activity/EqualizerManager.java b/src/org/cyanogenmod/audiofx/activity/EqualizerManager.java -index a9e0a6d..0fc928f 100644 ---- a/src/org/cyanogenmod/audiofx/activity/EqualizerManager.java -+++ b/src/org/cyanogenmod/audiofx/activity/EqualizerManager.java -@@ -26,7 +26,6 @@ import org.cyanogenmod.audiofx.Preset; - import org.cyanogenmod.audiofx.R; - import org.cyanogenmod.audiofx.eq.EqUtils; - import org.cyanogenmod.audiofx.service.AudioFxService; --import org.cyanogenmod.audiofx.stats.UserSession; - - import java.util.ArrayList; - import java.util.Arrays; -@@ -274,10 +273,6 @@ public class EqualizerManager { - * @return the index that the levels were copied to - */ - private int addPreset(float[] levels) { -- if (UserSession.getInstance() != null) { -- UserSession.getInstance().presetCreated(); -- } -- - final int customPresets = Constants.getCustomPresets(mContext, mNumBands).size(); - // format the name so it's like "Custom ", start with "Custom 2" - final String name = String.format(mContext.getString(R.string.custom_n), customPresets + 2); -@@ -588,10 +583,6 @@ public class EqualizerManager { - } - - public void renameCurrentPreset(String s) { -- if (UserSession.getInstance() != null) { -- UserSession.getInstance().presetRenamed(); -- } -- - if (isUserPreset()) { - ((Preset.CustomPreset) getCurrentPreset()).setName(s); - } -@@ -602,10 +593,6 @@ public class EqualizerManager { - } - - public boolean removePreset(int index) { -- if (UserSession.getInstance() != null) { -- UserSession.getInstance().presetRemoved(); -- } -- - if (index > mEQCustomPresetPosition) { - mEqPresets.remove(index); - mConfig.getCallbacks().notifyPresetsChanged(); -diff --git a/src/org/cyanogenmod/audiofx/fragment/AudioFxFragment.java b/src/org/cyanogenmod/audiofx/fragment/AudioFxFragment.java -index 582e3d6..89e4b91 100644 ---- a/src/org/cyanogenmod/audiofx/fragment/AudioFxFragment.java -+++ b/src/org/cyanogenmod/audiofx/fragment/AudioFxFragment.java -@@ -45,7 +45,6 @@ import org.cyanogenmod.audiofx.activity.ActivityMusic; - import org.cyanogenmod.audiofx.activity.EqualizerManager; - import org.cyanogenmod.audiofx.activity.MasterConfigControl; - import org.cyanogenmod.audiofx.activity.StateCallbacks; --import org.cyanogenmod.audiofx.stats.UserSession; - import org.cyanogenmod.audiofx.widget.InterceptableLinearLayout; - - import java.util.List; -@@ -337,7 +336,6 @@ public class AudioFxFragment extends Fragment implements StateCallbacks.DeviceCh - AudioDeviceInfo device = mMenuItems.get(item); - - if (device != null) { -- UserSession.getInstance().deviceChanged(); - mDeviceChanging = true; - if (item.isCheckable()) { - item.setChecked(!item.isChecked()); -diff --git a/src/org/cyanogenmod/audiofx/fragment/ControlsFragment.java b/src/org/cyanogenmod/audiofx/fragment/ControlsFragment.java -index 4a0eed6..9c9f5eb 100644 ---- a/src/org/cyanogenmod/audiofx/fragment/ControlsFragment.java -+++ b/src/org/cyanogenmod/audiofx/fragment/ControlsFragment.java -@@ -29,7 +29,6 @@ import org.cyanogenmod.audiofx.R; - import org.cyanogenmod.audiofx.activity.MasterConfigControl; - import org.cyanogenmod.audiofx.knobs.KnobCommander; - import org.cyanogenmod.audiofx.knobs.KnobContainer; --import org.cyanogenmod.audiofx.stats.UserSession; - - public class ControlsFragment extends AudioFxBaseFragment { - -@@ -44,9 +43,6 @@ public class ControlsFragment extends AudioFxBaseFragment { - = new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { -- if (mConfig.getMaxxVolumeEnabled() != isChecked) { -- UserSession.getInstance().maxxVolumeToggled(); -- } - mConfig.setMaxxVolumeEnabled(isChecked); - } - }; -diff --git a/src/org/cyanogenmod/audiofx/fragment/EqualizerFragment.java b/src/org/cyanogenmod/audiofx/fragment/EqualizerFragment.java -index 0f95365..7b459cf 100644 ---- a/src/org/cyanogenmod/audiofx/fragment/EqualizerFragment.java -+++ b/src/org/cyanogenmod/audiofx/fragment/EqualizerFragment.java -@@ -46,7 +46,6 @@ import org.cyanogenmod.audiofx.eq.EqContainerView; - import org.cyanogenmod.audiofx.preset.InfinitePagerAdapter; - import org.cyanogenmod.audiofx.preset.InfiniteViewPager; - import org.cyanogenmod.audiofx.preset.PresetPagerAdapter; --import org.cyanogenmod.audiofx.stats.UserSession; - import org.cyanogenmod.audiofx.viewpagerindicator.CirclePageIndicator; - - public class EqualizerFragment extends AudioFxBaseFragment -@@ -516,9 +515,6 @@ public class EqualizerFragment extends AudioFxBaseFragment - mSelectedPosition = position; - if (!mDeviceChanging) { - mSelectedPositionBands = mEqManager.getPresetLevels(mSelectedPosition); -- if (UserSession.getInstance() != null) { -- UserSession.getInstance().presetSelected(); -- } - } - } - -diff --git a/src/org/cyanogenmod/audiofx/knobs/RadialKnob.java b/src/org/cyanogenmod/audiofx/knobs/RadialKnob.java -index 9f35835..b9bd045 100644 ---- a/src/org/cyanogenmod/audiofx/knobs/RadialKnob.java -+++ b/src/org/cyanogenmod/audiofx/knobs/RadialKnob.java -@@ -49,7 +49,6 @@ import android.view.View; - import android.view.animation.AccelerateInterpolator; - import android.widget.Toast; - import org.cyanogenmod.audiofx.R; --import org.cyanogenmod.audiofx.stats.UserSession; - - public class RadialKnob extends View { - -@@ -456,8 +455,6 @@ public class RadialKnob extends View { - } - } - if (mMoved) { -- UserSession.getInstance() -- .knobOptionsAdjusted(((KnobContainer.KnobInfo)getTag()).whichKnob); - } - mLastX = -1; - mLastY = -1; -diff --git a/src/org/cyanogenmod/audiofx/stats/AppState.java b/src/org/cyanogenmod/audiofx/stats/AppState.java -deleted file mode 100644 -index 7ca0c9c..0000000 ---- a/src/org/cyanogenmod/audiofx/stats/AppState.java -+++ /dev/null -@@ -1,53 +0,0 @@ --/* -- * Copyright (C) 2016 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ --package org.cyanogenmod.audiofx.stats; -- --import com.cyanogen.ambient.analytics.Event; --import org.cyanogenmod.audiofx.Preset; --import org.cyanogenmod.audiofx.activity.MasterConfigControl; --import org.cyanogenmod.audiofx.eq.EqUtils; --import org.cyanogenmod.audiofx.knobs.KnobCommander; -- --public class AppState { -- public static void appendState(MasterConfigControl control, -- KnobCommander knobs, Event.Builder builder) { -- // what's the current output device? -- builder.addField("state_current_device", control.getCurrentDeviceIdentifier()); -- -- // what preset? if custom, what name/values? -- builder.addField("state_preset_name", control.getEqualizerManager().getCurrentPreset().getName()); -- -- if (control.getEqualizerManager().getCurrentPreset() instanceof Preset.CustomPreset) { -- builder.addField("state_custom_preset_values", -- EqUtils.floatLevelsToString(control.getEqualizerManager().getCurrentPreset().getLevels())); -- } -- -- // knob states -- if (control.hasMaxxAudio()) { -- builder.addField("state_maxx_volume", control.getMaxxVolumeEnabled()); -- } -- -- if (knobs.hasBassBoost()) { -- builder.addField("state_knob_bass", knobs.getBassStrength()); -- } -- if (knobs.hasTreble()) { -- builder.addField("state_knob_treble", knobs.getTrebleStrength()); -- } -- if (knobs.hasVirtualizer()) { -- builder.addField("state_knob_virtualizer", knobs.getVirtualizerStrength()); -- } -- } --} -diff --git a/src/org/cyanogenmod/audiofx/stats/UserSession.java b/src/org/cyanogenmod/audiofx/stats/UserSession.java -deleted file mode 100644 -index 285edb3..0000000 ---- a/src/org/cyanogenmod/audiofx/stats/UserSession.java -+++ /dev/null -@@ -1,215 +0,0 @@ --/* -- * Copyright (C) 2016 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ --package org.cyanogenmod.audiofx.stats; -- --import android.os.Parcel; --import android.os.Parcelable; --import com.cyanogen.ambient.analytics.Event; --import org.cyanogenmod.audiofx.Preset; --import org.cyanogenmod.audiofx.knobs.KnobCommander; -- --public class UserSession implements Parcelable { -- -- private static final String SOURCE_NONE = "none"; -- -- private static UserSession sSession; -- public static final UserSession getInstance() { -- return sSession; -- } -- -- private String mSource; -- private int mDevicesChanged; -- private int mEnabledDisabledToggles; -- private int mPresetsSelected; -- private int mPresetsCreated; -- private int mPresetsRemoved; -- private int mPresetsRenamed; -- private int mMaxxVolumeToggled; -- private int mTrebleKnobAdjusted; -- private int mBassKnobAdjusted; -- private int mVirtualizerKnobAdjusted; -- -- public UserSession(String incomingPackageSource) { -- if (incomingPackageSource == null) { -- mSource = SOURCE_NONE; -- } else { -- mSource = incomingPackageSource; -- } -- sSession = this; -- } -- -- public void deviceChanged() { -- mDevicesChanged++; -- } -- -- public void deviceEnabledDisabled() { -- mEnabledDisabledToggles++; -- } -- -- public void presetSelected() { -- mPresetsSelected++; -- } -- -- public void presetRemoved() { -- mPresetsRemoved++; -- } -- -- public void presetRenamed() { -- mPresetsRenamed++; -- } -- -- public void presetCreated() { -- mPresetsCreated++; -- } -- -- public void maxxVolumeToggled() { -- mMaxxVolumeToggled++; -- } -- -- public void knobOptionsAdjusted(int knob) { -- switch (knob) { -- case KnobCommander.KNOB_BASS: -- mBassKnobAdjusted++; -- break; -- case KnobCommander.KNOB_TREBLE: -- mTrebleKnobAdjusted++; -- break; -- case KnobCommander.KNOB_VIRTUALIZER: -- mVirtualizerKnobAdjusted++; -- break; -- } -- } -- -- public void append(Event.Builder builder) { -- builder.addField("session_source", mSource); -- if (mDevicesChanged > 0) -- builder.addField("session_devices_changed_count", mDevicesChanged); -- if (mEnabledDisabledToggles > 0) -- builder.addField("session_devices_enabled_disabled_count", mEnabledDisabledToggles); -- if (mPresetsSelected > 0) -- builder.addField("session_presets_changed_count", mPresetsSelected); -- if (mPresetsCreated > 0) -- builder.addField("session_presets_created_count", mPresetsCreated); -- if (mPresetsRemoved > 0) -- builder.addField("session_presets_removed_count", mPresetsRemoved); -- if (mPresetsRenamed > 0) -- builder.addField("session_presets_renamed_count", mPresetsRenamed); -- if (mMaxxVolumeToggled > 0) -- builder.addField("session_maxx_volume_toggled", mMaxxVolumeToggled); -- if (mBassKnobAdjusted > 0) -- builder.addField("session_knobs_bass_adjusted_count", mBassKnobAdjusted); -- if (mVirtualizerKnobAdjusted > 0) -- builder.addField("session_knobs_virtualizer_adjusted_count", mVirtualizerKnobAdjusted); -- if (mTrebleKnobAdjusted > 0) -- builder.addField("session_knobs_treble_adjusted_count", mTrebleKnobAdjusted); -- } -- -- @Override -- public String toString() { -- StringBuilder s = new StringBuilder(getClass().getName() + "["); -- if (mSource != null) { -- s.append("mSource=").append(mSource).append(", "); -- } -- if (mDevicesChanged > 0) { -- s.append("mDevicesChanged=").append(mDevicesChanged).append(", "); -- } -- if (mEnabledDisabledToggles > 0) { -- s.append("mEnabledDisabledToggles=").append(mEnabledDisabledToggles).append(", "); -- } -- if (mPresetsSelected > 0) { -- s.append("mPresetsSelected=").append(mPresetsSelected).append(", "); -- } -- if (mPresetsCreated > 0) { -- s.append("mPresetsCreated=").append(mPresetsCreated).append(", "); -- } -- if (mPresetsRemoved > 0) { -- s.append("mPresetsRemoved=").append(mPresetsRemoved).append(", "); -- } -- if (mPresetsRenamed > 0) { -- s.append("mPresetsRenamed=").append(mPresetsRenamed).append(", "); -- } -- if (mMaxxVolumeToggled > 0) { -- s.append("mMaxxVolumeToggled=").append(mMaxxVolumeToggled).append(", "); -- } -- if (mBassKnobAdjusted > 0) { -- s.append("mBassKnobAdjusted=").append(mBassKnobAdjusted).append(", "); -- } -- if (mVirtualizerKnobAdjusted > 0) { -- s.append("mVirtualizerKnobAdjusted=").append(mVirtualizerKnobAdjusted).append(", "); -- } -- if (mTrebleKnobAdjusted > 0) { -- s.append("mTrebleKnobAdjusted=").append(mTrebleKnobAdjusted).append(", "); -- } -- if (s.charAt(s.length() - 2) == ',') { -- s.delete(s.length() - 2, s.length()); -- } -- s.append("]"); -- -- return s.toString(); -- } -- -- public static final Creator CREATOR = new Creator() { -- @Override -- public UserSession createFromParcel(Parcel in) { -- return new UserSession(in); -- } -- -- @Override -- public UserSession[] newArray(int size) { -- return new UserSession[size]; -- } -- }; -- -- @Override -- public int describeContents() { -- return 0; -- } -- -- protected UserSession(Parcel in) { -- mSource = in.readString(); -- mDevicesChanged = in.readInt(); -- mEnabledDisabledToggles = in.readInt(); -- mPresetsSelected = in.readInt(); -- mPresetsCreated = in.readInt(); -- mPresetsRemoved = in.readInt(); -- mPresetsRenamed = in.readInt(); -- mBassKnobAdjusted = in.readInt(); -- mVirtualizerKnobAdjusted = in.readInt(); -- mTrebleKnobAdjusted = in.readInt(); -- mMaxxVolumeToggled = in.readInt(); -- } -- -- @Override -- public void writeToParcel(Parcel dest, int flags) { -- dest.writeString(mSource); -- dest.writeInt(mDevicesChanged); -- dest.writeInt(mEnabledDisabledToggles); -- dest.writeInt(mPresetsSelected); -- dest.writeInt(mPresetsCreated); -- dest.writeInt(mPresetsRemoved); -- dest.writeInt(mPresetsRenamed); -- dest.writeInt(mBassKnobAdjusted); -- dest.writeInt(mVirtualizerKnobAdjusted); -- dest.writeInt(mTrebleKnobAdjusted); -- dest.writeInt(mMaxxVolumeToggled); -- } -- -- private static class State { -- private String mOutputDevice; -- private Preset mPreset; -- private String mKnobsOpts; -- } --} --- -2.9.3 - diff --git a/Patches/CyanogenMod-13.0/android_packages_apps_Contacts/Remove_Analytics.patch b/Patches/CyanogenMod-13.0/android_packages_apps_Contacts/Remove_Analytics.patch deleted file mode 100644 index 9847c625..00000000 --- a/Patches/CyanogenMod-13.0/android_packages_apps_Contacts/Remove_Analytics.patch +++ /dev/null @@ -1,1230 +0,0 @@ -From 63088e28c95fb7235308ed6c6677a4796de24aa4 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Fri, 8 Apr 2016 21:33:05 -0400 -Subject: [PATCH] Remove analytics - -Change-Id: Ie162b463d2bf591cc99937dc074d781d6ef8cb88 ---- - AndroidManifest_cm.xml | 14 - - src/com/android/contacts/ContactsApplication.java | 2 - - .../contacts/activities/PeopleActivity.java | 8 +- - .../editor/CompactContactEditorFragment.java | 2 - - .../contacts/editor/ContactEditorFragment.java | 2 - - .../contacts/incall/InCallMetricsDbHelper.java | 330 ------------- - .../contacts/incall/InCallMetricsHelper.java | 533 --------------------- - .../contacts/incall/InCallMetricsReceiver.java | 33 -- - .../contacts/incall/InCallMetricsService.java | 35 -- - .../list/PluginContactBrowseListFragment.java | 13 +- - .../quickcontact/QuickContactActivity.java | 40 +- - 11 files changed, 4 insertions(+), 1008 deletions(-) - delete mode 100644 src/com/android/contacts/incall/InCallMetricsDbHelper.java - delete mode 100644 src/com/android/contacts/incall/InCallMetricsHelper.java - delete mode 100644 src/com/android/contacts/incall/InCallMetricsReceiver.java - delete mode 100644 src/com/android/contacts/incall/InCallMetricsService.java - -diff --git a/AndroidManifest_cm.xml b/AndroidManifest_cm.xml -index 1f1e29e..1e33223 100644 ---- a/AndroidManifest_cm.xml -+++ b/AndroidManifest_cm.xml -@@ -20,8 +20,6 @@ - - - -- - - - - -- -- -- -- -- -- -- -- -- -- - - -diff --git a/src/com/android/contacts/ContactsApplication.java b/src/com/android/contacts/ContactsApplication.java -index f0f86e9..74fb9e5 100644 ---- a/src/com/android/contacts/ContactsApplication.java -+++ b/src/com/android/contacts/ContactsApplication.java -@@ -37,7 +37,6 @@ import com.android.contacts.common.testing.InjectedServices; - import com.android.contacts.common.util.Constants; - import com.android.contacts.commonbind.analytics.AnalyticsUtil; - import com.android.contacts.incall.InCallPluginHelper; --import com.android.contacts.incall.InCallMetricsHelper; - import com.android.phone.common.incall.CallMethodHelper; - - import com.google.common.annotations.VisibleForTesting; -@@ -128,7 +127,6 @@ public final class ContactsApplication extends Application { - - AnalyticsUtil.initialize(this); - InCallPluginHelper.init(this); -- InCallMetricsHelper.init(this); - } - - private class DelayedInitializer extends AsyncTask { -diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java -index 5df9ebe..c42d6d3 100644 ---- a/src/com/android/contacts/activities/PeopleActivity.java -+++ b/src/com/android/contacts/activities/PeopleActivity.java -@@ -56,11 +56,9 @@ import android.view.Window; - import android.widget.ImageButton; - import android.widget.Toast; - import android.widget.Toolbar; -- --import com.android.contacts.ContactsActivity; --import com.android.contacts.incall.InCallMetricsHelper; - import com.android.contacts.incall.InCallPluginHelper; - import com.android.contacts.incall.InCallPluginInfo; -+import com.android.contacts.ContactsActivity; - import com.android.contacts.R; - import com.android.contacts.activities.ActionBarAdapter.TabState; - import com.android.contacts.common.ContactsUtils; -@@ -971,10 +969,6 @@ public class PeopleActivity extends ContactsActivity implements - if (fragment != null) { - fragment.setUserVisibleHint(true); - } -- if (mCurrentPrimaryItem instanceof PluginContactBrowseListFragment) { -- InCallMetricsHelper.increaseImpressionCount(PeopleActivity.this, -- ((PluginContactBrowseListFragment) mCurrentPrimaryItem).getPluginInfo()); -- } - mCurrentPrimaryItem = fragment; - } - } -diff --git a/src/com/android/contacts/editor/CompactContactEditorFragment.java b/src/com/android/contacts/editor/CompactContactEditorFragment.java -index 28bf078..656c5ae 100644 ---- a/src/com/android/contacts/editor/CompactContactEditorFragment.java -+++ b/src/com/android/contacts/editor/CompactContactEditorFragment.java -@@ -26,7 +26,6 @@ import com.android.contacts.common.model.ValuesDelta; - import com.android.contacts.common.model.account.AccountType; - import com.android.contacts.common.util.ImplicitIntentsUtil; - import com.android.contacts.detail.PhotoSelectionHandler; --import com.android.contacts.incall.InCallMetricsHelper; - import com.android.contacts.util.ContactPhotoUtils; - - import android.app.Activity; -@@ -326,7 +325,6 @@ public class CompactContactEditorFragment extends ContactEditorBaseFragment impl - mContext, mContactIdForJoin, contactId, CompactContactEditorActivity.class, - CompactContactEditorActivity.ACTION_JOIN_COMPLETED); - mContext.startService(intent); -- InCallMetricsHelper.increaseContactManualMergeCount(mContext, mContactIdForJoin, contactId); - } - - @Override -diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java -index bd15b62..31e8d51 100644 ---- a/src/com/android/contacts/editor/ContactEditorFragment.java -+++ b/src/com/android/contacts/editor/ContactEditorFragment.java -@@ -46,7 +46,6 @@ import com.android.contacts.common.util.AccountsListAdapter; - import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter; - import com.android.contacts.detail.PhotoSelectionHandler; - import com.android.contacts.editor.Editor.EditorListener; --import com.android.contacts.incall.InCallMetricsHelper; - import com.android.contacts.util.ContactPhotoUtils; - import com.android.contacts.util.UiClosables; - -@@ -536,7 +535,6 @@ public class ContactEditorFragment extends ContactEditorBaseFragment implements - mContext, mContactIdForJoin, contactId, ContactEditorActivity.class, - ContactEditorActivity.ACTION_JOIN_COMPLETED); - mContext.startService(intent); -- InCallMetricsHelper.increaseContactManualMergeCount(mContext, mContactIdForJoin, contactId); - } - - /** -diff --git a/src/com/android/contacts/incall/InCallMetricsDbHelper.java b/src/com/android/contacts/incall/InCallMetricsDbHelper.java -deleted file mode 100644 -index c511227..0000000 ---- a/src/com/android/contacts/incall/InCallMetricsDbHelper.java -+++ /dev/null -@@ -1,330 +0,0 @@ --/* -- * Copyright (C) 2016 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.contacts.incall; -- --import android.content.ContentValues; --import android.content.Context; --import android.database.Cursor; --import android.database.DatabaseUtils; --import android.database.sqlite.SQLiteDatabase; --import android.database.sqlite.SQLiteOpenHelper; --import android.util.Log; -- --import com.google.common.base.Preconditions; -- --import java.util.LinkedList; --import java.util.List; -- --public class InCallMetricsDbHelper extends SQLiteOpenHelper { -- private static final String TAG = InCallMetricsDbHelper.class.getSimpleName(); -- private static final boolean DEBUG = false; -- -- private static InCallMetricsDbHelper mInstance = null; -- -- private static final int DATABASE_VERSION = 1; -- private static final String DATABASE_NAME = "contacts_incall_metrics.db"; -- -- private final Context mContext; -- -- // db query select statements -- private static final String SELECT_NUDGE_ID_AND_ACCEPT_TIME = -- InAppColumns.NUDGE_ID + "==? AND " + InAppColumns.EVENT_ACCEPTANCE_TIME + " ==? "; -- private static final String SELECT_PROVIDER_AND_EVENT = -- UserActionsColumns.PROVIDER_NAME + "==? AND " + UserActionsColumns.EVENT_NAME + " ==?"; -- -- public interface Tables { -- // stores events in the INAPP_ACTIONS category -- static final String INAPP_TABLE = "inapp_metrics"; -- // store events in the USER_ACTIONS category -- static final String USER_ACTIONS_TABLE = "user_actions_metrics"; -- } -- -- public interface InAppColumns { -- static final String _ID = "id"; -- static final String CATEGORY = "category"; -- static final String EVENT_NAME = "event_name"; -- static final String COUNT = "count"; -- static final String NUDGE_ID = "nudge_id"; -- static final String EVENT_ACCEPTANCE = "event_acceptance"; -- static final String EVENT_ACCEPTANCE_TIME = "event_acceptance_time"; -- static final String PROVIDER_NAME = "provider_name"; -- } -- -- public interface UserActionsColumns { -- static final String _ID = "id"; -- static final String CATEGORY = "category"; -- static final String EVENT_NAME = "event_name"; -- static final String COUNT = "count"; -- static final String PROVIDER_NAME = "provider_name"; -- static final String RAW_ID = "raw_id"; -- } -- -- private static final String[] INAPP_PROJECTION = new String[] { -- InAppColumns._ID, -- InAppColumns.CATEGORY, -- InAppColumns.EVENT_NAME, -- InAppColumns.COUNT, -- InAppColumns.NUDGE_ID, -- InAppColumns.EVENT_ACCEPTANCE, -- InAppColumns.EVENT_ACCEPTANCE_TIME, -- InAppColumns.PROVIDER_NAME -- }; -- -- private static final String[] USER_ACTIONS_PROJECTION = new String[] { -- UserActionsColumns._ID, -- UserActionsColumns.CATEGORY, -- UserActionsColumns.EVENT_NAME, -- UserActionsColumns.COUNT, -- UserActionsColumns.PROVIDER_NAME, -- UserActionsColumns.RAW_ID -- }; -- -- /** -- * If there's an existing entry that matches the NUDGE_ID and the EVENT_ACCEPTANCE_TIME -- * is not set, increment the count stored "colName" column. Otherwise, create a new entry. -- * -- * @param provider component name of the InCall provider -- * @param event metric event -- * @param cat metric category -- * @param nudgeId metric nudge ID -- * @param colName database column name to increment -- */ -- public void incrementInAppParam(String provider, String event, String cat, String nudgeId, -- String colName) { -- // find entries that match nudge_id, and timestamp 0 to increment count -- if (nudgeId == null) { -- nudgeId = InCallMetricsHelper.NUDGE_ID_INVALID; -- } -- ContentValues entry = new ContentValues(); -- entry.put(InAppColumns.EVENT_NAME, event); -- entry.put(InAppColumns.CATEGORY, cat); -- entry.put(InAppColumns.NUDGE_ID, nudgeId); -- entry.put(InAppColumns.PROVIDER_NAME, provider); -- String[] selectionArgs = new String[] {nudgeId, String.valueOf(0)}; -- SQLiteDatabase db = getWritableDatabase(); -- Cursor queryCursor = db.query( -- Tables.INAPP_TABLE, -- INAPP_PROJECTION, -- SELECT_NUDGE_ID_AND_ACCEPT_TIME, -- selectionArgs, -- null, -- null, -- null); -- if (queryCursor != null && queryCursor.moveToFirst()) { -- // increment existing entry -- entry.put(colName, queryCursor.getInt(queryCursor.getColumnIndex(colName)) + 1); -- db.update(Tables.INAPP_TABLE, entry, SELECT_NUDGE_ID_AND_ACCEPT_TIME, selectionArgs); -- } else { -- // no entry where acceptance time is not set -- entry.put(colName, 1); -- db.insert(Tables.INAPP_TABLE, null, entry); -- } -- queryCursor.close(); -- } -- -- /** -- * Tables.INAPP_TABLE stores in-app nudge related interaction events. When a user -- * accepts (accept set to 1)/dismisses (accept set to 0) the in-app nudge, the timestamp -- * is stored in EVENT_ACCEPTANCE_TIME. Once that timestamp is captured, any subsequent in-app -- * nudge interaction events should be recorded in a new entry. -- * If there's an existing entry that matches the NUDGE_ID and the EVENT_ACCEPTANCE_TIME -- * is not set, set the EVENT_ACCEPTANCE and EVENT_ACCEPTANCE_TIME. Otherwise, create a new -- * entry. -- * -- * @param provider component name of the InCall provider -- * @param event metric event -- * @param cat metric category -- * @param nudgeId metric nudge ID -- */ -- public void setInAppAcceptance(String provider, String event, String cat, Integer accept, -- String nudgeId) { -- // find entries that match nudge_id, and timestamp 0 -- // if all matche entries have timestamp set, create a new entry -- if (nudgeId == null) { -- nudgeId = InCallMetricsHelper.NUDGE_ID_INVALID; -- } -- String[] selectionArgs = new String[] {nudgeId, String.valueOf(0)}; -- SQLiteDatabase db = getWritableDatabase(); -- Cursor queryCursor = db.query( -- Tables.INAPP_TABLE, -- INAPP_PROJECTION, -- SELECT_NUDGE_ID_AND_ACCEPT_TIME, -- selectionArgs, -- null, -- null, -- null); -- ContentValues entry = new ContentValues(); -- entry.put(InAppColumns.EVENT_NAME, event); -- entry.put(InAppColumns.CATEGORY, cat); -- entry.put(InAppColumns.NUDGE_ID, nudgeId); -- entry.put(InAppColumns.PROVIDER_NAME, provider); -- entry.put(InAppColumns.EVENT_ACCEPTANCE, accept); -- entry.put(InAppColumns.EVENT_ACCEPTANCE_TIME, System.currentTimeMillis()); -- if (queryCursor != null && queryCursor.moveToFirst()) { -- db.update(Tables.INAPP_TABLE, entry, SELECT_NUDGE_ID_AND_ACCEPT_TIME, selectionArgs); -- } else { -- db.insert(Tables.INAPP_TABLE, null, entry); -- } -- queryCursor.close(); -- } -- -- /** -- * Tables.USER_ACTIONS_TABLE stores auto/manual merge counts and invite counts. -- * If there's an existing entry that matches the PROVIDER_NAME and the EVENT_NAME, -- * increment the count stored in the "colName" column. Otherwise, create a new entry. -- * -- * @param provider component name of the InCall provider -- * @param event metric event -- * @param cat metric category -- * @param colName database column name to increment -- */ -- public void incrementUserActionsParam(String provider, String rawIds, String event, String -- cat, String colName) { -- // query for event type, update, if not found insert -- ContentValues entry = new ContentValues(); -- entry.put(UserActionsColumns.EVENT_NAME, event); -- entry.put(UserActionsColumns.CATEGORY, cat); -- entry.put(UserActionsColumns.PROVIDER_NAME, provider); -- entry.put(UserActionsColumns.RAW_ID, rawIds); -- -- String[] selectionArgs = new String[] {provider, event}; -- SQLiteDatabase db = getWritableDatabase(); -- Cursor queryCursor = db.query( -- Tables.USER_ACTIONS_TABLE, -- USER_ACTIONS_PROJECTION, -- SELECT_PROVIDER_AND_EVENT, -- selectionArgs, -- null, -- null, -- null); -- if (queryCursor != null && queryCursor.moveToFirst()) { -- // increment existing entry, only increment if it's manual merge -- if (event.equals(InCallMetricsHelper.Events.CONTACTS_MANUAL_MERGED)) { -- entry.put(colName, -- queryCursor.getInt(queryCursor.getColumnIndex(colName)) + 1); -- db.update(Tables.USER_ACTIONS_TABLE, entry, SELECT_PROVIDER_AND_EVENT, -- selectionArgs); -- } -- } else { -- // no existing entry, create one -- entry.put(colName, 1); -- db.insert(Tables.USER_ACTIONS_TABLE, null, entry); -- } -- queryCursor.close(); -- } -- -- /** -- * Return all entries in the table storing events from the corresponding category -- * -- * @param cat metric category -- * @param clear if the database table should be cleared afterwards -- * @return List of ContentValues in the respective table -- */ -- public List getAllEntries(InCallMetricsHelper.Categories cat, boolean clear) { -- List list = new LinkedList(); -- String table = ""; -- switch (cat) { -- case USER_ACTIONS: -- table = Tables.USER_ACTIONS_TABLE; -- break; -- case INAPP_NUDGES: -- table = Tables.INAPP_TABLE; -- break; -- default: -- return list; -- } -- SQLiteDatabase db = getWritableDatabase(); -- Cursor cursor = db.rawQuery("SELECT * FROM " + table, null); -- if (cursor != null && cursor.moveToFirst()) { -- do { -- ContentValues entry = new ContentValues(); -- DatabaseUtils.cursorRowToContentValues(cursor, entry); -- list.add(entry); -- } while (cursor.moveToNext()); -- } -- if (!DEBUG && clear) { -- db.delete(table, null, null); -- } -- cursor.close(); -- return list; -- } -- -- @Override -- public void onCreate(SQLiteDatabase db) { -- setupTables(db); -- } -- -- @Override -- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { -- if (oldVersion == 0) { -- Log.e(TAG, "Malformed database version..recreating database"); -- } -- -- if (oldVersion <= newVersion) { -- setupTables(db); -- } -- } -- -- public static synchronized InCallMetricsDbHelper getInstance(Context context) { -- if (DEBUG) { -- Log.v(TAG, "Getting Instance"); -- } -- if (mInstance == null) { -- // Use application context instead of activity context because this is a singleton, -- // and we don't want to leak the activity if the activity is not running but the -- // database helper is still doing work. -- mInstance = new InCallMetricsDbHelper(context.getApplicationContext(), DATABASE_NAME); -- } -- return mInstance; -- } -- -- protected InCallMetricsDbHelper(Context context, String databaseName) { -- this(context, databaseName, DATABASE_VERSION); -- } -- -- protected InCallMetricsDbHelper(Context context, String databaseName, int dbVersion) { -- super(context, databaseName, null, dbVersion); -- mContext = context; -- } -- -- private void setupTables(SQLiteDatabase db) { -- dropTables(db); -- db.execSQL("CREATE TABLE " + Tables.INAPP_TABLE + " (" + -- InAppColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + -- InAppColumns.CATEGORY + " TEXT, " + -- InAppColumns.EVENT_NAME + " TEXT, " + -- InAppColumns.COUNT + " INTEGER DEFAULT 0, " + -- InAppColumns.NUDGE_ID + " TEXT, " + -- InAppColumns.EVENT_ACCEPTANCE + " INTEGER DEFAULT -1, " + -- InAppColumns.EVENT_ACCEPTANCE_TIME + " INTEGER DEFAULT 0, " + -- InAppColumns.PROVIDER_NAME + " TEXT" + -- ");"); -- db.execSQL("CREATE TABLE " + Tables.USER_ACTIONS_TABLE + " (" + -- UserActionsColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + -- UserActionsColumns.CATEGORY + " TEXT, " + -- UserActionsColumns.EVENT_NAME + " TEXT, " + -- UserActionsColumns.COUNT + " INTEGER DEFAULT 0, " + -- UserActionsColumns.PROVIDER_NAME + " TEXT, " + -- UserActionsColumns.RAW_ID + " INTEGER DEFAULT 0" + -- ");"); -- } -- -- public void dropTables(SQLiteDatabase db) { -- db.execSQL("DROP TABLE IF EXISTS " + Tables.INAPP_TABLE); -- db.execSQL("DROP TABLE IF EXISTS " + Tables.USER_ACTIONS_TABLE); -- } --} -\ No newline at end of file -diff --git a/src/com/android/contacts/incall/InCallMetricsHelper.java b/src/com/android/contacts/incall/InCallMetricsHelper.java -deleted file mode 100644 -index 5b041a2..0000000 ---- a/src/com/android/contacts/incall/InCallMetricsHelper.java -+++ /dev/null -@@ -1,533 +0,0 @@ --/* -- * Copyright (C) 2016 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.contacts.incall; -- --import android.app.AlarmManager; --import android.app.PendingIntent; --import android.content.ComponentName; --import android.content.ContentValues; --import android.content.Context; --import android.content.Intent; --import android.database.Cursor; -- --import android.os.Handler; --import android.os.HandlerThread; --import android.os.SystemClock; --import android.provider.ContactsContract.RawContacts; --import android.util.Log; -- --import com.android.phone.common.ambient.AmbientConnection; --import com.android.phone.common.incall.CallMethodInfo; --import com.cyanogen.ambient.analytics.AnalyticsServices; --import com.cyanogen.ambient.analytics.Event; --import com.cyanogen.ambient.incall.InCallServices; --import com.google.common.base.Joiner; --import cyanogenmod.providers.CMSettings; -- --import java.util.ArrayList; --import java.util.Arrays; --import java.util.Collections; --import java.util.HashMap; --import java.util.HashSet; --import java.util.List; --import java.util.Set; -- --public class InCallMetricsHelper { -- private static final String TAG = InCallMetricsHelper.class.getSimpleName(); -- -- private static final boolean DEBUG = false; -- private static final String CATEGORY_PREFIX = "contacts.incall."; -- private static final int REQUEST_CODE = 777; -- -- public static final String NUDGE_ID_INVALID = "-1"; -- public static final int EVENT_DISMISS = 0; -- public static final int EVENT_ACCEPT = 1; -- -- private static InCallMetricsHelper sInstance; -- private InCallMetricsDbHelper mDbHelper; -- private static final String HANDLER_THREAD_NAME = "InCallMetricsHandler"; -- private HandlerThread mHandlerThread; -- private Handler mHandler; -- private Context mContext; -- -- public enum Categories { -- USER_ACTIONS("USER_ACTIONS"), -- INAPP_NUDGES("INAPP_NUDGES"), -- UNKNOWN("UNKNOWN"); -- -- private String mValue; -- Categories(String s) { -- mValue = s; -- } -- public String value() { -- return mValue; -- } -- } -- -- public enum Events { -- CONTACTS_MANUAL_MERGED("CONTACTS_MANUAL_MERGED"), -- CONTACTS_AUTO_MERGED("CONTACTS_AUTO_MERGED"), -- INVITES_SENT("INVITES_SENT"), -- INAPP_NUDGE_CONTACTS_LOGIN("INAPP_NUDGE_CONTACTS_LOGIN"), -- INAPP_NUDGE_CONTACTS_INSTALL("INAPP_NUDGE_CONTACTS_INSTALL"), -- INAPP_NUDGE_CONTACTS_TAB_LOGIN("INAPP_NUDGE_CONTACTS_TAB_LOGIN"), -- UNKNOWN("UNKNOWN"); -- -- private String mValue; -- Events(String s) { -- mValue = s; -- } -- public String value() { -- return mValue; -- } -- } -- -- public enum Parameters { -- ACTION_LOCATION("ACTION_LOCATION"), -- CATEGORY("CATEGORY"), -- COUNT("COUNT"), -- EVENT_ACCEPTANCE("EVENT_ACCEPTANCE"), -- EVENT_ACCEPTANCE_TIME("EVENT_ACCEPTANCE_TIME"), -- EVENT_NAME("EVENT_NAME"), -- NUDGE_ID("NUDGE_ID"), -- PROVIDER_NAME("PROVIDER_NAME"); -- -- private String mValue; -- -- Parameters(String s) { -- mValue = s; -- } -- -- public String value() { -- return mValue; -- } -- -- public String toCol() { -- return mValue.toLowerCase(); -- } -- } -- -- public static void init(Context context) { -- InCallMetricsHelper helper = getInstance(context); -- AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); -- Intent i = new Intent(context, InCallMetricsService.class); -- -- // scheduled every 24h -- PendingIntent pendingIntent = PendingIntent.getService(context, REQUEST_CODE, i, -- PendingIntent.FLAG_UPDATE_CURRENT); -- am.setInexactRepeating(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime(), -- AlarmManager.INTERVAL_DAY, pendingIntent); -- } -- -- public static synchronized InCallMetricsHelper getInstance(Context context) { -- if (sInstance == null) { -- sInstance = new InCallMetricsHelper(); -- sInstance.mContext = context; -- // init handler -- sInstance.mHandlerThread = new HandlerThread(HANDLER_THREAD_NAME); -- sInstance.mHandlerThread.start(); -- sInstance.mHandler = new Handler(sInstance.mHandlerThread.getLooper()); -- sInstance.mDbHelper = InCallMetricsDbHelper.getInstance(context); -- } -- return sInstance; -- } -- -- /** -- * Gather all metrics entries from tables and send to Ambient. Called from -- * InCallMetricsService (IntentService) -- * -- * @param context context to be used in db -- */ -- public static void prepareAndSend(Context context) { -- if (!statsOptIn(context)) { -- return; -- } -- -- InCallMetricsHelper helper = getInstance(context); -- // In App events -- List allList = helper.mDbHelper.getAllEntries(Categories.INAPP_NUDGES, true); -- // User Actions events -- allList.addAll(helper.mDbHelper.getAllEntries(Categories.USER_ACTIONS, true)); -- for (ContentValues cv : allList) { -- Categories cat = cv.containsKey(Parameters.CATEGORY.toCol()) ? -- Categories.valueOf(cv.getAsString(Parameters.CATEGORY.toCol())) : -- Categories.UNKNOWN; -- Events event = cv.containsKey(Parameters.EVENT_NAME.toCol()) ? -- Events.valueOf(cv.getAsString(Parameters.EVENT_NAME.toCol())) : -- Events.UNKNOWN; -- Set plugins = InCallPluginHelper.getAllPluginComponentNames(); -- sendEvent(context, cat, event, getExtraFields(cat, event, cv), plugins); -- } -- } -- -- /** -- * Map ContentValues pair from db to pairs -- * -- * @param event metric event -- * @param cat metric category -- * @param cv -- */ -- private static HashMap getExtraFields(Categories cat, Events event, -- ContentValues cv) { -- HashMap map = new HashMap(); -- map.put(Parameters.PROVIDER_NAME, cv.getAsString(Parameters.PROVIDER_NAME.toCol())); -- switch (cat) { -- case INAPP_NUDGES: -- switch (event) { -- case INAPP_NUDGE_CONTACTS_LOGIN: -- case INAPP_NUDGE_CONTACTS_INSTALL: -- case INAPP_NUDGE_CONTACTS_TAB_LOGIN: -- map.put(Parameters.COUNT, cv.getAsInteger(Parameters.COUNT.toCol())); -- map.put(Parameters.NUDGE_ID, cv.getAsString(Parameters.NUDGE_ID.toCol())); -- map.put(Parameters.EVENT_ACCEPTANCE_TIME, -- cv.getAsInteger(Parameters.EVENT_ACCEPTANCE_TIME.toCol())); -- map.put(Parameters.EVENT_ACCEPTANCE, -- cv.getAsInteger(Parameters.EVENT_ACCEPTANCE.toCol()) == 0 ? -- Boolean.FALSE : Boolean.TRUE); -- break; -- default: -- break; -- } -- break; -- case USER_ACTIONS: -- switch (event) { -- case CONTACTS_AUTO_MERGED: -- case CONTACTS_MANUAL_MERGED: -- case INVITES_SENT: -- map.put(Parameters.COUNT, cv.getAsInteger(Parameters.COUNT.toCol())); -- break; -- default: -- break; -- } -- break; -- default: -- break; -- } -- return map; -- } -- -- /** -- * Send AnalyticsService events to Ambient and InCall plugins -- * -- * @param context context -- * @param cat metric category -- * @param eventName metric event name -- * @param extraFields pairs to be included in Ambient Event -- * @param pluginSet a set of available plugin component names for sending lookup -- */ -- private static void sendEvent(Context context, Categories cat, Events eventName, -- HashMap extraFields, Set pluginSet) { -- Event.Builder eventBuilder = new Event.Builder(CATEGORY_PREFIX + cat.value(), eventName -- .value()); -- if (extraFields != null && extraFields.size() > 0) { -- for (Parameters param : extraFields.keySet()) { -- eventBuilder.addField(param.value(), String.valueOf(extraFields.get(param))); -- } -- } -- Event event = eventBuilder.build(); -- if (DEBUG) Log.d(TAG, event.toString()); -- // send to Ambient -- AnalyticsServices.AnalyticsApi.sendEvent(AmbientConnection.CLIENT.get(context), event); -- // send to selective plugin -- String providers = extraFields.containsKey(Parameters.PROVIDER_NAME) ? -- (String) extraFields.get(Parameters.PROVIDER_NAME) : ""; -- sendEventToProviders(context, cat, eventName, event, providers, pluginSet); -- } -- -- /** -- * Send Ambient Events to InCall providers, if they exist in the set of currently available -- * InCall plugins -- * -- * @param context context -- * @param cat metric category -- * @param eventName metric event name -- * @param pluginSet a set of available plugin component names for sending lookup -- */ -- private static void sendEventToProviders(Context context, Categories cat, Events eventName, -- Event event, String providers, Set pluginSet) { -- if (!isWhiteListed(cat, eventName)) { -- return; -- } -- if (DEBUG) Log.d(TAG, "sendEventToProviders:" + providers); -- String[] providerList = providers.split(","); -- for (String provider : providerList) { -- if (pluginSet.contains(provider)) { -- if (DEBUG) Log.d(TAG, "sendEventToProvider:" + provider); -- InCallServices.getInstance().sendAnalyticsEventToPlugin( -- AmbientConnection.CLIENT.get(context), -- ComponentName.unflattenFromString(provider), event); -- } -- } -- } -- -- /** -- * Check if the category/event are whitelisted to be able to sent to InCall providers -- * -- * @param cat metric category -- * @param eventName metric event name -- */ -- private static boolean isWhiteListed(Categories cat, Events eventName) { -- return true; -- } -- -- public static void increaseInviteCount(final Context context, final String provider) { -- final InCallMetricsHelper helper = getInstance(context); -- helper.mHandler.post(new Runnable() { -- @Override -- public void run() { -- if (!statsOptIn(context)) { -- return; -- } -- helper.mDbHelper.incrementUserActionsParam(provider, "", -- Events.INVITES_SENT.value(), -- Categories.USER_ACTIONS.value(), -- Parameters.COUNT.value().toLowerCase()); -- } -- }); -- } -- -- /** -- * Set a specific parameter to a certain value -- * -- * @param context context -- * @param component InCall provider component name -- * @param cat metric category -- * @param event metric event name -- * @param param metric parameter to set -- * @param value metric parameter value to set to -- * @param nudgeId nudge ID corresponding to the -- */ -- public static void setValue(final Context context, final ComponentName component, -- final Categories cat, final Events event, final Parameters param, -- final Object value, final String nudgeId) { -- final InCallMetricsHelper helper = getInstance(context); -- helper.mHandler.post(new Runnable() { -- @Override -- public void run() { -- if (!statsOptIn(context)) { -- return; -- } -- switch (cat) { -- case INAPP_NUDGES: -- switch (param) { -- case EVENT_ACCEPTANCE: -- helper.mDbHelper.setInAppAcceptance(component.flattenToString(), -- event.value(), cat.value(), (Integer) value, nudgeId); -- break; -- default: -- break; -- } -- break; -- default: -- break; -- } -- } -- }); -- } -- -- /** -- * Increases the impression count for different nudges in contacts card -- * -- * @param context context -- * @param cmi CallMethodInfo for the entry -- * @pram even Events type -- */ -- public static void increaseImpressionCount(final Context context, final CallMethodInfo cmi, -- final Events event) { -- if (cmi == null) { -- return; -- } -- final InCallMetricsHelper helper = getInstance(context); -- helper.mHandler.post(new Runnable() { -- @Override -- public void run() { -- if (!statsOptIn(context)) { -- return; -- } -- switch (event) { -- case INAPP_NUDGE_CONTACTS_INSTALL: -- helper.mDbHelper.incrementInAppParam(cmi.mComponent.flattenToString(), -- event.value(), Categories.INAPP_NUDGES.value(), -- generateNudgeId(cmi.mInstallNudgeSubtitle), -- Parameters.COUNT.toCol()); -- break; -- case INAPP_NUDGE_CONTACTS_LOGIN: -- helper.mDbHelper.incrementInAppParam(cmi.mComponent.flattenToString(), -- event.value(), Categories.INAPP_NUDGES.value(), -- generateNudgeId(cmi.mLoginNudgeSubtitle), -- Parameters.COUNT.toCol()); -- break; -- default: -- break; -- } -- } -- }); -- } -- -- /** -- * Increases the impression count for contacts tab login -- * -- * @param context context -- * @param pluginInfo list of plugin info -- */ -- public static void increaseImpressionCount(final Context context, final InCallPluginInfo -- pluginInfo) { -- final InCallMetricsHelper helper = getInstance(context); -- if (pluginInfo == null) { -- return; -- } -- helper.mHandler.post(new Runnable() { -- @Override -- public void run() { -- if (!statsOptIn(context)) { -- return; -- } -- CallMethodInfo cmi = pluginInfo.mCallMethodInfo; -- if (!cmi.mIsAuthenticated) { -- helper.mDbHelper.incrementInAppParam(cmi.mComponent.flattenToString(), -- Events.INAPP_NUDGE_CONTACTS_TAB_LOGIN.value(), -- Categories.INAPP_NUDGES.value(), generateNudgeId(cmi.mLoginSubtitle), -- Parameters.COUNT.toCol()); -- } -- } -- }); -- } -- -- /** -- * Increases contact merge counts -- * -- * @param context context -- * @param contactIdForJoin the primary contact ID to be merged -- * @param contactId the secondary contact ID to be merged -- */ -- public static void increaseContactManualMergeCount(final Context context, -- final long contactIdForJoin, final long contactId) { -- final InCallMetricsHelper helper = getInstance(context); -- helper.mHandler.post(new Runnable() { -- @Override -- public void run() { -- if (!statsOptIn(context)) { -- return; -- } -- HashMap plugins = InCallPluginHelper -- .getAllCallMethods(); -- HashMap pluginMap = new HashMap(); -- for (CallMethodInfo cmi : plugins.values()) { -- if (DEBUG) { -- Log.d(TAG, "increaseContactMergeCount:" + cmi.mAccountType + " " + -- cmi.mComponent.flattenToString()); -- } -- pluginMap.put(cmi.mAccountType, cmi.mComponent.flattenToString()); -- } -- Set providerSet = queryContactProviderByContactIds(context, -- contactIdForJoin, contactId, pluginMap); -- -- List providerList = new ArrayList(providerSet); -- Collections.sort(providerList); -- String joinedProvider = providerList.size() == 0 ? "" : -- Joiner.on(",").skipNulls().join(providerList); -- helper.mDbHelper.incrementUserActionsParam(joinedProvider, "", -- InCallMetricsHelper.Events.CONTACTS_MANUAL_MERGED.value(), -- Categories.USER_ACTIONS.value(), Parameters.COUNT.toCol()); -- } -- }); -- } -- -- public static void increaseContactAutoMergeCount(final Context context, final String rawIds) { -- final InCallMetricsHelper helper = getInstance(context); -- helper.mHandler.post(new Runnable() { -- @Override -- public void run() { -- if (!statsOptIn(context)) { -- return; -- } -- String[] rawIdArray = rawIds.split(","); -- Arrays.sort(rawIdArray); -- Set providerSet = queryContactProviderByRawContactIds(context, rawIdArray); -- -- List providerList = new ArrayList(providerSet); -- Collections.sort(providerList); -- String joinedProvider = providerList.size() == 0 ? "" : -- Joiner.on(",").skipNulls().join(providerList); -- String joinedRawIds = rawIdArray.length == 0 ? "" : -- Joiner.on(",").skipNulls().join(rawIdArray); -- helper.mDbHelper.incrementUserActionsParam(joinedProvider, -- joinedRawIds, -- InCallMetricsHelper.Events.CONTACTS_AUTO_MERGED.value(), -- Categories.USER_ACTIONS.value(), Parameters.COUNT.toCol()); -- } -- }); -- -- } -- -- /** -- * Check if the provided contact IDs is from an account type that matches a InCall -- * provider. -- * -- * @param context context -- * @param contactId the primary contact ID to be merged -- * @param contactId2 the secondary contact ID to be merged -- * @parma pluginMap the pairs for lookup -- */ -- private static Set queryContactProviderByContactIds(Context context, long contactId, -- long contactId2, HashMap pluginMap) { -- Set providerSet = new HashSet(); -- Cursor cursor = context.getContentResolver().query(RawContacts.CONTENT_URI, -- new String[] {RawContacts.ACCOUNT_TYPE}, -- RawContacts.CONTACT_ID + "=? OR " + RawContacts.CONTACT_ID + "=?", -- new String[]{String.valueOf(contactId), String.valueOf(contactId2)}, null); -- if (cursor != null && cursor.moveToFirst()) { -- do { -- providerSet.add(cursor.getString(0)); -- if (DEBUG) Log.d(TAG, "queryContactProvider:" + cursor.getString(0)); -- } while (cursor.moveToNext()); -- } -- cursor.close(); -- return providerSet; -- } -- -- private static Set queryContactProviderByRawContactIds(Context context, String[] -- rawIds) { -- Set providerSet = new HashSet(); -- Cursor cursor = null; -- for (String rawId : rawIds) { -- cursor = context.getContentResolver().query(RawContacts.CONTENT_URI, -- new String[]{RawContacts.ACCOUNT_TYPE}, -- RawContacts._ID + "=?", -- new String[]{rawId}, null); -- if (cursor != null && cursor.moveToFirst()) { -- do { -- providerSet.add(cursor.getString(0)); -- if (DEBUG) Log.d(TAG, "queryContactProvider:" + cursor.getString(0)); -- } while (cursor.moveToNext()); -- } -- } -- if (cursor != null) { -- cursor.close(); -- } -- return providerSet; -- } -- -- public static String generateNudgeId(String data) { -- return java.util.UUID.nameUUIDFromBytes(data.getBytes()).toString(); -- } -- -- private static boolean statsOptIn(Context context) { -- return CMSettings.Secure.getInt(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, 1) == 1; -- } --} -\ No newline at end of file -diff --git a/src/com/android/contacts/incall/InCallMetricsReceiver.java b/src/com/android/contacts/incall/InCallMetricsReceiver.java -deleted file mode 100644 -index 507c7fa..0000000 ---- a/src/com/android/contacts/incall/InCallMetricsReceiver.java -+++ /dev/null -@@ -1,33 +0,0 @@ --/* -- * Copyright (C) 2016 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.contacts.incall; -- --import android.content.BroadcastReceiver; --import android.content.Context; --import android.content.Intent; -- --public class InCallMetricsReceiver extends BroadcastReceiver { -- private static final String CONTACT_AUTO_MERGE_KEY_RAW_IDS = "RAW_IDS"; -- -- @Override -- public void onReceive(Context context, Intent intent) { -- String rawIds = intent.getStringExtra(CONTACT_AUTO_MERGE_KEY_RAW_IDS); -- if (rawIds != null) { -- InCallMetricsHelper.increaseContactAutoMergeCount(context, rawIds); -- } -- } --} -diff --git a/src/com/android/contacts/incall/InCallMetricsService.java b/src/com/android/contacts/incall/InCallMetricsService.java -deleted file mode 100644 -index fa56267..0000000 ---- a/src/com/android/contacts/incall/InCallMetricsService.java -+++ /dev/null -@@ -1,35 +0,0 @@ --/* -- * Copyright (C) 2016 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.contacts.incall; -- --import android.app.IntentService; --import android.content.Intent; -- -- --public class InCallMetricsService extends IntentService { -- static final String TAG = InCallMetricsService.class.getSimpleName(); -- private static final boolean DEBUG = true; -- -- public InCallMetricsService () { -- super(InCallMetricsService.class.getSimpleName()); -- } -- -- @Override -- protected void onHandleIntent(Intent intent) { -- InCallMetricsHelper.prepareAndSend(this); -- } --} -\ No newline at end of file -diff --git a/src/com/android/contacts/list/PluginContactBrowseListFragment.java b/src/com/android/contacts/list/PluginContactBrowseListFragment.java -index 29ef148..954fc88 100644 ---- a/src/com/android/contacts/list/PluginContactBrowseListFragment.java -+++ b/src/com/android/contacts/list/PluginContactBrowseListFragment.java -@@ -49,7 +49,7 @@ import com.android.contacts.common.list.AutoScrollListView; - import com.android.contacts.common.list.ContactEntryListFragment; - import com.android.contacts.common.list.DirectoryPartition; - import com.android.contacts.common.util.ContactLoaderUtils; --import com.android.contacts.incall.InCallMetricsHelper; -+import com.android.contacts.incall.InCallPluginHelper; - import com.android.contacts.incall.InCallPluginInfo; - import com.android.contacts.R; - import com.android.contacts.common.list.ContactListAdapter; -@@ -650,15 +650,6 @@ public class PluginContactBrowseListFragment extends ContactEntryListFragment -+ -+ -+ -+ -+ -+ - Disable app cellular usage - Prevent app from using cellular data connection - Internet -+ -+ -+ DNS encryption -+ Manage DNS encryption settings -+ Enable DNS encryption -+ Toggle execution of local DNS encryption service -+ Configuration -+ DNS resolver list -+ Select which server you want to use -+ DNS resolver:  -+ Loading encrypted DNS resolver configuration... - -diff --git a/res/xml/dns_crypt_settings.xml b/res/xml/dns_crypt_settings.xml -new file mode 100644 -index 0000000..636f754 ---- /dev/null -+++ b/res/xml/dns_crypt_settings.xml -@@ -0,0 +1,38 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/res/xml/privacy_settings_cyanogenmod.xml b/res/xml/privacy_settings_cyanogenmod.xml -index 256ca00..25221c2 100644 ---- a/res/xml/privacy_settings_cyanogenmod.xml -+++ b/res/xml/privacy_settings_cyanogenmod.xml -@@ -47,4 +47,14 @@ - android:targetPackage="com.android.settings" - android:targetClass="com.android.settings.applications.ProtectedAppsActivity" /> - -+ -+ -+ -+ - -diff --git a/src/com/android/settings/dnscrypt/DnsCryptPreferenceActivity.java b/src/com/android/settings/dnscrypt/DnsCryptPreferenceActivity.java -new file mode 100644 -index 0000000..64f13c7 ---- /dev/null -+++ b/src/com/android/settings/dnscrypt/DnsCryptPreferenceActivity.java -@@ -0,0 +1,149 @@ -+/* -+* Copyright (C) 2014 The CyanogenMod Project -+* -+* Licensed under the Apache License, Version 2.0 (the "License"); -+* you may not use this file except in compliance with the License. -+* You may obtain a copy of the License at -+* -+* http://www.apache.org/licenses/LICENSE-2.0 -+* -+* Unless required by applicable law or agreed to in writing, software -+* distributed under the License is distributed on an "AS IS" BASIS, -+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+* See the License for the specific language governing permissions and -+* limitations under the License. -+*/ -+ -+package com.android.settings.dnscrypt; -+ -+import android.app.ProgressDialog; -+import android.os.Bundle; -+import android.preference.ListPreference; -+import android.preference.Preference; -+import android.preference.Preference.OnPreferenceChangeListener; -+import android.preference.PreferenceActivity; -+import android.preference.SwitchPreference; -+import android.provider.Settings; -+import android.util.Log; -+import com.android.settings.R; -+import com.android.settings.dnscrypt.LoadConfigFileTask.ILoadConfigListener; -+ -+import java.io.File; -+ -+/** -+ * DnsCryptSettingsFragment -+ *
-+ *     Screen for configuring and starting stopping encrypted dns daemon
-+ * 
-+ * -+ * @see {@link android.preference.PreferenceActivity} -+ * @see {@link android.preference.Preference.OnPreferenceChangeListener} -+ */ -+public class DnsCryptPreferenceActivity extends PreferenceActivity implements -+ OnPreferenceChangeListener, ILoadConfigListener { -+ -+ // Constants -+ private static final String TAG = DnsCryptPreferenceActivity.class.getSimpleName(); -+ private static final String PREF_TOGGLE = "pref_toggle_dnscrypt"; -+ private static final String PREF_SERVER_LIST = "pref_server_list"; -+ private static final String CONFIG_FILE = "/system/etc/dnscrypt-resolvers.csv"; -+ -+ // Members -+ private SwitchPreference mEncryptionSwitchPreference; -+ private ListPreference mServerListPreference; -+ private LoadConfigFileTask mLoadConfigFileTask; -+ private String mDnsResolverLabel = "DNS provider"; -+ -+ // Views -+ private ProgressDialog mProgressDialog; -+ -+ @Override -+ public void onCreate(Bundle savedInstanceState) { -+ super.onCreate(savedInstanceState); -+ getActionBar().setDisplayHomeAsUpEnabled(true); -+ getActionBar().setTitle(R.string.dns_enc_title); -+ addPreferencesFromResource(R.xml.dns_crypt_settings); -+ mEncryptionSwitchPreference = (SwitchPreference) findPreference(PREF_TOGGLE); -+ mEncryptionSwitchPreference.setOnPreferenceChangeListener(this); -+ mServerListPreference = (ListPreference) findPreference(PREF_SERVER_LIST); -+ mServerListPreference.setOnPreferenceChangeListener(this); -+ mDnsResolverLabel = getResources().getString(R.string.dns_enc_resolver_label); -+ mProgressDialog = new ProgressDialog(this); -+ mProgressDialog.setTitle(R.string.dns_enc_resolvers_loading); -+ mProgressDialog.show(); -+ if (mLoadConfigFileTask == null) { -+ mLoadConfigFileTask = -+ new LoadConfigFileTask(new File(CONFIG_FILE), mProgressDialog, this); -+ mLoadConfigFileTask.execute(); -+ } -+ initPreferences(); -+ } -+ -+ private void initPreferences() { -+ boolean currentCheckedState = (Settings.Secure.getInt(getContentResolver(), -+ Settings.Secure.DNS_ENCRYPTION_TOGGLE, -+ Settings.Secure.DNS_ENCRYPTION_TOGGLE_DEFAULT) == 1); -+ if (mEncryptionSwitchPreference != null) { -+ mEncryptionSwitchPreference.setChecked(currentCheckedState); -+ } -+ } -+ -+ @Override -+ public boolean onPreferenceChange(Preference preference, Object o) { -+ if (preference == mEncryptionSwitchPreference) { -+ Boolean newCheckedState = (Boolean) o; -+ mServerListPreference.setEnabled(newCheckedState); -+ int setValue = (newCheckedState) ? 1 : 0; -+ Settings.Secure.putInt(getContentResolver(), Settings.Secure.DNS_ENCRYPTION_TOGGLE, -+ setValue); -+ return true; -+ } else if (preference == mServerListPreference) { -+ String value = (String) o; -+ int i; -+ for (i = 0; i < mServerListPreference.getEntryValues().length; i++) { -+ if (value.equals(mServerListPreference.getEntryValues()[i])) { -+ break; -+ } -+ } -+ try { -+ mServerListPreference.setSummary(mDnsResolverLabel + -+ mServerListPreference.getEntries()[i]); -+ } catch (ArrayIndexOutOfBoundsException oobe) { -+ Log.e(TAG, "Error finding default value!"); -+ mServerListPreference.setSummary(R.string.dns_enc_server_summary); -+ } -+ Settings.Secure.putString(getContentResolver(), Settings.Secure -+ .DNS_ENCRYPTION_SERVER, value); -+ return true; -+ } -+ return false; -+ } -+ -+ @Override -+ public void onConfigLoaded(CharSequence[] entries, CharSequence[] entryValues) { -+ if (mServerListPreference != null && entries != null && entryValues != null) { -+ mServerListPreference.setEntries(entries); -+ mServerListPreference.setEntryValues(entryValues); -+ String value = Settings.Secure.getString(getContentResolver(), -+ Settings.Secure.DNS_ENCRYPTION_SERVER); -+ value = (value == null) ? Settings.Secure.DNS_ENCRYPTION_SERVER_DEFAULT : value; -+ mServerListPreference.setValue(value); -+ int i; -+ for (i = 0; i < mServerListPreference.getEntryValues().length; i++) { -+ if (value.equals(mServerListPreference.getEntryValues()[i])) { -+ break; -+ } -+ } -+ try { -+ mServerListPreference.setSummary(mDnsResolverLabel -+ + mServerListPreference.getEntries()[i]); -+ } catch (ArrayIndexOutOfBoundsException oobe) { -+ Log.e(TAG, "Error finding default value!", oobe); -+ mServerListPreference.setSummary(R.string.dns_enc_server_summary); -+ } -+ mServerListPreference.setEnabled(mEncryptionSwitchPreference.isChecked()); -+ } -+ mLoadConfigFileTask = null; -+ mProgressDialog.dismiss(); -+ } -+} -diff --git a/src/com/android/settings/dnscrypt/LoadConfigFileTask.java b/src/com/android/settings/dnscrypt/LoadConfigFileTask.java -new file mode 100644 -index 0000000..910e6c1 ---- /dev/null -+++ b/src/com/android/settings/dnscrypt/LoadConfigFileTask.java -@@ -0,0 +1,152 @@ -+/* -+* Copyright (C) 2014 The CyanogenMod Project -+* -+* Licensed under the Apache License, Version 2.0 (the "License"); -+* you may not use this file except in compliance with the License. -+* You may obtain a copy of the License at -+* -+* http://www.apache.org/licenses/LICENSE-2.0 -+* -+* Unless required by applicable law or agreed to in writing, software -+* distributed under the License is distributed on an "AS IS" BASIS, -+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+* See the License for the specific language governing permissions and -+* limitations under the License. -+*/ -+ -+package com.android.settings.dnscrypt; -+ -+import android.app.ProgressDialog; -+import android.os.AsyncTask; -+import android.util.Log; -+ -+import java.io.BufferedReader; -+import java.io.File; -+import java.io.FileInputStream; -+import java.io.IOException; -+import java.io.InputStreamReader; -+import java.util.ArrayList; -+import java.util.List; -+ -+/** -+ * LoadConfigFileTask -+ *
-+ *     This task will check if the config file exists in /system/etc and if so will load it for
-+ *     configuration display in Settings
-+ * 
-+ */ -+public class LoadConfigFileTask extends AsyncTask { -+ -+ // Constants -+ private static final String TAG = LoadConfigFileTask.class.getSimpleName(); -+ -+ // Members -+ private ILoadConfigListener mListener; -+ private File mConfigFile; -+ private ProgressDialog mProgressDialog; -+ private CharSequence[] mEntries; -+ private CharSequence[] mEntryValues; -+ -+ /** -+ * Constructor -+ * -+ * @param configFile {@link java.io.File} -+ * @param progressDialog {@link android.app.ProgressDialog} -+ * @throws IllegalArgumentException {@link java.lang.IllegalArgumentException} -+ */ -+ public LoadConfigFileTask(File configFile, ProgressDialog progressDialog, ILoadConfigListener -+ listener) -+ throws IllegalArgumentException { -+ if (configFile == null || !configFile.exists()) { -+ throw new IllegalArgumentException("'configFile' must not be null and must exist!"); -+ } -+ mConfigFile = configFile; -+ mProgressDialog = progressDialog; -+ mListener = listener; -+ } -+ -+ @Override -+ public void onPreExecute() { -+ if (mProgressDialog != null) { -+ mProgressDialog.show(); -+ } -+ } -+ -+ @Override -+ public void onProgressUpdate(Integer... progress) { -+ if (mProgressDialog != null) { -+ mProgressDialog.setProgress(progress[0]); -+ } -+ } -+ -+ @Override -+ public Void doInBackground(Void... params) { -+ -+ if (mConfigFile == null || !mConfigFile.exists()) { -+ Log.w(TAG, "No config file found....such strange!"); -+ // [TODO][MSB]: Download that sucker! -+ // [TODO][MSB]: Perform sig check? -+ return null; -+ } -+ -+ try { -+ FileInputStream fis = new FileInputStream(mConfigFile); -+ InputStreamReader reader = new InputStreamReader(fis); -+ BufferedReader bufferedReader = new BufferedReader(reader); -+ List configLines = new ArrayList(); -+ String line = ""; -+ while((line = bufferedReader.readLine()) != null) { -+ configLines.add(line); -+ } -+ mEntries = new CharSequence[configLines.size() - 1]; -+ mEntryValues = new CharSequence[configLines.size() - 1]; -+ if (mProgressDialog != null) { -+ mProgressDialog.setMax(configLines.size()); -+ } -+ boolean skippedTitle = false; -+ int progress = 0; -+ int i = 0; -+ for (String configLine : configLines) { -+ if (!skippedTitle) { -+ skippedTitle = true; -+ progress++; -+ continue; -+ } -+ String[] configParts = configLine.split(","); -+ if (configParts.length > 3) { -+ String name = configParts[0]; -+ String fullName = configParts[1]; -+ mEntries[i] = fullName; -+ mEntryValues[i] = name; -+ } -+ i++; -+ progress++; -+ publishProgress(progress); -+ } -+ } catch (IOException e) { -+ Log.e(TAG, e.getMessage()); -+ } -+ return null; -+ } -+ -+ @Override -+ public void onPostExecute(Void result) { -+ if (mListener != null) { -+ mListener.onConfigLoaded(mEntries, mEntryValues); -+ } -+ if (mProgressDialog != null) { -+ mProgressDialog.dismiss(); -+ } -+ } -+ -+ /** -+ * ILoadConfigListener -+ *
-+     *     Callback interface for passing back results
-+     * 
-+ */ -+ public interface ILoadConfigListener { -+ public void onConfigLoaded(CharSequence[] entries, CharSequence[] entryValues); -+ } -+ -+} -diff --git a/src/com/android/settings/dnscrypt/model/DnsCryptServerEntry.java b/src/com/android/settings/dnscrypt/model/DnsCryptServerEntry.java -new file mode 100644 -index 0000000..c0f2c75 ---- /dev/null -+++ b/src/com/android/settings/dnscrypt/model/DnsCryptServerEntry.java -@@ -0,0 +1,155 @@ -+/* -+* Copyright (C) 2014 The CyanogenMod Project -+* -+* Licensed under the Apache License, Version 2.0 (the "License"); -+* you may not use this file except in compliance with the License. -+* You may obtain a copy of the License at -+* -+* http://www.apache.org/licenses/LICENSE-2.0 -+* -+* Unless required by applicable law or agreed to in writing, software -+* distributed under the License is distributed on an "AS IS" BASIS, -+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+* See the License for the specific language governing permissions and -+* limitations under the License. -+*/ -+ -+package com.android.settings.dnscrypt.model; -+ -+/** -+ * DnsCryptServerEntry -+ *
-+ *    Model object for representing a dns crypt server entry
-+ * 
-+ */ -+public class DnsCryptServerEntry { -+ -+ // Members -+ private String mName; -+ private String mFullName; -+ private String mDescription; -+ private String mLocation; -+ private String mCoords; -+ private String mUrl; -+ private String mVersion; -+ private String mDnsSecValidation; -+ private String mNoLogs; -+ private String mNamecoin; -+ private String mResolverAddress; -+ private String mProviderName; -+ private String mProviderPublicKey; -+ private String mProviderPublicKeyTextRecord; -+ -+ public String getName() { -+ return mName; -+ } -+ -+ public void setName(String name) { -+ mName = name; -+ } -+ -+ public String getFullName() { -+ return mFullName; -+ } -+ -+ public void setFullName(String fullName) { -+ mFullName = fullName; -+ } -+ -+ public String getDescription() { -+ return mDescription; -+ } -+ -+ public void setDescription(String description) { -+ mDescription = description; -+ } -+ -+ public String getLocation() { -+ return mLocation; -+ } -+ -+ public void setLocation(String location) { -+ mLocation = location; -+ } -+ -+ public String getCoords() { -+ return mCoords; -+ } -+ -+ public void setCoords(String coords) { -+ mCoords = coords; -+ } -+ -+ public String getUrl() { -+ return mUrl; -+ } -+ -+ public void setUrl(String url) { -+ mUrl = url; -+ } -+ -+ public String getVersion() { -+ return mVersion; -+ } -+ -+ public void setVersion(String version) { -+ mVersion = version; -+ } -+ -+ public String getDnsSecValidation() { -+ return mDnsSecValidation; -+ } -+ -+ public void setDnsSecValidation(String dnsSecValidation) { -+ mDnsSecValidation = dnsSecValidation; -+ } -+ -+ public String getNoLogs() { -+ return mNoLogs; -+ } -+ -+ public void setNoLogs(String noLogs) { -+ mNoLogs = noLogs; -+ } -+ -+ public String getNamecoin() { -+ return mNamecoin; -+ } -+ -+ public void setNamecoin(String namecoin) { -+ mNamecoin = namecoin; -+ } -+ -+ public String getResolverAddress() { -+ return mResolverAddress; -+ } -+ -+ public void setResolverAddress(String resolverAddress) { -+ mResolverAddress = resolverAddress; -+ } -+ -+ public String getProviderName() { -+ return mProviderName; -+ } -+ -+ public void setProviderName(String providerName) { -+ mProviderName = providerName; -+ } -+ -+ public String getProviderPublicKey() { -+ return mProviderPublicKey; -+ } -+ -+ public void setProviderPublicKey(String providerPublicKey) { -+ mProviderPublicKey = providerPublicKey; -+ } -+ -+ public String getProviderPublicKeyTextRecord() { -+ return mProviderPublicKeyTextRecord; -+ } -+ -+ public void setProviderPublicKeyTextRecord(String providerPublicKeyTextRecord) { -+ mProviderPublicKeyTextRecord = providerPublicKeyTextRecord; -+ } -+ -+} --- -2.7.4 - diff --git a/Patches/CyanogenMod-13.0/android_packages_apps_Settings/Hostname_Rand.patch b/Patches/CyanogenMod-13.0/android_packages_apps_Settings/Hostname_Rand.patch deleted file mode 100644 index cde64d8c..00000000 --- a/Patches/CyanogenMod-13.0/android_packages_apps_Settings/Hostname_Rand.patch +++ /dev/null @@ -1,231 +0,0 @@ -From ef32dacb30b5c938d48ba294ff660b0cd5777dd6 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Mon, 18 Apr 2016 09:27:27 -0400 -Subject: [PATCH] Implement hostname Randomization - -Change-Id: I00bfb9235979c2c80191cb0871716adaa3583e06 ---- - MAC_Rand.patch | 120 +++++++++++++++++++++++++ - res/values/cm_strings.xml | 4 + - res/xml/wireless_settings.xml | 6 ++ - src/com/android/settings/WirelessSettings.java | 14 +++ - 4 files changed, 144 insertions(+) - create mode 100644 MAC_Rand.patch - -diff --git a/MAC_Rand.patch b/MAC_Rand.patch -new file mode 100644 -index 0000000..48ad1ec ---- /dev/null -+++ b/MAC_Rand.patch -@@ -0,0 +1,120 @@ -+From e84a1e030313cbc2875c9d3ee1f016808d33dab3 Mon Sep 17 00:00:00 2001 -+From: Tad -+Date: Mon, 18 Apr 2016 08:53:03 -0400 -+Subject: [PATCH] Implement MAC Randomization -+ -+Change-Id: Id074d011eac7c33af267de4c1649670c32770cb5 -+--- -+ res/values/cm_strings.xml | 4 ++++ -+ res/xml/wireless_settings.xml | 6 ++++++ -+ src/com/android/settings/WirelessSettings.java | 24 +++++++++++++++++++++++- -+ 3 files changed, 33 insertions(+), 1 deletion(-) -+ -+diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml -+index 128660e..8aa4785 100644 -+--- a/res/values/cm_strings.xml -++++ b/res/values/cm_strings.xml -+@@ -1187,4 +1187,8 @@ -+ -+ -+ Network operators -++ -++ -++ Randomize MAC addresses -++ Assign random MAC addresses when network devices are enabled -+ -+diff --git a/res/xml/wireless_settings.xml b/res/xml/wireless_settings.xml -+index 8882003..4a2d5d0 100644 -+--- a/res/xml/wireless_settings.xml -++++ b/res/xml/wireless_settings.xml -+@@ -19,6 +19,12 @@ -+ android:title="@string/radio_controls_title"> -+ -+ -++ -++ - Randomize MAC addresses - Assign random MAC addresses when network devices are enabled -+ -+ -+ Randomize network hostname -+ Assign random network hostname on boot - -diff --git a/res/xml/wireless_settings.xml b/res/xml/wireless_settings.xml -index 4a2d5d0..905e8de 100644 ---- a/res/xml/wireless_settings.xml -+++ b/res/xml/wireless_settings.xml -@@ -25,6 +25,12 @@ - android:persistent="false" /> - - -+ -+ -Date: Mon, 18 Apr 2016 08:53:03 -0400 -Subject: [PATCH] Implement MAC Randomization - -Change-Id: Id074d011eac7c33af267de4c1649670c32770cb5 ---- - res/values/cm_strings.xml | 4 ++++ - res/xml/wireless_settings.xml | 6 ++++++ - src/com/android/settings/WirelessSettings.java | 24 +++++++++++++++++++++++- - 3 files changed, 33 insertions(+), 1 deletion(-) - -diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml -index 128660e..8aa4785 100644 ---- a/res/values/cm_strings.xml -+++ b/res/values/cm_strings.xml -@@ -1187,4 +1187,8 @@ - - - Network operators -+ -+ -+ Randomize MAC addresses -+ Assign random MAC addresses when network devices are enabled - -diff --git a/res/xml/wireless_settings.xml b/res/xml/wireless_settings.xml -index 8882003..4a2d5d0 100644 ---- a/res/xml/wireless_settings.xml -+++ b/res/xml/wireless_settings.xml -@@ -19,6 +19,12 @@ - android:title="@string/radio_controls_title"> - - -+ -+ -Date: Wed, 24 Feb 2016 08:41:10 -0500 -Subject: [PATCH] Remove analytics - -Change-Id: I8ef6bc93aa3e8a256bfd137a982d50c15100d4f0 ---- - AndroidManifest.xml | 26 -- - res/xml/anonymous_stats.xml | 32 --- - res/xml/privacy_settings_cyanogenmod.xml | 8 - - .../android/settings/cmstats/AnonymousStats.java | 107 -------- - src/com/android/settings/cmstats/PreviewData.java | 55 ---- - .../android/settings/cmstats/ReportingService.java | 106 -------- - .../settings/cmstats/ReportingServiceManager.java | 123 --------- - .../settings/cmstats/StatsUploadJobService.java | 291 --------------------- - src/com/android/settings/cmstats/Utilities.java | 102 -------- - .../settings/cyanogenmod/PrivacySettings.java | 3 - - 10 files changed, 853 deletions(-) - delete mode 100644 res/xml/anonymous_stats.xml - delete mode 100644 src/com/android/settings/cmstats/AnonymousStats.java - delete mode 100644 src/com/android/settings/cmstats/PreviewData.java - delete mode 100644 src/com/android/settings/cmstats/ReportingService.java - delete mode 100644 src/com/android/settings/cmstats/ReportingServiceManager.java - delete mode 100644 src/com/android/settings/cmstats/StatsUploadJobService.java - delete mode 100644 src/com/android/settings/cmstats/Utilities.java - -diff --git a/AndroidManifest.xml b/AndroidManifest.xml -index 775dbf0..f0ca92f 100755 ---- a/AndroidManifest.xml -+++ b/AndroidManifest.xml -@@ -1556,12 +1556,6 @@ - - - -- -- -- - - $ - - -- -- -- -- -- -- -- -- -- -- -- -- -- - - - -diff --git a/res/xml/anonymous_stats.xml b/res/xml/anonymous_stats.xml -deleted file mode 100644 -index 0f3b8e2..0000000 ---- a/res/xml/anonymous_stats.xml -+++ /dev/null -@@ -1,32 +0,0 @@ -- -- -- -- -- -- -- -- -- -- -diff --git a/res/xml/privacy_settings_cyanogenmod.xml b/res/xml/privacy_settings_cyanogenmod.xml -index 256ca00..04f8643 100644 ---- a/res/xml/privacy_settings_cyanogenmod.xml -+++ b/res/xml/privacy_settings_cyanogenmod.xml -@@ -29,14 +29,6 @@ - android:summary="@string/blacklist_summary" - android:fragment="com.android.settings.blacklist.BlacklistSettings" /> - -- -- -- -- - - = QUEUE_MAX_THRESHOLD) { -- lastId = 1; -- } else { -- lastId += 1; -- } -- setLastJobId(context, lastId); -- return lastId; -- } -- -- @Override -- protected int getMetricsCategory() { -- return CMMetricsLogger.ANONYMOUS_STATS; -- } --} -diff --git a/src/com/android/settings/cmstats/PreviewData.java b/src/com/android/settings/cmstats/PreviewData.java -deleted file mode 100644 -index 0adacad..0000000 ---- a/src/com/android/settings/cmstats/PreviewData.java -+++ /dev/null -@@ -1,55 +0,0 @@ --/* -- * Copyright (C) 2012 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.settings.cmstats; -- --import android.content.Context; --import android.os.Bundle; --import android.preference.Preference; --import android.preference.PreferenceScreen; -- --import com.android.settings.R; --import com.android.settings.SettingsPreferenceFragment; --import org.cyanogenmod.internal.logging.CMMetricsLogger; -- --public class PreviewData extends SettingsPreferenceFragment { -- private static final String UNIQUE_ID = "preview_id"; -- private static final String DEVICE = "preview_device"; -- private static final String VERSION = "preview_version"; -- private static final String COUNTRY = "preview_country"; -- private static final String CARRIER = "preview_carrier"; -- -- @Override -- public void onCreate(Bundle savedInstanceState) { -- super.onCreate(savedInstanceState); -- -- addPreferencesFromResource(R.xml.preview_data); -- -- final PreferenceScreen prefSet = getPreferenceScreen(); -- final Context context = getActivity(); -- -- prefSet.findPreference(UNIQUE_ID).setSummary(Utilities.getUniqueID(context)); -- prefSet.findPreference(DEVICE).setSummary(Utilities.getDevice()); -- prefSet.findPreference(VERSION).setSummary(Utilities.getModVersion()); -- prefSet.findPreference(COUNTRY).setSummary(Utilities.getCountryCode(context)); -- prefSet.findPreference(CARRIER).setSummary(Utilities.getCarrier(context)); -- } -- -- @Override -- protected int getMetricsCategory() { -- return CMMetricsLogger.PREVIEW_DATA; -- } --} -diff --git a/src/com/android/settings/cmstats/ReportingService.java b/src/com/android/settings/cmstats/ReportingService.java -deleted file mode 100644 -index 8410143..0000000 ---- a/src/com/android/settings/cmstats/ReportingService.java -+++ /dev/null -@@ -1,106 +0,0 @@ --/* -- * Copyright (C) 2015 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.settings.cmstats; -- --import android.app.IntentService; --import android.app.job.JobInfo; --import android.app.job.JobScheduler; --import android.content.ComponentName; --import android.content.Context; --import android.content.Intent; --import android.os.PersistableBundle; --import android.os.UserHandle; --import android.util.Log; --import cyanogenmod.providers.CMSettings; -- --import java.util.List; -- --public class ReportingService extends IntentService { -- /* package */ static final String TAG = "CMStats"; -- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); -- -- public static final String EXTRA_OPTING_OUT = "cmstats::opt_out"; -- -- public ReportingService() { -- super(ReportingService.class.getSimpleName()); -- } -- -- @Override -- protected void onHandleIntent(Intent intent) { -- JobScheduler js = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); -- -- String deviceId = Utilities.getUniqueID(getApplicationContext()); -- String deviceName = Utilities.getDevice(); -- String deviceVersion = Utilities.getModVersion(); -- String deviceCountry = Utilities.getCountryCode(getApplicationContext()); -- String deviceCarrier = Utilities.getCarrier(getApplicationContext()); -- String deviceCarrierId = Utilities.getCarrierId(getApplicationContext()); -- boolean optOut = intent.getBooleanExtra(EXTRA_OPTING_OUT, false); -- -- final int cyanogenJobId = AnonymousStats.getNextJobId(getApplicationContext()); -- final int cmOrgJobId = AnonymousStats.getNextJobId(getApplicationContext()); -- -- if (DEBUG) Log.d(TAG, "scheduling jobs id: " + cyanogenJobId + ", " + cmOrgJobId); -- -- PersistableBundle cyanogenBundle = new PersistableBundle(); -- cyanogenBundle.putBoolean(StatsUploadJobService.KEY_OPT_OUT, optOut); -- cyanogenBundle.putString(StatsUploadJobService.KEY_DEVICE_NAME, deviceName); -- cyanogenBundle.putString(StatsUploadJobService.KEY_UNIQUE_ID, deviceId); -- cyanogenBundle.putString(StatsUploadJobService.KEY_VERSION, deviceVersion); -- cyanogenBundle.putString(StatsUploadJobService.KEY_COUNTRY, deviceCountry); -- cyanogenBundle.putString(StatsUploadJobService.KEY_CARRIER, deviceCarrier); -- cyanogenBundle.putString(StatsUploadJobService.KEY_CARRIER_ID, deviceCarrierId); -- cyanogenBundle.putLong(StatsUploadJobService.KEY_TIMESTAMP, System.currentTimeMillis()); -- -- // get snapshot and persist it -- PersistableBundle cmBundle = new PersistableBundle(cyanogenBundle); -- -- // set job types -- cyanogenBundle.putInt(StatsUploadJobService.KEY_JOB_TYPE, -- StatsUploadJobService.JOB_TYPE_CYANOGEN); -- cmBundle.putInt(StatsUploadJobService.KEY_JOB_TYPE, -- StatsUploadJobService.JOB_TYPE_CMORG); -- -- // schedule cyanogen stats upload -- js.schedule(new JobInfo.Builder(cyanogenJobId, new ComponentName(getPackageName(), -- StatsUploadJobService.class.getName())) -- .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) -- .setMinimumLatency(1000) -- .setExtras(cyanogenBundle) -- .setPersisted(true) -- .build()); -- -- // schedule cmorg stats upload -- js.schedule(new JobInfo.Builder(cmOrgJobId, new ComponentName(getPackageName(), -- StatsUploadJobService.class.getName())) -- .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) -- .setMinimumLatency(1000) -- .setExtras(cmBundle) -- .setPersisted(true) -- .build()); -- -- if (optOut) { -- // we've successfully scheduled the opt out. -- CMSettings.Secure.putIntForUser(getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION_REPORTED, 1, UserHandle.USER_OWNER); -- } -- -- // reschedule -- AnonymousStats.updateLastSynced(this); -- ReportingServiceManager.setAlarm(this); -- } --} -diff --git a/src/com/android/settings/cmstats/ReportingServiceManager.java b/src/com/android/settings/cmstats/ReportingServiceManager.java -deleted file mode 100644 -index bce1372..0000000 ---- a/src/com/android/settings/cmstats/ReportingServiceManager.java -+++ /dev/null -@@ -1,123 +0,0 @@ --/* -- * Copyright (C) 2012 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.settings.cmstats; -- --import android.app.AlarmManager; --import android.app.PendingIntent; --import android.app.job.JobScheduler; --import android.content.BroadcastReceiver; --import android.content.Context; --import android.content.Intent; --import android.content.SharedPreferences; --import android.os.UserHandle; --import android.util.Log; --import cyanogenmod.providers.CMSettings; -- --public class ReportingServiceManager extends BroadcastReceiver { -- private static final long MILLIS_PER_HOUR = 60L * 60L * 1000L; -- private static final long MILLIS_PER_DAY = 24L * MILLIS_PER_HOUR; -- private static final long UPDATE_INTERVAL = 1L * MILLIS_PER_DAY; -- -- private static final String TAG = ReportingServiceManager.class.getSimpleName(); -- -- public static final String ACTION_LAUNCH_SERVICE = -- "com.android.settings.action.TRIGGER_REPORT_METRICS"; -- public static final String EXTRA_FORCE = "force"; -- -- @Override -- public void onReceive(Context context, Intent intent) { -- if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { -- setAlarm(context); -- } else if (intent.getAction().equals(ACTION_LAUNCH_SERVICE)){ -- launchService(context, intent.getBooleanExtra(EXTRA_FORCE, false)); -- } -- } -- -- /** -- * opt out if we haven't yet -- */ -- public static void initiateOptOut(Context context) { -- final boolean optOutReported = CMSettings.Secure.getIntForUser(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION_REPORTED, 0, UserHandle.USER_OWNER) == 1; -- if (!optOutReported) { -- Intent intent = new Intent(); -- intent.setClass(context, ReportingService.class); -- intent.putExtra(ReportingService.EXTRA_OPTING_OUT, true); -- context.startServiceAsUser(intent, UserHandle.OWNER); -- } -- } -- -- public static void setAlarm(Context context) { -- SharedPreferences prefs = AnonymousStats.getPreferences(context); -- if (prefs.contains(AnonymousStats.ANONYMOUS_OPT_IN)) { -- migrate(context, prefs); -- } -- if (!Utilities.isStatsCollectionEnabled(context)) { -- initiateOptOut(context); -- return; -- } -- long lastSynced = prefs.getLong(AnonymousStats.ANONYMOUS_LAST_CHECKED, 0); -- if (lastSynced == 0) { -- launchService(context, true); // service will reschedule the next alarm -- return; -- } -- long millisFromNow = (lastSynced + UPDATE_INTERVAL) - System.currentTimeMillis(); -- -- Intent intent = new Intent(ACTION_LAUNCH_SERVICE); -- intent.setClass(context, ReportingServiceManager.class); -- -- AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); -- alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + millisFromNow, -- PendingIntent.getBroadcast(context, 0, intent, 0)); -- Log.d(TAG, "Next sync attempt in : " -- + (millisFromNow / MILLIS_PER_HOUR) + " hours"); -- } -- -- public static void launchService(Context context, boolean force) { -- SharedPreferences prefs = AnonymousStats.getPreferences(context); -- -- if (!Utilities.isStatsCollectionEnabled(context)) { -- return; -- } -- -- if (!force) { -- long lastSynced = prefs.getLong(AnonymousStats.ANONYMOUS_LAST_CHECKED, 0); -- if (lastSynced == 0) { -- setAlarm(context); -- return; -- } -- long timeElapsed = System.currentTimeMillis() - lastSynced; -- if (timeElapsed < UPDATE_INTERVAL) { -- long timeLeft = UPDATE_INTERVAL - timeElapsed; -- Log.d(TAG, "Waiting for next sync : " -- + timeLeft / MILLIS_PER_HOUR + " hours"); -- return; -- } -- } -- -- Intent intent = new Intent(); -- intent.setClass(context, ReportingService.class); -- context.startServiceAsUser(intent, UserHandle.OWNER); -- } -- -- private static void migrate(Context context, SharedPreferences prefs) { -- Utilities.setStatsCollectionEnabled(context, -- prefs.getBoolean(AnonymousStats.ANONYMOUS_OPT_IN, true)); -- prefs.edit().remove(AnonymousStats.ANONYMOUS_OPT_IN).commit(); -- } -- --} -diff --git a/src/com/android/settings/cmstats/StatsUploadJobService.java b/src/com/android/settings/cmstats/StatsUploadJobService.java -deleted file mode 100644 -index 580a20f..0000000 ---- a/src/com/android/settings/cmstats/StatsUploadJobService.java -+++ /dev/null -@@ -1,291 +0,0 @@ --/* -- * Copyright (C) 2015 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.settings.cmstats; -- --import android.app.job.JobParameters; --import android.app.job.JobService; --import android.net.Uri; --import android.os.AsyncTask; --import android.os.PersistableBundle; --import android.util.ArrayMap; --import android.util.Log; --import com.android.settings.R; --import org.json.JSONException; --import org.json.JSONObject; -- --import java.io.BufferedInputStream; --import java.io.BufferedReader; --import java.io.BufferedWriter; --import java.io.IOException; --import java.io.InputStream; --import java.io.InputStreamReader; --import java.io.OutputStream; --import java.io.OutputStreamWriter; --import java.net.HttpURLConnection; --import java.net.URL; --import java.util.Collections; --import java.util.Map; -- --public class StatsUploadJobService extends JobService { -- -- private static final String TAG = StatsUploadJobService.class.getSimpleName(); -- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); -- -- public static final String KEY_JOB_TYPE = "job_type"; -- public static final int JOB_TYPE_CYANOGEN = 1; -- public static final int JOB_TYPE_CMORG = 2; -- -- public static final String KEY_UNIQUE_ID = "uniqueId"; -- public static final String KEY_DEVICE_NAME = "deviceName"; -- public static final String KEY_VERSION = "version"; -- public static final String KEY_COUNTRY = "country"; -- public static final String KEY_CARRIER = "carrier"; -- public static final String KEY_CARRIER_ID = "carrierId"; -- public static final String KEY_TIMESTAMP = "timeStamp"; -- public static final String KEY_OPT_OUT = "optOut"; -- -- private final Map mCurrentJobs -- = Collections.synchronizedMap(new ArrayMap()); -- -- @Override -- public boolean onStartJob(JobParameters jobParameters) { -- if (DEBUG) -- Log.d(TAG, "onStartJob() called with " + "jobParameters = [" + jobParameters + "]"); -- final StatsUploadTask uploadTask = new StatsUploadTask(jobParameters); -- mCurrentJobs.put(jobParameters, uploadTask); -- uploadTask.execute((Void) null); -- return true; -- } -- -- @Override -- public boolean onStopJob(JobParameters jobParameters) { -- if (DEBUG) -- Log.d(TAG, "onStopJob() called with " + "jobParameters = [" + jobParameters + "]"); -- -- final StatsUploadTask cancelledJob; -- cancelledJob = mCurrentJobs.remove(jobParameters); -- -- if (cancelledJob != null) { -- // cancel the ongoing background task -- cancelledJob.cancel(true); -- return true; // reschedule -- } -- -- return false; -- } -- -- private class StatsUploadTask extends AsyncTask { -- -- private JobParameters mJobParams; -- -- public StatsUploadTask(JobParameters jobParams) { -- this.mJobParams = jobParams; -- } -- -- @Override -- protected Boolean doInBackground(Void... params) { -- -- PersistableBundle extras = mJobParams.getExtras(); -- -- String deviceId = extras.getString(KEY_UNIQUE_ID); -- String deviceName = extras.getString(KEY_DEVICE_NAME); -- String deviceVersion = extras.getString(KEY_VERSION); -- String deviceCountry = extras.getString(KEY_COUNTRY); -- String deviceCarrier = extras.getString(KEY_CARRIER); -- String deviceCarrierId = extras.getString(KEY_CARRIER_ID); -- long timeStamp = extras.getLong(KEY_TIMESTAMP); -- boolean optOut = extras.getBoolean(KEY_OPT_OUT); -- -- boolean success = false; -- int jobType = extras.getInt(KEY_JOB_TYPE, -1); -- if (!isCancelled()) { -- switch (jobType) { -- case JOB_TYPE_CYANOGEN: -- try { -- JSONObject json = new JSONObject(); -- json.put("optOut", optOut); -- json.put("uniqueId", deviceId); -- json.put("deviceName", deviceName); -- json.put("version", deviceVersion); -- json.put("country", deviceCountry); -- json.put("carrier", deviceCarrier); -- json.put("carrierId", deviceCarrierId); -- json.put("timestamp", timeStamp); -- -- success = uploadToCyanogen(json); -- } catch (IOException | JSONException e) { -- Log.e(TAG, "Could not upload stats checkin to cyanogen server", e); -- success = false; -- } -- break; -- -- case JOB_TYPE_CMORG: -- try { -- success = uploadToCM(deviceId, deviceName, deviceVersion, deviceCountry, -- deviceCarrier, deviceCarrierId, optOut); -- } catch (IOException e) { -- Log.e(TAG, "Could not upload stats checkin to commnity server", e); -- success = false; -- } -- break; -- } -- } -- if (DEBUG) -- Log.d(TAG, "job id " + mJobParams.getJobId() + ", has finished with success=" -- + success); -- return success; -- } -- -- @Override -- protected void onPostExecute(Boolean success) { -- mCurrentJobs.remove(mJobParams); -- jobFinished(mJobParams, !success); -- } -- } -- -- -- private boolean uploadToCM(String deviceId, String deviceName, String deviceVersion, -- String deviceCountry, String deviceCarrier, String deviceCarrierId, -- boolean optOut) -- throws IOException { -- -- final Uri uri = Uri.parse(getString(R.string.stats_cm_url)).buildUpon() -- .appendQueryParameter("opt_out", optOut ? "1" : "0") -- .appendQueryParameter("device_hash", deviceId) -- .appendQueryParameter("device_name", deviceName) -- .appendQueryParameter("device_version", deviceVersion) -- .appendQueryParameter("device_country", deviceCountry) -- .appendQueryParameter("device_carrier", deviceCarrier) -- .appendQueryParameter("device_carrier_id", deviceCarrierId).build(); -- URL url = new URL(uri.toString()); -- HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); -- try { -- urlConnection.setInstanceFollowRedirects(true); -- urlConnection.setDoOutput(true); -- urlConnection.connect(); -- -- final int responseCode = urlConnection.getResponseCode(); -- if (DEBUG) Log.d(TAG, "cm server response code=" + responseCode); -- final boolean success = responseCode == HttpURLConnection.HTTP_OK; -- if (!success) { -- Log.w(TAG, "failed sending, server returned: " + getResponse(urlConnection, -- !success)); -- } -- return success; -- } finally { -- urlConnection.disconnect(); -- } -- -- } -- -- private boolean uploadToCyanogen(JSONObject json) -- throws IOException, JSONException { -- String authToken = getAuthToken(); -- -- if (authToken.isEmpty()) { -- Log.w(TAG, "no auth token!"); -- } -- -- URL url = new URL(getString(R.string.stats_cyanogen_url)); -- HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); -- try { -- urlConnection.setInstanceFollowRedirects(true); -- urlConnection.setDoInput(true); -- urlConnection.setDoOutput(true); -- -- urlConnection.setRequestProperty("Accept-Encoding", "identity"); -- urlConnection.setRequestProperty("Authorization", authToken); -- urlConnection.setRequestProperty("Content-Type", "application/json"); -- -- OutputStream os = urlConnection.getOutputStream(); -- BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); -- writer.write(json.toString()); -- writer.flush(); -- writer.close(); -- os.close(); -- -- urlConnection.connect(); -- -- final int responseCode = urlConnection.getResponseCode(); -- final boolean success = responseCode == HttpURLConnection.HTTP_OK; -- -- final String response = getResponse(urlConnection, !success); -- if (DEBUG) -- Log.d(TAG, "server responseCode: " + responseCode +", response=" + response); -- -- if (!success) { -- Log.w(TAG, "failed sending, server returned: " + response); -- } -- return success; -- } finally { -- urlConnection.disconnect(); -- } -- } -- -- private String getAuthToken() { -- HttpURLConnection urlConnection = null; -- try { -- URL url = new URL(getString(R.string.stats_cyanogen_token_url)); -- urlConnection = (HttpURLConnection) url.openConnection(); -- urlConnection.setInstanceFollowRedirects(true); -- urlConnection.setDoInput(true); -- -- urlConnection.setRequestProperty("Accept-Encoding", "identity"); -- urlConnection.setRequestProperty("Content-Type", "text/plain"); -- -- urlConnection.connect(); -- -- final int responseCode = urlConnection.getResponseCode(); -- final boolean success = responseCode == HttpURLConnection.HTTP_OK; -- if (DEBUG) Log.d(TAG, "server auth response code=" + responseCode); -- final String response = getResponse(urlConnection, !success); -- if (DEBUG) -- Log.d(TAG, "server auth response=" + response); -- -- if (success) { -- return response; -- } -- } catch (IOException e) { -- Log.e(TAG, "error getting auth token", e); -- } finally { -- if (urlConnection != null) { -- urlConnection.disconnect(); -- } -- } -- return ""; -- } -- -- private String getResponse(HttpURLConnection httpUrlConnection, boolean errorStream) -- throws IOException { -- InputStream responseStream = new BufferedInputStream(errorStream -- ? httpUrlConnection.getErrorStream() -- : httpUrlConnection.getInputStream()); -- -- BufferedReader responseStreamReader = new BufferedReader( -- new InputStreamReader(responseStream)); -- String line = ""; -- StringBuilder stringBuilder = new StringBuilder(); -- while ((line = responseStreamReader.readLine()) != null) { -- stringBuilder.append(line).append("\n"); -- } -- responseStreamReader.close(); -- responseStream.close(); -- -- return stringBuilder.toString(); -- } -- --} -diff --git a/src/com/android/settings/cmstats/Utilities.java b/src/com/android/settings/cmstats/Utilities.java -deleted file mode 100644 -index 1e98888..0000000 ---- a/src/com/android/settings/cmstats/Utilities.java -+++ /dev/null -@@ -1,102 +0,0 @@ --/* -- * Copyright (C) 2012 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.settings.cmstats; -- --import android.content.Context; --import android.os.Build; --import android.os.SystemProperties; --import android.provider.Settings; --import android.telephony.TelephonyManager; --import android.text.TextUtils; -- --import cyanogenmod.providers.CMSettings; -- --import java.math.BigInteger; --import java.net.NetworkInterface; --import java.security.MessageDigest; -- --public class Utilities { -- public static String getUniqueID(Context context) { -- final String id = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); -- return digest(context.getPackageName() + id); -- } -- -- public static String getCarrier(Context context) { -- TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); -- String carrier = tm.getNetworkOperatorName(); -- if (TextUtils.isEmpty(carrier)) { -- carrier = "Unknown"; -- } -- return carrier; -- } -- -- public static String getCarrierId(Context context) { -- TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); -- String carrierId = tm.getNetworkOperator(); -- if (TextUtils.isEmpty(carrierId)) { -- carrierId = "0"; -- } -- return carrierId; -- } -- -- public static String getCountryCode(Context context) { -- TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); -- String countryCode = tm.getNetworkCountryIso(); -- if (TextUtils.isEmpty(countryCode)) { -- countryCode = "Unknown"; -- } -- return countryCode; -- } -- -- public static String getDevice() { -- return SystemProperties.get("ro.cm.device", Build.PRODUCT); -- } -- -- public static String getModVersion() { -- return SystemProperties.get("ro.cm.version", Build.DISPLAY); -- } -- -- public static String digest(String input) { -- try { -- MessageDigest md = MessageDigest.getInstance("MD5"); -- return new BigInteger(1, md.digest(input.getBytes())).toString(16).toUpperCase(); -- } catch (Exception e) { -- return null; -- } -- } -- -- /** -- * Check to see if global stats are enabled. -- * @param context -- * @return Whether or not stats collection is enabled. -- */ -- public static boolean isStatsCollectionEnabled(Context context) { -- return CMSettings.Secure.getInt(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, 1) != 0; -- } -- -- /** -- * Enabled or disable stats collection -- * @param context -- * @param enabled Boolean that sets collection being enabled. -- */ -- public static void setStatsCollectionEnabled(Context context, boolean enabled) { -- int enable = (enabled) ? 1 : 0; -- CMSettings.Secure.putInt(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, enable); -- } --} -diff --git a/src/com/android/settings/cyanogenmod/PrivacySettings.java b/src/com/android/settings/cyanogenmod/PrivacySettings.java -index f6a9c15..066063a 100644 ---- a/src/com/android/settings/cyanogenmod/PrivacySettings.java -+++ b/src/com/android/settings/cyanogenmod/PrivacySettings.java -@@ -32,7 +32,6 @@ import org.cyanogenmod.internal.logging.CMMetricsLogger; - public class PrivacySettings extends SettingsPreferenceFragment { - - private static final String KEY_BLACKLIST = "blacklist"; -- private static final String KEY_STATS = "cmstats"; - - private PreferenceScreen mBlacklist; - -@@ -48,8 +47,6 @@ public class PrivacySettings extends SettingsPreferenceFragment { - - boolean isOwner = Utils.isUserOwner(); - if (!isOwner) { -- PreferenceScreen root = getPreferenceScreen(); -- root.removePreference(findPreference(KEY_STATS)); - } - - // Determine options based on device telephony support --- -2.7.2 - diff --git a/Patches/CyanogenMod-13.0/android_packages_apps_SetupWizard/Remove_Analytics-old.patch b/Patches/CyanogenMod-13.0/android_packages_apps_SetupWizard/Remove_Analytics-old.patch deleted file mode 100644 index a961267c..00000000 --- a/Patches/CyanogenMod-13.0/android_packages_apps_SetupWizard/Remove_Analytics-old.patch +++ /dev/null @@ -1,954 +0,0 @@ -From 353e522115eca684a4036f2005f64ab14123218f Mon Sep 17 00:00:00 2001 -From: Tad -Date: Fri, 8 Apr 2016 20:43:21 -0400 -Subject: [PATCH] Remove analytics - -Change-Id: I4d38768fc22791f9e5085c56a22f94f335526c31 ---- - AndroidManifest.xml | 1 - - .../setupwizard/cmstats/SetupStats.java | 162 --------------------- - .../setupwizard/cmstats/StatsUtils.java | 44 ------ - .../setupwizard/setup/BluetoothSetupPage.java | 7 - - .../setupwizard/setup/ChooseDataSimPage.java | 4 - - .../setupwizard/setup/CyanogenServicesPage.java | 13 -- - .../setupwizard/setup/CyanogenSettingsPage.java | 56 ------- - .../setupwizard/setup/DateTimePage.java | 19 --- - .../setupwizard/setup/FingerprintSetupPage.java | 4 - - .../setupwizard/setup/GmsAccountPage.java | 23 --- - .../setupwizard/setup/MobileDataPage.java | 4 - - .../setupwizard/setup/OtherSettingsPage.java | 17 +-- - .../cyanogenmod/setupwizard/setup/SetupPage.java | 7 - - .../cyanogenmod/setupwizard/setup/WelcomePage.java | 14 -- - .../setupwizard/setup/WifiSetupPage.java | 25 ---- - .../setupwizard/ui/SetupPageFragment.java | 3 - - .../setupwizard/ui/SetupWizardActivity.java | 6 - - .../util/EnableAccessibilityController.java | 3 - - 18 files changed, 1 insertion(+), 411 deletions(-) - delete mode 100644 src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java - delete mode 100644 src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java - -diff --git a/AndroidManifest.xml b/AndroidManifest.xml -index d8c7617..8e2ec08 100644 ---- a/AndroidManifest.xml -+++ b/AndroidManifest.xml -@@ -43,7 +43,6 @@ - - - -- - - - -diff --git a/src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java b/src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java -deleted file mode 100644 -index 6eb527f..0000000 ---- a/src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java -+++ /dev/null -@@ -1,162 +0,0 @@ --/* -- * Copyright (C) 2014 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.cyanogenmod.setupwizard.cmstats; -- --import android.content.Context; --import android.content.Intent; --import android.os.UserHandle; --import android.util.Log; -- --import java.util.LinkedList; -- -- --public class SetupStats { -- -- private static final String TAG = SetupStats.class.getSimpleName(); -- -- private static final String ANALYTIC_INTENT = "com.cyngn.stats.action.SEND_ANALYTIC_EVENT"; -- private static final String ANALYTIC_PERMISSION = "com.cyngn.stats.SEND_ANALYTICS"; -- -- public static final String TRACKING_ID = "tracking_id"; -- -- private final LinkedList mEvents = new LinkedList(); -- -- private static final SetupStats sInstance = new SetupStats(); -- -- private static final boolean DEBUG = false; -- -- private SetupStats() {} -- -- public static void addEvent(String category, String action, -- String label, String value) { -- sInstance.mEvents.add(new Event(category, action, label, value)); -- } -- -- public static void addEvent(String category, String action) { -- sInstance.mEvents.add(new Event(category, action, null, null)); -- } -- -- public static void sendEvents(Context context) { -- while (!sInstance.mEvents.isEmpty()) { -- sInstance.sendEvent(context, sInstance.mEvents.remove()); -- } -- } -- -- private void sendEvent(Context context, Event event) { -- -- if (!StatsUtils.isStatsPackageInstalled(context) -- || !StatsUtils.isStatsCollectionEnabled(context)) { -- return; -- } -- -- // Create new intent -- Intent intent = new Intent(); -- intent.setAction(ANALYTIC_INTENT); -- -- // add tracking id -- intent.putExtra(TRACKING_ID, context.getPackageName()); -- // append -- intent.putExtra(Fields.EVENT_CATEGORY, event.category); -- if (DEBUG) Log.d(TAG, Fields.EVENT_CATEGORY + "=" + event.category); -- intent.putExtra(Fields.EVENT_ACTION, event.action); -- if (DEBUG) Log.d(TAG, Fields.EVENT_ACTION + "=" + event.action); -- // check if exist -- if (event.label != null) { -- intent.putExtra(Fields.EVENT_LABEL, event.label); -- if (DEBUG) Log.d(TAG, Fields.EVENT_LABEL + "=" + event.label); -- } -- -- if (event.value != null) { -- intent.putExtra(Fields.EVENT_VALUE, event.value); -- if (DEBUG) Log.d(TAG, Fields.EVENT_VALUE + "=" + event.value); -- } -- -- // broadcast for internal package -- context.sendBroadcastAsUser(intent, -- new UserHandle(UserHandle.USER_CURRENT), ANALYTIC_PERMISSION); -- } -- -- private static final class Event { -- private final String category; -- private final String action; -- private final String label; -- private final String value; -- -- public Event(String category, String action, String label, String value) { -- this.action = action; -- this.category = category; -- this.label = label; -- this.value = value; -- } -- } -- -- public static final class Fields { -- public static final String EVENT_CATEGORY = "category"; -- public static final String EVENT_ACTION = "action"; -- public static final String EVENT_LABEL = "label"; -- public static final String EVENT_VALUE = "value"; -- } -- -- public static final class Categories { -- public static final String APP_LAUNCH = "app_launch"; -- public static final String APP_FINISHED = "app_finish"; -- public static final String PAGE_LOAD = "page_load"; -- public static final String EXTERNAL_PAGE_LOAD = "external_page_load"; -- public static final String BUTTON_CLICK = "button_click"; -- public static final String SETTING_CHANGED = "setting_changed"; -- } -- -- public static final class Action { -- public static final String PAGE_LOADED = "page_loaded"; -- public static final String PREVIOUS_BUTTON = "previous_button"; -- public static final String NEXT_BUTTON = "next_button"; -- public static final String CHANGE_LOCALE = "change_local"; -- public static final String EXTERNAL_PAGE_LAUNCH = "external_page_launch"; -- public static final String EXTERNAL_PAGE_RESULT = "external_page_result"; -- public static final String ENABLE_MOBILE_DATA = "enable_mobile_data"; -- public static final String PREFERRED_DATA_SIM = "preferred_data_sim"; -- public static final String APPLY_CUSTOM_THEME = "apply_custom_theme"; -- public static final String USE_SECURE_SMS = "use_secure_sms"; -- public static final String ENABLE_BACKUP = "enable_backup"; -- public static final String ENABLE_NAV_KEYS = "enable_nav_keys"; -- public static final String ENABLE_LOCATION = "enable_location"; -- public static final String ENABLE_NETWORK_LOCATION = "enable_network_location"; -- public static final String ENABLE_GPS_LOCATION = "enable_gps_location"; -- public static final String DATE_CHANGED = "date_changed"; -- public static final String TIME_CHANGED = "time_changed"; -- public static final String TIMEZONE_CHANGED = "timezone_changed"; -- } -- -- public static final class Label { -- public static final String PAGE = "page"; -- public static final String LOCALE = "local"; -- public static final String RESULT = "result"; -- public static final String WIFI_SETUP = "wifi_setup"; -- public static final String BLUETOOTH_SETUP = "bluetooth_setup"; -- public static final String CYANOGEN_ACCOUNT = "cyanogen_account_setup"; -- public static final String CAPTIVE_PORTAL_LOGIN = "captive_portal_login"; -- public static final String EMERGENCY_CALL = "emergency_call"; -- public static final String GMS_ACCOUNT = "gms_account"; -- public static final String RESTORE = "restore"; -- public static final String CHECKED = "checked"; -- public static final String VALUE = "value"; -- public static final String SLOT = "slot"; -- public static final String TOTAL_TIME = "total_time"; -- public static final String FINGERPRINT_SETUP = "fingerprint_setup"; -- } -- --} -diff --git a/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java b/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java -deleted file mode 100644 -index 8be8fad..0000000 ---- a/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java -+++ /dev/null -@@ -1,44 +0,0 @@ -- --/* -- * Copyright (C) 2014 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.cyanogenmod.setupwizard.cmstats; -- --import android.content.Context; --import android.content.pm.ApplicationInfo; --import android.content.pm.PackageInfo; --import android.content.pm.PackageManager; -- --import cyanogenmod.providers.CMSettings; -- --public class StatsUtils { -- private static final String STATS_PACKAGE = "com.cyngn.stats"; -- -- public static boolean isStatsCollectionEnabled(Context context) { -- return CMSettings.Secure.getInt(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, 1) != 0; -- } -- -- public static boolean isStatsPackageInstalled(Context context) { -- try { -- PackageInfo pi = context.getPackageManager().getPackageInfo(STATS_PACKAGE, 0); -- return pi.applicationInfo.enabled -- && ((pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0); -- } catch (PackageManager.NameNotFoundException e) { -- return false; -- } -- } --} -diff --git a/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -index 915abec..8609dbb 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -@@ -28,7 +28,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -91,9 +90,6 @@ public class BluetoothSetupPage extends SetupPage { - @Override - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_BLUETOOTH) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.BLUETOOTH_SETUP, "success"); - getCallbacks().onNextPage(); - } else { - return false; -@@ -111,9 +107,6 @@ public class BluetoothSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.BLUETOOTH_SETUP); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_BLUETOOTH, options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java b/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -index 255cbad..a3282af 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -@@ -47,7 +47,6 @@ import com.android.internal.telephony.TelephonyIntents; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -356,9 +355,6 @@ public class ChooseDataSimPage extends SetupPage { - for (int i = 0; i < mCheckBoxes.size(); i++) { - if (subInfoRecord.getSimSlotIndex() == i) { - mCheckBoxes.get(i).setChecked(true); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.PREFERRED_DATA_SIM, -- SetupStats.Label.SLOT, String.valueOf(i + 1)); - } else { - mCheckBoxes.get(i).setChecked(false); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java b/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -index e71dd79..5bfe3b0 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -@@ -32,7 +32,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -95,10 +94,6 @@ public class CyanogenServicesPage extends SetupPage { - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CYANOGEN) { - if (resultCode == Activity.RESULT_OK || resultCode == Activity.RESULT_FIRST_USER) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CYANOGEN_ACCOUNT, -- resultCode == Activity.RESULT_OK ? "success" : "skipped"); - if (SetupWizardUtils.accountExists(mContext, - mContext.getString(R.string.cm_account_type))) { - if (SetupWizardUtils.isDeviceLocked()) { -@@ -108,9 +103,6 @@ public class CyanogenServicesPage extends SetupPage { - } - getCallbacks().onNextPage(); - } else if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CYANOGEN_ACCOUNT, "canceled"); - getCallbacks().onPreviousPage(); - } - } -@@ -136,11 +128,6 @@ public class CyanogenServicesPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats -- .addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, -- SetupStats.Label.CYANOGEN_ACCOUNT); - mFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_CYANOGEN, - options.toBundle()); -diff --git a/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java b/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -index d17d64b..2c95253 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -@@ -42,7 +42,6 @@ import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -54,7 +53,6 @@ public class CyanogenSettingsPage extends SetupPage { - - public static final String TAG = "CyanogenSettingsPage"; - -- public static final String KEY_SEND_METRICS = "send_metrics"; - public static final String DISABLE_NAV_KEYS = "disable_nav_keys"; - public static final String KEY_APPLY_DEFAULT_THEME = "apply_default_theme"; - public static final String KEY_BUTTON_BACKLIGHT = "pre_navbar_button_backlight"; -@@ -116,37 +114,18 @@ public class CyanogenSettingsPage extends SetupPage { - @Override - public void run() { - if (getData().containsKey(DISABLE_NAV_KEYS)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_NAV_KEYS, -- SetupStats.Label.CHECKED, -- String.valueOf(getData().getBoolean(DISABLE_NAV_KEYS))); - writeDisableNavkeysOption(mContext, getData().getBoolean(DISABLE_NAV_KEYS)); - } - } - }); -- handleEnableMetrics(); - handleDefaultThemeSetup(); - } - -- private void handleEnableMetrics() { -- Bundle privacyData = getData(); -- if (privacyData != null -- && privacyData.containsKey(KEY_SEND_METRICS)) { -- CMSettings.Secure.putInt(mContext.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, privacyData.getBoolean(KEY_SEND_METRICS) -- ? 1 : 0); -- } -- } -- - private void handleDefaultThemeSetup() { - Bundle privacyData = getData(); - if (!SetupWizardUtils.getDefaultThemePackageName(mContext).equals( - ThemeConfig.SYSTEM_DEFAULT) && privacyData != null && - privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.APPLY_CUSTOM_THEME, -- SetupStats.Label.CHECKED, -- String.valueOf(privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME))); - Log.i(TAG, "Applying default theme"); - final ThemeManager tm = ThemeManager.getInstance(mContext); - tm.applyDefaultTheme(); -@@ -176,26 +155,14 @@ public class CyanogenSettingsPage extends SetupPage { - private View mKillSwitchView; - private TextView mKillSwitchTitle; - private ImageView mKillSwitchStatus; -- private View mMetricsRow; - private View mDefaultThemeRow; - private View mNavKeysRow; -- private CheckBox mMetrics; - private CheckBox mDefaultTheme; - private CheckBox mNavKeys; - - private boolean mHideNavKeysRow = false; - private boolean mHideThemeRow = false; - -- -- private View.OnClickListener mMetricsClickListener = new View.OnClickListener() { -- @Override -- public void onClick(View view) { -- boolean checked = !mMetrics.isChecked(); -- mMetrics.setChecked(checked); -- mPage.getData().putBoolean(KEY_SEND_METRICS, checked); -- } -- }; -- - private View.OnClickListener mDefaultThemeClickListener = new View.OnClickListener() { - @Override - public void onClick(View view) { -@@ -253,19 +220,6 @@ public class CyanogenSettingsPage extends SetupPage { - } - } - -- mMetricsRow = mRootView.findViewById(R.id.metrics); -- mMetricsRow.setOnClickListener(mMetricsClickListener); -- String metricsHelpImproveCM = -- getString(R.string.services_help_improve_cm, getString(R.string.os_name)); -- String metricsSummary = getString(R.string.services_metrics_label, -- metricsHelpImproveCM, getString(R.string.os_name)); -- final SpannableStringBuilder metricsSpan = new SpannableStringBuilder(metricsSummary); -- metricsSpan.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), -- 0, metricsHelpImproveCM.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); -- TextView metrics = (TextView) mRootView.findViewById(R.id.enable_metrics_summary); -- metrics.setText(metricsSpan); -- mMetrics = (CheckBox) mRootView.findViewById(R.id.enable_metrics_checkbox); -- - mDefaultThemeRow = mRootView.findViewById(R.id.theme); - mHideThemeRow = hideThemeSwitch(getActivity()); - if (mHideThemeRow) { -@@ -314,19 +268,9 @@ public class CyanogenSettingsPage extends SetupPage { - public void onResume() { - super.onResume(); - updateDisableNavkeysOption(); -- updateMetricsOption(); - updateThemeOption(); - } - -- private void updateMetricsOption() { -- final Bundle myPageBundle = mPage.getData(); -- boolean metricsChecked = -- !myPageBundle.containsKey(KEY_SEND_METRICS) || myPageBundle -- .getBoolean(KEY_SEND_METRICS); -- mMetrics.setChecked(metricsChecked); -- myPageBundle.putBoolean(KEY_SEND_METRICS, metricsChecked); -- } -- - private void updateThemeOption() { - if (!mHideThemeRow) { - final Bundle myPageBundle = mPage.getData(); -diff --git a/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java b/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -index 7a5922b..a669163 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -@@ -42,7 +42,6 @@ import android.widget.TextView; - import android.widget.TimePicker; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - - import org.xmlpull.v1.XmlPullParserException; -@@ -136,8 +135,6 @@ public class DateTimePage extends SetupPage { - mDateView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "date_picker"); - showDatePicker(); - } - }); -@@ -145,8 +142,6 @@ public class DateTimePage extends SetupPage { - mTimeView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "time_picker"); - showTimePicker(); - } - }); -@@ -167,17 +162,11 @@ public class DateTimePage extends SetupPage { - final Map map = (Map) adapterView.getItemAtPosition(position); - final String tzId = (String) map.get(KEY_ID); - if (mCurrentTimeZone != null && !mCurrentTimeZone.getID().equals(tzId)) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "timezone_picker"); - // Update the system timezone value - final Activity activity = getActivity(); - final AlarmManager alarm = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE); - alarm.setTimeZone(tzId); - mCurrentTimeZone = TimeZone.getTimeZone(tzId); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.TIMEZONE_CHANGED, -- SetupStats.Label.VALUE, -- mCurrentTimeZone.getDisplayName()); - } - - } -@@ -232,10 +221,6 @@ public class DateTimePage extends SetupPage { - if (activity != null) { - setDate(activity, year, month, day); - updateTimeAndDateDisplay(activity); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.DATE_CHANGED, -- SetupStats.Label.VALUE, -- month+"/"+day+"/"+year); - } - } - -@@ -245,10 +230,6 @@ public class DateTimePage extends SetupPage { - if (activity != null) { - setTime(activity, hourOfDay, minute); - updateTimeAndDateDisplay(activity); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.TIME_CHANGED, -- SetupStats.Label.VALUE, -- hourOfDay+":"+minute); - } - } - -diff --git a/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -index 890a4f6..c9174c6 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -@@ -28,7 +28,6 @@ import android.widget.TextView; - import com.android.internal.widget.LockPatternUtils; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - - public class FingerprintSetupPage extends SetupPage { -@@ -113,9 +112,6 @@ public class FingerprintSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(getActivity(), - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.FINGERPRINT_SETUP); - startActivityForResult(intent, SetupWizardApp.REQUEST_CODE_SETUP_FINGERPRINT, - options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -index 9bcce42..64b84da 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -@@ -34,7 +34,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -116,10 +115,6 @@ public class GmsAccountPage extends SetupPage { - boolean restorePicker = !data.hasExtra(EXTRA_RESTORE_TOKEN) - && !data.hasExtra(EXTRA_RESTORE_ACCOUNT) && - data.hasExtra(EXTRA_AUTH_ACCOUNT); -- -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.GMS_ACCOUNT, "success"); - launchGmsRestorePage(restorePicker); - } else { - handleResult(requestCode, resultCode); -@@ -140,24 +135,12 @@ public class GmsAccountPage extends SetupPage { - - private void handleResult(int requestCode, int resultCode) { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "canceled"); - getCallbacks().onPreviousPage(); - } else { - if (resultCode == Activity.RESULT_OK) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "success"); - getCallbacks().onNextPage(); - } else { - if (canSkip()) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "skipped"); - getCallbacks().onNextPage(); - } else { - getCallbacks().onPreviousPage(); -@@ -194,9 +177,6 @@ public class GmsAccountPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.RESTORE); - mFragment.startActivityForResult( - intent, - SetupWizardApp.REQUEST_CODE_RESTORE_GMS, options.toBundle()); -@@ -240,9 +220,6 @@ public class GmsAccountPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.GMS_ACCOUNT); - mFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_GMS, options.toBundle()); - } catch (OperationCanceledException e) { -diff --git a/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java b/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -index 8940fd3..02ee1b6 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -@@ -38,7 +38,6 @@ import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -147,9 +146,6 @@ public class MobileDataPage extends SetupPage { - } else { - onDataStateReady(); - } -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_MOBILE_DATA, -- SetupStats.Label.CHECKED, String.valueOf(checked)); - } - }; - -diff --git a/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java b/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -index 0ed17ff..0bea90b 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -@@ -40,7 +40,6 @@ import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -233,9 +232,6 @@ public class OtherSettingsPage extends SetupPage { - private void onToggleBackup(boolean checked) { - try { - mBackupManager.setBackupEnabled(checked); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_BACKUP, -- SetupStats.Label.CHECKED, String.valueOf(checked)); - } catch (RemoteException e) {} - updateBackupToggle(); - } -@@ -309,9 +305,6 @@ public class OtherSettingsPage extends SetupPage { - } - - private void onToggleLocationAccess(boolean checked) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); - - if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_SENSORS_ONLY); -@@ -321,10 +314,6 @@ public class OtherSettingsPage extends SetupPage { - } - - private void onToggleBatterySaving(boolean checked) { -- /* SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_BATTERY_SAVING_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); */ -- - if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_BATTERY_SAVING); - } else { -@@ -333,11 +322,7 @@ public class OtherSettingsPage extends SetupPage { - } - - private void onToggleNetwork(boolean checked) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_NETWORK_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); -- -- if (checked) { -+ if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY); - } else { - setLocationMode(Settings.Secure.LOCATION_MODE_SENSORS_ONLY); -diff --git a/src/com/cyanogenmod/setupwizard/setup/SetupPage.java b/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -index 1a19fb0..9804049 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -@@ -26,7 +26,6 @@ import android.transition.Transition; - import android.view.Gravity; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - - - public abstract class SetupPage implements Page { -@@ -76,18 +75,12 @@ public abstract class SetupPage implements Page { - public void doLoadAction(FragmentManager fragmentManager, int action) { - Fragment fragment = getFragment(fragmentManager, action); - if (action == Page.ACTION_NEXT) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- SetupStats.Action.NEXT_BUTTON, getKey(), -- String.valueOf(System.currentTimeMillis())); - Transition t = new Slide(Gravity.RIGHT); - fragment.setEnterTransition(t); - fragmentManager.beginTransaction() - .replace(R.id.content,fragment, getKey()) - .commit(); - } else { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- SetupStats.Action.PREVIOUS_BUTTON, getKey(), -- String.valueOf(System.currentTimeMillis())); - Transition t = new Slide(Gravity.LEFT); - fragment.setEnterTransition(t); - fragmentManager.beginTransaction() -diff --git a/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java b/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -index e09c2a1..eedb24d 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -@@ -42,7 +42,6 @@ import android.widget.Toast; - import com.android.internal.telephony.MccTable; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LocalePicker; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -87,7 +86,6 @@ public class WelcomePage extends SetupPage { - return true; - } else { - if (mWelcomeFragment != null) { -- mWelcomeFragment.sendLocaleStats(); - } - return super.doNextAction(); - } -@@ -102,10 +100,6 @@ public class WelcomePage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, SetupStats.Label.EMERGENCY_CALL); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.EMERGENCY_CALL); - mContext.startActivity(intent, options.toBundle()); - return true; - } -@@ -269,14 +263,6 @@ public class WelcomePage extends SetupPage { - return R.layout.setup_welcome_page; - } - -- public void sendLocaleStats() { -- if (!mCurrentLocale.equals(mInitialLocale)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.CHANGE_LOCALE, SetupStats.Label.LOCALE, -- mCurrentLocale.getDisplayName()); -- } -- } -- - public void fetchAndUpdateSimLocale() { - if (mIgnoreSimLocale || isDetached()) { - return; -diff --git a/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -index 2d8084a..3a131f7 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -@@ -31,7 +31,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -86,9 +85,6 @@ public class WifiSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.CAPTIVE_PORTAL_LOGIN); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL, - options.toBundle()); -@@ -157,19 +153,10 @@ public class WifiSetupPage extends SetupPage { - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_WIFI) { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "canceled"); - getCallbacks().onPreviousPage(); - } else if (resultCode == Activity.RESULT_OK) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "success"); - checkForCaptivePortal(); - } else { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "skipped"); - getCallbacks().onNextPage(); - } - } else if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL) { -@@ -179,20 +166,11 @@ public class WifiSetupPage extends SetupPage { - } - String token = data.getStringExtra("response_token"); - if (token != null && !token.equals(mResponseToken)) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "token_mismatch"); - launchWifiSetup(); - } else { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "canceled"); - launchWifiSetup(); - } else { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "success"); - getCallbacks().onNextPage(); - } - } -@@ -256,9 +234,6 @@ public class WifiSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.WIFI_SETUP); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_WIFI, options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java b/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -index b0df440..33c61c7 100644 ---- a/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -+++ b/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -@@ -26,7 +26,6 @@ import android.view.ViewGroup; - import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.setup.Page; - import com.cyanogenmod.setupwizard.setup.SetupDataCallbacks; - -@@ -43,8 +42,6 @@ public abstract class SetupPageFragment extends Fragment { - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setRetainInstance(true); -- SetupStats.addEvent(SetupStats.Categories.PAGE_LOAD, SetupStats.Action.PAGE_LOADED, -- mKey, String.valueOf(System.currentTimeMillis())); - } - - @Override -diff --git a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -index 6005347..05b2939 100644 ---- a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -+++ b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -@@ -43,7 +43,6 @@ import android.widget.ProgressBar; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.setup.CMSetupWizardData; - import com.cyanogenmod.setupwizard.setup.GmsAccountPage; - import com.cyanogenmod.setupwizard.setup.Page; -@@ -106,7 +105,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - } - }); - if (sLaunchTime == 0) { -- SetupStats.addEvent(SetupStats.Categories.APP_LAUNCH, TAG); - sLaunchTime = System.nanoTime(); - } - setContentView(R.layout.setup_main); -@@ -381,9 +379,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - @Override - public void finishSetup() { - if (!mIsFinishing) { -- SetupStats.addEvent(SetupStats.Categories.APP_FINISHED, TAG, -- SetupStats.Label.TOTAL_TIME, String.valueOf( -- System.nanoTime() - sLaunchTime)); - final SetupWizardApp setupWizardApp = (SetupWizardApp)getApplication(); - setupWizardApp.sendStickyBroadcastAsUser( - new Intent(SetupWizardApp.ACTION_FINISHED), -@@ -471,7 +466,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - } - final ThemeManager tm = ThemeManager.getInstance(SetupWizardActivity.this); - tm.removeClient(SetupWizardActivity.this); -- SetupStats.sendEvents(SetupWizardActivity.this); - SetupWizardUtils.disableGMSSetupWizard(SetupWizardActivity.this); - final WallpaperManager wallpaperManager = - WallpaperManager.getInstance(SetupWizardActivity.this); -diff --git a/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java b/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -index 440129b..47d6de5 100644 ---- a/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -+++ b/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -@@ -39,7 +39,6 @@ import android.view.accessibility.AccessibilityManager; - import android.view.accessibility.IAccessibilityManager; - - import com.android.internal.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - - import java.util.ArrayList; - import java.util.Iterator; -@@ -284,8 +283,6 @@ public class EnableAccessibilityController { - // Turn on accessibility mode last. - Settings.Secure.putIntForUser(resolver, Settings.Secure.ACCESSIBILITY_ENABLED, - 1, userId); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- "accessibility_enabled"); - } else if (keyguardLocked) { - try { - mAccessibilityManager.temporaryEnableAccessibilityStateUntilKeyguardRemoved( --- -2.8.0 - diff --git a/Patches/CyanogenMod-13.0/android_packages_apps_SetupWizard/Remove_Analytics-old2.patch b/Patches/CyanogenMod-13.0/android_packages_apps_SetupWizard/Remove_Analytics-old2.patch deleted file mode 100644 index 3f49310a..00000000 --- a/Patches/CyanogenMod-13.0/android_packages_apps_SetupWizard/Remove_Analytics-old2.patch +++ /dev/null @@ -1,954 +0,0 @@ -From 4a66cf8f67b5941037ae566db6c74a748a5351a2 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Fri, 8 Apr 2016 20:43:21 -0400 -Subject: [PATCH] Remove analytics - -Change-Id: I4d38768fc22791f9e5085c56a22f94f335526c31 ---- - AndroidManifest.xml | 1 - - .../setupwizard/cmstats/SetupStats.java | 162 --------------------- - .../setupwizard/cmstats/StatsUtils.java | 44 ------ - .../setupwizard/setup/BluetoothSetupPage.java | 7 - - .../setupwizard/setup/ChooseDataSimPage.java | 4 - - .../setupwizard/setup/CyanogenServicesPage.java | 13 -- - .../setupwizard/setup/CyanogenSettingsPage.java | 56 ------- - .../setupwizard/setup/DateTimePage.java | 19 --- - .../setupwizard/setup/FingerprintSetupPage.java | 4 - - .../setupwizard/setup/GmsAccountPage.java | 23 --- - .../setupwizard/setup/MobileDataPage.java | 4 - - .../setupwizard/setup/OtherSettingsPage.java | 17 +-- - .../cyanogenmod/setupwizard/setup/SetupPage.java | 7 - - .../cyanogenmod/setupwizard/setup/WelcomePage.java | 14 -- - .../setupwizard/setup/WifiSetupPage.java | 25 ---- - .../setupwizard/ui/SetupPageFragment.java | 3 - - .../setupwizard/ui/SetupWizardActivity.java | 6 - - .../util/EnableAccessibilityController.java | 3 - - 18 files changed, 1 insertion(+), 411 deletions(-) - delete mode 100644 src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java - delete mode 100644 src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java - -diff --git a/AndroidManifest.xml b/AndroidManifest.xml -index d8c7617..8e2ec08 100644 ---- a/AndroidManifest.xml -+++ b/AndroidManifest.xml -@@ -43,7 +43,6 @@ - - - -- - - - -diff --git a/src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java b/src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java -deleted file mode 100644 -index 6eb527f..0000000 ---- a/src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java -+++ /dev/null -@@ -1,162 +0,0 @@ --/* -- * Copyright (C) 2014 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.cyanogenmod.setupwizard.cmstats; -- --import android.content.Context; --import android.content.Intent; --import android.os.UserHandle; --import android.util.Log; -- --import java.util.LinkedList; -- -- --public class SetupStats { -- -- private static final String TAG = SetupStats.class.getSimpleName(); -- -- private static final String ANALYTIC_INTENT = "com.cyngn.stats.action.SEND_ANALYTIC_EVENT"; -- private static final String ANALYTIC_PERMISSION = "com.cyngn.stats.SEND_ANALYTICS"; -- -- public static final String TRACKING_ID = "tracking_id"; -- -- private final LinkedList mEvents = new LinkedList(); -- -- private static final SetupStats sInstance = new SetupStats(); -- -- private static final boolean DEBUG = false; -- -- private SetupStats() {} -- -- public static void addEvent(String category, String action, -- String label, String value) { -- sInstance.mEvents.add(new Event(category, action, label, value)); -- } -- -- public static void addEvent(String category, String action) { -- sInstance.mEvents.add(new Event(category, action, null, null)); -- } -- -- public static void sendEvents(Context context) { -- while (!sInstance.mEvents.isEmpty()) { -- sInstance.sendEvent(context, sInstance.mEvents.remove()); -- } -- } -- -- private void sendEvent(Context context, Event event) { -- -- if (!StatsUtils.isStatsPackageInstalled(context) -- || !StatsUtils.isStatsCollectionEnabled(context)) { -- return; -- } -- -- // Create new intent -- Intent intent = new Intent(); -- intent.setAction(ANALYTIC_INTENT); -- -- // add tracking id -- intent.putExtra(TRACKING_ID, context.getPackageName()); -- // append -- intent.putExtra(Fields.EVENT_CATEGORY, event.category); -- if (DEBUG) Log.d(TAG, Fields.EVENT_CATEGORY + "=" + event.category); -- intent.putExtra(Fields.EVENT_ACTION, event.action); -- if (DEBUG) Log.d(TAG, Fields.EVENT_ACTION + "=" + event.action); -- // check if exist -- if (event.label != null) { -- intent.putExtra(Fields.EVENT_LABEL, event.label); -- if (DEBUG) Log.d(TAG, Fields.EVENT_LABEL + "=" + event.label); -- } -- -- if (event.value != null) { -- intent.putExtra(Fields.EVENT_VALUE, event.value); -- if (DEBUG) Log.d(TAG, Fields.EVENT_VALUE + "=" + event.value); -- } -- -- // broadcast for internal package -- context.sendBroadcastAsUser(intent, -- new UserHandle(UserHandle.USER_CURRENT), ANALYTIC_PERMISSION); -- } -- -- private static final class Event { -- private final String category; -- private final String action; -- private final String label; -- private final String value; -- -- public Event(String category, String action, String label, String value) { -- this.action = action; -- this.category = category; -- this.label = label; -- this.value = value; -- } -- } -- -- public static final class Fields { -- public static final String EVENT_CATEGORY = "category"; -- public static final String EVENT_ACTION = "action"; -- public static final String EVENT_LABEL = "label"; -- public static final String EVENT_VALUE = "value"; -- } -- -- public static final class Categories { -- public static final String APP_LAUNCH = "app_launch"; -- public static final String APP_FINISHED = "app_finish"; -- public static final String PAGE_LOAD = "page_load"; -- public static final String EXTERNAL_PAGE_LOAD = "external_page_load"; -- public static final String BUTTON_CLICK = "button_click"; -- public static final String SETTING_CHANGED = "setting_changed"; -- } -- -- public static final class Action { -- public static final String PAGE_LOADED = "page_loaded"; -- public static final String PREVIOUS_BUTTON = "previous_button"; -- public static final String NEXT_BUTTON = "next_button"; -- public static final String CHANGE_LOCALE = "change_local"; -- public static final String EXTERNAL_PAGE_LAUNCH = "external_page_launch"; -- public static final String EXTERNAL_PAGE_RESULT = "external_page_result"; -- public static final String ENABLE_MOBILE_DATA = "enable_mobile_data"; -- public static final String PREFERRED_DATA_SIM = "preferred_data_sim"; -- public static final String APPLY_CUSTOM_THEME = "apply_custom_theme"; -- public static final String USE_SECURE_SMS = "use_secure_sms"; -- public static final String ENABLE_BACKUP = "enable_backup"; -- public static final String ENABLE_NAV_KEYS = "enable_nav_keys"; -- public static final String ENABLE_LOCATION = "enable_location"; -- public static final String ENABLE_NETWORK_LOCATION = "enable_network_location"; -- public static final String ENABLE_GPS_LOCATION = "enable_gps_location"; -- public static final String DATE_CHANGED = "date_changed"; -- public static final String TIME_CHANGED = "time_changed"; -- public static final String TIMEZONE_CHANGED = "timezone_changed"; -- } -- -- public static final class Label { -- public static final String PAGE = "page"; -- public static final String LOCALE = "local"; -- public static final String RESULT = "result"; -- public static final String WIFI_SETUP = "wifi_setup"; -- public static final String BLUETOOTH_SETUP = "bluetooth_setup"; -- public static final String CYANOGEN_ACCOUNT = "cyanogen_account_setup"; -- public static final String CAPTIVE_PORTAL_LOGIN = "captive_portal_login"; -- public static final String EMERGENCY_CALL = "emergency_call"; -- public static final String GMS_ACCOUNT = "gms_account"; -- public static final String RESTORE = "restore"; -- public static final String CHECKED = "checked"; -- public static final String VALUE = "value"; -- public static final String SLOT = "slot"; -- public static final String TOTAL_TIME = "total_time"; -- public static final String FINGERPRINT_SETUP = "fingerprint_setup"; -- } -- --} -diff --git a/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java b/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java -deleted file mode 100644 -index 8be8fad..0000000 ---- a/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java -+++ /dev/null -@@ -1,44 +0,0 @@ -- --/* -- * Copyright (C) 2014 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.cyanogenmod.setupwizard.cmstats; -- --import android.content.Context; --import android.content.pm.ApplicationInfo; --import android.content.pm.PackageInfo; --import android.content.pm.PackageManager; -- --import cyanogenmod.providers.CMSettings; -- --public class StatsUtils { -- private static final String STATS_PACKAGE = "com.cyngn.stats"; -- -- public static boolean isStatsCollectionEnabled(Context context) { -- return CMSettings.Secure.getInt(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, 1) != 0; -- } -- -- public static boolean isStatsPackageInstalled(Context context) { -- try { -- PackageInfo pi = context.getPackageManager().getPackageInfo(STATS_PACKAGE, 0); -- return pi.applicationInfo.enabled -- && ((pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0); -- } catch (PackageManager.NameNotFoundException e) { -- return false; -- } -- } --} -diff --git a/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -index 915abec..8609dbb 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -@@ -28,7 +28,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -91,9 +90,6 @@ public class BluetoothSetupPage extends SetupPage { - @Override - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_BLUETOOTH) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.BLUETOOTH_SETUP, "success"); - getCallbacks().onNextPage(); - } else { - return false; -@@ -111,9 +107,6 @@ public class BluetoothSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.BLUETOOTH_SETUP); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_BLUETOOTH, options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java b/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -index a0a4312..42e7ea2 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -@@ -47,7 +47,6 @@ import com.android.internal.telephony.TelephonyIntents; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -356,9 +355,6 @@ public class ChooseDataSimPage extends SetupPage { - for (int i = 0; i < mCheckBoxes.size(); i++) { - if (subInfoRecord.getSimSlotIndex() == i) { - mCheckBoxes.get(i).setChecked(true); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.PREFERRED_DATA_SIM, -- SetupStats.Label.SLOT, String.valueOf(i + 1)); - } else { - mCheckBoxes.get(i).setChecked(false); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java b/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -index e71dd79..5bfe3b0 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -@@ -32,7 +32,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -95,10 +94,6 @@ public class CyanogenServicesPage extends SetupPage { - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CYANOGEN) { - if (resultCode == Activity.RESULT_OK || resultCode == Activity.RESULT_FIRST_USER) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CYANOGEN_ACCOUNT, -- resultCode == Activity.RESULT_OK ? "success" : "skipped"); - if (SetupWizardUtils.accountExists(mContext, - mContext.getString(R.string.cm_account_type))) { - if (SetupWizardUtils.isDeviceLocked()) { -@@ -108,9 +103,6 @@ public class CyanogenServicesPage extends SetupPage { - } - getCallbacks().onNextPage(); - } else if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CYANOGEN_ACCOUNT, "canceled"); - getCallbacks().onPreviousPage(); - } - } -@@ -136,11 +128,6 @@ public class CyanogenServicesPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats -- .addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, -- SetupStats.Label.CYANOGEN_ACCOUNT); - mFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_CYANOGEN, - options.toBundle()); -diff --git a/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java b/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -index d17d64b..2c95253 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -@@ -42,7 +42,6 @@ import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -54,7 +53,6 @@ public class CyanogenSettingsPage extends SetupPage { - - public static final String TAG = "CyanogenSettingsPage"; - -- public static final String KEY_SEND_METRICS = "send_metrics"; - public static final String DISABLE_NAV_KEYS = "disable_nav_keys"; - public static final String KEY_APPLY_DEFAULT_THEME = "apply_default_theme"; - public static final String KEY_BUTTON_BACKLIGHT = "pre_navbar_button_backlight"; -@@ -116,37 +114,18 @@ public class CyanogenSettingsPage extends SetupPage { - @Override - public void run() { - if (getData().containsKey(DISABLE_NAV_KEYS)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_NAV_KEYS, -- SetupStats.Label.CHECKED, -- String.valueOf(getData().getBoolean(DISABLE_NAV_KEYS))); - writeDisableNavkeysOption(mContext, getData().getBoolean(DISABLE_NAV_KEYS)); - } - } - }); -- handleEnableMetrics(); - handleDefaultThemeSetup(); - } - -- private void handleEnableMetrics() { -- Bundle privacyData = getData(); -- if (privacyData != null -- && privacyData.containsKey(KEY_SEND_METRICS)) { -- CMSettings.Secure.putInt(mContext.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, privacyData.getBoolean(KEY_SEND_METRICS) -- ? 1 : 0); -- } -- } -- - private void handleDefaultThemeSetup() { - Bundle privacyData = getData(); - if (!SetupWizardUtils.getDefaultThemePackageName(mContext).equals( - ThemeConfig.SYSTEM_DEFAULT) && privacyData != null && - privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.APPLY_CUSTOM_THEME, -- SetupStats.Label.CHECKED, -- String.valueOf(privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME))); - Log.i(TAG, "Applying default theme"); - final ThemeManager tm = ThemeManager.getInstance(mContext); - tm.applyDefaultTheme(); -@@ -176,26 +155,14 @@ public class CyanogenSettingsPage extends SetupPage { - private View mKillSwitchView; - private TextView mKillSwitchTitle; - private ImageView mKillSwitchStatus; -- private View mMetricsRow; - private View mDefaultThemeRow; - private View mNavKeysRow; -- private CheckBox mMetrics; - private CheckBox mDefaultTheme; - private CheckBox mNavKeys; - - private boolean mHideNavKeysRow = false; - private boolean mHideThemeRow = false; - -- -- private View.OnClickListener mMetricsClickListener = new View.OnClickListener() { -- @Override -- public void onClick(View view) { -- boolean checked = !mMetrics.isChecked(); -- mMetrics.setChecked(checked); -- mPage.getData().putBoolean(KEY_SEND_METRICS, checked); -- } -- }; -- - private View.OnClickListener mDefaultThemeClickListener = new View.OnClickListener() { - @Override - public void onClick(View view) { -@@ -253,19 +220,6 @@ public class CyanogenSettingsPage extends SetupPage { - } - } - -- mMetricsRow = mRootView.findViewById(R.id.metrics); -- mMetricsRow.setOnClickListener(mMetricsClickListener); -- String metricsHelpImproveCM = -- getString(R.string.services_help_improve_cm, getString(R.string.os_name)); -- String metricsSummary = getString(R.string.services_metrics_label, -- metricsHelpImproveCM, getString(R.string.os_name)); -- final SpannableStringBuilder metricsSpan = new SpannableStringBuilder(metricsSummary); -- metricsSpan.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), -- 0, metricsHelpImproveCM.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); -- TextView metrics = (TextView) mRootView.findViewById(R.id.enable_metrics_summary); -- metrics.setText(metricsSpan); -- mMetrics = (CheckBox) mRootView.findViewById(R.id.enable_metrics_checkbox); -- - mDefaultThemeRow = mRootView.findViewById(R.id.theme); - mHideThemeRow = hideThemeSwitch(getActivity()); - if (mHideThemeRow) { -@@ -314,19 +268,9 @@ public class CyanogenSettingsPage extends SetupPage { - public void onResume() { - super.onResume(); - updateDisableNavkeysOption(); -- updateMetricsOption(); - updateThemeOption(); - } - -- private void updateMetricsOption() { -- final Bundle myPageBundle = mPage.getData(); -- boolean metricsChecked = -- !myPageBundle.containsKey(KEY_SEND_METRICS) || myPageBundle -- .getBoolean(KEY_SEND_METRICS); -- mMetrics.setChecked(metricsChecked); -- myPageBundle.putBoolean(KEY_SEND_METRICS, metricsChecked); -- } -- - private void updateThemeOption() { - if (!mHideThemeRow) { - final Bundle myPageBundle = mPage.getData(); -diff --git a/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java b/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -index 7a5922b..a669163 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -@@ -42,7 +42,6 @@ import android.widget.TextView; - import android.widget.TimePicker; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - - import org.xmlpull.v1.XmlPullParserException; -@@ -136,8 +135,6 @@ public class DateTimePage extends SetupPage { - mDateView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "date_picker"); - showDatePicker(); - } - }); -@@ -145,8 +142,6 @@ public class DateTimePage extends SetupPage { - mTimeView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "time_picker"); - showTimePicker(); - } - }); -@@ -167,17 +162,11 @@ public class DateTimePage extends SetupPage { - final Map map = (Map) adapterView.getItemAtPosition(position); - final String tzId = (String) map.get(KEY_ID); - if (mCurrentTimeZone != null && !mCurrentTimeZone.getID().equals(tzId)) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "timezone_picker"); - // Update the system timezone value - final Activity activity = getActivity(); - final AlarmManager alarm = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE); - alarm.setTimeZone(tzId); - mCurrentTimeZone = TimeZone.getTimeZone(tzId); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.TIMEZONE_CHANGED, -- SetupStats.Label.VALUE, -- mCurrentTimeZone.getDisplayName()); - } - - } -@@ -232,10 +221,6 @@ public class DateTimePage extends SetupPage { - if (activity != null) { - setDate(activity, year, month, day); - updateTimeAndDateDisplay(activity); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.DATE_CHANGED, -- SetupStats.Label.VALUE, -- month+"/"+day+"/"+year); - } - } - -@@ -245,10 +230,6 @@ public class DateTimePage extends SetupPage { - if (activity != null) { - setTime(activity, hourOfDay, minute); - updateTimeAndDateDisplay(activity); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.TIME_CHANGED, -- SetupStats.Label.VALUE, -- hourOfDay+":"+minute); - } - } - -diff --git a/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -index 890a4f6..c9174c6 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -@@ -28,7 +28,6 @@ import android.widget.TextView; - import com.android.internal.widget.LockPatternUtils; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - - public class FingerprintSetupPage extends SetupPage { -@@ -113,9 +112,6 @@ public class FingerprintSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(getActivity(), - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.FINGERPRINT_SETUP); - startActivityForResult(intent, SetupWizardApp.REQUEST_CODE_SETUP_FINGERPRINT, - options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -index eebf3f5..1de9c82 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -@@ -34,7 +34,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -138,10 +137,6 @@ public class GmsAccountPage extends SetupPage { - boolean restorePicker = !data.hasExtra(EXTRA_RESTORE_TOKEN) - && !data.hasExtra(EXTRA_RESTORE_ACCOUNT) && - data.hasExtra(EXTRA_AUTH_ACCOUNT); -- -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.GMS_ACCOUNT, "success"); - launchGmsRestorePage(restorePicker); - } else { - handleResult(requestCode, resultCode); -@@ -169,24 +164,12 @@ public class GmsAccountPage extends SetupPage { - - private void handleResult(int requestCode, int resultCode) { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "canceled"); - getCallbacks().onPreviousPage(); - } else { - if (resultCode == Activity.RESULT_OK) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "success"); - getCallbacks().onNextPage(); - } else { - if (canSkip()) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "skipped"); - getCallbacks().onNextPage(); - } else { - getCallbacks().onPreviousPage(); -@@ -226,9 +209,6 @@ public class GmsAccountPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.RESTORE); - mFragment.startActivityForResult( - intent, - SetupWizardApp.REQUEST_CODE_RESTORE_GMS, options.toBundle()); -@@ -275,9 +255,6 @@ public class GmsAccountPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.GMS_ACCOUNT); - mFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_GMS, options.toBundle()); - } catch (OperationCanceledException e) { -diff --git a/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java b/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -index da3872e..36d9ad5 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -@@ -38,7 +38,6 @@ import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -147,9 +146,6 @@ public class MobileDataPage extends SetupPage { - } else { - onDataStateReady(); - } -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_MOBILE_DATA, -- SetupStats.Label.CHECKED, String.valueOf(checked)); - } - }; - -diff --git a/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java b/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -index 0ed17ff..0bea90b 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -@@ -40,7 +40,6 @@ import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -233,9 +232,6 @@ public class OtherSettingsPage extends SetupPage { - private void onToggleBackup(boolean checked) { - try { - mBackupManager.setBackupEnabled(checked); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_BACKUP, -- SetupStats.Label.CHECKED, String.valueOf(checked)); - } catch (RemoteException e) {} - updateBackupToggle(); - } -@@ -309,9 +305,6 @@ public class OtherSettingsPage extends SetupPage { - } - - private void onToggleLocationAccess(boolean checked) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); - - if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_SENSORS_ONLY); -@@ -321,10 +314,6 @@ public class OtherSettingsPage extends SetupPage { - } - - private void onToggleBatterySaving(boolean checked) { -- /* SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_BATTERY_SAVING_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); */ -- - if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_BATTERY_SAVING); - } else { -@@ -333,11 +322,7 @@ public class OtherSettingsPage extends SetupPage { - } - - private void onToggleNetwork(boolean checked) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_NETWORK_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); -- -- if (checked) { -+ if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY); - } else { - setLocationMode(Settings.Secure.LOCATION_MODE_SENSORS_ONLY); -diff --git a/src/com/cyanogenmod/setupwizard/setup/SetupPage.java b/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -index 1a19fb0..9804049 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -@@ -26,7 +26,6 @@ import android.transition.Transition; - import android.view.Gravity; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - - - public abstract class SetupPage implements Page { -@@ -76,18 +75,12 @@ public abstract class SetupPage implements Page { - public void doLoadAction(FragmentManager fragmentManager, int action) { - Fragment fragment = getFragment(fragmentManager, action); - if (action == Page.ACTION_NEXT) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- SetupStats.Action.NEXT_BUTTON, getKey(), -- String.valueOf(System.currentTimeMillis())); - Transition t = new Slide(Gravity.RIGHT); - fragment.setEnterTransition(t); - fragmentManager.beginTransaction() - .replace(R.id.content,fragment, getKey()) - .commit(); - } else { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- SetupStats.Action.PREVIOUS_BUTTON, getKey(), -- String.valueOf(System.currentTimeMillis())); - Transition t = new Slide(Gravity.LEFT); - fragment.setEnterTransition(t); - fragmentManager.beginTransaction() -diff --git a/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java b/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -index e09c2a1..eedb24d 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -@@ -42,7 +42,6 @@ import android.widget.Toast; - import com.android.internal.telephony.MccTable; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LocalePicker; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -87,7 +86,6 @@ public class WelcomePage extends SetupPage { - return true; - } else { - if (mWelcomeFragment != null) { -- mWelcomeFragment.sendLocaleStats(); - } - return super.doNextAction(); - } -@@ -102,10 +100,6 @@ public class WelcomePage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, SetupStats.Label.EMERGENCY_CALL); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.EMERGENCY_CALL); - mContext.startActivity(intent, options.toBundle()); - return true; - } -@@ -269,14 +263,6 @@ public class WelcomePage extends SetupPage { - return R.layout.setup_welcome_page; - } - -- public void sendLocaleStats() { -- if (!mCurrentLocale.equals(mInitialLocale)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.CHANGE_LOCALE, SetupStats.Label.LOCALE, -- mCurrentLocale.getDisplayName()); -- } -- } -- - public void fetchAndUpdateSimLocale() { - if (mIgnoreSimLocale || isDetached()) { - return; -diff --git a/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -index 2d8084a..3a131f7 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -@@ -31,7 +31,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -86,9 +85,6 @@ public class WifiSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.CAPTIVE_PORTAL_LOGIN); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL, - options.toBundle()); -@@ -157,19 +153,10 @@ public class WifiSetupPage extends SetupPage { - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_WIFI) { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "canceled"); - getCallbacks().onPreviousPage(); - } else if (resultCode == Activity.RESULT_OK) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "success"); - checkForCaptivePortal(); - } else { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "skipped"); - getCallbacks().onNextPage(); - } - } else if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL) { -@@ -179,20 +166,11 @@ public class WifiSetupPage extends SetupPage { - } - String token = data.getStringExtra("response_token"); - if (token != null && !token.equals(mResponseToken)) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "token_mismatch"); - launchWifiSetup(); - } else { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "canceled"); - launchWifiSetup(); - } else { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "success"); - getCallbacks().onNextPage(); - } - } -@@ -256,9 +234,6 @@ public class WifiSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.WIFI_SETUP); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_WIFI, options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java b/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -index b0df440..33c61c7 100644 ---- a/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -+++ b/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -@@ -26,7 +26,6 @@ import android.view.ViewGroup; - import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.setup.Page; - import com.cyanogenmod.setupwizard.setup.SetupDataCallbacks; - -@@ -43,8 +42,6 @@ public abstract class SetupPageFragment extends Fragment { - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setRetainInstance(true); -- SetupStats.addEvent(SetupStats.Categories.PAGE_LOAD, SetupStats.Action.PAGE_LOADED, -- mKey, String.valueOf(System.currentTimeMillis())); - } - - @Override -diff --git a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -index 7ba58e0..68255c4 100644 ---- a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -+++ b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -@@ -44,7 +44,6 @@ import android.widget.ProgressBar; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.setup.CMSetupWizardData; - import com.cyanogenmod.setupwizard.setup.GmsAccountPage; - import com.cyanogenmod.setupwizard.setup.Page; -@@ -108,7 +107,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - } - }); - if (sLaunchTime == 0) { -- SetupStats.addEvent(SetupStats.Categories.APP_LAUNCH, TAG); - sLaunchTime = System.nanoTime(); - } - setContentView(R.layout.setup_main); -@@ -387,9 +385,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - @Override - public void finishSetup() { - if (!mIsFinishing) { -- SetupStats.addEvent(SetupStats.Categories.APP_FINISHED, TAG, -- SetupStats.Label.TOTAL_TIME, String.valueOf( -- System.nanoTime() - sLaunchTime)); - final SetupWizardApp setupWizardApp = (SetupWizardApp)getApplication(); - setupWizardApp.sendStickyBroadcastAsUser( - new Intent(SetupWizardApp.ACTION_FINISHED), -@@ -479,7 +474,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - } - final ThemeManager tm = ThemeManager.getInstance(SetupWizardActivity.this); - tm.unregisterThemeChangeListener(SetupWizardActivity.this); -- SetupStats.sendEvents(SetupWizardActivity.this); - SetupWizardUtils.disableGMSSetupWizard(SetupWizardActivity.this); - final WallpaperManager wallpaperManager = - WallpaperManager.getInstance(SetupWizardActivity.this); -diff --git a/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java b/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -index 440129b..47d6de5 100644 ---- a/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -+++ b/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -@@ -39,7 +39,6 @@ import android.view.accessibility.AccessibilityManager; - import android.view.accessibility.IAccessibilityManager; - - import com.android.internal.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - - import java.util.ArrayList; - import java.util.Iterator; -@@ -284,8 +283,6 @@ public class EnableAccessibilityController { - // Turn on accessibility mode last. - Settings.Secure.putIntForUser(resolver, Settings.Secure.ACCESSIBILITY_ENABLED, - 1, userId); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- "accessibility_enabled"); - } else if (keyguardLocked) { - try { - mAccessibilityManager.temporaryEnableAccessibilityStateUntilKeyguardRemoved( --- -2.8.0 - diff --git a/Patches/CyanogenMod-13.0/android_packages_apps_SetupWizard/Remove_Analytics.patch b/Patches/CyanogenMod-13.0/android_packages_apps_SetupWizard/Remove_Analytics.patch deleted file mode 100644 index 340abe7b..00000000 --- a/Patches/CyanogenMod-13.0/android_packages_apps_SetupWizard/Remove_Analytics.patch +++ /dev/null @@ -1,944 +0,0 @@ -From 149226a0a45a4a65447c4059b6e199dbc345bfde Mon Sep 17 00:00:00 2001 -From: Tad -Date: Thu, 28 Apr 2016 00:22:37 -0400 -Subject: [PATCH] Remove analytics - -Change-Id: I1c9a4267c948013a9cd900cf046ed450d945ab4c ---- - AndroidManifest.xml | 1 - - .../setupwizard/cmstats/SetupStats.java | 162 --------------------- - .../setupwizard/cmstats/StatsUtils.java | 44 ------ - .../setupwizard/setup/BluetoothSetupPage.java | 7 - - .../setupwizard/setup/ChooseDataSimPage.java | 4 - - .../setupwizard/setup/CyanogenServicesPage.java | 13 -- - .../setupwizard/setup/CyanogenSettingsPage.java | 56 ------- - .../setupwizard/setup/DateTimePage.java | 19 --- - .../setupwizard/setup/FingerprintSetupPage.java | 4 - - .../setupwizard/setup/GmsAccountPage.java | 23 --- - .../setupwizard/setup/MobileDataPage.java | 4 - - .../setupwizard/setup/OtherSettingsPage.java | 14 +- - .../cyanogenmod/setupwizard/setup/SetupPage.java | 7 - - .../cyanogenmod/setupwizard/setup/WelcomePage.java | 14 -- - .../setupwizard/setup/WifiSetupPage.java | 25 ---- - .../setupwizard/ui/SetupPageFragment.java | 3 - - .../setupwizard/ui/SetupWizardActivity.java | 6 - - .../util/EnableAccessibilityController.java | 3 - - 18 files changed, 1 insertion(+), 408 deletions(-) - delete mode 100644 src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java - delete mode 100644 src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java - -diff --git a/AndroidManifest.xml b/AndroidManifest.xml -index d8c7617..8e2ec08 100644 ---- a/AndroidManifest.xml -+++ b/AndroidManifest.xml -@@ -43,7 +43,6 @@ - - - -- - - - -diff --git a/src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java b/src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java -deleted file mode 100644 -index 6eb527f..0000000 ---- a/src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java -+++ /dev/null -@@ -1,162 +0,0 @@ --/* -- * Copyright (C) 2014 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.cyanogenmod.setupwizard.cmstats; -- --import android.content.Context; --import android.content.Intent; --import android.os.UserHandle; --import android.util.Log; -- --import java.util.LinkedList; -- -- --public class SetupStats { -- -- private static final String TAG = SetupStats.class.getSimpleName(); -- -- private static final String ANALYTIC_INTENT = "com.cyngn.stats.action.SEND_ANALYTIC_EVENT"; -- private static final String ANALYTIC_PERMISSION = "com.cyngn.stats.SEND_ANALYTICS"; -- -- public static final String TRACKING_ID = "tracking_id"; -- -- private final LinkedList mEvents = new LinkedList(); -- -- private static final SetupStats sInstance = new SetupStats(); -- -- private static final boolean DEBUG = false; -- -- private SetupStats() {} -- -- public static void addEvent(String category, String action, -- String label, String value) { -- sInstance.mEvents.add(new Event(category, action, label, value)); -- } -- -- public static void addEvent(String category, String action) { -- sInstance.mEvents.add(new Event(category, action, null, null)); -- } -- -- public static void sendEvents(Context context) { -- while (!sInstance.mEvents.isEmpty()) { -- sInstance.sendEvent(context, sInstance.mEvents.remove()); -- } -- } -- -- private void sendEvent(Context context, Event event) { -- -- if (!StatsUtils.isStatsPackageInstalled(context) -- || !StatsUtils.isStatsCollectionEnabled(context)) { -- return; -- } -- -- // Create new intent -- Intent intent = new Intent(); -- intent.setAction(ANALYTIC_INTENT); -- -- // add tracking id -- intent.putExtra(TRACKING_ID, context.getPackageName()); -- // append -- intent.putExtra(Fields.EVENT_CATEGORY, event.category); -- if (DEBUG) Log.d(TAG, Fields.EVENT_CATEGORY + "=" + event.category); -- intent.putExtra(Fields.EVENT_ACTION, event.action); -- if (DEBUG) Log.d(TAG, Fields.EVENT_ACTION + "=" + event.action); -- // check if exist -- if (event.label != null) { -- intent.putExtra(Fields.EVENT_LABEL, event.label); -- if (DEBUG) Log.d(TAG, Fields.EVENT_LABEL + "=" + event.label); -- } -- -- if (event.value != null) { -- intent.putExtra(Fields.EVENT_VALUE, event.value); -- if (DEBUG) Log.d(TAG, Fields.EVENT_VALUE + "=" + event.value); -- } -- -- // broadcast for internal package -- context.sendBroadcastAsUser(intent, -- new UserHandle(UserHandle.USER_CURRENT), ANALYTIC_PERMISSION); -- } -- -- private static final class Event { -- private final String category; -- private final String action; -- private final String label; -- private final String value; -- -- public Event(String category, String action, String label, String value) { -- this.action = action; -- this.category = category; -- this.label = label; -- this.value = value; -- } -- } -- -- public static final class Fields { -- public static final String EVENT_CATEGORY = "category"; -- public static final String EVENT_ACTION = "action"; -- public static final String EVENT_LABEL = "label"; -- public static final String EVENT_VALUE = "value"; -- } -- -- public static final class Categories { -- public static final String APP_LAUNCH = "app_launch"; -- public static final String APP_FINISHED = "app_finish"; -- public static final String PAGE_LOAD = "page_load"; -- public static final String EXTERNAL_PAGE_LOAD = "external_page_load"; -- public static final String BUTTON_CLICK = "button_click"; -- public static final String SETTING_CHANGED = "setting_changed"; -- } -- -- public static final class Action { -- public static final String PAGE_LOADED = "page_loaded"; -- public static final String PREVIOUS_BUTTON = "previous_button"; -- public static final String NEXT_BUTTON = "next_button"; -- public static final String CHANGE_LOCALE = "change_local"; -- public static final String EXTERNAL_PAGE_LAUNCH = "external_page_launch"; -- public static final String EXTERNAL_PAGE_RESULT = "external_page_result"; -- public static final String ENABLE_MOBILE_DATA = "enable_mobile_data"; -- public static final String PREFERRED_DATA_SIM = "preferred_data_sim"; -- public static final String APPLY_CUSTOM_THEME = "apply_custom_theme"; -- public static final String USE_SECURE_SMS = "use_secure_sms"; -- public static final String ENABLE_BACKUP = "enable_backup"; -- public static final String ENABLE_NAV_KEYS = "enable_nav_keys"; -- public static final String ENABLE_LOCATION = "enable_location"; -- public static final String ENABLE_NETWORK_LOCATION = "enable_network_location"; -- public static final String ENABLE_GPS_LOCATION = "enable_gps_location"; -- public static final String DATE_CHANGED = "date_changed"; -- public static final String TIME_CHANGED = "time_changed"; -- public static final String TIMEZONE_CHANGED = "timezone_changed"; -- } -- -- public static final class Label { -- public static final String PAGE = "page"; -- public static final String LOCALE = "local"; -- public static final String RESULT = "result"; -- public static final String WIFI_SETUP = "wifi_setup"; -- public static final String BLUETOOTH_SETUP = "bluetooth_setup"; -- public static final String CYANOGEN_ACCOUNT = "cyanogen_account_setup"; -- public static final String CAPTIVE_PORTAL_LOGIN = "captive_portal_login"; -- public static final String EMERGENCY_CALL = "emergency_call"; -- public static final String GMS_ACCOUNT = "gms_account"; -- public static final String RESTORE = "restore"; -- public static final String CHECKED = "checked"; -- public static final String VALUE = "value"; -- public static final String SLOT = "slot"; -- public static final String TOTAL_TIME = "total_time"; -- public static final String FINGERPRINT_SETUP = "fingerprint_setup"; -- } -- --} -diff --git a/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java b/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java -deleted file mode 100644 -index 8be8fad..0000000 ---- a/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java -+++ /dev/null -@@ -1,44 +0,0 @@ -- --/* -- * Copyright (C) 2014 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.cyanogenmod.setupwizard.cmstats; -- --import android.content.Context; --import android.content.pm.ApplicationInfo; --import android.content.pm.PackageInfo; --import android.content.pm.PackageManager; -- --import cyanogenmod.providers.CMSettings; -- --public class StatsUtils { -- private static final String STATS_PACKAGE = "com.cyngn.stats"; -- -- public static boolean isStatsCollectionEnabled(Context context) { -- return CMSettings.Secure.getInt(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, 1) != 0; -- } -- -- public static boolean isStatsPackageInstalled(Context context) { -- try { -- PackageInfo pi = context.getPackageManager().getPackageInfo(STATS_PACKAGE, 0); -- return pi.applicationInfo.enabled -- && ((pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0); -- } catch (PackageManager.NameNotFoundException e) { -- return false; -- } -- } --} -diff --git a/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -index 915abec..8609dbb 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -@@ -28,7 +28,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -91,9 +90,6 @@ public class BluetoothSetupPage extends SetupPage { - @Override - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_BLUETOOTH) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.BLUETOOTH_SETUP, "success"); - getCallbacks().onNextPage(); - } else { - return false; -@@ -111,9 +107,6 @@ public class BluetoothSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.BLUETOOTH_SETUP); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_BLUETOOTH, options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java b/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -index a0a4312..42e7ea2 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -@@ -47,7 +47,6 @@ import com.android.internal.telephony.TelephonyIntents; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -356,9 +355,6 @@ public class ChooseDataSimPage extends SetupPage { - for (int i = 0; i < mCheckBoxes.size(); i++) { - if (subInfoRecord.getSimSlotIndex() == i) { - mCheckBoxes.get(i).setChecked(true); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.PREFERRED_DATA_SIM, -- SetupStats.Label.SLOT, String.valueOf(i + 1)); - } else { - mCheckBoxes.get(i).setChecked(false); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java b/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -index e71dd79..5bfe3b0 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -@@ -32,7 +32,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -95,10 +94,6 @@ public class CyanogenServicesPage extends SetupPage { - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CYANOGEN) { - if (resultCode == Activity.RESULT_OK || resultCode == Activity.RESULT_FIRST_USER) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CYANOGEN_ACCOUNT, -- resultCode == Activity.RESULT_OK ? "success" : "skipped"); - if (SetupWizardUtils.accountExists(mContext, - mContext.getString(R.string.cm_account_type))) { - if (SetupWizardUtils.isDeviceLocked()) { -@@ -108,9 +103,6 @@ public class CyanogenServicesPage extends SetupPage { - } - getCallbacks().onNextPage(); - } else if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CYANOGEN_ACCOUNT, "canceled"); - getCallbacks().onPreviousPage(); - } - } -@@ -136,11 +128,6 @@ public class CyanogenServicesPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats -- .addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, -- SetupStats.Label.CYANOGEN_ACCOUNT); - mFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_CYANOGEN, - options.toBundle()); -diff --git a/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java b/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -index d17d64b..2c95253 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -@@ -42,7 +42,6 @@ import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -54,7 +53,6 @@ public class CyanogenSettingsPage extends SetupPage { - - public static final String TAG = "CyanogenSettingsPage"; - -- public static final String KEY_SEND_METRICS = "send_metrics"; - public static final String DISABLE_NAV_KEYS = "disable_nav_keys"; - public static final String KEY_APPLY_DEFAULT_THEME = "apply_default_theme"; - public static final String KEY_BUTTON_BACKLIGHT = "pre_navbar_button_backlight"; -@@ -116,37 +114,18 @@ public class CyanogenSettingsPage extends SetupPage { - @Override - public void run() { - if (getData().containsKey(DISABLE_NAV_KEYS)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_NAV_KEYS, -- SetupStats.Label.CHECKED, -- String.valueOf(getData().getBoolean(DISABLE_NAV_KEYS))); - writeDisableNavkeysOption(mContext, getData().getBoolean(DISABLE_NAV_KEYS)); - } - } - }); -- handleEnableMetrics(); - handleDefaultThemeSetup(); - } - -- private void handleEnableMetrics() { -- Bundle privacyData = getData(); -- if (privacyData != null -- && privacyData.containsKey(KEY_SEND_METRICS)) { -- CMSettings.Secure.putInt(mContext.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, privacyData.getBoolean(KEY_SEND_METRICS) -- ? 1 : 0); -- } -- } -- - private void handleDefaultThemeSetup() { - Bundle privacyData = getData(); - if (!SetupWizardUtils.getDefaultThemePackageName(mContext).equals( - ThemeConfig.SYSTEM_DEFAULT) && privacyData != null && - privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.APPLY_CUSTOM_THEME, -- SetupStats.Label.CHECKED, -- String.valueOf(privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME))); - Log.i(TAG, "Applying default theme"); - final ThemeManager tm = ThemeManager.getInstance(mContext); - tm.applyDefaultTheme(); -@@ -176,26 +155,14 @@ public class CyanogenSettingsPage extends SetupPage { - private View mKillSwitchView; - private TextView mKillSwitchTitle; - private ImageView mKillSwitchStatus; -- private View mMetricsRow; - private View mDefaultThemeRow; - private View mNavKeysRow; -- private CheckBox mMetrics; - private CheckBox mDefaultTheme; - private CheckBox mNavKeys; - - private boolean mHideNavKeysRow = false; - private boolean mHideThemeRow = false; - -- -- private View.OnClickListener mMetricsClickListener = new View.OnClickListener() { -- @Override -- public void onClick(View view) { -- boolean checked = !mMetrics.isChecked(); -- mMetrics.setChecked(checked); -- mPage.getData().putBoolean(KEY_SEND_METRICS, checked); -- } -- }; -- - private View.OnClickListener mDefaultThemeClickListener = new View.OnClickListener() { - @Override - public void onClick(View view) { -@@ -253,19 +220,6 @@ public class CyanogenSettingsPage extends SetupPage { - } - } - -- mMetricsRow = mRootView.findViewById(R.id.metrics); -- mMetricsRow.setOnClickListener(mMetricsClickListener); -- String metricsHelpImproveCM = -- getString(R.string.services_help_improve_cm, getString(R.string.os_name)); -- String metricsSummary = getString(R.string.services_metrics_label, -- metricsHelpImproveCM, getString(R.string.os_name)); -- final SpannableStringBuilder metricsSpan = new SpannableStringBuilder(metricsSummary); -- metricsSpan.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), -- 0, metricsHelpImproveCM.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); -- TextView metrics = (TextView) mRootView.findViewById(R.id.enable_metrics_summary); -- metrics.setText(metricsSpan); -- mMetrics = (CheckBox) mRootView.findViewById(R.id.enable_metrics_checkbox); -- - mDefaultThemeRow = mRootView.findViewById(R.id.theme); - mHideThemeRow = hideThemeSwitch(getActivity()); - if (mHideThemeRow) { -@@ -314,19 +268,9 @@ public class CyanogenSettingsPage extends SetupPage { - public void onResume() { - super.onResume(); - updateDisableNavkeysOption(); -- updateMetricsOption(); - updateThemeOption(); - } - -- private void updateMetricsOption() { -- final Bundle myPageBundle = mPage.getData(); -- boolean metricsChecked = -- !myPageBundle.containsKey(KEY_SEND_METRICS) || myPageBundle -- .getBoolean(KEY_SEND_METRICS); -- mMetrics.setChecked(metricsChecked); -- myPageBundle.putBoolean(KEY_SEND_METRICS, metricsChecked); -- } -- - private void updateThemeOption() { - if (!mHideThemeRow) { - final Bundle myPageBundle = mPage.getData(); -diff --git a/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java b/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -index 7a5922b..a669163 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -@@ -42,7 +42,6 @@ import android.widget.TextView; - import android.widget.TimePicker; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - - import org.xmlpull.v1.XmlPullParserException; -@@ -136,8 +135,6 @@ public class DateTimePage extends SetupPage { - mDateView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "date_picker"); - showDatePicker(); - } - }); -@@ -145,8 +142,6 @@ public class DateTimePage extends SetupPage { - mTimeView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "time_picker"); - showTimePicker(); - } - }); -@@ -167,17 +162,11 @@ public class DateTimePage extends SetupPage { - final Map map = (Map) adapterView.getItemAtPosition(position); - final String tzId = (String) map.get(KEY_ID); - if (mCurrentTimeZone != null && !mCurrentTimeZone.getID().equals(tzId)) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "timezone_picker"); - // Update the system timezone value - final Activity activity = getActivity(); - final AlarmManager alarm = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE); - alarm.setTimeZone(tzId); - mCurrentTimeZone = TimeZone.getTimeZone(tzId); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.TIMEZONE_CHANGED, -- SetupStats.Label.VALUE, -- mCurrentTimeZone.getDisplayName()); - } - - } -@@ -232,10 +221,6 @@ public class DateTimePage extends SetupPage { - if (activity != null) { - setDate(activity, year, month, day); - updateTimeAndDateDisplay(activity); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.DATE_CHANGED, -- SetupStats.Label.VALUE, -- month+"/"+day+"/"+year); - } - } - -@@ -245,10 +230,6 @@ public class DateTimePage extends SetupPage { - if (activity != null) { - setTime(activity, hourOfDay, minute); - updateTimeAndDateDisplay(activity); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.TIME_CHANGED, -- SetupStats.Label.VALUE, -- hourOfDay+":"+minute); - } - } - -diff --git a/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -index 890a4f6..c9174c6 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -@@ -28,7 +28,6 @@ import android.widget.TextView; - import com.android.internal.widget.LockPatternUtils; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - - public class FingerprintSetupPage extends SetupPage { -@@ -113,9 +112,6 @@ public class FingerprintSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(getActivity(), - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.FINGERPRINT_SETUP); - startActivityForResult(intent, SetupWizardApp.REQUEST_CODE_SETUP_FINGERPRINT, - options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -index 2b4741a..e8b4ef4 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -@@ -35,7 +35,6 @@ import android.util.Log; - import com.android.setupwizardlib.util.ResultCodes; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -143,10 +142,6 @@ public class GmsAccountPage extends SetupPage { - boolean restorePicker = !data.hasExtra(EXTRA_RESTORE_TOKEN) - && !data.hasExtra(EXTRA_RESTORE_ACCOUNT) && - data.hasExtra(EXTRA_AUTH_ACCOUNT); -- -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.GMS_ACCOUNT, "success"); - launchGmsRestorePage(restorePicker); - } else { - handleResult(requestCode, resultCode); -@@ -174,24 +169,12 @@ public class GmsAccountPage extends SetupPage { - - private void handleResult(int requestCode, int resultCode) { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "canceled"); - getCallbacks().onPreviousPage(); - } else { - if (resultCode == Activity.RESULT_OK) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "success"); - getCallbacks().onNextPage(); - } else { - if (canSkip()) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "skipped"); - getCallbacks().onNextPage(); - } else { - getCallbacks().onPreviousPage(); -@@ -231,9 +214,6 @@ public class GmsAccountPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.RESTORE); - mFragment.startActivityForResult( - intent, - SetupWizardApp.REQUEST_CODE_RESTORE_GMS, options.toBundle()); -@@ -305,9 +285,6 @@ public class GmsAccountPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.GMS_ACCOUNT); - mFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_GMS, options.toBundle()); - } catch (OperationCanceledException e) { -diff --git a/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java b/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -index da3872e..36d9ad5 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -@@ -38,7 +38,6 @@ import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -147,9 +146,6 @@ public class MobileDataPage extends SetupPage { - } else { - onDataStateReady(); - } -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_MOBILE_DATA, -- SetupStats.Label.CHECKED, String.valueOf(checked)); - } - }; - -diff --git a/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java b/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -index 7ed23dc..69b0100 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -@@ -17,7 +17,6 @@ - package com.cyanogenmod.setupwizard.setup; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -229,9 +228,6 @@ public class OtherSettingsPage extends SetupPage { - } - - private void onToggleLocationAccess(boolean checked) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); - - if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_SENSORS_ONLY); -@@ -241,10 +237,6 @@ public class OtherSettingsPage extends SetupPage { - } - - private void onToggleBatterySaving(boolean checked) { -- /* SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_BATTERY_SAVING_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); */ -- - if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_BATTERY_SAVING); - } else { -@@ -253,11 +245,7 @@ public class OtherSettingsPage extends SetupPage { - } - - private void onToggleNetwork(boolean checked) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_NETWORK_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); -- -- if (checked) { -+ if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY); - } else { - setLocationMode(Settings.Secure.LOCATION_MODE_SENSORS_ONLY); -diff --git a/src/com/cyanogenmod/setupwizard/setup/SetupPage.java b/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -index 1a19fb0..9804049 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -@@ -26,7 +26,6 @@ import android.transition.Transition; - import android.view.Gravity; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - - - public abstract class SetupPage implements Page { -@@ -76,18 +75,12 @@ public abstract class SetupPage implements Page { - public void doLoadAction(FragmentManager fragmentManager, int action) { - Fragment fragment = getFragment(fragmentManager, action); - if (action == Page.ACTION_NEXT) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- SetupStats.Action.NEXT_BUTTON, getKey(), -- String.valueOf(System.currentTimeMillis())); - Transition t = new Slide(Gravity.RIGHT); - fragment.setEnterTransition(t); - fragmentManager.beginTransaction() - .replace(R.id.content,fragment, getKey()) - .commit(); - } else { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- SetupStats.Action.PREVIOUS_BUTTON, getKey(), -- String.valueOf(System.currentTimeMillis())); - Transition t = new Slide(Gravity.LEFT); - fragment.setEnterTransition(t); - fragmentManager.beginTransaction() -diff --git a/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java b/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -index e09c2a1..eedb24d 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -@@ -42,7 +42,6 @@ import android.widget.Toast; - import com.android.internal.telephony.MccTable; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LocalePicker; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -87,7 +86,6 @@ public class WelcomePage extends SetupPage { - return true; - } else { - if (mWelcomeFragment != null) { -- mWelcomeFragment.sendLocaleStats(); - } - return super.doNextAction(); - } -@@ -102,10 +100,6 @@ public class WelcomePage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, SetupStats.Label.EMERGENCY_CALL); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.EMERGENCY_CALL); - mContext.startActivity(intent, options.toBundle()); - return true; - } -@@ -269,14 +263,6 @@ public class WelcomePage extends SetupPage { - return R.layout.setup_welcome_page; - } - -- public void sendLocaleStats() { -- if (!mCurrentLocale.equals(mInitialLocale)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.CHANGE_LOCALE, SetupStats.Label.LOCALE, -- mCurrentLocale.getDisplayName()); -- } -- } -- - public void fetchAndUpdateSimLocale() { - if (mIgnoreSimLocale || isDetached()) { - return; -diff --git a/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -index 2d8084a..3a131f7 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -@@ -31,7 +31,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -86,9 +85,6 @@ public class WifiSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.CAPTIVE_PORTAL_LOGIN); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL, - options.toBundle()); -@@ -157,19 +153,10 @@ public class WifiSetupPage extends SetupPage { - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_WIFI) { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "canceled"); - getCallbacks().onPreviousPage(); - } else if (resultCode == Activity.RESULT_OK) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "success"); - checkForCaptivePortal(); - } else { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "skipped"); - getCallbacks().onNextPage(); - } - } else if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL) { -@@ -179,20 +166,11 @@ public class WifiSetupPage extends SetupPage { - } - String token = data.getStringExtra("response_token"); - if (token != null && !token.equals(mResponseToken)) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "token_mismatch"); - launchWifiSetup(); - } else { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "canceled"); - launchWifiSetup(); - } else { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "success"); - getCallbacks().onNextPage(); - } - } -@@ -256,9 +234,6 @@ public class WifiSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.WIFI_SETUP); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_WIFI, options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java b/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -index b0df440..33c61c7 100644 ---- a/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -+++ b/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -@@ -26,7 +26,6 @@ import android.view.ViewGroup; - import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.setup.Page; - import com.cyanogenmod.setupwizard.setup.SetupDataCallbacks; - -@@ -43,8 +42,6 @@ public abstract class SetupPageFragment extends Fragment { - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setRetainInstance(true); -- SetupStats.addEvent(SetupStats.Categories.PAGE_LOAD, SetupStats.Action.PAGE_LOADED, -- mKey, String.valueOf(System.currentTimeMillis())); - } - - @Override -diff --git a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -index 0d82a74..3e3657d 100644 ---- a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -+++ b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -@@ -45,7 +45,6 @@ import android.widget.ProgressBar; - import com.android.setupwizardlib.util.SystemBarHelper; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.setup.CMSetupWizardData; - import com.cyanogenmod.setupwizard.setup.GmsAccountPage; - import com.cyanogenmod.setupwizard.setup.Page; -@@ -93,7 +92,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - } - SystemBarHelper.hideSystemBars(getWindow()); - if (sLaunchTime == 0) { -- SetupStats.addEvent(SetupStats.Categories.APP_LAUNCH, TAG); - sLaunchTime = System.nanoTime(); - } - setContentView(R.layout.setup_main); -@@ -369,9 +367,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - @Override - public void finishSetup() { - if (!mIsFinishing) { -- SetupStats.addEvent(SetupStats.Categories.APP_FINISHED, TAG, -- SetupStats.Label.TOTAL_TIME, String.valueOf( -- System.nanoTime() - sLaunchTime)); - final SetupWizardApp setupWizardApp = (SetupWizardApp)getApplication(); - setupWizardApp.sendStickyBroadcastAsUser( - new Intent(SetupWizardApp.ACTION_FINISHED), -@@ -461,7 +456,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - } - final ThemeManager tm = ThemeManager.getInstance(SetupWizardActivity.this); - tm.unregisterThemeChangeListener(SetupWizardActivity.this); -- SetupStats.sendEvents(SetupWizardActivity.this); - SetupWizardUtils.disableGMSSetupWizard(SetupWizardActivity.this); - final WallpaperManager wallpaperManager = - WallpaperManager.getInstance(SetupWizardActivity.this); -diff --git a/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java b/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -index 440129b..47d6de5 100644 ---- a/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -+++ b/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -@@ -39,7 +39,6 @@ import android.view.accessibility.AccessibilityManager; - import android.view.accessibility.IAccessibilityManager; - - import com.android.internal.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - - import java.util.ArrayList; - import java.util.Iterator; -@@ -284,8 +283,6 @@ public class EnableAccessibilityController { - // Turn on accessibility mode last. - Settings.Secure.putIntForUser(resolver, Settings.Secure.ACCESSIBILITY_ENABLED, - 1, userId); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- "accessibility_enabled"); - } else if (keyguardLocked) { - try { - mAccessibilityManager.temporaryEnableAccessibilityStateUntilKeyguardRemoved( --- -2.8.0 - diff --git a/Patches/CyanogenMod-13.0/android_packages_apps_Trebuchet/Remove_Analytics.patch b/Patches/CyanogenMod-13.0/android_packages_apps_Trebuchet/Remove_Analytics.patch deleted file mode 100644 index add48497..00000000 --- a/Patches/CyanogenMod-13.0/android_packages_apps_Trebuchet/Remove_Analytics.patch +++ /dev/null @@ -1,2564 +0,0 @@ -From 11df11ec7fe9f43798cf5fa33b65acbb45dc52b4 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Thu, 5 May 2016 02:53:50 -0400 -Subject: [PATCH 1/5] Revert "Trebuchet Statistics:" - -This reverts commit a20b046db71039ee581bb80274cf1fc450b3fd99. - -Change-Id: I4c71ccdc40151d5d3f98b776f2ce215027009978 ---- - Android.mk | 2 +- - AndroidManifest.xml | 10 -- - src/com/android/launcher3/Launcher.java | 32 ----- - src/com/android/launcher3/LauncherModel.java | 37 +---- - .../launcher3/WallpaperChangedReceiver.java | 15 -- - .../launcher3/stats/external/StatsUtil.java | 117 --------------- - .../launcher3/stats/external/TrackingBundle.java | 67 --------- - .../stats/internal/db/DatabaseHelper.java | 159 --------------------- - .../stats/internal/db/TrackingEventContract.java | 31 ---- - .../stats/internal/model/CountAction.java | 73 ---------- - .../internal/model/CountOriginByPackageAction.java | 91 ------------ - .../stats/internal/model/ITrackingAction.java | 45 ------ - src/com/android/launcher3/stats/util/Logger.java | 55 ------- - 13 files changed, 4 insertions(+), 730 deletions(-) - delete mode 100644 src/com/android/launcher3/stats/external/StatsUtil.java - delete mode 100644 src/com/android/launcher3/stats/external/TrackingBundle.java - delete mode 100644 src/com/android/launcher3/stats/internal/db/DatabaseHelper.java - delete mode 100644 src/com/android/launcher3/stats/internal/db/TrackingEventContract.java - delete mode 100644 src/com/android/launcher3/stats/internal/model/CountAction.java - delete mode 100644 src/com/android/launcher3/stats/internal/model/CountOriginByPackageAction.java - delete mode 100644 src/com/android/launcher3/stats/internal/model/ITrackingAction.java - delete mode 100644 src/com/android/launcher3/stats/util/Logger.java - -diff --git a/Android.mk b/Android.mk -index 5ef85b4..9915fc5 100644 ---- a/Android.mk -+++ b/Android.mk -@@ -45,7 +45,7 @@ LOCAL_AAPT_FLAGS := \ - --auto-add-overlay \ - --extra-packages android.support.v7.recyclerview - --#LOCAL_SDK_VERSION := current -+LOCAL_SDK_VERSION := current - LOCAL_PACKAGE_NAME := Trebuchet - LOCAL_PRIVILEGED_MODULE := true - -diff --git a/AndroidManifest.xml b/AndroidManifest.xml -index dbdabfa..ee80841 100644 ---- a/AndroidManifest.xml -+++ b/AndroidManifest.xml -@@ -69,10 +69,8 @@ - - - -- - - - - -- -- -- -- -- -- - - -diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java -index 8161d38..37f3931 100644 ---- a/src/com/android/launcher3/Launcher.java -+++ b/src/com/android/launcher3/Launcher.java -@@ -111,7 +111,6 @@ import com.android.launcher3.compat.UserManagerCompat; - import com.android.launcher3.list.SettingsPinnedHeaderAdapter; - import com.android.launcher3.model.WidgetsModel; - import com.android.launcher3.settings.SettingsProvider; --import com.android.launcher3.stats.LauncherStats; - import com.android.launcher3.util.ComponentKey; - import com.android.launcher3.util.LongArrayMap; - import com.android.launcher3.util.Thunk; -@@ -170,10 +169,6 @@ public class Launcher extends Activity - - private static final float BOUNCE_ANIMATION_TENSION = 1.3f; - -- -- public static final String LONGPRESS_CHANGE = "wallpaper_changed_by_longpress"; -- -- - /** - * IntentStarter uses request codes starting with this. This must be greater than all activity - * request codes used internally. -@@ -2136,9 +2131,6 @@ public class Launcher extends Activity - public void removeAppWidget(LauncherAppWidgetInfo launcherInfo) { - removeWidgetToAutoAdvance(launcherInfo.hostView); - launcherInfo.hostView = null; -- AppWidgetProviderInfo info = mAppWidgetManager.getAppWidgetInfo(launcherInfo.appWidgetId); -- String packageName = info.providerInfo.packageName; -- LauncherApplication.getLauncherStats().sendWidgetRemoveEvent(packageName); - } - - public void showOutOfSpaceMessage(boolean isHotseatLayout) { -@@ -2632,8 +2624,6 @@ public class Launcher extends Activity - completeAddAppWidget(appWidgetId, info.container, info.screenId, boundWidget, - appWidgetInfo); - mWorkspace.removeExtraEmptyScreenDelayed(true, onComplete, delay, false); -- String packageName = appWidgetInfo.providerInfo.packageName; -- LauncherApplication.getLauncherStats().sendWidgetAddEvent(packageName); - } - } - -@@ -2893,13 +2883,6 @@ public class Launcher extends Activity - } else if (tag instanceof AppInfo) { - AppInfo info = (AppInfo) tag; - startAppShortcutOrInfoActivity(v); -- LauncherApplication.getLauncherStats().sendAppLaunchEvent( -- LauncherStats.ORIGIN_APPDRAWER, info.componentName.getPackageName()); -- String packageName = info.getIntent().getComponent().getPackageName(); -- if (LauncherStats.SETTINGS_PACKAGE_NAME.equals(packageName)) { -- LauncherApplication.getLauncherStats() -- .sendSettingsOpenedEvent(LauncherStats.ORIGIN_APPDRAWER); -- } - } else if (tag instanceof LauncherAppWidgetInfo) { - if (v instanceof PendingAppWidgetHostView) { - onClickPendingWidget((PendingAppWidgetHostView) v); -@@ -3048,17 +3031,6 @@ public class Launcher extends Activity - - // Start activities - startAppShortcutOrInfoActivity(v); -- ComponentName componentName = intent.getComponent(); -- if (componentName != null) { -- String packageName = intent.getComponent().getPackageName(); -- LauncherApplication.getLauncherStats() -- .sendAppLaunchEvent(LauncherStats.ORIGIN_HOMESCREEN, -- packageName); -- if (LauncherStats.SETTINGS_PACKAGE_NAME.equals(packageName)) { -- LauncherApplication.getLauncherStats().sendSettingsOpenedEvent( -- LauncherStats.ORIGIN_HOMESCREEN); -- } -- } - - if (mLauncherCallbacks != null) { - mLauncherCallbacks.onClickAppShortcut(v); -@@ -4173,10 +4145,6 @@ public class Launcher extends Activity - mWorkspace.createCustomContentContainer(); - populateCustomContentContainer(); - } -- -- LauncherModel.saveWidgetCount(this); -- LauncherModel.savePageCount(this); -- - } - - @Override -diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java -index 687e565..e758817 100644 ---- a/src/com/android/launcher3/LauncherModel.java -+++ b/src/com/android/launcher3/LauncherModel.java -@@ -28,7 +28,6 @@ import android.content.Context; - import android.content.Intent; - import android.content.Intent.ShortcutIconResource; - import android.content.IntentFilter; --import android.content.SharedPreferences; - import android.content.pm.PackageManager; - import android.content.pm.ProviderInfo; - import android.content.pm.ResolveInfo; -@@ -65,9 +64,6 @@ import com.android.launcher3.util.ManagedProfileHeuristic; - import com.android.launcher3.util.Thunk; - import cyanogenmod.providers.CMSettings; - --import com.android.launcher3.settings.SettingsProvider; --import com.android.launcher3.stats.internal.service.AggregationIntentService; -- - import java.lang.ref.WeakReference; - import java.net.URISyntaxException; - import java.security.InvalidParameterException; -@@ -1055,22 +1051,10 @@ public class LauncherModel extends BroadcastReceiver - } - - /** -- * Saves the total widget count to a shared preference -- * -- * @param context {@link Context} -- */ -- /* package */ static void saveWidgetCount(Context context) { -- int widgetCount = LauncherModel.sBgAppWidgets.size(); -- SharedPreferences prefs = context.getSharedPreferences(LauncherAppState -- .getSharedPreferencesKey(), Context.MODE_PRIVATE); -- prefs.edit().putInt(AggregationIntentService.PREF_KEY_WIDGET_COUNT, widgetCount).apply(); -- } -- -- /** - * Add an item to the database in a specified container. Sets the container, screen, cellX and - * cellY fields of the item. Also assigns an ID to the item. - */ -- public static void addItemToDatabase(final Context context, final ItemInfo item, final long container, -+ public static void addItemToDatabase(Context context, final ItemInfo item, final long container, - final long screenId, final int cellX, final int cellY) { - item.container = container; - item.cellX = cellX; -@@ -1120,7 +1104,6 @@ public class LauncherModel extends BroadcastReceiver - break; - case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: - sBgAppWidgets.add((LauncherAppWidgetInfo) item); -- saveWidgetCount(context); - break; - } - } -@@ -1173,7 +1156,7 @@ public class LauncherModel extends BroadcastReceiver - * @param context - * @param items - */ -- static void deleteItemsFromDatabase(final Context context, final ArrayList items) { -+ static void deleteItemsFromDatabase(Context context, final ArrayList items) { - final ContentResolver cr = context.getContentResolver(); - Runnable r = new Runnable() { - public void run() { -@@ -1203,7 +1186,6 @@ public class LauncherModel extends BroadcastReceiver - break; - case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: - sBgAppWidgets.remove((LauncherAppWidgetInfo) item); -- saveWidgetCount(context); - break; - } - sBgItemsIdMap.remove(item.id); -@@ -1215,22 +1197,10 @@ public class LauncherModel extends BroadcastReceiver - } - - /** -- * Saves the count of workspace pages -- * -- * @param context {@link Context} -- */ -- /* package */ static void savePageCount(Context context) { -- int pageCount = LauncherModel.sBgWorkspaceScreens.size(); -- SharedPreferences prefs = context.getSharedPreferences(LauncherAppState -- .getSharedPreferencesKey(), Context.MODE_PRIVATE); -- prefs.edit().putInt(AggregationIntentService.PREF_KEY_PAGE_COUNT, pageCount).apply(); -- } -- -- /** - * Update the order of the workspace screens in the database. The array list contains - * a list of screen ids in the order that they should appear. - */ -- public void updateWorkspaceScreenOrder(final Context context, final ArrayList screens) { -+ public void updateWorkspaceScreenOrder(Context context, final ArrayList screens) { - final ArrayList screensCopy = new ArrayList(screens); - final ContentResolver cr = context.getContentResolver(); - final Uri uri = LauncherSettings.WorkspaceScreens.CONTENT_URI; -@@ -1268,7 +1238,6 @@ public class LauncherModel extends BroadcastReceiver - synchronized (sBgLock) { - sBgWorkspaceScreens.clear(); - sBgWorkspaceScreens.addAll(screensCopy); -- savePageCount(context); - } - } - }; -diff --git a/src/com/android/launcher3/WallpaperChangedReceiver.java b/src/com/android/launcher3/WallpaperChangedReceiver.java -index 0a6a7ef..2d5612f 100644 ---- a/src/com/android/launcher3/WallpaperChangedReceiver.java -+++ b/src/com/android/launcher3/WallpaperChangedReceiver.java -@@ -20,25 +20,10 @@ import android.content.BroadcastReceiver; - import android.content.Context; - import android.content.Intent; - --import android.content.SharedPreferences; --import com.android.launcher3.stats.LauncherStats; -- - public class WallpaperChangedReceiver extends BroadcastReceiver { - public void onReceive(Context context, Intent data) { - LauncherAppState.setApplicationContext(context.getApplicationContext()); - LauncherAppState appState = LauncherAppState.getInstance(); - appState.onWallpaperChanged(); -- SharedPreferences prefs = context.getSharedPreferences(LauncherAppState -- .getSharedPreferencesKey(), Context.MODE_PRIVATE); -- boolean fromSelf = prefs.getBoolean(Launcher.LONGPRESS_CHANGE, false); -- if (fromSelf) { -- prefs.edit().putBoolean(Launcher.LONGPRESS_CHANGE, false).apply(); -- LauncherApplication.getLauncherStats().sendWallpaperChangedEvent( -- LauncherStats.ORIGIN_TREB_LONGPRESS); -- } else { -- LauncherApplication.getLauncherStats().sendWallpaperChangedEvent( -- LauncherStats.ORIGIN_CHOOSER); -- } -- - } - } -diff --git a/src/com/android/launcher3/stats/external/StatsUtil.java b/src/com/android/launcher3/stats/external/StatsUtil.java -deleted file mode 100644 -index 697df54..0000000 ---- a/src/com/android/launcher3/stats/external/StatsUtil.java -+++ /dev/null -@@ -1,117 +0,0 @@ --/* -- * Copyright (c) 2015. The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.launcher3.stats.external; -- --import android.content.ComponentName; --import android.content.Context; --import android.content.Intent; --import android.content.pm.ApplicationInfo; --import android.content.pm.PackageInfo; --import android.content.pm.PackageManager; --import android.os.Bundle; --import android.util.Log; --import com.android.launcher3.stats.util.Logger; -- --/** -- * StatsUtil -- *
-- *     Utility for interfacing with CyanogenStats
-- * 
-- */ --public class StatsUtil { -- -- // Tag and logging -- private static final String TAG = StatsUtil.class.getSimpleName(); -- -- // Constants -- private static final String KEY_TRACKING_ID = "tracking_id"; -- private static final String ANALYTIC_INTENT = "com.cyngn.stats.action.SEND_ANALYTIC_EVENT"; -- private static final String STATS_PACKAGE = "com.cyngn.stats"; -- -- /** -- * Checks if stats collection is enabled -- * -- * @param context {@link android.content.Context} -- * @return {@link java.lang.Boolean} -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public static boolean isStatsCollectionEnabled(Context context) -- throws IllegalArgumentException { -- return isStatsPackageInstalledAndSystemApp(context); -- } -- -- /** -- * Checks if the stats package is installed -- * -- * @param context {@link android.content.Context} -- * @return {@link Boolean {@link Boolean {@link Boolean {@link Boolean}}}} -- */ -- private static boolean isStatsPackageInstalledAndSystemApp(Context context) -- throws IllegalArgumentException { -- if (context == null) { -- throw new IllegalArgumentException("'context' cannot be null!"); -- } -- try { -- PackageInfo pi = context.getPackageManager().getPackageInfo(STATS_PACKAGE, 0); -- boolean isSystemApp = (pi.applicationInfo.flags & -- (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) != 0; -- return pi.applicationInfo.enabled && isSystemApp; -- } catch (PackageManager.NameNotFoundException e) { -- Log.e(TAG, "stats not found!"); -- return false; -- } -- } -- -- /** -- * Send an event to CyangenStats -- * -- * @param context {@link Context} not null -- * @param trackingBundle {@link Bundle} -- * @throws IllegalArgumentException -- */ -- public static void sendEvent(Context context, Bundle trackingBundle) -- throws IllegalArgumentException { -- if (context == null) { -- throw new IllegalArgumentException("'context' cannot be null!"); -- } -- if (trackingBundle == null) { -- throw new IllegalArgumentException("'trackingBundle' cannot be null!"); -- } -- if (!isStatsCollectionEnabled(context)) { -- Logger.logd(TAG, "Stats collection: DISABLED!"); -- return; -- } -- Logger.logd(TAG, "Stats collection: ENABLED!"); -- -- Intent newIntent = new Intent(ANALYTIC_INTENT); -- -- if (!trackingBundle.containsKey(KEY_TRACKING_ID)) { -- Logger.logd(TAG, "No tracking id in bundle"); -- return; -- } else { -- if (trackingBundle.containsKey(TrackingBundle.KEY_EVENT_CATEGORY) -- && trackingBundle.containsKey(TrackingBundle.KEY_EVENT_ACTION)) { -- Logger.logd(TAG, trackingBundle.toString()); -- newIntent.putExtras(trackingBundle); -- context.sendBroadcast(newIntent); -- } else { -- Logger.logd(TAG, "Not a valid tracking bundle"); -- } -- } -- } -- --} -diff --git a/src/com/android/launcher3/stats/external/TrackingBundle.java b/src/com/android/launcher3/stats/external/TrackingBundle.java -deleted file mode 100644 -index 6ca5d97..0000000 ---- a/src/com/android/launcher3/stats/external/TrackingBundle.java -+++ /dev/null -@@ -1,67 +0,0 @@ --/* -- * Copyright (c) 2015. The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.launcher3.stats.external; -- --import android.os.Bundle; --import android.text.TextUtils; -- --/** -- *
-- *     Extension of a {@link Bundle} to provider streamline interfaces for
-- *     the specific task of sending events
-- * 
-- * -- * @see {@link Bundle} -- */ --public class TrackingBundle { -- -- // Constants -- public static final String KEY_TRACKING_ID = "tracking_id"; -- public static final String KEY_EVENT_CATEGORY = "category"; -- public static final String KEY_EVENT_ACTION = "action"; -- public static final String KEY_METADATA_VALUE = "value"; -- public static final String KEY_METADATA_ORIGIN = "origin"; -- public static final String KEY_METADATA_PACKAGE = "package"; -- -- -- /** -- * Constructor -- * -- * @param trackingId {@link String} -- * @param category {@link String} -- * @param action {@link String} -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public static Bundle createTrackingBundle(String trackingId, String category, String action) -- throws IllegalArgumentException { -- if (TextUtils.isEmpty(trackingId)) { -- throw new IllegalArgumentException("'trackingId' cannot be null or empty!"); -- } -- if (TextUtils.isEmpty(category)) { -- throw new IllegalArgumentException("'category' cannot be null or empty!"); -- } -- if (TextUtils.isEmpty(action)) { -- throw new IllegalArgumentException("'action' cannot be null or empty!"); -- } -- Bundle bundle = new Bundle(); -- bundle.putString(KEY_EVENT_CATEGORY, category); -- bundle.putString(KEY_EVENT_ACTION, action); -- bundle.putString(KEY_TRACKING_ID, trackingId); -- return bundle; -- } -- --} -\ No newline at end of file -diff --git a/src/com/android/launcher3/stats/internal/db/DatabaseHelper.java b/src/com/android/launcher3/stats/internal/db/DatabaseHelper.java -deleted file mode 100644 -index 7ffd509..0000000 ---- a/src/com/android/launcher3/stats/internal/db/DatabaseHelper.java -+++ /dev/null -@@ -1,159 +0,0 @@ --package com.android.launcher3.stats.internal.db; -- --import android.content.ContentValues; --import android.content.Context; --import android.database.Cursor; --import android.database.sqlite.SQLiteDatabase; --import android.database.sqlite.SQLiteOpenHelper; --import com.android.launcher3.stats.internal.model.TrackingEvent; --import com.android.launcher3.stats.util.Logger; -- --import java.util.ArrayList; --import java.util.List; -- --/** -- *
-- *     Helper for accessing the database
-- * 
-- * -- * @see {@link SQLiteOpenHelper} -- */ --public class DatabaseHelper extends SQLiteOpenHelper { -- -- // Constants -- private static final String TAG = DatabaseHelper.class.getSimpleName(); -- private static final String DATABASE_NAME = "events"; -- private static final int DATABASE_VERSION = 1; -- -- // Instance -- private static DatabaseHelper sInstance = null; -- -- /** -- * Constructor -- * -- * @param context {@link Context} -- * @return {@link DatabaseHelper} -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public static DatabaseHelper createInstance(Context context) throws IllegalArgumentException { -- if (sInstance == null) { -- sInstance = new DatabaseHelper(context); -- } -- return sInstance; -- } -- -- /** -- * Constructor -- * -- * @param context {@link Context} -- */ -- public DatabaseHelper(Context context) { -- super(context, DATABASE_NAME, null, DATABASE_VERSION); -- } -- -- /** -- * Write an event to the database -- * -- * @param trackingEvent {@link TrackingEvent} -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public void writeEvent(TrackingEvent trackingEvent) -- throws IllegalArgumentException { -- if (trackingEvent == null) { -- throw new IllegalArgumentException("'trackingEvent' cannot be null!"); -- } -- Logger.logd(TAG, "Event written to database: " + trackingEvent); -- SQLiteDatabase db = getWritableDatabase(); -- ContentValues contentValues = trackingEvent.toContentValues(); -- db.insert(TrackingEventContract.EVENT_TABLE_NAME, null, contentValues); -- db.close(); -- } -- -- /** -- * Get a list of tracking events -- * -- * @param instanceId {@link Integer} -- * @return {@link List} -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public List getTrackingEventsByCategory(int instanceId, -- TrackingEvent.Category category) throws IllegalArgumentException { -- if (category == null) { -- throw new IllegalArgumentException("'category' cannot be null!"); -- } -- -- List eventList = new ArrayList(); -- -- // Get a writable database -- SQLiteDatabase db = getWritableDatabase(); -- -- // Update unclaimed items for this instance -- ContentValues contentValues = new ContentValues(); -- contentValues.put(TrackingEventContract.EVENT_COLUMN_INSTANCE, instanceId); -- String whereClause = TrackingEventContract.EVENT_COLUMN_INSTANCE + " IS NULL AND " -- + TrackingEventContract.EVENT_COLUMN_CATEGORY + " = ? "; -- String[] whereArgs = new String[] { -- category.name(), -- }; -- int cnt = db.update(TrackingEventContract.EVENT_TABLE_NAME, contentValues, whereClause, -- whereArgs); -- -- // Short circuit empty update -- if (cnt < 1) { -- return eventList; -- } -- -- // Select all tagged items -- String selection = TrackingEventContract.EVENT_COLUMN_CATEGORY + " = ? AND " -- + TrackingEventContract.EVENT_COLUMN_INSTANCE + " = ? "; -- String[] selectionArgs = new String[]{ -- category.name(), -- String.valueOf(instanceId), -- }; -- Cursor c = db.query(TrackingEventContract.EVENT_TABLE_NAME, null, selection, selectionArgs, -- null, null, null); -- -- // Build return list -- while (c != null && c.getCount() > 0 && c.moveToNext()) { -- eventList.add(new TrackingEvent(c)); -- } -- -- db.close(); -- -- return eventList; -- } -- -- /** -- * Deletes events related to the instance -- * -- * @param instanceId {@link Integer} -- * @return {@link Integer} -- */ -- public int deleteEventsByInstanceId(int instanceId) { -- SQLiteDatabase db = getWritableDatabase(); -- String whereClause = TrackingEventContract.EVENT_COLUMN_INSTANCE + " = ?"; -- String[] whereArgs = new String[]{ -- String.valueOf(instanceId), -- }; -- int cnt = db.delete(TrackingEventContract.EVENT_TABLE_NAME, whereClause, whereArgs); -- db.close(); -- return cnt; -- } -- -- @Override -- public void onCreate(SQLiteDatabase db) { -- db.execSQL(TrackingEventContract.CREATE_EVENT_TABLE); -- } -- -- @Override -- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { -- -- // [NOTE][MSB]: This will lose data, need to make sure this is handled if/when database -- // schema changes -- -- // db.execSQL("DROP TABLE IF EXISTS " + TrackingEventContract.EVENT_TABLE_NAME); -- // onCreate(db); -- -- } -- --} -diff --git a/src/com/android/launcher3/stats/internal/db/TrackingEventContract.java b/src/com/android/launcher3/stats/internal/db/TrackingEventContract.java -deleted file mode 100644 -index 481a431..0000000 ---- a/src/com/android/launcher3/stats/internal/db/TrackingEventContract.java -+++ /dev/null -@@ -1,31 +0,0 @@ --package com.android.launcher3.stats.internal.db; -- --import android.provider.BaseColumns; -- --/** -- *
-- *     Table contract definition
-- * 
-- * -- * @see {@link BaseColumns} -- */ --public class TrackingEventContract implements BaseColumns { -- -- // Constants -- public static final String EVENT_TABLE_NAME = "event"; -- -- // Columns -- public static final String EVENT_COLUMN_CATEGORY = "category"; -- public static final String EVENT_COLUMN_METADATA = "metadata"; -- public static final String EVENT_COLUMN_INSTANCE = "instance"; -- -- // SQL -- public static final String CREATE_EVENT_TABLE = "CREATE TABLE " + EVENT_TABLE_NAME -- + " ( " -- + " `" + _ID + "` INTEGER PRIMARY KEY AUTOINCREMENT, " -- + " `" + EVENT_COLUMN_CATEGORY + "` TEXT, " -- + " `" + EVENT_COLUMN_METADATA + "` TEXT, " -- + " `" + EVENT_COLUMN_INSTANCE + "` INTEGER " -- + ");"; -- --} -diff --git a/src/com/android/launcher3/stats/internal/model/CountAction.java b/src/com/android/launcher3/stats/internal/model/CountAction.java -deleted file mode 100644 -index d509d4d..0000000 ---- a/src/com/android/launcher3/stats/internal/model/CountAction.java -+++ /dev/null -@@ -1,73 +0,0 @@ --/* -- * Copyright (c) 2015. The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.launcher3.stats.internal.model; -- --import android.os.Bundle; --import android.text.TextUtils; --import com.android.launcher3.stats.external.TrackingBundle; -- --import java.util.ArrayList; --import java.util.HashMap; --import java.util.List; --import java.util.Map; -- --/** -- *
-- *     Handles the specific for sending a tracking event
-- * 
-- * -- * @see {@link ITrackingAction} -- */ --public class CountAction implements ITrackingAction { -- -- public static final String TRACKING_ACTION = "count"; -- -- @Override -- public String toString() { -- return TRACKING_ACTION; -- } -- -- @Override -- public List createTrackingBundles(String trackingId, TrackingEvent.Category category, -- List eventList) { -- -- Map> eventPackageMap = -- new HashMap>(); -- -- for (TrackingEvent event : eventList) { -- String pkg = event.getMetaData(TrackingEvent.KEY_PACKAGE); -- pkg = (TextUtils.isEmpty(pkg)) ? trackingId : pkg; -- if (!eventPackageMap.containsKey(pkg)) { -- eventPackageMap.put(pkg, new ArrayList()); -- } -- eventPackageMap.get(pkg).add(event); -- } -- -- List bundleList = new ArrayList(); -- for (Map.Entry> entry : eventPackageMap.entrySet()) { -- Bundle bundle = TrackingBundle.createTrackingBundle(trackingId, category.name(), -- TRACKING_ACTION); -- bundle.putInt(TrackingBundle.KEY_METADATA_VALUE, entry.getValue().size()); -- String pkg = entry.getKey(); -- if (!pkg.equals(trackingId)) { -- bundle.putString(TrackingBundle.KEY_METADATA_PACKAGE, pkg); -- } -- bundleList.add(bundle); -- } -- return bundleList; -- } --} -diff --git a/src/com/android/launcher3/stats/internal/model/CountOriginByPackageAction.java b/src/com/android/launcher3/stats/internal/model/CountOriginByPackageAction.java -deleted file mode 100644 -index fc04ca0..0000000 ---- a/src/com/android/launcher3/stats/internal/model/CountOriginByPackageAction.java -+++ /dev/null -@@ -1,91 +0,0 @@ --/* -- * Copyright (c) 2015. The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.launcher3.stats.internal.model; -- --import android.os.Bundle; --import android.text.TextUtils; --import com.android.launcher3.stats.external.TrackingBundle; -- --import java.util.ArrayList; --import java.util.HashMap; --import java.util.List; --import java.util.Map; -- --/** -- *
-- *     This is an action to send a count of events with common origins
-- * 
-- */ --public class CountOriginByPackageAction implements ITrackingAction { -- -- public static final String TRACKING_ACTION = "count_by_origin"; -- -- @Override -- public String toString() { -- return TRACKING_ACTION; -- } -- -- @Override -- public List createTrackingBundles(String trackingId, TrackingEvent.Category category, -- List eventList) { -- // Make an origin mapper -- Map>> originEventMap = -- new HashMap>>(); -- -- // Parse the event list and categorize by origin -- for (TrackingEvent event : eventList) { -- // We are parsing for things with origin, if no origin is set, discard it! -- if (TextUtils.isEmpty(event.getMetaData(TrackingEvent.KEY_ORIGIN))) { -- continue; -- } -- String originKey = event.getMetaData(TrackingEvent.KEY_ORIGIN); -- if (!originEventMap.containsKey(originKey)) { -- HashMap> newMap = -- new HashMap>(); -- originEventMap.put(originKey, newMap); -- } -- String packageName = event.getMetaData(TrackingEvent.KEY_PACKAGE); -- // Set a default so our iteration picks it up and just discard package metadata -- packageName = (TextUtils.isEmpty(packageName)) ? trackingId : packageName; -- if (!originEventMap.get(originKey).containsKey(packageName)) { -- originEventMap.get(originKey).put(packageName, new ArrayList()); -- } -- originEventMap.get(originKey).get(packageName).add(event); -- } -- -- // Start building result tracking bundles -- List bundleList = new ArrayList(); -- for (Map.Entry>> entry : -- originEventMap.entrySet()) { -- String origin = entry.getKey(); -- for (Map.Entry> entry2 : entry.getValue().entrySet()) { -- String pkg = entry2.getKey(); -- List events = entry2.getValue(); -- Bundle bundle = TrackingBundle.createTrackingBundle(trackingId, category.name(), -- TRACKING_ACTION); -- bundle.putString(TrackingBundle.KEY_METADATA_ORIGIN, origin); -- bundle.putInt(TrackingBundle.KEY_METADATA_VALUE, events.size()); -- if (!trackingId.equals(pkg)) { -- bundle.putString(TrackingBundle.KEY_METADATA_PACKAGE, pkg); -- } -- bundleList.add(bundle); -- } -- } -- return bundleList; -- } -- --} -diff --git a/src/com/android/launcher3/stats/internal/model/ITrackingAction.java b/src/com/android/launcher3/stats/internal/model/ITrackingAction.java -deleted file mode 100644 -index b577ed2..0000000 ---- a/src/com/android/launcher3/stats/internal/model/ITrackingAction.java -+++ /dev/null -@@ -1,45 +0,0 @@ --/* -- * Copyright (c) 2015. The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.launcher3.stats.internal.model; -- --import android.os.Bundle; -- --import java.util.List; -- --/** -- *
-- *     This is an action we want to perfrom from a report.
-- *
-- *     e.g.
-- *          1. I want to get the COUNT of widgets added
-- *          2. I want to get the origin of app launches
-- * 
-- */ --public interface ITrackingAction { -- -- /** -- * Creates a new bundle used to tracking events -- * -- * @param trackingId {@link String} -- * @param category {@link com.android.launcher3.stats.internal.model.TrackingEvent.Category} -- * @param eventList {@link List} -- * @return {@link List} -- */ -- List createTrackingBundles(String trackingId, TrackingEvent.Category category, -- List eventList); -- --} -diff --git a/src/com/android/launcher3/stats/util/Logger.java b/src/com/android/launcher3/stats/util/Logger.java -deleted file mode 100644 -index 8d73f54..0000000 ---- a/src/com/android/launcher3/stats/util/Logger.java -+++ /dev/null -@@ -1,55 +0,0 @@ --/* -- * Copyright (c) 2015. The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.launcher3.stats.util; -- --import android.os.Build; --import android.text.TextUtils; --import android.util.Log; -- --/** -- *
-- *     Metrics debug logging
-- * 
-- */ --public class Logger { -- -- private static final String TAG = "TrebuchetStats"; -- -- /** -- * Log a debug message -- * -- * @param tag {@link String} -- * @param msg {@link String } -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public static void logd(String tag, String msg) throws IllegalArgumentException { -- if (TextUtils.isEmpty(tag)) { -- throw new IllegalArgumentException("'tag' cannot be empty!"); -- } -- if (TextUtils.isEmpty(msg)) { -- throw new IllegalArgumentException("'msg' cannot be empty!"); -- } -- if (isDebugging()) { -- Log.d(TAG, tag + " [ " + msg + " ]"); -- } -- } -- -- private static boolean isDebugging() { -- return Log.isLoggable(TAG, Log.DEBUG); -- } -- --} --- -2.8.2 - - -From 2514dc636747cc8f9f13709877e152d28eeefd95 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Thu, 5 May 2016 09:48:16 -0400 -Subject: [PATCH 2/5] Nuke analytics - -Change-Id: Iced69b10508f8a5a1926ae475272982ee41ffb17 ---- - src/com/android/launcher3/Launcher.java | 3 - - src/com/android/launcher3/LauncherApplication.java | 15 -- - src/com/android/launcher3/stats/LauncherStats.java | 246 --------------------- - .../stats/internal/model/TrackingEvent.java | 206 ----------------- - .../internal/service/AggregationIntentService.java | 238 -------------------- - 5 files changed, 708 deletions(-) - delete mode 100644 src/com/android/launcher3/stats/LauncherStats.java - delete mode 100644 src/com/android/launcher3/stats/internal/model/TrackingEvent.java - delete mode 100644 src/com/android/launcher3/stats/internal/service/AggregationIntentService.java - -diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java -index 37f3931..f5744dd 100644 ---- a/src/com/android/launcher3/Launcher.java -+++ b/src/com/android/launcher3/Launcher.java -@@ -5297,9 +5297,6 @@ public class Launcher extends Activity - - AnimationDrawable frameAnimation = (AnimationDrawable) mAnimatedArrow.getBackground(); - frameAnimation.start(); -- -- LauncherApplication.getLauncherStats().sendSettingsOpenedEvent( -- LauncherStats.ORIGIN_TREB_LONGPRESS); - } - - @Override -diff --git a/src/com/android/launcher3/LauncherApplication.java b/src/com/android/launcher3/LauncherApplication.java -index 4bbcec0..a921128 100644 ---- a/src/com/android/launcher3/LauncherApplication.java -+++ b/src/com/android/launcher3/LauncherApplication.java -@@ -18,27 +18,12 @@ package com.android.launcher3; - - import android.app.Application; - --import com.android.launcher3.stats.LauncherStats; --import com.android.launcher3.stats.internal.service.AggregationIntentService; - - public class LauncherApplication extends Application { - -- private static LauncherStats sLauncherStats = null; -- -- /** -- * Get the reference handle for LauncherStats commands -- * -- * @return {@link LauncherStats} -- */ -- public static LauncherStats getLauncherStats() { -- return sLauncherStats; -- } -- - @Override - public void onCreate() { - super.onCreate(); -- sLauncherStats = LauncherStats.getInstance(this); -- AggregationIntentService.scheduleService(this); - } - - } -diff --git a/src/com/android/launcher3/stats/LauncherStats.java b/src/com/android/launcher3/stats/LauncherStats.java -deleted file mode 100644 -index 5e8cb83..0000000 ---- a/src/com/android/launcher3/stats/LauncherStats.java -+++ /dev/null -@@ -1,246 +0,0 @@ --/* -- * Copyright (c) 2015. The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.launcher3.stats; -- --import android.content.Context; --import android.os.Handler; --import android.os.HandlerThread; --import android.os.Message; --import android.text.TextUtils; --import android.util.Log; --import com.android.launcher3.stats.internal.db.DatabaseHelper; --import com.android.launcher3.stats.internal.model.TrackingEvent; -- --/** -- *
-- *     Utility class made specifically for Launcher related events
-- * 
-- */ --public class LauncherStats { -- -- // Constants -- private static final String TAG = LauncherStats.class.getSimpleName(); -- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); -- private static final int MSG_STORE_EVENT = 1000; -- public static final String SETTINGS_PACKAGE_NAME = "com.android.settings"; -- public static final String ORIGIN_HOMESCREEN = "homescreen"; -- public static final String ORIGIN_APPDRAWER = "appdrawer"; -- public static final String ORIGIN_TREB_LONGPRESS = "trebuchet_longpress"; -- public static final String ORIGIN_CHOOSER = "theme_chooser"; -- public static final String ORIGIN_SETTINGS = "settings"; -- public static final String ORIGIN_DRAG_DROP = "drag_drop"; -- public static final String ORIGIN_FOLDER = "folder"; -- -- private static void log(String msg) throws IllegalArgumentException { -- if (TextUtils.isEmpty(msg)) { -- throw new IllegalArgumentException("'msg' cannot be null or empty!"); -- } -- if (DEBUG) { -- Log.d(TAG, msg); -- } -- } -- -- private static void loge(String msg) throws IllegalArgumentException { -- if (TextUtils.isEmpty(msg)) { -- throw new IllegalArgumentException("'msg' cannot be null or empty!"); -- } -- Log.e(TAG, msg); -- } -- -- /** -- *
--     *     This is a thread responsible for writing events to a database
--     * 
-- * -- * @see {@link HandlerThread} -- */ -- private static class WriteHandlerThread extends HandlerThread { -- public WriteHandlerThread() { -- super(WriteHandlerThread.class.getSimpleName()); -- } -- } -- -- /** -- *
--     *     Handler for issuing db writes
--     * 
-- * -- * @see {@link Handler} -- */ -- private static class WriteHandler extends Handler { -- -- public WriteHandler() { -- super(sHandlerThread.getLooper()); -- } -- -- @Override -- public void handleMessage(Message msg) { -- log("Handling message: " + msg.what); -- switch (msg.what) { -- case MSG_STORE_EVENT: -- handleStoreEvent((TrackingEvent) msg.obj); -- break; -- default: -- super.handleMessage(msg); -- } -- } -- } -- -- // Instance -- private static LauncherStats sInstance = null; -- -- // Members -- private static WriteHandlerThread sHandlerThread; -- private static WriteHandler sWriteHandler; -- private static DatabaseHelper sDatabaseHelper; -- -- /** -- * Send a message to the handler to store event data -- * -- * @param trackingEvent {@link TrackingEvent} -- */ -- protected void sendStoreEventMessage(TrackingEvent trackingEvent) { -- log("Sending tracking event to handler: " + trackingEvent); -- Message msg = new Message(); -- msg.what = MSG_STORE_EVENT; -- msg.obj = trackingEvent; -- sWriteHandler.sendMessage(msg); -- } -- -- /** -- * Handle the storing work -- * -- * @param trackingEvent {@link TrackingEvent} -- */ -- private static void handleStoreEvent(TrackingEvent trackingEvent) { -- log("Handling store event: " + trackingEvent); -- if (trackingEvent != null) { -- sDatabaseHelper.writeEvent(trackingEvent); -- } else { -- loge("Tracking event was null!"); -- } -- } -- -- /** -- * Used only for overlay extensions -- */ -- protected LauncherStats() { } -- -- /** -- * Constructor -- * -- * @param context {@link Context} not null! -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- private LauncherStats(Context context) throws IllegalArgumentException { -- if (context == null) { -- throw new IllegalArgumentException("'context' cannot be null!"); -- } -- sDatabaseHelper = new DatabaseHelper(context); -- sHandlerThread = new WriteHandlerThread(); -- sHandlerThread.start(); -- sWriteHandler = new WriteHandler(); -- } -- -- /** -- * Gets a singleton instance of the stats utility -- * -- * @param context {@link Context} not null! -- * @return {@link LauncherStats} -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public static LauncherStats getInstance(Context context) -- throws IllegalArgumentException { -- if (sInstance == null) { -- sInstance = new LauncherStats(context); -- } -- return sInstance; -- } -- -- /** -- * Interface for posting a new widget add event -- * -- * @param pkg {@link String} package name of widget -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public void sendWidgetAddEvent(String pkg) throws IllegalArgumentException { -- if (TextUtils.isEmpty(pkg)) { -- throw new IllegalArgumentException("'pkg' cannot be null!"); -- } -- TrackingEvent trackingEvent = new TrackingEvent(TrackingEvent.Category.WIDGET_ADD); -- trackingEvent.setMetaData(TrackingEvent.KEY_PACKAGE, pkg); -- sendStoreEventMessage(trackingEvent); -- } -- -- /** -- * Interface for posting a new widget removal event -- * -- * @param pkg {@link String} package name of widget -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public void sendWidgetRemoveEvent(String pkg) throws IllegalArgumentException { -- if (TextUtils.isEmpty(pkg)) { -- throw new IllegalArgumentException("'pkg' cannot be null!"); -- } -- TrackingEvent trackingEvent = new TrackingEvent(TrackingEvent.Category.WIDGET_REMOVE); -- trackingEvent.setMetaData(TrackingEvent.KEY_PACKAGE, pkg); -- sendStoreEventMessage(trackingEvent); -- } -- -- /** -- * Interface for posting an app launch event -- * -- * @param origin {@link String} origin of application launch -- * @param pkg {@link String} package of app launched -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public void sendAppLaunchEvent(String origin, String pkg) throws IllegalArgumentException { -- if (TextUtils.isEmpty(origin)) { -- throw new IllegalArgumentException("'origin' cannot be null!"); -- } -- if (TextUtils.isEmpty(pkg)) { -- throw new IllegalArgumentException("'pkg' cannot be null!"); -- } -- TrackingEvent trackingEvent = new TrackingEvent(TrackingEvent.Category.APP_LAUNCH); -- trackingEvent.setMetaData(TrackingEvent.KEY_ORIGIN, origin); -- trackingEvent.setMetaData(TrackingEvent.KEY_PACKAGE, pkg); -- sendStoreEventMessage(trackingEvent); -- } -- -- /** -- * Interface for sending a "settings opened" event -- * -- * @param origin {@link String} origin of the event -- */ -- public void sendSettingsOpenedEvent(String origin) { -- TrackingEvent trackingEvent = new TrackingEvent(TrackingEvent.Category.SETTINGS_OPEN); -- trackingEvent.setMetaData(TrackingEvent.KEY_ORIGIN, origin); -- sendStoreEventMessage(trackingEvent); -- } -- -- /** -- * Interface for sending a "wallpaper changed" event -- * -- * @param origin {@link String} origin of the event -- */ -- public void sendWallpaperChangedEvent(String origin) { -- TrackingEvent trackingEvent = new TrackingEvent(TrackingEvent.Category.WALLPAPER_CHANGE); -- trackingEvent.setMetaData(TrackingEvent.KEY_ORIGIN, origin); -- sendStoreEventMessage(trackingEvent); -- } -- --} -diff --git a/src/com/android/launcher3/stats/internal/model/TrackingEvent.java b/src/com/android/launcher3/stats/internal/model/TrackingEvent.java -deleted file mode 100644 -index 44aaeb3..0000000 ---- a/src/com/android/launcher3/stats/internal/model/TrackingEvent.java -+++ /dev/null -@@ -1,206 +0,0 @@ --/* -- * Copyright (c) 2015. The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.launcher3.stats.internal.model; -- --import android.content.ContentValues; --import android.database.Cursor; --import android.os.Bundle; --import android.text.TextUtils; --import android.util.Log; --import com.android.launcher3.stats.external.TrackingBundle; --import com.android.launcher3.stats.internal.db.TrackingEventContract; --import com.android.launcher3.stats.util.Logger; -- --import java.util.HashMap; --import java.util.Map; --import java.util.Set; -- --/** -- *
-- *     Model of an event to track
-- * 
-- */ --public class TrackingEvent { -- -- // Constants -- private static final String TAG = TrackingEvent.class.getSimpleName(); -- -- // Members -- private Category mCategory; -- private final Map mMetaData = new HashMap(); -- -- public enum Category { -- APP_LAUNCH, -- WIDGET_ADD, -- WIDGET_REMOVE, -- SETTINGS_OPEN, -- WALLPAPER_CHANGE, -- HOMESCREEN_PAGE, -- WIDGET, -- REMOTE_FOLDER -- } -- -- public static final String KEY_ORIGIN = TrackingBundle.KEY_METADATA_ORIGIN; -- public static final String KEY_VALUE = TrackingBundle.KEY_METADATA_VALUE; -- public static final String KEY_PACKAGE = TrackingBundle.KEY_METADATA_PACKAGE; -- public static final String KEY_ACTION = TrackingBundle.KEY_EVENT_ACTION; -- -- /** -- * Constructor -- * -- * @param category {@link TrackingEvent.Category} -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public TrackingEvent(Category category) throws IllegalArgumentException { -- if (category == null) { -- throw new IllegalArgumentException("'category' cannot be null or empty!"); -- } -- mCategory = category; -- } -- -- /** -- * Constructor -- * -- * @param cursor {@link Cursor} -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public TrackingEvent(Cursor cursor) throws IllegalArgumentException { -- if (cursor == null) { -- throw new IllegalArgumentException("'cursor' cannot be null!"); -- } -- mCategory = Category.valueOf(cursor.getString(cursor.getColumnIndex( -- TrackingEventContract.EVENT_COLUMN_CATEGORY))); -- String metadata = cursor.getString(cursor.getColumnIndex( -- TrackingEventContract.EVENT_COLUMN_METADATA)); -- if (!TextUtils.isEmpty(metadata)) { -- String[] parts = metadata.split(","); -- for (String part : parts) { -- try { -- String key = part.split("=")[0]; -- String val = part.split("=")[1]; -- mMetaData.put(key, val); -- } catch (IndexOutOfBoundsException e) { -- Log.w(TAG, e.getMessage(), e); -- } -- } -- } -- } -- -- /** -- * Get the category -- * -- * @return {@link TrackingEvent.Category} -- */ -- public Category getCategory() { -- return mCategory; -- } -- -- /** -- * Get the set of meta data keys -- * -- * @return {@link Set} -- */ -- public Set getMetaDataKeySet() { -- return mMetaData.keySet(); -- } -- -- /** -- * Set some meta data -- * -- * @param key {@link String} -- * @param value {@link String} -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public void setMetaData(String key, String value) throws IllegalArgumentException { -- if (TextUtils.isEmpty(key)) { -- throw new IllegalArgumentException("'key' cannot be null or empty!"); -- } -- if (TextUtils.isEmpty(value)) { -- throw new IllegalArgumentException("'value' cannot be null or empty!"); -- } -- mMetaData.put(key, value); -- } -- -- /** -- * Get some meta data value -- * -- * @param key {@link String} -- * @return {@link String} -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public String getMetaData(String key) throws IllegalArgumentException { -- if (TextUtils.isEmpty(key)) { -- throw new IllegalArgumentException("'key' cannot be null or empty!"); -- } -- if (mMetaData.containsKey(key)) { -- return mMetaData.get(key); -- } -- return null; -- } -- -- /** -- * Remove some meta data -- * -- * @param key {@link String} -- * @return {@link String} or null -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public String removeMetaData(String key) throws IllegalArgumentException { -- if (TextUtils.isEmpty(key)) { -- throw new IllegalArgumentException("'key' cannot be null or empty!"); -- } -- if (mMetaData.containsKey(key)) { -- return mMetaData.remove(key); -- } -- return null; -- } -- -- /** -- * Converts this object into content values for use with sqlite -- * -- * @return {@link ContentValues} -- */ -- public ContentValues toContentValues() { -- ContentValues contentValues = new ContentValues(); -- contentValues.put(TrackingEventContract.EVENT_COLUMN_CATEGORY, mCategory.name()); -- StringBuilder sb = new StringBuilder(); -- for (String key : mMetaData.keySet()) { -- sb.append(key).append("=").append(mMetaData.get(key)).append(","); -- } -- if (sb.length() > 0) { -- String metadata = sb.toString(); -- metadata = metadata.substring(0, metadata.length() - 1); -- Logger.logd(TAG, "MetaData: " + metadata); -- contentValues.put(TrackingEventContract.EVENT_COLUMN_METADATA, metadata); -- } -- return contentValues; -- } -- -- /** -- * Convert this object into a tracking bundle -- * -- * @param trackingId {@link String} -- * @param action {@link ITrackingAction} -- * @return {@link Bundle} -- */ -- public Bundle toTrackingBundle(String trackingId, ITrackingAction action) { -- Bundle bundle = TrackingBundle.createTrackingBundle(trackingId, mCategory.name(), -- action.toString()); -- return bundle; -- } -- --} -diff --git a/src/com/android/launcher3/stats/internal/service/AggregationIntentService.java b/src/com/android/launcher3/stats/internal/service/AggregationIntentService.java -deleted file mode 100644 -index b32d79b..0000000 ---- a/src/com/android/launcher3/stats/internal/service/AggregationIntentService.java -+++ /dev/null -@@ -1,238 +0,0 @@ --/* -- * Copyright (c) 2015. The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.launcher3.stats.internal.service; -- --import android.app.AlarmManager; --import android.app.IntentService; --import android.app.PendingIntent; --import android.content.ComponentName; --import android.content.Context; --import android.content.Intent; --import android.content.IntentFilter; --import android.content.SharedPreferences; --import android.content.pm.PackageManager; --import android.os.Bundle; --import android.preference.PreferenceManager; --import android.util.Log; -- --import com.android.launcher3.LauncherAppState; --import com.android.launcher3.stats.external.StatsUtil; --import com.android.launcher3.stats.external.TrackingBundle; --import com.android.launcher3.stats.internal.db.DatabaseHelper; --import com.android.launcher3.stats.internal.model.CountAction; --import com.android.launcher3.stats.internal.model.CountOriginByPackageAction; --import com.android.launcher3.stats.internal.model.ITrackingAction; --import com.android.launcher3.stats.internal.model.RemoteFolderAction; --import com.android.launcher3.stats.internal.model.TrackingEvent; --import com.android.launcher3.stats.util.Logger; -- --import java.util.ArrayList; --import java.util.List; -- --/** -- *
-- *     Service that starts on a timer and handles aggregating events and sending them to
-- *     CyanogenStats
-- * 
-- * -- * @see {@link IntentService} -- */ --public class AggregationIntentService extends IntentService { -- -- // Constants -- private static final String TAG = AggregationIntentService.class.getSimpleName(); -- private static final String TRACKING_ID = "com.cyanogenmod.trebuchet"; -- public static final String ACTION_AGGREGATE_AND_TRACK = -- "com.cyanogenmod.trebuchet.AGGREGATE_AND_TRACK"; -- private static final List TRACKED_ACTIONS = new ArrayList() { -- { -- add(new CountAction()); -- add(new CountOriginByPackageAction()); -- } -- }; -- private static final int INVALID_COUNT = -1; -- private static final String KEY_LAST_TIME_RAN = "last_time_stats_ran"; -- public static final String PREF_KEY_PAGE_COUNT = "page_count"; -- public static final String PREF_KEY_WIDGET_COUNT = "widget_count"; -- -- // Members -- private DatabaseHelper mDatabaseHelper = null; -- private int mInstanceId = -1; -- private SharedPreferences mPrefs = null; -- -- /** -- * Creates an IntentService. Invoked by your subclass's constructor. -- */ -- public AggregationIntentService() { -- super(AggregationIntentService.class.getSimpleName()); -- } -- -- @Override -- protected void onHandleIntent(Intent intent) { -- if (!isTrebuchetDefaultLauncher()) { -- // Cancel repeating schedule -- unscheduleService(); -- // don't return b/c we still want to upload whatever metrics are left. -- } -- String action = intent.getAction(); -- if (ACTION_AGGREGATE_AND_TRACK.equals(action)) { -- mPrefs = getSharedPreferences(LauncherAppState.getSharedPreferencesKey(), -- Context.MODE_PRIVATE); -- mPrefs.edit().putLong(KEY_LAST_TIME_RAN, System.currentTimeMillis()).apply(); -- mInstanceId = (int) System.currentTimeMillis(); -- mDatabaseHelper = DatabaseHelper.createInstance(this); -- performAggregation(); -- deleteTrackingEventsForInstance(); -- handleNonEventMetrics(); -- } -- } -- -- private void performAggregation() { -- -- // Iterate available categories -- for (TrackingEvent.Category category : TrackingEvent.Category.values()) { -- -- // Fetch the events from the database based on the category -- List eventList = -- mDatabaseHelper.getTrackingEventsByCategory(mInstanceId, category); -- -- Logger.logd(TAG, "Event list size: " + eventList.size()); -- // Short circuit if no events for the category -- if (eventList.size() < 1) { -- continue; -- } -- -- // Now crunch the data into actionable events for the server. -- // Remote Folder data will process itself separately. -- if (category == TrackingEvent.Category.REMOTE_FOLDER) { -- performTrackingCall(new RemoteFolderAction(), category, eventList); -- } else { -- for (ITrackingAction action : TRACKED_ACTIONS) { -- performTrackingCall(action, category, eventList); -- } -- } -- } -- } -- -- private void deleteTrackingEventsForInstance() { -- mDatabaseHelper.deleteEventsByInstanceId(mInstanceId); -- } -- -- /** -- * These are metrics that are not event based and need a snapshot every INTERVAL -- */ -- private void handleNonEventMetrics() { -- sendPageCountStats(); -- sendWidgetCountStats(); -- -- } -- -- private void sendPageCountStats() { -- int pageCount = mPrefs.getInt(PREF_KEY_PAGE_COUNT, INVALID_COUNT); -- if (pageCount == INVALID_COUNT) { -- return; -- } -- Bundle bundle = TrackingBundle -- .createTrackingBundle(TRACKING_ID, TrackingEvent.Category.HOMESCREEN_PAGE.name(), -- "count"); -- bundle.putString(TrackingEvent.KEY_VALUE, String.valueOf(pageCount)); -- StatsUtil.sendEvent(this, bundle); -- } -- -- private void sendWidgetCountStats() { -- int widgetCount = mPrefs.getInt(PREF_KEY_WIDGET_COUNT, INVALID_COUNT); -- if (widgetCount == INVALID_COUNT) { -- return; -- } -- Bundle bundle = TrackingBundle -- .createTrackingBundle(TRACKING_ID, TrackingEvent.Category.WIDGET.name(), "count"); -- bundle.putString(TrackingEvent.KEY_VALUE, String.valueOf(widgetCount)); -- StatsUtil.sendEvent(this, bundle); -- } -- -- private void performTrackingCall(ITrackingAction action, TrackingEvent.Category category, -- List eventList) -- throws IllegalArgumentException { -- try { -- for (Bundle bundle : action.createTrackingBundles(TRACKING_ID, category, eventList)) { -- StatsUtil.sendEvent(this, bundle); -- } -- } catch (NullPointerException e) { -- Log.e(TAG, "NPE fetching bundle list!", e); -- } catch (IllegalArgumentException e) { -- Log.e(TAG, "Illegal argument!", e); -- } -- } -- -- private void unscheduleService() { -- Intent intent = new Intent(this, AggregationIntentService.class); -- intent.setAction(ACTION_AGGREGATE_AND_TRACK); -- PendingIntent pi = PendingIntent.getService(this, 0, intent, -- PendingIntent.FLAG_UPDATE_CURRENT); -- AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); -- alarmManager.cancel(pi); -- } -- -- private boolean isTrebuchetDefaultLauncher() { -- final IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN); -- filter.addCategory(Intent.CATEGORY_HOME); -- -- List filters = new ArrayList(); -- filters.add(filter); -- -- final String myPackageName = getPackageName(); -- List activities = new ArrayList(); -- final PackageManager packageManager = getPackageManager(); -- -- // You can use name of your package here as third argument -- packageManager.getPreferredActivities(filters, activities, null); -- -- for (ComponentName activity : activities) { -- if (myPackageName.equals(activity.getPackageName())) { -- Logger.logd(TAG, "Trebuchet IS default launcher!"); -- return true; -- } -- } -- Logger.logd(TAG, "Trebuchet IS NOT default launcher!"); -- return false; -- } -- -- private static final long ALARM_INTERVAL = 86400000; // 1 day -- -- /** -- * Schedule an alarm service, will cancel existing -- * -- * @param context {@link Context} -- * @throws IllegalArgumentException {@link IllegalArgumentException} -- */ -- public static void scheduleService(Context context) throws IllegalArgumentException { -- if (context == null) { -- throw new IllegalArgumentException("'context' cannot be null!"); -- } -- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); -- long lastTimeRan = prefs.getLong(KEY_LAST_TIME_RAN, 0); -- Intent intent = new Intent(context, AggregationIntentService.class); -- intent.setAction(ACTION_AGGREGATE_AND_TRACK); -- PendingIntent pi = PendingIntent.getService(context, 0, intent, -- PendingIntent.FLAG_UPDATE_CURRENT); -- AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); -- alarmManager.cancel(pi); -- alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, lastTimeRan + ALARM_INTERVAL, -- ALARM_INTERVAL, pi); -- } -- --} --- -2.8.2 - - -From 3a182fd5cd65ca8ee85fddd458cbe32c562a58eb Mon Sep 17 00:00:00 2001 -From: Tad -Date: Thu, 5 May 2016 10:05:20 -0400 -Subject: [PATCH 3/5] Nuke remotefolder - -Change-Id: Ie56aa15051c66a3957c9dfd3b2b20639e27512cc ---- - RemoteFolder/Android-prebuilt-libs.mk | 1 - - RemoteFolder/Android.mk | 1 - - .../com/android/launcher3/RemoteFolderManager.java | 151 --------------------- - .../stats/internal/model/RemoteFolderAction.java | 30 ---- - res/layout/user_folder.xml | 4 - - res/values/preferences_defaults.xml | 2 - - src/com/android/launcher3/FolderInfo.java | 20 --- - src/com/android/launcher3/Launcher.java | 37 +---- - src/com/android/launcher3/LauncherModel.java | 7 +- - .../list/SettingsPinnedHeaderAdapter.java | 26 ---- - .../launcher3/settings/SettingsProvider.java | 2 - - 11 files changed, 7 insertions(+), 274 deletions(-) - delete mode 100644 RemoteFolder/Android-prebuilt-libs.mk - delete mode 100644 RemoteFolder/Android.mk - delete mode 100644 RemoteFolder/src/com/android/launcher3/RemoteFolderManager.java - delete mode 100644 RemoteFolder/src/com/android/launcher3/stats/internal/model/RemoteFolderAction.java - -diff --git a/RemoteFolder/Android-prebuilt-libs.mk b/RemoteFolder/Android-prebuilt-libs.mk -deleted file mode 100644 -index 65357a8..0000000 ---- a/RemoteFolder/Android-prebuilt-libs.mk -+++ /dev/null -@@ -1 +0,0 @@ --# Empty file needed to mirror lib makefile in overlay -\ No newline at end of file -diff --git a/RemoteFolder/Android.mk b/RemoteFolder/Android.mk -deleted file mode 100644 -index 2a74413..0000000 ---- a/RemoteFolder/Android.mk -+++ /dev/null -@@ -1 +0,0 @@ --LOCAL_SRC_FILES += $(call all-java-files-under, RemoteFolder/src) -diff --git a/RemoteFolder/src/com/android/launcher3/RemoteFolderManager.java b/RemoteFolder/src/com/android/launcher3/RemoteFolderManager.java -deleted file mode 100644 -index 142a4d1..0000000 ---- a/RemoteFolder/src/com/android/launcher3/RemoteFolderManager.java -+++ /dev/null -@@ -1,151 +0,0 @@ --package com.android.launcher3; -- --import android.content.Context; --import android.graphics.drawable.Drawable; --import android.os.Bundle; --import android.view.View; --import android.view.ViewGroup; --import com.android.launcher3.allapps.AllAppsGridAdapter; --import com.android.launcher3.allapps.AlphabeticalAppsList; -- --import java.util.ArrayList; --import java.util.List; -- --/** -- * Manages adding and removing the remote folder from the workspace. -- */ --public class RemoteFolderManager { -- -- public RemoteFolderManager(final Launcher launcher) { } -- -- /** -- * Called when launcher receives a non-initial {@link Launcher#onCreate(Bundle)} call. -- * @param launcher new launcher activity. -- */ -- public void onRecreateLauncher(final Launcher launcher) { } -- -- /** -- * Called when Launcher's views are loaded and ready. -- */ -- public void onSetupViews() { } -- -- /** -- * Create a remote folder view. -- * @param icon folder icon view on the workspace. -- * @return a view for the remote folder. -- */ -- public Folder createRemoteFolder(final FolderIcon icon, ViewGroup root) { return null; } -- -- /** -- * Get a drawable for the supplied item in the folder icon preview. -- * @param items list of views in the folder. -- * @param position index of icon to retreive. -- * @return an icon to draw in the folder preview. -- */ -- public Drawable getFolderIconDrawable(final ArrayList items, -- final int position) { return null; } -- -- /** -- * Called when Launcher finishes binding items from the model. -- */ -- public void bindFinished() { } -- -- /** -- * Called when a setting for remote folder is updated. -- */ -- public void onSettingChanged() { } -- -- /** -- * Called when the remote folder is dropped into the delete area on the workspace. -- */ -- public void onFolderDeleted() { } -- -- /** -- * Called when the app drawer is opened. -- */ -- public void onAppDrawerOpened() { } -- -- /** -- * Called when the app drawer is reloaded. -- */ -- public void onReloadAppDrawer() { } -- -- /** -- * Called when the app drawer is measured. -- * @param numAppsPerRow the number of apps the drawer will show in a row. -- */ -- public void onMeasureDrawer(int numAppsPerRow) { } -- -- /** -- * Called when new apps are added to launcher. -- * @param apps list of added apps. -- */ -- public void onBindAddApps(ArrayList apps) { } -- -- /** -- * Called when the info icon is clicked -- */ -- public void onInfoIconClicked() { } -- -- /** -- * Called when the grid size for launcher is updated. -- */ -- public void onGridSizeChanged() { } -- -- /** -- * Change the appearance of FolderIcon for our RemoteFolder by adding a badge -- * @param icon the FolderIcon to update -- * @return a FolderIcon with an added ImageView -- */ -- public static FolderIcon addBadgeToFolderIcon(FolderIcon icon) { -- return icon; -- } -- -- /** -- * Called when adapter items for predicted apps are updated. -- * @param items current list of built adapter items. -- * @param fastScrollInfo fast scroller info for this section. -- * @param sectionInfo info about apps in this section. -- * @param position current position of item to be built into the adapter. -- * @return the new position to start from for next adapter items. -- */ -- public int onUpdateAdapterItems(final List items, -- final AlphabeticalAppsList.FastScrollSectionInfo fastScrollInfo, -- final AlphabeticalAppsList.SectionInfo sectionInfo, -- int position) { return position; } -- -- /** -- * Called when a view holder is created for a remote app. -- * @param holder remote view holder. -- * @param viewType specific type of view holder. -- */ -- public void onCreateViewHolder(final AllAppsGridAdapter.ViewHolder holder, final int viewType) { } -- -- /** -- * Called when a view holder is bound for a remote app. -- * @param holder remote view holder. -- * @param item info for this app. -- */ -- public void onBindViewHolder(final AllAppsGridAdapter.ViewHolder holder, final AppInfo item) { } -- -- /** -- * Populate home settings list with additional values as needed. -- * @param values list of settings strings. -- * @param context application context. -- */ -- public static void onInitializeHomeSettings(final ArrayList values, -- final Context context) { } -- -- /** -- * Populate drawer settings list with additional values as needed. -- * @param values list of settings strings. -- * @param context application context. -- */ -- public static void onInitializeDrawerSettings(final ArrayList values, -- final Context context) { } -- -- /** -- * Apply icon pack when the theme changes. -- */ -- public synchronized void onThemeChanged() { } --} -diff --git a/RemoteFolder/src/com/android/launcher3/stats/internal/model/RemoteFolderAction.java b/RemoteFolder/src/com/android/launcher3/stats/internal/model/RemoteFolderAction.java -deleted file mode 100644 -index dc36332..0000000 ---- a/RemoteFolder/src/com/android/launcher3/stats/internal/model/RemoteFolderAction.java -+++ /dev/null -@@ -1,30 +0,0 @@ --/* -- * Copyright (c) 2016. The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.android.launcher3.stats.internal.model; -- --import android.os.Bundle; -- --import java.util.ArrayList; --import java.util.List; -- --public class RemoteFolderAction implements ITrackingAction { -- @Override -- public List createTrackingBundles(String trackingId, TrackingEvent.Category category, -- List eventList) { -- return new ArrayList(); -- } --} -diff --git a/res/layout/user_folder.xml b/res/layout/user_folder.xml -index 516da30..c2712ff 100644 ---- a/res/layout/user_folder.xml -+++ b/res/layout/user_folder.xml -@@ -24,10 +24,6 @@ - android:layout_margin="@dimen/folder_margin" - android:layout_gravity="bottom|center_horizontal"> - -- -- - true - true - false -- false -- false - 1 - -diff --git a/src/com/android/launcher3/FolderInfo.java b/src/com/android/launcher3/FolderInfo.java -index 7969d62..2fa3dbc 100644 ---- a/src/com/android/launcher3/FolderInfo.java -+++ b/src/com/android/launcher3/FolderInfo.java -@@ -28,7 +28,6 @@ import java.util.Arrays; - * Represents a folder containing shortcuts or apps. - */ - public class FolderInfo extends ItemInfo { -- public static final int REMOTE_SUBTYPE = 1; - - public static final int NO_FLAGS = 0x00000000; - -@@ -123,25 +122,6 @@ public class FolderInfo extends ItemInfo { - itemsChanged(); - } - -- /** -- * @return true if this info represents a remote folder, false otherwise -- */ -- public boolean isRemote() { -- return (subType & REMOTE_SUBTYPE) != 0; -- } -- -- /** -- * Set flag indicating whether this folder is remote -- * @param remote true if folder is remote, false otherwise -- */ -- public void setRemote(final boolean remote) { -- if (remote) { -- subType |= REMOTE_SUBTYPE; -- } else { -- subType &= ~REMOTE_SUBTYPE; -- } -- } -- - public void setTitle(CharSequence title) { - this.title = title; - for (int i = 0; i < listeners.size(); i++) { -diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java -index f5744dd..77f7db6 100644 ---- a/src/com/android/launcher3/Launcher.java -+++ b/src/com/android/launcher3/Launcher.java -@@ -264,8 +264,6 @@ public class Launcher extends Activity - private View mWeightWatcher; - private DynamicGridSizeFragment mDynamicGridSizeFragment; - -- protected static RemoteFolderManager sRemoteFolderManager; -- - private AppWidgetManagerCompat mAppWidgetManager; - private LauncherAppWidgetHost mAppWidgetHost; - -@@ -519,12 +517,6 @@ public class Launcher extends Activity - - mAppWidgetHost = new LauncherAppWidgetHost(this, APPWIDGET_HOST_ID); - -- if (sRemoteFolderManager == null) { -- sRemoteFolderManager = new RemoteFolderManager(this); -- } else { -- sRemoteFolderManager.onRecreateLauncher(this); -- } -- - // If we are getting an onCreate, we can actually preempt onResume and unset mPaused here, - // this also ensures that any synchronous binding below doesn't re-trigger another - // LauncherModel load. -@@ -1629,7 +1621,6 @@ public class Launcher extends Activity - mWeightWatcher.setVisibility(show ? View.VISIBLE : View.GONE); - } - -- sRemoteFolderManager.onSetupViews(); - } - - /** -@@ -1887,7 +1878,6 @@ public class Launcher extends Activity - mAppsView.addApps(addedApps); - tryAndUpdatePredictedApps(); - mAppsView.onReloadAppDrawer(); -- sRemoteFolderManager.onReloadAppDrawer(); - } - - public void reloadWidgetView() { -@@ -1945,9 +1935,6 @@ public class Launcher extends Activity - reloadLauncher(false, true); - } - -- // Must be called after reload and before settings invalidation. -- sRemoteFolderManager.onGridSizeChanged(); -- - mOverviewSettingsPanel.notifyDataSetInvalidated(); - - FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); -@@ -2154,10 +2141,6 @@ public class Launcher extends Activity - return mWorkspace; - } - -- public RemoteFolderManager getRemoteFolderManager() { -- return sRemoteFolderManager; -- } -- - public Hotseat getHotseat() { - return mHotseat; - } -@@ -3797,8 +3780,6 @@ public class Launcher extends Activity - tryAndUpdatePredictedApps(); - } - showAppsOrWidgets(State.APPS, animated, focusSearchBar); -- -- sRemoteFolderManager.onAppDrawerOpened(); - } - - /** -@@ -3918,18 +3899,13 @@ public class Launcher extends Activity - * resumed. - */ - private void tryAndUpdatePredictedApps() { -- boolean mRemoteDrawerEnabled = SettingsProvider.getBoolean(this, -- SettingsProvider.SETTINGS_UI_DRAWER_REMOTE_APPS, -- R.bool.preferences_interface_drawer_remote_apps_default); -- if (!mRemoteDrawerEnabled) { -- if (mLauncherCallbacks != null) { -- List apps = mLauncherCallbacks.getPredictedApps(); -- if (apps != null) { -- mAppsView.setPredictedAppComponents(apps); -- } -- } -+ if (mLauncherCallbacks != null) { -+ List apps = mLauncherCallbacks.getPredictedApps(); -+ if (apps != null) { -+ mAppsView.setPredictedAppComponents(apps); - } - } -+ } - - void lockAllApps() { - // TODO -@@ -4213,7 +4189,6 @@ public class Launcher extends Activity - - if (addedApps != null && mAppsView != null) { - mAppsView.addApps(addedApps); -- sRemoteFolderManager.onBindAddApps(addedApps); - } - } - -@@ -4539,8 +4514,6 @@ public class Launcher extends Activity - } - - mWorkspace.stripEmptyScreens(); -- -- sRemoteFolderManager.bindFinished(); - } - - private void sendLoadingCompleteBroadcastIfNecessary() { -diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java -index e758817..beabeaa 100644 ---- a/src/com/android/launcher3/LauncherModel.java -+++ b/src/com/android/launcher3/LauncherModel.java -@@ -2707,9 +2707,7 @@ public class LauncherModel extends BroadcastReceiver - finalItem.container = folder.container; - LauncherModel.deleteItemFromDatabase(mContext, folder); - // only replace this item back on the workspace if it's not protected -- // and not a remote folder. -- if (!mHiddenApps.contains(finalItem.intent.getComponent()) && -- !folder.isRemote()) { -+ if (!mHiddenApps.contains(finalItem.intent.getComponent())) { - LauncherModel.addOrMoveItemInDatabase(mContext, finalItem, - folder.container, folder.screenId, folder.cellX, folder.cellY); - workspaceItems.add(finalItem); -@@ -2717,8 +2715,7 @@ public class LauncherModel extends BroadcastReceiver - workspaceItems.remove(i); - folders.remove(Long.valueOf(item.id)); - -- // Remote folders are always empty on bind. -- } else if (folder.contents.size() == 0 && !folder.isRemote()) { -+ } else if (folder.contents.size() == 0) { - LauncherModel.deleteFolderContentsFromDatabase(mContext, folder); - workspaceItems.remove(i); - folders.remove(Long.valueOf(item.id)); -diff --git a/src/com/android/launcher3/list/SettingsPinnedHeaderAdapter.java b/src/com/android/launcher3/list/SettingsPinnedHeaderAdapter.java -index 1ccd2da..d1dbbf7 100644 ---- a/src/com/android/launcher3/list/SettingsPinnedHeaderAdapter.java -+++ b/src/com/android/launcher3/list/SettingsPinnedHeaderAdapter.java -@@ -125,13 +125,6 @@ public class SettingsPinnedHeaderAdapter extends PinnedHeaderListAdapter { - SettingsProvider.SETTINGS_UI_ALLOW_ROTATION, - R.bool.preferences_interface_allow_rotation); - setSettingSwitch(stateView, settingSwitch, current); -- break; -- case 5: -- current = SettingsProvider.getBoolean(mContext, -- SettingsProvider.SETTINGS_UI_HOMESCREEN_REMOTE_FOLDER, -- R.bool.preferences_interface_homescreen_remote_folder_default); -- setSettingSwitch(stateView, settingSwitch, current); -- break; - default: - hideStates(stateView, settingSwitch); - } -@@ -181,12 +174,6 @@ public class SettingsPinnedHeaderAdapter extends PinnedHeaderListAdapter { - R.bool.preferences_interface_drawer_search_default); - setSettingSwitch(stateView, settingSwitch, current); - break; -- case 6: -- current = SettingsProvider.getBoolean(mContext, -- SettingsProvider.SETTINGS_UI_DRAWER_REMOTE_APPS, -- R.bool.preferences_interface_drawer_remote_apps_default); -- setSettingSwitch(stateView, settingSwitch, current); -- break; - default: - hideStates(stateView, settingSwitch); - } -@@ -295,13 +282,6 @@ public class SettingsPinnedHeaderAdapter extends PinnedHeaderListAdapter { - key, extras); - - break; -- case 5: -- onSettingsBooleanChanged(v, -- SettingsProvider.SETTINGS_UI_HOMESCREEN_REMOTE_FOLDER, -- R.bool.preferences_interface_homescreen_remote_folder_default, -- false); -- mLauncher.getRemoteFolderManager().onSettingChanged(); -- break; - } - break; - case OverviewSettingsPanel.DRAWER_SETTINGS_POSITION: -@@ -351,12 +331,6 @@ public class SettingsPinnedHeaderAdapter extends PinnedHeaderListAdapter { - R.bool.preferences_interface_drawer_search_default, false); - mLauncher.reloadAppDrawer(); - break; -- case 6: -- onSettingsBooleanChanged(v, -- SettingsProvider.SETTINGS_UI_DRAWER_REMOTE_APPS, -- R.bool.preferences_interface_drawer_remote_apps_default, false); -- mLauncher.getRemoteFolderManager().onSettingChanged(); -- break; - } - break; - case OverviewSettingsPanel.APP_SETTINGS_POSITION: -diff --git a/src/com/android/launcher3/settings/SettingsProvider.java b/src/com/android/launcher3/settings/SettingsProvider.java -index e809a8a..a0e18cb 100644 ---- a/src/com/android/launcher3/settings/SettingsProvider.java -+++ b/src/com/android/launcher3/settings/SettingsProvider.java -@@ -26,8 +26,6 @@ public final class SettingsProvider { - public static final String SETTINGS_UI_HOMESCREEN_SEARCH = "ui_homescreen_search"; - public static final String SETTINGS_UI_HOMESCREEN_HIDE_ICON_LABELS = "ui_homescreen_general_hide_icon_labels"; - public static final String SETTINGS_UI_HOMESCREEN_SCROLLING_WALLPAPER_SCROLL = "ui_homescreen_scrolling_wallpaper_scroll"; -- public static final String SETTINGS_UI_HOMESCREEN_REMOTE_FOLDER = "ui_homescreen_remote_folder"; -- public static final String SETTINGS_UI_DRAWER_REMOTE_APPS = "ui_drawer_remote_apps"; - public static final String SETTINGS_UI_DYNAMIC_GRID_SIZE = "ui_dynamic_grid_size"; - public static final String SETTINGS_UI_HOMESCREEN_ROWS = "ui_homescreen_rows"; - public static final String SETTINGS_UI_HOMESCREEN_COLUMNS = "ui_homescreen_columns"; --- -2.8.2 - - -From 10d5ba7b72cf47eec82dee12ba8cf0b8b77ae8b5 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Thu, 5 May 2016 10:17:17 -0400 -Subject: [PATCH 4/5] Nuke remote folder some more - -Change-Id: I55d1c6a995fe009b91eb94d3c961389a78da768c ---- - Android.mk | 6 ---- - src/com/android/launcher3/DeleteDropTarget.java | 9 ++---- - src/com/android/launcher3/FolderIcon.java | 34 ++++------------------ - .../android/launcher3/OverviewSettingsPanel.java | 6 ---- - .../android/launcher3/ThemeChangedReceiver.java | 4 --- - .../launcher3/allapps/AllAppsContainerView.java | 2 -- - .../launcher3/allapps/AllAppsGridAdapter.java | 10 ------- - .../launcher3/allapps/AlphabeticalAppsList.java | 5 ---- - 8 files changed, 8 insertions(+), 68 deletions(-) - -diff --git a/Android.mk b/Android.mk -index 9915fc5..3ef528d 100644 ---- a/Android.mk -+++ b/Android.mk -@@ -61,16 +61,10 @@ LOCAL_OVERRIDES_PACKAGES := Launcher3 - LOCAL_PROGUARD_FLAG_FILES := proguard.flags - LOCAL_PROGUARD_ENABLED := full - --REMOTE_FOLDER_UPDATER ?= $(LOCAL_PATH)/RemoteFolder --include $(REMOTE_FOLDER_UPDATER)/Android.mk -- - include $(BUILD_PACKAGE) - - include $(CLEAR_VARS) - --REMOTE_FOLDER_UPDATER ?= $(LOCAL_PATH)/RemoteFolder --include $(REMOTE_FOLDER_UPDATER)/Android-prebuilt-libs.mk -- - include $(BUILD_MULTI_PREBUILT) - - include $(CLEAR_VARS) -diff --git a/src/com/android/launcher3/DeleteDropTarget.java b/src/com/android/launcher3/DeleteDropTarget.java -index f51a43a..a442442 100644 ---- a/src/com/android/launcher3/DeleteDropTarget.java -+++ b/src/com/android/launcher3/DeleteDropTarget.java -@@ -75,13 +75,8 @@ public class DeleteDropTarget extends ButtonDropTarget { - } else if (item instanceof FolderInfo) { - FolderInfo folder = (FolderInfo) item; - -- // Remote folder should not really be deleted. Let the manager handle it. -- if (folder.isRemote()) { -- launcher.getRemoteFolderManager().onFolderDeleted(); -- } else { -- launcher.removeFolder(folder); -- LauncherModel.deleteFolderContentsFromDatabase(launcher, folder); -- } -+ launcher.removeFolder(folder); -+ LauncherModel.deleteFolderContentsFromDatabase(launcher, folder); - } else if (item instanceof LauncherAppWidgetInfo) { - final LauncherAppWidgetInfo widget = (LauncherAppWidgetInfo) item; - -diff --git a/src/com/android/launcher3/FolderIcon.java b/src/com/android/launcher3/FolderIcon.java -index 356c275..c43f120 100644 ---- a/src/com/android/launcher3/FolderIcon.java -+++ b/src/com/android/launcher3/FolderIcon.java -@@ -174,16 +174,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { - icon.mLauncher = launcher; - icon.setContentDescription(String.format(launcher.getString(R.string.folder_name_format), - folderInfo.title)); -- Folder folder; -- if (folderInfo.isRemote()) { -- folder = launcher.getRemoteFolderManager().createRemoteFolder(icon, launcher.getDragLayer()); -- if (folder == null) { -- LauncherModel.deleteItemFromDatabase(launcher, folderInfo); -- return null; -- } -- } else { -- folder = Folder.fromXml(launcher, launcher.getDragLayer()); -- } -+ Folder folder = Folder.fromXml(launcher, launcher.getDragLayer()); - folder.setDragController(launcher.getDragController()); - folder.setFolderIcon(icon); - folder.bind(folderInfo); -@@ -245,11 +236,6 @@ public class FolderIcon extends FrameLayout implements FolderListener { - } - } - -- // Create an overlay badge if this FolderIcon is for a RemoteFolder -- if (folderInfo.isRemote()) { -- icon = RemoteFolderManager.addBadgeToFolderIcon(icon); -- } -- - return icon; - } - -@@ -391,14 +377,10 @@ public class FolderIcon extends FrameLayout implements FolderListener { - } - - private boolean willAcceptItem(ItemInfo item) { -- if (mInfo.isRemote()) return false; -- - final int itemType = item.itemType; - - boolean hidden = false; - if (item instanceof FolderInfo){ -- if (((FolderInfo) item).isRemote()) return false; -- - hidden = ((FolderInfo) item).hidden; - } - return ((itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION || -@@ -704,7 +686,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { - super.dispatchDraw(canvas); - - if (mFolder == null) return; -- if (mFolder.getItemCount() == 0 && !mAnimating && !mInfo.isRemote()) return; -+ if (mFolder.getItemCount() == 0 && !mAnimating) return; - - ArrayList items = mFolder.getItemsInReadingOrder(); - Drawable d; -@@ -740,14 +722,10 @@ public class FolderIcon extends FrameLayout implements FolderListener { - if (!mAnimating) { - for (int i = 0; i < NUM_ITEMS_IN_PREVIEW; i++) { - d = null; -- if (mInfo.isRemote()) { -- d = mLauncher.getRemoteFolderManager().getFolderIconDrawable(items, i); -- } else if (i < items.size()) { -- v = (TextView) items.get(i); -- if (!mHiddenItems.contains(v.getTag())) { -- d = getTopDrawable(v); -- } -- } -+ v = (TextView) items.get(i); -+ if (!mHiddenItems.contains(v.getTag())) { -+ d = getTopDrawable(v); -+ } - - if (d != null) { - mParams = computePreviewItemDrawingParams(i, mParams); -diff --git a/src/com/android/launcher3/OverviewSettingsPanel.java b/src/com/android/launcher3/OverviewSettingsPanel.java -index 8f1b435..3fbb65a 100644 ---- a/src/com/android/launcher3/OverviewSettingsPanel.java -+++ b/src/com/android/launcher3/OverviewSettingsPanel.java -@@ -75,9 +75,6 @@ public class OverviewSettingsPanel { - res.getString(R.string.grid_size_text), - res.getString(R.string.allow_rotation_title)})); - -- // Add additional external settings. -- RemoteFolderManager.onInitializeHomeSettings(values, mLauncher); -- - String[] valuesArr = new String[values.size()]; - values.toArray(valuesArr); - return valuesArr; -@@ -93,9 +90,6 @@ public class OverviewSettingsPanel { - res.getString(R.string.fast_scroller_type), - res.getString(R.string.home_screen_search_text)})); - -- // Add additional external settings. -- RemoteFolderManager.onInitializeDrawerSettings(values, mLauncher); -- - String[] valuesArr = new String[values.size()]; - values.toArray(valuesArr); - return valuesArr; -diff --git a/src/com/android/launcher3/ThemeChangedReceiver.java b/src/com/android/launcher3/ThemeChangedReceiver.java -index 3f4f3af..6dac0be 100644 ---- a/src/com/android/launcher3/ThemeChangedReceiver.java -+++ b/src/com/android/launcher3/ThemeChangedReceiver.java -@@ -43,10 +43,6 @@ public class ThemeChangedReceiver extends BroadcastReceiver { - app.recreateWidgetPreviewDb(); - app.getIconCache().flush(); - app.getModel().forceReload(); -- -- if (Launcher.sRemoteFolderManager != null) { -- Launcher.sRemoteFolderManager.onThemeChanged(); -- } - } - } - -diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java -index 989148f..23f4f70 100644 ---- a/src/com/android/launcher3/allapps/AllAppsContainerView.java -+++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java -@@ -377,8 +377,6 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc - - boolean mergeSections = mSectionStrategy == SECTION_STRATEGY_GRID; - mApps.setNumAppsPerRow(mNumAppsPerRow, mNumPredictedAppsPerRow, mergeSections); -- -- mLauncher.getRemoteFolderManager().onMeasureDrawer(mNumPredictedAppsPerRow); - } - - super.onMeasure(widthMeasureSpec, heightMeasureSpec); -diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java -index 6431825..56ce38d 100644 ---- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java -+++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java -@@ -42,7 +42,6 @@ import com.android.launcher3.BaseRecyclerViewFastScrollBar.FastScrollFocusable; - import com.android.launcher3.BubbleTextView; - import com.android.launcher3.Launcher; - import com.android.launcher3.R; --import com.android.launcher3.RemoteFolderManager; - import com.android.launcher3.Utilities; - import com.android.launcher3.settings.SettingsProvider; - import com.android.launcher3.util.Thunk; -@@ -329,8 +328,6 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter -Date: Thu, 5 May 2016 15:20:44 -0400 -Subject: [PATCH 5/5] Fix build breakage - -Change-Id: I82319301b59da5d04fe3c0b68791999f04717579 ---- - src/com/android/launcher3/LauncherModel.java | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java -index beabeaa..c6d5e21 100644 ---- a/src/com/android/launcher3/LauncherModel.java -+++ b/src/com/android/launcher3/LauncherModel.java -@@ -47,7 +47,7 @@ import android.text.TextUtils; - import android.util.Log; - import android.util.LongSparseArray; - import android.util.Pair; -- -+import com.android.launcher3.settings.SettingsProvider; - import com.android.launcher3.compat.AppWidgetManagerCompat; - import com.android.launcher3.compat.LauncherActivityInfoCompat; - import com.android.launcher3.compat.LauncherAppsCompat; --- -2.8.2 - diff --git a/Patches/CyanogenMod-13.0/android_packages_services_Telephony/PreferredNetworkType_Fix.patch b/Patches/CyanogenMod-13.0/android_packages_services_Telephony/PreferredNetworkType_Fix.patch deleted file mode 100644 index 503f21d0..00000000 --- a/Patches/CyanogenMod-13.0/android_packages_services_Telephony/PreferredNetworkType_Fix.patch +++ /dev/null @@ -1,89 +0,0 @@ -From b003454ab2ece62db5ae6c621aa6ec5c93c5c0b5 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sun, 20 Mar 2016 14:40:17 -0400 -Subject: [PATCH] Actually fix profiles failing to set users preferred network - type - -Change-Id: I325430f971b35b07d6852f3647fa60ec935a5b52 ---- - src/com/android/phone/PhoneToggler.java | 38 +++++++++++++++++++++++++++++---- - 1 file changed, 34 insertions(+), 4 deletions(-) - -diff --git a/src/com/android/phone/PhoneToggler.java b/src/com/android/phone/PhoneToggler.java -index 90234f9..a38dd68 100644 ---- a/src/com/android/phone/PhoneToggler.java -+++ b/src/com/android/phone/PhoneToggler.java -@@ -21,6 +21,8 @@ import android.content.Context; - import android.content.Intent; - import android.telephony.SubscriptionManager; - import android.util.Log; -+import android.os.Handler; -+import android.os.Message; - - import com.android.internal.telephony.Phone; - import com.android.internal.telephony.PhoneFactory; -@@ -42,6 +44,15 @@ public class PhoneToggler extends BroadcastReceiver { - private static final String LOG_TAG = "PhoneToggler"; - private static final boolean DBG = false; - -+ private MyHandler mHandler; -+ -+ private MyHandler getHandler() { -+ if (mHandler == null) { -+ mHandler = new MyHandler(); -+ } -+ return mHandler; -+ } -+ - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); -@@ -51,8 +62,7 @@ public class PhoneToggler extends BroadcastReceiver { - SubscriptionController subCtrl = SubscriptionController.getInstance(); - - int networkMode = intent.getExtras().getInt(EXTRA_NETWORK_MODE, -1); -- int subId = intent.getExtras().getInt(EXTRA_SUB_ID, -- SubscriptionManager.getDefaultDataSubId()); -+ int subId = SubscriptionManager.getDefaultDataSubId(); - - // since the caller must be a system app, it's assumed that they have already - // chosen a valid network mode for this subId, so only basic validation is done -@@ -60,8 +70,9 @@ public class PhoneToggler extends BroadcastReceiver { - if (DBG) Log.d(LOG_TAG, "Changing network mode to " + networkMode); - subCtrl.setUserNwMode(subId, networkMode); - try { -- PhoneFactory.getPhone(SubscriptionManager.getPhoneId(subId)) -- .setPreferredNetworkType(networkMode, null); -+ Phone phone = PhoneFactory.getPhone(SubscriptionManager.getPhoneId(subId)); -+ Message response = getHandler().obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE); -+ phone.setPreferredNetworkType(networkMode, response); - } catch (Throwable t) { - Log.d(LOG_TAG, "error setting preferred network", t); - } -@@ -117,4 +128,23 @@ public class PhoneToggler extends BroadcastReceiver { - } - } - -+ private class MyHandler extends Handler { -+ private static final int MESSAGE_SET_PREFERRED_NETWORK_TYPE = 0; -+ -+ @Override -+ public void handleMessage(Message msg) { -+ switch (msg.what) { -+ case MESSAGE_SET_PREFERRED_NETWORK_TYPE: -+ handleSetPreferredNetworkTypeResponse(msg); -+ break; -+ } -+ } -+ -+ private void handleSetPreferredNetworkTypeResponse(Message msg) { -+ if (DBG) { -+ Log.e(LOG_TAG, "handleSetPreferredNetworkTypeResponse() called"); -+ } -+ } -+ } -+ - } --- -2.7.4 - diff --git a/Patches/CyanogenMod-13.0/android_system_core/MAC_Rand.patch b/Patches/CyanogenMod-13.0/android_system_core/MAC_Rand.patch deleted file mode 100644 index a7cbbbde..00000000 --- a/Patches/CyanogenMod-13.0/android_system_core/MAC_Rand.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 978d511140a6391ef82243fe6500e207697b9b41 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Mon, 18 Apr 2016 08:54:51 -0400 -Subject: [PATCH] Implement MAC Randomization - -Change-Id: I3276bfb674801572ab9ff286fb1b036253eaf409 ---- - rootdir/init.rc | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/rootdir/init.rc b/rootdir/init.rc -index 78adacc..8cff499 100644 ---- a/rootdir/init.rc -+++ b/rootdir/init.rc -@@ -559,6 +559,8 @@ on property:sys.sysctl.extra_free_kbytes=* - on property:sys.sysctl.tcp_def_init_rwnd=* - write /proc/sys/net/ipv4/tcp_default_init_rwnd ${sys.sysctl.tcp_def_init_rwnd} - -+on property:persist.privacy.randomize_mac=* -+ write /proc/sys/net/core/randomize_mac ${persist.privacy.randomize_mac} - - ## Daemon processes to be run by init. - ## --- -2.8.0 - diff --git a/Patches/CyanogenMod-13.0/android_vendor_cm/DNSCrypt.patch b/Patches/CyanogenMod-13.0/android_vendor_cm/DNSCrypt.patch deleted file mode 100644 index 3b5aa181..00000000 --- a/Patches/CyanogenMod-13.0/android_vendor_cm/DNSCrypt.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 28fec2a2867a8a0fea386038bc366e630ac1ed4e Mon Sep 17 00:00:00 2001 -From: Martin Brabham -Date: Thu, 7 May 2015 11:22:13 -0700 -Subject: [PATCH] DNSCrypt - Add sepolicy for dnscrypt proxy to run - Add - service entry to init.local.rc - -Change-Id: Id2ee42738c10a7a024fcf25edc3a6cbe2fe0bbc8 ---- - prebuilt/common/etc/init.local.rc | 6 ++++++ - sepolicy/dnscryptproxy.te | 8 ++++++++ - 2 files changed, 14 insertions(+) - create mode 100644 sepolicy/dnscryptproxy.te - -diff --git a/prebuilt/common/etc/init.local.rc b/prebuilt/common/etc/init.local.rc -index 1f66b77..8042c29 100644 ---- a/prebuilt/common/etc/init.local.rc -+++ b/prebuilt/common/etc/init.local.rc -@@ -128,6 +128,12 @@ on boot - # Persistent properties (only created if persist exists) - mkdir /persist/properties 0770 system system - -+# For now default this to opendns until we modify the code to read a system propery -+# dnscrypt proxy -+service dnscrypt-proxy /system/xbin/dnscrypt-proxy -+ class main -+ disabled -+ - # sysinit (/system/etc/init.d) - service sysinit /system/bin/sysinit - user root -diff --git a/sepolicy/dnscryptproxy.te b/sepolicy/dnscryptproxy.te -new file mode 100644 -index 0000000..3f143c9 ---- /dev/null -+++ b/sepolicy/dnscryptproxy.te -@@ -0,0 +1,8 @@ -+allow init self:udp_socket { bind setopt write read }; -+allow init port:udp_socket name_bind; -+allow init node:udp_socket node_bind; -+ -+allow init self:tcp_socket { create ioctl setopt bind listen }; -+allow init port:tcp_socket name_bind; -+allow init node:tcp_socket node_bind; -+ --- -2.7.4 - diff --git a/Patches/CyanogenMod-13.0/android_vendor_cm/Remove_Analytics.patch b/Patches/CyanogenMod-13.0/android_vendor_cm/Remove_Analytics.patch deleted file mode 100644 index f98f3100..00000000 --- a/Patches/CyanogenMod-13.0/android_vendor_cm/Remove_Analytics.patch +++ /dev/null @@ -1,25 +0,0 @@ -From a32d4f29bb1ed433326eebe496df7c3b5483e192 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Wed, 24 Feb 2016 09:05:13 -0500 -Subject: [PATCH] Remove analytics - -Change-Id: I44ad1e35e086eb6287ea1065a1d77474ca6c295a ---- - .../vendor/cmsdk/packages/CMSettingsProvider/res/values/defaults.xml | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/overlay/common/vendor/cmsdk/packages/CMSettingsProvider/res/values/defaults.xml b/overlay/common/vendor/cmsdk/packages/CMSettingsProvider/res/values/defaults.xml -index eec242d..58fb154 100644 ---- a/overlay/common/vendor/cmsdk/packages/CMSettingsProvider/res/values/defaults.xml -+++ b/overlay/common/vendor/cmsdk/packages/CMSettingsProvider/res/values/defaults.xml -@@ -24,7 +24,4 @@ - 1 - - -- -- -- true - --- -2.7.1 - diff --git a/Patches/CyanogenMod-13.0/android_vendor_cm/Wallpaper.patch b/Patches/CyanogenMod-13.0/android_vendor_cm/Wallpaper.patch deleted file mode 100644 index f1a1c387..00000000 --- a/Patches/CyanogenMod-13.0/android_vendor_cm/Wallpaper.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 3698eabdc4057a2e977ffb4db60bffb1cea062fa Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sun, 19 Jun 2016 15:13:50 -0400 -Subject: [PATCH] Bring back the custom wallpaper picker [5/5] - -Change-Id: Icb52423c63206927b45b72f1d1785c3574f2c0d6 ---- - config/common.mk | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/config/common.mk b/config/common.mk -index 75191ba..c2a15ae 100644 ---- a/config/common.mk -+++ b/config/common.mk -@@ -154,7 +154,8 @@ PRODUCT_PACKAGES += \ - CMSettingsProvider \ - ExactCalculator \ - LiveLockScreenService \ -- WeatherProvider -+ WeatherProvider \ -+ WallpaperPicker - - # Exchange support - PRODUCT_PACKAGES += \ --- -2.7.4 - diff --git a/Patches/CyanogenMod-13.0/cm_platform_sdk/Radio-2.patch b/Patches/CyanogenMod-13.0/cm_platform_sdk/Radio-2.patch deleted file mode 100644 index ec6cd82e..00000000 --- a/Patches/CyanogenMod-13.0/cm_platform_sdk/Radio-2.patch +++ /dev/null @@ -1,33 +0,0 @@ -From aceee7358fa39da71425c6db7fe6c984c846128a Mon Sep 17 00:00:00 2001 -From: Tad -Date: Mon, 8 Aug 2016 16:04:56 -0400 -Subject: [PATCH] Add radio tile (2/2) - -Change-Id: Iacc6ed7ce384d955ff2494e55c318e054b7ff206 ---- - sdk/src/java/org/cyanogenmod/internal/util/QSConstants.java | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/sdk/src/java/org/cyanogenmod/internal/util/QSConstants.java b/sdk/src/java/org/cyanogenmod/internal/util/QSConstants.java -index c5e62eb..a2b5269 100644 ---- a/sdk/src/java/org/cyanogenmod/internal/util/QSConstants.java -+++ b/sdk/src/java/org/cyanogenmod/internal/util/QSConstants.java -@@ -48,6 +48,7 @@ public class QSConstants { - public static final String TILE_SCREEN_TIMEOUT = "screen_timeout"; - public static final String TILE_USB_TETHER = "usb_tether"; - public static final String TILE_HEADS_UP = "heads_up"; -+ public static final String TILE_RADIO_POWER = "radio_power"; - public static final String TILE_AMBIENT_DISPLAY = "ambient_display"; - public static final String TILE_SYNC = "sync"; - public static final String TILE_BATTERY_SAVER = "battery_saver"; -@@ -96,6 +97,7 @@ public class QSConstants { - STATIC_TILES_AVAILABLE.add(TILE_SCREEN_TIMEOUT); - STATIC_TILES_AVAILABLE.add(TILE_USB_TETHER); - STATIC_TILES_AVAILABLE.add(TILE_HEADS_UP); -+ STATIC_TILES_AVAILABLE.add(TILE_RADIO_POWER); - STATIC_TILES_AVAILABLE.add(TILE_AMBIENT_DISPLAY); - STATIC_TILES_AVAILABLE.add(TILE_SYNC); - STATIC_TILES_AVAILABLE.add(TILE_BATTERY_SAVER); --- -2.7.4 - diff --git a/Patches/CyanogenMod-13.0/cm_platform_sdk/Remove_Analytics.patch b/Patches/CyanogenMod-13.0/cm_platform_sdk/Remove_Analytics.patch deleted file mode 100644 index e1957582..00000000 --- a/Patches/CyanogenMod-13.0/cm_platform_sdk/Remove_Analytics.patch +++ /dev/null @@ -1,135 +0,0 @@ -From b90e97cdb84542a787f1361633a662f57852d9d3 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sat, 2 Apr 2016 11:31:27 -0400 -Subject: [PATCH] Remove analytics - -Change-Id: I4aa2a69fd7eb68d9ab8a4ba426532944901f2322 ---- - host/migration/example-cm12.1-settings.txt | 3 +-- - host/migration/src/CMSettings.java | 7 ------- - packages/CMSettingsProvider/res/values/defaults.xml | 3 --- - .../src/org/cyanogenmod/cmsettings/CMDatabaseHelper.java | 3 --- - .../cmsettings/tests/CMSettingsProviderDefaultsTest.java | 3 --- - sdk/src/java/cyanogenmod/providers/CMSettings.java | 13 ------------- - 6 files changed, 1 insertion(+), 31 deletions(-) - -diff --git a/host/migration/example-cm12.1-settings.txt b/host/migration/example-cm12.1-settings.txt -index 7534be3..9f454aa 100644 ---- a/host/migration/example-cm12.1-settings.txt -+++ b/host/migration/example-cm12.1-settings.txt -@@ -64,7 +64,6 @@ Row: 60 name=swap_volume_keys_on_rotation, type=s, value=0, type=s - Row: 61 name=status_bar_brightness_control, type=s, value=0, type=s - Row: 62 name=status_bar_notif_count, type=s, value=1, type=s - Row: 63 name=dev_force_show_navbar, type=s, value=0, type=s --Row: 64 name=stats_collection, type=s, value=1, type=s - Row: 65 name=advanced_mode, type=s, value=1, type=s - Row: 66 name=default_theme_package, type=s, value=com.cyngn.hexo, type=s - Row: 67 name=default_theme_components, type=s, value=mods_overlays|mods_status_bar|mods_navigation_bar|mods_icons|mods_homescreen|mods_fonts, type=s -@@ -118,4 +117,4 @@ Row: 114 name=ring_home_button_behavior, type=s, value=1, type=s - Row: 115 name=show_alarm_icon, type=s, value=1, type=s - Row: 116 name=status_bar_am_pm, type=s, value=1, type=s - Row: 117 name=status_bar_quick_qs_pulldown, type=s, value=1, type=s --Row: 118 name=t9_search_input_locale, type=s, value=enUS, type=s -\ No newline at end of file -+Row: 118 name=t9_search_input_locale, type=s, value=enUS, type=s -diff --git a/host/migration/src/CMSettings.java b/host/migration/src/CMSettings.java -index 0d57b0d..b4f5be9 100644 ---- a/host/migration/src/CMSettings.java -+++ b/host/migration/src/CMSettings.java -@@ -833,12 +833,6 @@ public final class CMSettings { - public static final String QS_USE_MAIN_TILES = "sysui_qs_main_tiles"; - - /** -- * Global stats collection -- * @hide -- */ -- public static final String STATS_COLLECTION = "stats_collection"; -- -- /** - * Boolean value whether to link ringtone and notification volume - * - * @hide -@@ -1021,7 +1015,6 @@ public final class CMSettings { - CMSettings.Secure.DEV_FORCE_SHOW_NAVBAR, - CMSettings.Secure.KEYBOARD_BRIGHTNESS, - CMSettings.Secure.POWER_MENU_ACTIONS, -- CMSettings.Secure.STATS_COLLECTION, - CMSettings.Secure.QS_SHOW_BRIGHTNESS_SLIDER, - CMSettings.Secure.QS_TILES, - CMSettings.Secure.QS_USE_MAIN_TILES, -diff --git a/packages/CMSettingsProvider/res/values/defaults.xml b/packages/CMSettingsProvider/res/values/defaults.xml -index 5d590ad..916bb10 100644 ---- a/packages/CMSettingsProvider/res/values/defaults.xml -+++ b/packages/CMSettingsProvider/res/values/defaults.xml -@@ -48,9 +48,6 @@ - Comma-delimited, quick settings tiles. See QSConstants.java for a list of all available tiles - wifi,bt,cell,airplane,rotation,flashlight,location,cast,hotspot,live_display --> - -- -- false -- - -- GSM|WCDMA -+ GPRS|EDGE|UMTS|HSDPA|HSUPA|HSPA|LTE|HSPAP|GSM|WCDMA - - - true -diff --git a/overlay/packages/services/Telephony/res/values/config.xml b/overlay/packages/services/Telephony/res/values/config.xml -index af352a4..22c65ea 100644 ---- a/overlay/packages/services/Telephony/res/values/config.xml -+++ b/overlay/packages/services/Telephony/res/values/config.xml -@@ -21,4 +21,7 @@ - are routed through the android.media.AudioManager class (true) or through - the com.android.internal.telephony.Phone interface (false). --> - true -+ -+ -+ true - --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_device_lge_mako/0002-TWRP.patch b/Patches/CyanogenMod-14.1/android_device_lge_mako/0002-TWRP.patch deleted file mode 100644 index cab814d0..00000000 --- a/Patches/CyanogenMod-14.1/android_device_lge_mako/0002-TWRP.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 65d11ac33d0a3da260668c6dd18e5d28fefb272e Mon Sep 17 00:00:00 2001 -From: Tad -Date: Wed, 23 Nov 2016 18:38:32 -0500 -Subject: [PATCH] TWRP Support - -Change-Id: Ib0a86923a40e21cddc1199141c70a7c776de3d1e ---- - BoardConfig.mk | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) - -diff --git a/BoardConfig.mk b/BoardConfig.mk -index ec97bae..ecf5253 100644 ---- a/BoardConfig.mk -+++ b/BoardConfig.mk -@@ -132,3 +132,19 @@ MALLOC_IMPL := dlmalloc - BOARD_HAS_NO_SELECT_BUTTON := true - - BOARD_HARDWARE_CLASS := device/lge/mako/cmhw/ -+ -+#TWRP -+TW_THEME := portrait_hdpi -+RECOVERY_SDCARD_ON_DATA := true -+RECOVERY_GRAPHICS_USE_LINELENGTH := true -+BOARD_HAS_NO_REAL_SDCARD := true -+PRODUCT_BUILD_PROP_OVERRIDES += BUILD_UTC_DATE=0 -+TW_INCLUDE_JB_CRYPTO := true -+TW_FLASH_FROM_STORAGE := true -+TW_NO_USB_STORAGE := true -+TW_MAX_BRIGHTNESS := 255 -+TW_BRIGHTNESS_PATH := /sys/class/leds/lcd-backlight/brightness -+TW_INTERNAL_STORAGE_PATH := "/data/media" -+TW_INTERNAL_STORAGE_MOUNT_POINT := "data" -+TW_EXTERNAL_STORAGE_PATH := "/usb-otg" -+TW_EXTERNAL_STORAGE_MOUNT_POINT := "usb-otg" --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_device_motorola_clark/0001-Build_Fix.patch b/Patches/CyanogenMod-14.1/android_device_motorola_clark/0001-Build_Fix.patch deleted file mode 100644 index 3a900f4f..00000000 --- a/Patches/CyanogenMod-14.1/android_device_motorola_clark/0001-Build_Fix.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 6fdf689f450e577750212ac5f0d3ffce50965651 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Thu, 17 Nov 2016 15:39:23 -0500 -Subject: [PATCH] Fix build failure - -Change-Id: I94282a3df32daa97992c17476b0eb3e8f21e2499 ---- - overlay/frameworks/base/core/res/res/values/config.xml | 6 ------ - 1 file changed, 6 deletions(-) - -diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml -index e0358e2..0b0549b 100644 ---- a/overlay/frameworks/base/core/res/res/values/config.xml -+++ b/overlay/frameworks/base/core/res/res/values/config.xml -@@ -421,9 +421,6 @@ - format is UMTS|LTE|... --> - GSM | WCDMA | LTE | CDMA | EVDO - -- -- com.qualcomm.location -- - - "lte:2097152,4194304,8388608,262144,524288,1048576" - "lte_ca:2097152,4194304,8388608,262144,524288,1048576" -@@ -442,9 +439,6 @@ - rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max --> - 524288,2097152,4194304,262144,524288,1048576 - -- -- true -- - - true - --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_device_motorola_clark/0002-Remove_Sprint_DM.patch b/Patches/CyanogenMod-14.1/android_device_motorola_clark/0002-Remove_Sprint_DM.patch deleted file mode 100644 index 908983e7..00000000 --- a/Patches/CyanogenMod-14.1/android_device_motorola_clark/0002-Remove_Sprint_DM.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 9e22fca4c687d84ba84428788d55b356069e29c7 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Thu, 17 Nov 2016 15:40:05 -0500 -Subject: [PATCH] Remove Sprint DM - -Change-Id: I94d44bb4753cac72106f7c49997d69a0ec5556bd ---- - proprietary-files.txt | 15 --------------- - 1 file changed, 15 deletions(-) - -diff --git a/proprietary-files.txt b/proprietary-files.txt -index f97d3e6..3675ce9 100644 ---- a/proprietary-files.txt -+++ b/proprietary-files.txt -@@ -290,21 +290,6 @@ lib64/libqti-iop.so - vendor/lib/libqti-iop-client.so - vendor/lib64/libqti-iop-client.so - --# DM/Sprint ---app/DMConfigUpdateLight/DMConfigUpdateLight.apk ---app/HiddenMenuLight/HiddenMenuLight.apk --lib/libdmengine.so --lib/libdmjavaplugin.so ---priv-app/CQATest/CQATest.apk ---priv-app/ConnMO/ConnMO.apk ---priv-app/DCMO/DCMO.apk ---priv-app/DMService/DMService.apk --lib/libdmengine.so:priv-app/DMService/lib/arm/libdmengine.so --lib/libdmjavaplugin.so:priv-app/DMService/lib/arm/libdmjavaplugin.so ---priv-app/DiagMon/DiagMon.apk ---priv-app/LifetimeData/LifetimeData.apk ---priv-app/SprintDM/SprintDM.apk -- - # DRM - # TZBSP - bin/qseecomd --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_device_motorola_clark/0003-Enable_Dex_Preopt.patch b/Patches/CyanogenMod-14.1/android_device_motorola_clark/0003-Enable_Dex_Preopt.patch deleted file mode 100644 index dcf151be..00000000 --- a/Patches/CyanogenMod-14.1/android_device_motorola_clark/0003-Enable_Dex_Preopt.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 44299d2cda16b60235cc682988d59dd3dcd823a5 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Fri, 18 Nov 2016 02:21:47 -0500 -Subject: [PATCH] Enable Dex-preopt - -Change-Id: I7634ebac4af7a977cff21a6be83bbda11dc943f4 ---- - BoardConfig.mk | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/BoardConfig.mk b/BoardConfig.mk -index 40022b4..250bbb5 100644 ---- a/BoardConfig.mk -+++ b/BoardConfig.mk -@@ -182,3 +182,6 @@ TARGET_USES_WCNSS_MAC_ADDR_REV := true - WIFI_DRIVER_FW_PATH_STA := "sta" - WIFI_DRIVER_FW_PATH_AP := "ap" - WPA_SUPPLICANT_VERSION := VER_0_8_X -+ -+#Dex pre-optimization -+WITH_DEXPREOPT := true --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_device_motorola_clark/0004-Remove_Widevine.patch b/Patches/CyanogenMod-14.1/android_device_motorola_clark/0004-Remove_Widevine.patch deleted file mode 100644 index fa4a3290..00000000 --- a/Patches/CyanogenMod-14.1/android_device_motorola_clark/0004-Remove_Widevine.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 755b36c6f5e6feaac20112e0819299f63be3553d Mon Sep 17 00:00:00 2001 -From: Tad -Date: Fri, 18 Nov 2016 18:22:00 -0500 -Subject: [PATCH] Remove Widevine and disable DRM server - -Change-Id: I24d3ba704d00d85747d851a9a497dd577ad03b5f ---- - Android.mk | 10 +--------- - proprietary-files.txt | 2 -- - system.prop | 2 +- - 3 files changed, 2 insertions(+), 12 deletions(-) - -diff --git a/Android.mk b/Android.mk -index a69917c..693cba1 100644 ---- a/Android.mk -+++ b/Android.mk -@@ -52,14 +52,6 @@ $(IMS_SYMLINKS): $(LOCAL_INSTALLED_MODULE) - @rm -rf $@ - $(hide) ln -sf /system/vendor/lib64/$(notdir $@) $@ - --WV_IMAGES := widevine.b00 widevine.b01 widevine.b02 widevine.b03 widevine.mdt --WV_SYMLINKS := $(addprefix $(TARGET_OUT_ETC)/firmware/,$(notdir $(WV_IMAGES))) --$(WV_SYMLINKS): $(LOCAL_INSTALLED_MODULE) -- @echo "Widevine firmware link: $@" -- @mkdir -p $(dir $@) -- @rm -rf $@ -- $(hide) ln -sf /firmware/image/$(notdir $@) $@ -- - FIRMWARE_FILES := firmware fsg - FIRMWARE_SYMLINKS := $(addprefix $(TARGET_OUT)/rfs/msm/mpss/readonly/,$(notdir $(FIRMWARE_FILES))) - $(FIRMWARE_SYMLINKS): $(LOCAL_INSTALLED_MODULE) -@@ -68,6 +60,6 @@ $(FIRMWARE_SYMLINKS): $(LOCAL_INSTALLED_MODULE) - @rm -rf $@ - $(hide) ln -sf /$(notdir $@) $@ - --ALL_DEFAULT_INSTALLED_MODULES += $(PERSIST_WCNSS) $(WCNSS_CFG_INI) $(IMS_SYMLINKS) $(WV_SYMLINKS) $(FIRMWARE_SYMLINKS) -+ALL_DEFAULT_INSTALLED_MODULES += $(PERSIST_WCNSS) $(WCNSS_CFG_INI) $(IMS_SYMLINKS) $(FIRMWARE_SYMLINKS) - - endif -diff --git a/proprietary-files.txt b/proprietary-files.txt -index 3675ce9..45dd63b 100644 ---- a/proprietary-files.txt -+++ b/proprietary-files.txt -@@ -293,8 +293,6 @@ vendor/lib64/libqti-iop-client.so - # DRM - # TZBSP - bin/qseecomd --etc/permissions/com.google.widevine.software.drm.xml --framework/com.google.widevine.software.drm.jar - lib/hw/keystore.qcom.so - lib64/hw/keystore.qcom.so - vendor/lib/libdrmfs.so -diff --git a/system.prop b/system.prop -index 6b1967c..4124bd4 100644 ---- a/system.prop -+++ b/system.prop -@@ -56,7 +56,7 @@ dalvik.vm.dex2oat-threads=2 - dalvik.vm.image-dex2oat-threads=4 - - # DRM --drm.service.enabled=true -+drm.service.enabled=false - - # FM - ro.fm.transmitter=false --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_device_motorola_clark/0005-TWRP.patch b/Patches/CyanogenMod-14.1/android_device_motorola_clark/0005-TWRP.patch deleted file mode 100644 index 5a9cd7a2..00000000 --- a/Patches/CyanogenMod-14.1/android_device_motorola_clark/0005-TWRP.patch +++ /dev/null @@ -1,32 +0,0 @@ -From aa91f3c0beab9dbb78041540b59558631f63e30e Mon Sep 17 00:00:00 2001 -From: Tad -Date: Mon, 28 Nov 2016 07:04:58 -0500 -Subject: [PATCH] TWRP Support - -Change-Id: I9c9caf279898f7f6cab5f2da81715e0a5440ca17 ---- - BoardConfig.mk | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/BoardConfig.mk b/BoardConfig.mk -index 250bbb5..9be8f1c 100644 ---- a/BoardConfig.mk -+++ b/BoardConfig.mk -@@ -185,3 +185,14 @@ WPA_SUPPLICANT_VERSION := VER_0_8_X - - #Dex pre-optimization - WITH_DEXPREOPT := true -+ -+# TWRP -+TW_THEME := portrait_hdpi -+DEVICE_RESOLUTION := 1440x2560 -+TW_INCLUDE_L_CRYPTO := true -+TW_TARGET_USES_QCOM_BSP := true -+TW_NEW_ION_HEAP := true -+TW_INCLUDE_CRYPTO := true -+TW_SCREEN_BLANK_ON_BOOT := true -+TARGET_RECOVERY_QCOM_RTC_FIX := true -+TARGET_RECOVERY_FSTAB = $(DEVICE_PATH)/rootdir/fstab.qcom --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_device_oneplus_bacon/0001-Remove_DRM.patch b/Patches/CyanogenMod-14.1/android_device_oneplus_bacon/0001-Remove_DRM.patch deleted file mode 100644 index 6edc112e..00000000 --- a/Patches/CyanogenMod-14.1/android_device_oneplus_bacon/0001-Remove_DRM.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 5debdc1dd573384f7a1556a6db2d6960bd7259c5 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Thu, 17 Nov 2016 16:35:14 -0500 -Subject: [PATCH] Remove Widevine - -Change-Id: I531feb804092b596af47e75530fa88b5c85f628a ---- - Android.mk | 24 ------------------------ - 1 file changed, 24 deletions(-) - -diff --git a/Android.mk b/Android.mk -index dde02c7..08fc62e 100644 ---- a/Android.mk -+++ b/Android.mk -@@ -124,30 +124,6 @@ $(MC_SYMLINKS): $(LOCAL_INSTALLED_MODULE) - - ALL_DEFAULT_INSTALLED_MODULES += $(MC_SYMLINKS) - --PLAYREADY_IMAGES := \ -- playread.b00 playread.b01 playread.b02 playread.b03 playread.mdt -- --PLAYREADY_SYMLINKS := $(addprefix $(TARGET_OUT_ETC)/firmware/,$(notdir $(PLAYREADY_IMAGES))) --$(PLAYREADY_SYMLINKS): $(LOCAL_INSTALLED_MODULE) -- @echo "Playready firmware link: $@" -- @mkdir -p $(dir $@) -- @rm -rf $@ -- $(hide) ln -sf /firmware/image/$(notdir $@) $@ -- --ALL_DEFAULT_INSTALLED_MODULES += $(PLAYREADY_SYMLINKS) -- --WV_IMAGES := \ -- widevine.b00 widevine.b01 widevine.b02 widevine.b03 widevine.mdt -- --WV_SYMLINKS := $(addprefix $(TARGET_OUT_ETC)/firmware/,$(notdir $(WV_IMAGES))) --$(WV_SYMLINKS): $(LOCAL_INSTALLED_MODULE) -- @echo "Widevine firmware link: $@" -- @mkdir -p $(dir $@) -- @rm -rf $@ -- $(hide) ln -sf /firmware/image/$(notdir $@) $@ -- --ALL_DEFAULT_INSTALLED_MODULES += $(WV_SYMLINKS) -- - # Create links for audcal data files - $(shell mkdir -p $(TARGET_OUT)/etc/firmware/wcd9320; \ - ln -sf /data/misc/audio/wcd9320_anc.bin \ --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_device_oneplus_bacon/0002-Enable_Dex_Preopt.patch b/Patches/CyanogenMod-14.1/android_device_oneplus_bacon/0002-Enable_Dex_Preopt.patch deleted file mode 100644 index dc098901..00000000 --- a/Patches/CyanogenMod-14.1/android_device_oneplus_bacon/0002-Enable_Dex_Preopt.patch +++ /dev/null @@ -1,25 +0,0 @@ -From e12aa9baa815d0279aab7756edc4e9c130f0bbff Mon Sep 17 00:00:00 2001 -From: Tad -Date: Fri, 18 Nov 2016 02:23:46 -0500 -Subject: [PATCH] Enable Dex-preopt - -Change-Id: Id0ee761ca93a2a4cab0d40959610520b193d0528 ---- - BoardConfig.mk | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/BoardConfig.mk b/BoardConfig.mk -index 35bde5d..ff476f7 100644 ---- a/BoardConfig.mk -+++ b/BoardConfig.mk -@@ -197,4 +197,7 @@ TARGET_LDPRELOAD := libNimsWrap.so - endif - endif - -+#Dex pre-optimization -+WITH_DEXPREOPT := true -+ - -include vendor/oneplus/bacon/BoardConfigVendor.mk --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_external_sqlite/0001-Secure_Delete.patch b/Patches/CyanogenMod-14.1/android_external_sqlite/0001-Secure_Delete.patch deleted file mode 100644 index b2edcd6c..00000000 --- a/Patches/CyanogenMod-14.1/android_external_sqlite/0001-Secure_Delete.patch +++ /dev/null @@ -1,27 +0,0 @@ -From d06526ec844bf89e77c518dbcd0deb331babf8dd Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sun, 18 Dec 2016 09:30:44 -0500 -Subject: [PATCH] Enable secure_delete by default - -Change-Id: Ic2604b78f57998c001df9737ab0fdec2298122c4 ---- - dist/Android.mk | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/dist/Android.mk b/dist/Android.mk -index bf277d2..8113e32 100644 ---- a/dist/Android.mk -+++ b/dist/Android.mk -@@ -27,7 +27,8 @@ minimal_sqlite_flags := \ - -DSQLITE_OMIT_BUILTIN_TEST \ - -DSQLITE_OMIT_COMPILEOPTION_DIAGS \ - -DSQLITE_OMIT_LOAD_EXTENSION \ -- -DSQLITE_DEFAULT_FILE_PERMISSIONS=0600 -+ -DSQLITE_DEFAULT_FILE_PERMISSIONS=0600 \ -+ -DSQLITE_SECURE_DELETE - - device_sqlite_flags := $(minimal_sqlite_flags) \ - -DSQLITE_ENABLE_ICU \ --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_frameworks_base/0001-Userspace_Location.patch b/Patches/CyanogenMod-14.1/android_frameworks_base/0001-Userspace_Location.patch deleted file mode 100644 index b018a5e1..00000000 --- a/Patches/CyanogenMod-14.1/android_frameworks_base/0001-Userspace_Location.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 4211c35467725729615cce8fe3cd25f0de58da2a Mon Sep 17 00:00:00 2001 -From: Tad -Date: Fri, 18 Nov 2016 12:30:43 -0500 -Subject: [PATCH] Allow location providers outside of /system - -Change-Id: I405981605aeb00a4482d7191905963fc97a5d424 ---- - services/core/java/com/android/server/ServiceWatcher.java | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/services/core/java/com/android/server/ServiceWatcher.java b/services/core/java/com/android/server/ServiceWatcher.java -index 383e25a..31ae918 100644 ---- a/services/core/java/com/android/server/ServiceWatcher.java -+++ b/services/core/java/com/android/server/ServiceWatcher.java -@@ -92,8 +92,7 @@ public class ServiceWatcher implements ServiceConnection { - String pkg = initialPackageNames.get(i); - try { - HashSet set = new HashSet(); -- Signature[] sigs = pm.getPackageInfo(pkg, PackageManager.MATCH_SYSTEM_ONLY -- | PackageManager.GET_SIGNATURES).signatures; -+ Signature[] sigs = pm.getPackageInfo(pkg, PackageManager.GET_SIGNATURES).signatures; - set.addAll(Arrays.asList(sigs)); - sigSets.add(set); - } catch (NameNotFoundException e) { --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_frameworks_base/0002-Failed_Unlock_Shutdown.patch b/Patches/CyanogenMod-14.1/android_frameworks_base/0002-Failed_Unlock_Shutdown.patch deleted file mode 100644 index 7f4c21cd..00000000 --- a/Patches/CyanogenMod-14.1/android_frameworks_base/0002-Failed_Unlock_Shutdown.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 4921beaf996a89c9a56b98f213401ceeb2a23082 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Fri, 18 Nov 2016 14:52:59 -0500 -Subject: [PATCH] Shutdown after 5 failed unlock attempts - -Change-Id: Icc23122e5a25b756872fe132cd0e93684e8bafca ---- - .../Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java | 5 +++++ - packages/SystemUI/AndroidManifest.xml | 1 + - 2 files changed, 6 insertions(+) - -diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java -index aaff265..865956f 100644 ---- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java -+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java -@@ -22,6 +22,7 @@ import android.app.admin.DevicePolicyManager; - import android.content.Context; - import android.content.DialogInterface; - import android.content.Intent; -+import android.os.PowerManager; - import android.os.UserHandle; - import android.util.AttributeSet; - import android.util.Log; -@@ -366,6 +367,10 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe - if (!enableTimesCounter && (timeoutMs > 0)) { - showTimeoutDialog(timeoutMs); - } -+ if (failedAttempts >=5) { -+ final PowerManager powerManager = mContext.getSystemService(PowerManager.class); -+ powerManager.shutdown(false, false); -+ } - } - - /** -diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml -index 2248baf..b13b0fd 100644 ---- a/packages/SystemUI/AndroidManifest.xml -+++ b/packages/SystemUI/AndroidManifest.xml -@@ -112,6 +112,7 @@ - - - -+ - - - --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_frameworks_base/0003-Signature_Spoofing.patch b/Patches/CyanogenMod-14.1/android_frameworks_base/0003-Signature_Spoofing.patch deleted file mode 100644 index 361e17bf..00000000 --- a/Patches/CyanogenMod-14.1/android_frameworks_base/0003-Signature_Spoofing.patch +++ /dev/null @@ -1,97 +0,0 @@ -From 44cda6f5e47c33e91980ae35c8bc6d88e4d3763c Mon Sep 17 00:00:00 2001 -From: Tad -Date: Thu, 24 Nov 2016 13:01:30 -0500 -Subject: [PATCH] Allow packages to spoof their signature - -Change-Id: I9acf48c7607804890d0d0fa7fe30bb36779cb40d ---- - core/res/AndroidManifest.xml | 7 +++++++ - core/res/res/values/config.xml | 2 ++ - core/res/res/values/strings.xml | 5 +++++ - .../android/server/pm/PackageManagerService.java | 23 ++++++++++++++++++++-- - 4 files changed, 35 insertions(+), 2 deletions(-) - -diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml -index b624305..43eec1f 100644 ---- a/core/res/AndroidManifest.xml -+++ b/core/res/AndroidManifest.xml -@@ -1926,6 +1926,13 @@ - android:description="@string/permdesc_getPackageSize" - android:protectionLevel="normal" /> - -+ -+ -+ - -diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml -index 4a95f6e..702e02a 100644 ---- a/core/res/res/values/config.xml -+++ b/core/res/res/values/config.xml -@@ -1383,6 +1383,8 @@ - - - com.android.location.fused -+ -+ com.google.android.gms - - - -diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml -index 345d377..26814f1 100644 ---- a/core/res/res/values/strings.xml -+++ b/core/res/res/values/strings.xml -@@ -660,6 +660,11 @@ - - - -+ -+ Spoof package signature -+ -+ Allows the app to pretend to be a different app. Malicious applications might be able to use this to access private application data. Grant this permission with caution only! -+ - - disable or modify status bar - -diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java -index d450288..9194e69 100644 ---- a/services/core/java/com/android/server/pm/PackageManagerService.java -+++ b/services/core/java/com/android/server/pm/PackageManagerService.java -@@ -3141,8 +3141,27 @@ public class PackageManagerService extends IPackageManager.Stub { - ? Collections.emptySet() : permissionsState.getPermissions(userId); - final PackageUserState state = ps.readUserState(userId); - -- return PackageParser.generatePackageInfo(p, gids, flags, -- ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId); -+ return mayFakeSignature(p, PackageParser.generatePackageInfo(p, gids, flags, -+ ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId), -+ permissions); -+ } -+ -+ private PackageInfo mayFakeSignature(PackageParser.Package p, PackageInfo pi, -+ Set permissions) { -+ try { -+ if (permissions.contains("android.permission.FAKE_PACKAGE_SIGNATURE") -+ && p.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1 -+ && p.mAppMetaData != null) { -+ String sig = p.mAppMetaData.getString("fake-signature"); -+ if (sig != null) { -+ pi.signatures = new Signature[] {new Signature(sig)}; -+ } -+ } -+ } catch (Throwable t) { -+ // We should never die because of any failures, this is system code! -+ Log.w("PackageManagerService.FAKE_PACKAGE_SIGNATURE", t); -+ } -+ return pi; - } - - @Override --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_frameworks_base/0004-Hide_Passwords.patch b/Patches/CyanogenMod-14.1/android_frameworks_base/0004-Hide_Passwords.patch deleted file mode 100644 index a59676b3..00000000 --- a/Patches/CyanogenMod-14.1/android_frameworks_base/0004-Hide_Passwords.patch +++ /dev/null @@ -1,54 +0,0 @@ -From c46d22ad7a92e72f4ba9ba3a36e8dbdb566f4a07 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sun, 18 Dec 2016 09:36:07 -0500 -Subject: [PATCH] Hide passwords by default - -Change-Id: I95e26ff6219f6209d5b9fc7ae92a453b53b0aa76 ---- - core/java/android/text/method/TextKeyListener.java | 2 +- - core/java/com/android/internal/widget/PasswordEntryKeyboardHelper.java | 2 +- - packages/Keyguard/src/com/android/keyguard/PasswordTextView.java | 2 +- - 3 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/core/java/android/text/method/TextKeyListener.java b/core/java/android/text/method/TextKeyListener.java -index 994f3d7..b2ac244 100644 ---- a/core/java/android/text/method/TextKeyListener.java -+++ b/core/java/android/text/method/TextKeyListener.java -@@ -291,7 +291,7 @@ public class TextKeyListener extends BaseKeyListener implements SpanWatcher { - boolean cap = System.getInt(resolver, System.TEXT_AUTO_CAPS, 1) > 0; - boolean text = System.getInt(resolver, System.TEXT_AUTO_REPLACE, 1) > 0; - boolean period = System.getInt(resolver, System.TEXT_AUTO_PUNCTUATE, 1) > 0; -- boolean pw = System.getInt(resolver, System.TEXT_SHOW_PASSWORD, 1) > 0; -+ boolean pw = System.getInt(resolver, System.TEXT_SHOW_PASSWORD, 0) > 0; - - mPrefs = (cap ? AUTO_CAP : 0) | - (text ? AUTO_TEXT : 0) | -diff --git a/core/java/com/android/internal/widget/PasswordEntryKeyboardHelper.java b/core/java/com/android/internal/widget/PasswordEntryKeyboardHelper.java -index b2c9dc5..dc5b7f9 100644 ---- a/core/java/com/android/internal/widget/PasswordEntryKeyboardHelper.java -+++ b/core/java/com/android/internal/widget/PasswordEntryKeyboardHelper.java -@@ -159,7 +159,7 @@ public class PasswordEntryKeyboardHelper implements OnKeyboardActionListener { - mKeyboardState = KEYBOARD_STATE_NORMAL; - final boolean visiblePassword = Settings.System.getInt( - mContext.getContentResolver(), -- Settings.System.TEXT_SHOW_PASSWORD, 1) != 0; -+ Settings.System.TEXT_SHOW_PASSWORD, 0) != 0; - final boolean enablePreview = false; // TODO: grab from configuration - mKeyboardView.setPreviewEnabled(visiblePassword && enablePreview); - break; -diff --git a/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java b/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java -index 48737f9..3f4c381 100644 ---- a/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java -+++ b/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java -@@ -134,7 +134,7 @@ public class PasswordTextView extends View { - mDrawPaint.setColor(0xffffffff); - mDrawPaint.setTypeface(Typeface.create("sans-serif-light", 0)); - mShowPassword = Settings.System.getInt(mContext.getContentResolver(), -- Settings.System.TEXT_SHOW_PASSWORD, 1) == 1; -+ Settings.System.TEXT_SHOW_PASSWORD, 0) == 1; - mAppearInterpolator = AnimationUtils.loadInterpolator(mContext, - android.R.interpolator.linear_out_slow_in); - mDisappearInterpolator = AnimationUtils.loadInterpolator(mContext, --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_frameworks_base/0005-Harden_Sig_Spoofing.patch b/Patches/CyanogenMod-14.1/android_frameworks_base/0005-Harden_Sig_Spoofing.patch deleted file mode 100644 index 8d573695..00000000 --- a/Patches/CyanogenMod-14.1/android_frameworks_base/0005-Harden_Sig_Spoofing.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 6c9c966622adbfe0ad92ed90d90f93a782c99f02 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sun, 18 Dec 2016 19:10:20 -0500 -Subject: [PATCH] Harden signature spoofing - -Change-Id: I31e2a20923fff883c87fa6425408971657d3d7b3 ---- - core/res/AndroidManifest.xml | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml -index 486999b..182acbf 100644 ---- a/core/res/AndroidManifest.xml -+++ b/core/res/AndroidManifest.xml -@@ -1937,7 +1937,7 @@ - - - --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_kernel_lge_bullhead/0001-OverUnderClock.patch b/Patches/CyanogenMod-14.1/android_kernel_lge_bullhead/0001-OverUnderClock.patch deleted file mode 100644 index 40914170..00000000 --- a/Patches/CyanogenMod-14.1/android_kernel_lge_bullhead/0001-OverUnderClock.patch +++ /dev/null @@ -1,484 +0,0 @@ -From 28793d3021e480bba68fe8b76d9848a6b8aee5d5 Mon Sep 17 00:00:00 2001 -From: flar2 -Date: Tue, 3 Nov 2015 21:21:34 -0500 -Subject: [PATCH 1/3] msm8992 initial overclocking - ---- - arch/arm/boot/dts/qcom/msm8992-regulator.dtsi | 30 ++++++++++++-------- - arch/arm/boot/dts/qcom/msm8992.dtsi | 40 +++++++++++++++++++------- - drivers/clk/qcom/clock-cpu-8994.c | 8 +++--- - drivers/cpufreq/qcom-cpufreq.c | 41 +++++++++++++++++++++++++++ - 4 files changed, 93 insertions(+), 26 deletions(-) - -diff --git a/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -index d5f6860..23b23ba 100644 ---- a/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -+++ b/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -@@ -605,7 +605,7 @@ - regulator-name = "apc0_corner"; - qcom,cpr-fuse-corners = <4>; - regulator-min-microvolt = <1>; -- regulator-max-microvolt = <10>; -+ regulator-max-microvolt = <12>; - - qcom,cpr-voltage-ceiling = <900000 900000 1000000 1180000>; - qcom,cpr-voltage-floor = <640000 700000 800000 850000>; -@@ -669,15 +669,15 @@ - qcom,cpr-init-voltage-ref = <900000 900000 1000000 1230000>; - qcom,cpr-init-voltage-step = <10000>; - -- qcom,cpr-corner-map = <1 1 2 2 3 3 4 4 4 4>; -+ qcom,cpr-corner-map = <1 1 2 2 3 3 4 4 4 4 4 4>; - qcom,cpr-voltage-ceiling-override = - <0xFFFFFFFF 0 800000 800000 900000 900000 - 1000000 1000000 1115000 1115000 -- 1180000 1180000>; -+ 1180000 1180000 1180000 1180000>; - qcom,cpr-voltage-floor-override = - <0xFFFFFFFF 0 640000 655000 700000 735000 - 800000 835000 850000 875000 -- 950000 1000000>; -+ 950000 1000000 1000000 1000000>; - qcom,cpr-fuse-version-map = - <0 0xffffffff 0 0 0 0 0>, - <0 0xffffffff 1 0 0 0 0>, -@@ -759,10 +759,12 @@ - <7 864000000>, - <8 960000000>, - <9 1248000000>, -- <10 1440000000>; -+ <10 1440000000>, -+ <11 1536000000>, -+ <12 1632000000>; - qcom,cpr-speed-bin-max-corners = - <0 0 2 4 6 9>, -- <1 0 2 4 6 10>; -+ <1 0 2 4 6 12>; - qcom,cpr-enable; - }; - -@@ -774,7 +776,7 @@ - regulator-name = "apc1_corner"; - qcom,cpr-fuse-corners = <4>; - regulator-min-microvolt = <1>; -- regulator-max-microvolt = <15>; -+ regulator-max-microvolt = <17>; - - qcom,cpr-voltage-ceiling = <900000 900000 1000000 1180000>; - qcom,cpr-voltage-floor = <640000 640000 745000 850000>; -@@ -841,17 +843,19 @@ - qcom,cpr-init-voltage-ref = <900000 900000 1000000 1230000>; - qcom,cpr-init-voltage-step = <10000>; - -- qcom,cpr-corner-map = <1 2 2 2 2 3 3 3 4 4 4 4 4 4 4>; -+ qcom,cpr-corner-map = <1 2 2 2 2 3 3 3 4 4 4 4 4 4 4 4 4>; - qcom,cpr-voltage-ceiling-override = - <0xFFFFFFFF 0 900000 900000 900000 900000 - 900000 1000000 1000000 1000000 - 1115000 1115000 1115000 1115000 -- 1115000 1115000 1180000>; -+ 1115000 1115000 1180000 1180000 -+ 1180000>; - qcom,cpr-voltage-floor-override = - <0xFFFFFFFF 0 640000 640000 665000 690000 - 735000 745000 770000 785000 - 850000 860000 880000 900000 -- 920000 935000 1000000>; -+ 920000 935000 1000000 1000000 -+ 1000000>; - qcom,cpr-fuse-version-map = - <0xffffffff 0xffffffff 0 4 4 4 4>, - <0xffffffff 0xffffffff 1 4 4 4 4>, -@@ -908,9 +912,11 @@ - <12 1536000000>, - <13 1632000000>, - <14 1689600000>, -- <15 1824000000>; -+ <15 1824000000>, -+ <16 1958400000>, -+ <17 2016000000>; - qcom,cpr-speed-bin-max-corners = -- <0xFFFFFFFF 0 1 5 8 15>; -+ <0xFFFFFFFF 0 1 5 8 17>; - qcom,cpr-enable; - }; - -diff --git a/arch/arm/boot/dts/qcom/msm8992.dtsi b/arch/arm/boot/dts/qcom/msm8992.dtsi -index 5ba420c..8892b56 100644 ---- a/arch/arm/boot/dts/qcom/msm8992.dtsi -+++ b/arch/arm/boot/dts/qcom/msm8992.dtsi -@@ -852,7 +852,9 @@ - < 787200 3509 >, - < 864000 4173 >, - < 960000 5271 >, -- < 1440000 7102 >; -+ < 1440000 7102 >, -+ < 1536000 7102 >, -+ < 1632000 7102 >; - cpu-to-dev-map-4 = - < 384000 1525 >, - < 633600 2288 >, -@@ -860,16 +862,22 @@ - < 864000 4173 >, - < 960000 5271 >, - < 1344000 5928 >, -- < 1824000 7102 >; -+ < 1824000 7102 >, -+ < 1958400 7102 >, -+ < 2016000 7102 >; - }; - - mincpubw-cpufreq { - target-dev = <&mincpubw>; - cpu-to-dev-map-0 = -- < 1440000 1525 >; -+ < 1440000 1525 >, -+ < 1536000 1525 >, -+ < 1632000 1525 >; - cpu-to-dev-map-4 = - < 1689600 1525 >, -- < 1824000 5928 >; -+ < 1824000 1525 >, -+ < 1958400 1525 >, -+ < 2016000 5928 >; - }; - - cci-cpufreq { -@@ -880,7 +888,9 @@ - < 787200 384000 >, - < 864000 556800 >, - < 960000 729600 >, -- < 1440000 787200 >; -+ < 1440000 787200 >, -+ < 1536000 787200 >, -+ < 1632000 787200 >; - cpu-to-dev-map-4 = - < 384000 134400 >, - < 480000 300000 >, -@@ -888,7 +898,9 @@ - < 768000 556800 >, - < 960000 600000 >, - < 1440000 729600 >, -- < 1824000 787200 >; -+ < 1824000 787200 >, -+ < 1958400 787200 >, -+ < 2016000 787200 >; - }; - }; - -@@ -915,7 +927,9 @@ - < 864000 >, - < 960000 >, - < 1248000 >, -- < 1440000 >; -+ < 1440000 >, -+ < 1536000 >, -+ < 1632000 >; - - qcom,cpufreq-table-4 = - < 384000 >, -@@ -930,7 +944,9 @@ - < 1536000 >, - < 1632000 >, - < 1689600 >, -- < 1824000 >; -+ < 1824000 >, -+ < 1958400 >, -+ < 2016000 >; - - }; - -@@ -968,7 +984,9 @@ - < 864000000 7>, - < 960000000 8>, - < 1248000000 9>, -- < 1440000000 10>; -+ < 1440000000 10>, -+ < 1536000000 11>, -+ < 1632000000 12>; - qcom,a57-speedbin0-v0 = - < 0 0>, - < 384000000 5>, -@@ -983,7 +1001,9 @@ - < 1536000000 12>, - < 1632000000 13>, - < 1689600000 14>, -- < 1824000000 15>; -+ < 1824000000 15>, -+ < 1958400000 16>, -+ < 2016000000 17>; - qcom,cci-speedbin0-v0 = - < 0 0>, - < 134400000 2>, -diff --git a/drivers/clk/qcom/clock-cpu-8994.c b/drivers/clk/qcom/clock-cpu-8994.c -index 6eb346b..de3d72f 100644 ---- a/drivers/clk/qcom/clock-cpu-8994.c -+++ b/drivers/clk/qcom/clock-cpu-8994.c -@@ -191,13 +191,13 @@ static struct pll_clk a57_pll0 = { - .test_ctl_lo_val = 0x00010000, - }, - .min_rate = 1209600000, -- .max_rate = 1996800000, -+ .max_rate = 2073600000, - .base = &vbases[C1_PLL_BASE], - .c = { - .parent = &xo_ao.c, - .dbg_name = "a57_pll0", - .ops = &clk_ops_variable_rate_pll, -- VDD_DIG_FMAX_MAP2(LOW, 1593600000, NOMINAL, 1996800000), -+ VDD_DIG_FMAX_MAP2(LOW, 1593600000, NOMINAL, 2073600000), - CLK_INIT(a57_pll0.c), - }, - }; -@@ -229,13 +229,13 @@ static struct pll_clk a57_pll1 = { - /* Necessary since we'll be setting a rate before handoff on V1 */ - .src_rate = 19200000, - .min_rate = 1209600000, -- .max_rate = 1996800000, -+ .max_rate = 2073600000, - .base = &vbases[C1_PLL_BASE], - .c = { - .parent = &xo_ao.c, - .dbg_name = "a57_pll1", - .ops = &clk_ops_variable_rate_pll, -- VDD_DIG_FMAX_MAP2(LOW, 1593600000, NOMINAL, 1996800000), -+ VDD_DIG_FMAX_MAP2(LOW, 1593600000, NOMINAL, 2073600000), - CLK_INIT(a57_pll1.c), - }, - }; -diff --git a/drivers/cpufreq/qcom-cpufreq.c b/drivers/cpufreq/qcom-cpufreq.c -index e30b0cb..dd3a589 100644 ---- a/drivers/cpufreq/qcom-cpufreq.c -+++ b/drivers/cpufreq/qcom-cpufreq.c -@@ -31,6 +31,40 @@ - - static DEFINE_MUTEX(l2bw_lock); - -+static unsigned long arg_cpu_max_a53 = 1440000; -+ -+static int __init cpufreq_read_cpu_max_a53(char *cpu_max_a53) -+{ -+ unsigned long ui_khz; -+ int ret; -+ -+ ret = kstrtoul(cpu_max_a53, 0, &ui_khz); -+ if (ret) -+ return -EINVAL; -+ -+ arg_cpu_max_a53 = ui_khz; -+ printk("cpu_max_a53=%lu\n", arg_cpu_max_a53); -+ return ret; -+} -+__setup("cpu_max_a53=", cpufreq_read_cpu_max_a53); -+ -+static unsigned long arg_cpu_max_a57 = 1824000; -+ -+static int __init cpufreq_read_cpu_max_a57(char *cpu_max_a57) -+{ -+ unsigned long ui_khz; -+ int ret; -+ -+ ret = kstrtoul(cpu_max_a57, 0, &ui_khz); -+ if (ret) -+ return -EINVAL; -+ -+ arg_cpu_max_a57 = ui_khz; -+ printk("cpu_max_a57=%lu\n", arg_cpu_max_a57); -+ return ret; -+} -+__setup("cpu_max_a57=", cpufreq_read_cpu_max_a57); -+ - static struct clk *cpu_clk[NR_CPUS]; - static struct clk *l2_clk; - static DEFINE_PER_CPU(struct cpufreq_frequency_table *, freq_table); -@@ -364,6 +398,13 @@ static struct cpufreq_frequency_table *cpufreq_parse_dt(struct device *dev, - if (i > 0 && f <= ftbl[i-1].frequency) - break; - -+ //Custom max freq -+ if ((cpu < 4 && f > arg_cpu_max_a53) || -+ (cpu >= 4 && f > arg_cpu_max_a57)) { -+ nf = i; -+ break; -+ } -+ - ftbl[i].driver_data = i; - ftbl[i].frequency = f; - } --- -2.9.3 - - -From 9dfe99b9f8eead920f7cdefdb2ae7b1cea776d9b Mon Sep 17 00:00:00 2001 -From: dirtyhank -Date: Thu, 14 Jan 2016 12:56:07 +0100 -Subject: [PATCH 2/3] CPU underclocking - - Based on underclocking to Nexus 6P by anarkia1976 ---- - arch/arm/boot/dts/qcom/msm8992-regulator.dtsi | 6 +++--- - arch/arm/boot/dts/qcom/msm8992.dtsi | 14 +++++++++++--- - 2 files changed, 14 insertions(+), 6 deletions(-) - -diff --git a/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -index 23b23ba..1ef9eb3 100644 ---- a/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -+++ b/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -@@ -750,7 +750,7 @@ - qcom,cpr-voltage-scaling-factor-max = <0 0 2000 2000>; - qcom,cpr-quot-adjust-scaling-factor-max = <0 2000 2000 2000>; - qcom,cpr-corner-frequency-map = -- <1 300000000>, -+ <1 302400000>, - <2 384000000>, - <3 460800000>, - <4 600000000>, -@@ -898,8 +898,8 @@ - qcom,cpr-voltage-scaling-factor-max = <0 0 2000 2000>; - qcom,cpr-quot-adjust-scaling-factor-max = <0 0 2000 2000>; - qcom,cpr-corner-frequency-map = -- <1 300000000>, /* SVS Fmin for "SVS2" */ -- <2 300000000>, -+ <1 302400000>, /* SVS Fmin for "SVS2" */ -+ <2 302400000>, - <3 384000000>, - <4 480000000>, - <5 633600000>, -diff --git a/arch/arm/boot/dts/qcom/msm8992.dtsi b/arch/arm/boot/dts/qcom/msm8992.dtsi -index 8892b56..f6a39cd 100644 ---- a/arch/arm/boot/dts/qcom/msm8992.dtsi -+++ b/arch/arm/boot/dts/qcom/msm8992.dtsi -@@ -796,7 +796,7 @@ - governor = "cpufreq"; - freq-tbl-khz = - < 134400 >, -- < 300000 >, -+ < 302400 >, - < 384000 >, - < 556800 >, - < 600000 >, -@@ -856,7 +856,8 @@ - < 1536000 7102 >, - < 1632000 7102 >; - cpu-to-dev-map-4 = -- < 384000 1525 >, -+ < 302400 1525 >, -+ < 384000 1525 >, - < 633600 2288 >, - < 768000 3509 >, - < 864000 4173 >, -@@ -883,6 +884,7 @@ - cci-cpufreq { - target-dev = <&cci_cache>; - cpu-to-dev-map-0 = -+ < 302400 134400 >, - < 384000 134400 >, - < 600000 300000 >, - < 787200 384000 >, -@@ -892,6 +894,7 @@ - < 1536000 787200 >, - < 1632000 787200 >; - cpu-to-dev-map-4 = -+ < 302400 134400 >, - < 384000 134400 >, - < 480000 300000 >, - < 633600 384000 >, -@@ -919,6 +922,7 @@ - qcom,governor-per-policy; - - qcom,cpufreq-table-0 = -+ < 302400 >, - < 384000 >, - < 460800 >, - < 600000 >, -@@ -932,6 +936,7 @@ - < 1632000 >; - - qcom,cpufreq-table-4 = -+ < 302400 >, - < 384000 >, - < 480000 >, - < 633600 >, -@@ -966,6 +971,7 @@ - vdd-dig-supply = <&pm8994_s2_corner_ao>; - qcom,a53-speedbin0-v0 = - < 0 0>, -+ < 302400000 1>, - < 384000000 2>, - < 460800000 3>, - < 600000000 4>, -@@ -976,6 +982,7 @@ - < 1248000000 9>; - qcom,a53-speedbin1-v0 = - < 0 0>, -+ < 302400000 1>, - < 384000000 2>, - < 460800000 3>, - < 600000000 4>, -@@ -989,6 +996,7 @@ - < 1632000000 12>; - qcom,a57-speedbin0-v0 = - < 0 0>, -+ < 302400000 5>, - < 384000000 5>, - < 480000000 5>, - < 633600000 5>, -@@ -1007,7 +1015,7 @@ - qcom,cci-speedbin0-v0 = - < 0 0>, - < 134400000 2>, -- < 300000000 4>, -+ < 302400000 4>, - < 384000000 6>, - < 556800000 6>, - < 600000000 8>, --- -2.9.3 - - -From b7e24657fb125b77bb5d9a39493040e1234c7c83 Mon Sep 17 00:00:00 2001 -From: flar2 -Date: Mon, 21 Nov 2016 21:40:09 -0500 -Subject: [PATCH 3/3] msm8992: bump oc voltages - ---- - arch/arm/boot/dts/qcom/msm8992-regulator.dtsi | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -index 1ef9eb3..d2a875b 100644 ---- a/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -+++ b/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -@@ -673,11 +673,11 @@ - qcom,cpr-voltage-ceiling-override = - <0xFFFFFFFF 0 800000 800000 900000 900000 - 1000000 1000000 1115000 1115000 -- 1180000 1180000 1180000 1180000>; -+ 1180000 1180000 1180000 1200000>; - qcom,cpr-voltage-floor-override = - <0xFFFFFFFF 0 640000 655000 700000 735000 - 800000 835000 850000 875000 -- 950000 1000000 1000000 1000000>; -+ 950000 1000000 1000000 1100000>; - qcom,cpr-fuse-version-map = - <0 0xffffffff 0 0 0 0 0>, - <0 0xffffffff 1 0 0 0 0>, -@@ -849,13 +849,13 @@ - 900000 1000000 1000000 1000000 - 1115000 1115000 1115000 1115000 - 1115000 1115000 1180000 1180000 -- 1180000>; -+ 1200000>; - qcom,cpr-voltage-floor-override = - <0xFFFFFFFF 0 640000 640000 665000 690000 - 735000 745000 770000 785000 - 850000 860000 880000 900000 - 920000 935000 1000000 1000000 -- 1000000>; -+ 1100000>; - qcom,cpr-fuse-version-map = - <0xffffffff 0xffffffff 0 4 4 4 4>, - <0xffffffff 0xffffffff 1 4 4 4 4>, --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_kernel_lge_bullhead/0002-MMC_Tweak.patch b/Patches/CyanogenMod-14.1/android_kernel_lge_bullhead/0002-MMC_Tweak.patch deleted file mode 100644 index 0c6fc863..00000000 --- a/Patches/CyanogenMod-14.1/android_kernel_lge_bullhead/0002-MMC_Tweak.patch +++ /dev/null @@ -1,42 +0,0 @@ -From f24f2dec25043cf7e6ef0f80a65dde45f2f131dd Mon Sep 17 00:00:00 2001 -From: franciscofranco -Date: Wed, 20 Jan 2016 01:45:39 +0000 -Subject: [PATCH] IKSWM-6057: dts: mmc: remove wakeup on idle flag - -Remove the wakeup-on-idle flag can improve the mmc -performance(verified with iozone). No current drain -and other system performance impact. - -Change-Id: Ia90cdfb66569b5ee3713d2c9785a2b7a9d24760e -Signed-off-by: Lianwei Wang -Reviewed-on: http://gerrit.mot.com/785887 -SLTApproved: Slta Waiver -SME-Granted: SME Approvals Granted -Tested-by: Jira Key -Reviewed-by: Zhi-Ming Yuan -Submit-Approved: Jira Key -Signed-off-by: franciscofranco ---- - arch/arm/boot/dts/qcom/msm8992.dtsi | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/arch/arm/boot/dts/qcom/msm8992.dtsi b/arch/arm/boot/dts/qcom/msm8992.dtsi -index 5dedecb..dc70365 100644 ---- a/arch/arm/boot/dts/qcom/msm8992.dtsi -+++ b/arch/arm/boot/dts/qcom/msm8992.dtsi -@@ -1706,7 +1706,6 @@ - qcom,cpu-dma-latency-us = <301 70>; - qcom,cpu-affinity = "affine_cores"; - qcom,cpu-affinity-mask = <0x0f 0xf0>; -- qcom,wakeup-on-idle; - - qcom,msm-bus,name = "sdhc1"; - qcom,msm-bus,num-cases = <9>; -@@ -1746,7 +1745,6 @@ - qcom,cpu-dma-latency-us = <301 70>; - qcom,cpu-affinity = "affine_cores"; - qcom,cpu-affinity-mask = <0x0f 0xf0>; -- qcom,wakeup-on-idle; - - qcom,msm-bus,name = "sdhc2"; - qcom,msm-bus,num-cases = <8>; diff --git a/Patches/CyanogenMod-14.1/android_kernel_lge_hammerhead/0001-OverUnderClock.patch b/Patches/CyanogenMod-14.1/android_kernel_lge_hammerhead/0001-OverUnderClock.patch deleted file mode 100644 index 87c7e002..00000000 --- a/Patches/CyanogenMod-14.1/android_kernel_lge_hammerhead/0001-OverUnderClock.patch +++ /dev/null @@ -1,757 +0,0 @@ -From ec5d8918e9d3149ce489900f48d6e6ebd2fd5031 Mon Sep 17 00:00:00 2001 -From: Paul Reioux -Date: Sun, 20 Oct 2013 22:30:36 -0500 -Subject: [PATCH 1/5] Voltage Control: initial voltage control for MSM - Snapdragon 800 SOC - -Signed-off-by: Paul Reioux -Signed-off-by: flar2 ---- - arch/arm/mach-msm/Kconfig | 6 +++++ - arch/arm/mach-msm/acpuclock-krait.c | 48 +++++++++++++++++++++++++++++++++++++ - 2 files changed, 54 insertions(+) - -diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig -index ba5a33c..44db2ca 100644 ---- a/arch/arm/mach-msm/Kconfig -+++ b/arch/arm/mach-msm/Kconfig -@@ -1918,6 +1918,12 @@ config MSM_CPU_FREQ_MIN - - endif # CPU_FREQ_MSM - -+config CPU_VOLTAGE_TABLE -+ bool "Enable CPU Voltage Table via sysfs for adjustements" -+ default n -+ help -+ Krait User Votlage Control -+ - config MSM_AVS_HW - bool "Enable Adaptive Voltage Scaling (AVS)" - default n -diff --git a/arch/arm/mach-msm/acpuclock-krait.c b/arch/arm/mach-msm/acpuclock-krait.c -index 84e2fc1..c7eceb1 100644 ---- a/arch/arm/mach-msm/acpuclock-krait.c -+++ b/arch/arm/mach-msm/acpuclock-krait.c -@@ -937,6 +937,54 @@ static void __init bus_init(const struct l2_level *l2_level) - dev_err(drv.dev, "initial bandwidth req failed (%d)\n", ret); - } - -+#ifdef CONFIG_CPU_VOLTAGE_TABLE -+ -+#define HFPLL_MIN_VDD 800000 -+#define HFPLL_MAX_VDD 1350000 -+ -+ssize_t acpuclk_get_vdd_levels_str(char *buf) { -+ -+ int i, len = 0; -+ -+ if (buf) { -+ mutex_lock(&driver_lock); -+ -+ for (i = 0; drv.acpu_freq_tbl[i].speed.khz; i++) { -+ /* updated to use uv required by 8x60 architecture - faux123 */ -+ len += sprintf(buf + len, "%8lu: %8d\n", drv.acpu_freq_tbl[i].speed.khz, -+ drv.acpu_freq_tbl[i].vdd_core ); -+ } -+ -+ mutex_unlock(&driver_lock); -+ } -+ return len; -+} -+ -+/* updated to use uv required by 8x60 architecture - faux123 */ -+void acpuclk_set_vdd(unsigned int khz, int vdd_uv) { -+ -+ int i; -+ unsigned int new_vdd_uv; -+ -+ mutex_lock(&driver_lock); -+ -+ for (i = 0; drv.acpu_freq_tbl[i].speed.khz; i++) { -+ if (khz == 0) -+ new_vdd_uv = min(max((unsigned int)(drv.acpu_freq_tbl[i].vdd_core + vdd_uv), -+ (unsigned int)HFPLL_MIN_VDD), (unsigned int)HFPLL_MAX_VDD); -+ else if ( drv.acpu_freq_tbl[i].speed.khz == khz) -+ new_vdd_uv = min(max((unsigned int)vdd_uv, -+ (unsigned int)HFPLL_MIN_VDD), (unsigned int)HFPLL_MAX_VDD); -+ else -+ continue; -+ -+ drv.acpu_freq_tbl[i].vdd_core = new_vdd_uv; -+ } -+ pr_warn("faux123: user voltage table modified!\n"); -+ mutex_unlock(&driver_lock); -+} -+#endif /* CONFIG_CPU_VOTALGE_TABLE */ -+ - #ifdef CONFIG_CPU_FREQ_MSM - static struct cpufreq_frequency_table freq_table[NR_CPUS][35]; - --- -2.9.3 - - -From 1e4ac53ff15efeaf4cb3998b9ba009095d582413 Mon Sep 17 00:00:00 2001 -From: flar2 -Date: Sat, 9 Nov 2013 00:17:33 -0500 -Subject: [PATCH 2/5] Increase voltage limits - -Signed-off-by: flar2 ---- - arch/arm/boot/dts/msm8974-regulator.dtsi | 8 ++++---- - arch/arm/mach-msm/acpuclock-8974.c | 8 ++++---- - arch/arm/mach-msm/acpuclock-krait.c | 4 ++-- - 3 files changed, 10 insertions(+), 10 deletions(-) - -diff --git a/arch/arm/boot/dts/msm8974-regulator.dtsi b/arch/arm/boot/dts/msm8974-regulator.dtsi -index 9de41f4..6a38980 100644 ---- a/arch/arm/boot/dts/msm8974-regulator.dtsi -+++ b/arch/arm/boot/dts/msm8974-regulator.dtsi -@@ -477,7 +477,7 @@ - <0xf908a800 0x1000>; /* APCS_ALIAS0_KPSS_MDD */ - reg-names = "acs", "mdd"; - regulator-min-microvolt = <500000>; -- regulator-max-microvolt = <1100000>; -+ regulator-max-microvolt = <1200000>; - qcom,headroom-voltage = <150000>; - qcom,retention-voltage = <675000>; - qcom,ldo-default-voltage = <750000>; -@@ -493,7 +493,7 @@ - <0xf909a800 0x1000>; /* APCS_ALIAS1_KPSS_MDD */ - reg-names = "acs", "mdd"; - regulator-min-microvolt = <500000>; -- regulator-max-microvolt = <1100000>; -+ regulator-max-microvolt = <1200000>; - qcom,headroom-voltage = <150000>; - qcom,retention-voltage = <675000>; - qcom,ldo-default-voltage = <750000>; -@@ -509,7 +509,7 @@ - <0xf90aa800 0x1000>; /* APCS_ALIAS2_KPSS_MDD */ - reg-names = "acs", "mdd"; - regulator-min-microvolt = <500000>; -- regulator-max-microvolt = <1100000>; -+ regulator-max-microvolt = <1200000>; - qcom,headroom-voltage = <150000>; - qcom,retention-voltage = <675000>; - qcom,ldo-default-voltage = <750000>; -@@ -525,7 +525,7 @@ - <0xf90ba800 0x1000>; /* APCS_ALIAS3_KPSS_MDD */ - reg-names = "acs", "mdd"; - regulator-min-microvolt = <500000>; -- regulator-max-microvolt = <1100000>; -+ regulator-max-microvolt = <1200000>; - qcom,headroom-voltage = <150000>; - qcom,retention-voltage = <675000>; - qcom,ldo-default-voltage = <750000>; -diff --git a/arch/arm/mach-msm/acpuclock-8974.c b/arch/arm/mach-msm/acpuclock-8974.c -index 694d783..8b7d74e 100644 ---- a/arch/arm/mach-msm/acpuclock-8974.c -+++ b/arch/arm/mach-msm/acpuclock-8974.c -@@ -55,7 +55,7 @@ static struct scalable scalable[] __initdata = { - .hfpll_phys_base = 0xF908A000, - .l2cpmr_iaddr = 0x4501, - .sec_clk_sel = 2, -- .vreg[VREG_CORE] = { "krait0", 1100000 }, -+ .vreg[VREG_CORE] = { "krait0", 1200000 }, - .vreg[VREG_MEM] = { "krait0_mem", 1050000 }, - .vreg[VREG_DIG] = { "krait0_dig", LVL_HIGH }, - .vreg[VREG_HFPLL_A] = { "krait0_hfpll", 1800000 }, -@@ -64,7 +64,7 @@ static struct scalable scalable[] __initdata = { - .hfpll_phys_base = 0xF909A000, - .l2cpmr_iaddr = 0x5501, - .sec_clk_sel = 2, -- .vreg[VREG_CORE] = { "krait1", 1100000 }, -+ .vreg[VREG_CORE] = { "krait1", 1200000 }, - .vreg[VREG_MEM] = { "krait1_mem", 1050000 }, - .vreg[VREG_DIG] = { "krait1_dig", LVL_HIGH }, - .vreg[VREG_HFPLL_A] = { "krait1_hfpll", 1800000 }, -@@ -73,7 +73,7 @@ static struct scalable scalable[] __initdata = { - .hfpll_phys_base = 0xF90AA000, - .l2cpmr_iaddr = 0x6501, - .sec_clk_sel = 2, -- .vreg[VREG_CORE] = { "krait2", 1100000 }, -+ .vreg[VREG_CORE] = { "krait2", 1200000 }, - .vreg[VREG_MEM] = { "krait2_mem", 1050000 }, - .vreg[VREG_DIG] = { "krait2_dig", LVL_HIGH }, - .vreg[VREG_HFPLL_A] = { "krait2_hfpll", 1800000 }, -@@ -82,7 +82,7 @@ static struct scalable scalable[] __initdata = { - .hfpll_phys_base = 0xF90BA000, - .l2cpmr_iaddr = 0x7501, - .sec_clk_sel = 2, -- .vreg[VREG_CORE] = { "krait3", 1100000 }, -+ .vreg[VREG_CORE] = { "krait3", 1200000 }, - .vreg[VREG_MEM] = { "krait3_mem", 1050000 }, - .vreg[VREG_DIG] = { "krait3_dig", LVL_HIGH }, - .vreg[VREG_HFPLL_A] = { "krait3_hfpll", 1800000 }, -diff --git a/arch/arm/mach-msm/acpuclock-krait.c b/arch/arm/mach-msm/acpuclock-krait.c -index c7eceb1..2211ad3 100644 ---- a/arch/arm/mach-msm/acpuclock-krait.c -+++ b/arch/arm/mach-msm/acpuclock-krait.c -@@ -939,8 +939,8 @@ static void __init bus_init(const struct l2_level *l2_level) - - #ifdef CONFIG_CPU_VOLTAGE_TABLE - --#define HFPLL_MIN_VDD 800000 --#define HFPLL_MAX_VDD 1350000 -+#define HFPLL_MIN_VDD 500000 -+#define HFPLL_MAX_VDD 1200000 - - ssize_t acpuclk_get_vdd_levels_str(char *buf) { - --- -2.9.3 - - -From 28d7063d0b5a45d328633e4a59d20ac148f1fadd Mon Sep 17 00:00:00 2001 -From: flar2 -Date: Sat, 9 Nov 2013 01:27:36 -0500 -Subject: [PATCH 3/5] CPU overclocking - -Signed-off-by: flar2 ---- - arch/arm/mach-msm/acpuclock-8974.c | 42 ++++++++++ - arch/arm/mach-msm/acpuclock-krait.c | 148 +++++++++++++++++++++++++++++++++++- - 2 files changed, 189 insertions(+), 1 deletion(-) - -diff --git a/arch/arm/mach-msm/acpuclock-8974.c b/arch/arm/mach-msm/acpuclock-8974.c -index 8b7d74e..cb878d9 100644 ---- a/arch/arm/mach-msm/acpuclock-8974.c -+++ b/arch/arm/mach-msm/acpuclock-8974.c -@@ -710,6 +710,12 @@ static struct acpu_level acpu_freq_tbl_2p3g_pvs0[] __initdata = { - { 0, { 2112000, HFPLL, 1, 110 }, L2(19), 1070000, 627 }, - { 0, { 2188800, HFPLL, 1, 114 }, L2(19), 1085000, 659 }, - { 1, { 2265600, HFPLL, 1, 118 }, L2(19), 1100000, 691 }, -+ { 1, { 2342400, HFPLL, 1, 122 }, L2(19), 1115000, 714 }, -+ { 1, { 2419200, HFPLL, 1, 126 }, L2(19), 1130000, 738 }, -+ { 1, { 2496000, HFPLL, 1, 130 }, L2(19), 1145000, 761 }, -+ { 1, { 2572800, HFPLL, 1, 134 }, L2(19), 1160000, 784 }, -+ { 1, { 2649600, HFPLL, 1, 138 }, L2(19), 1175000, 808 }, -+ { 1, { 2726400, HFPLL, 1, 142 }, L2(19), 1195000, 831 }, - { 0, { 0 } } - }; - -@@ -741,6 +747,12 @@ static struct acpu_level acpu_freq_tbl_2p3g_pvs1[] __initdata = { - { 0, { 2112000, HFPLL, 1, 110 }, L2(19), 1045000, 627 }, - { 0, { 2188800, HFPLL, 1, 114 }, L2(19), 1060000, 659 }, - { 1, { 2265600, HFPLL, 1, 118 }, L2(19), 1075000, 691 }, -+ { 1, { 2342400, HFPLL, 1, 122 }, L2(19), 1090000, 714 }, -+ { 1, { 2419200, HFPLL, 1, 126 }, L2(19), 1105000, 738 }, -+ { 1, { 2496000, HFPLL, 1, 130 }, L2(19), 1120000, 761 }, -+ { 1, { 2572800, HFPLL, 1, 134 }, L2(19), 1135000, 784 }, -+ { 1, { 2649600, HFPLL, 1, 138 }, L2(19), 1150000, 808 }, -+ { 1, { 2726400, HFPLL, 1, 142 }, L2(19), 1165000, 831 }, - { 0, { 0 } } - }; - -@@ -772,6 +784,12 @@ static struct acpu_level acpu_freq_tbl_2p3g_pvs2[] __initdata = { - { 0, { 2112000, HFPLL, 1, 110 }, L2(19), 1020000, 627 }, - { 0, { 2188800, HFPLL, 1, 114 }, L2(19), 1035000, 659 }, - { 1, { 2265600, HFPLL, 1, 118 }, L2(19), 1050000, 691 }, -+ { 1, { 2342400, HFPLL, 1, 122 }, L2(19), 1065000, 714 }, -+ { 1, { 2419200, HFPLL, 1, 126 }, L2(19), 1080000, 738 }, -+ { 1, { 2496000, HFPLL, 1, 130 }, L2(19), 1095000, 761 }, -+ { 1, { 2572800, HFPLL, 1, 134 }, L2(19), 1110000, 784 }, -+ { 1, { 2649600, HFPLL, 1, 138 }, L2(19), 1125000, 808 }, -+ { 1, { 2726400, HFPLL, 1, 142 }, L2(19), 1140000, 831 }, - { 0, { 0 } } - }; - -@@ -803,6 +821,12 @@ static struct acpu_level acpu_freq_tbl_2p3g_pvs3[] __initdata = { - { 0, { 2112000, HFPLL, 1, 110 }, L2(19), 995000, 627 }, - { 0, { 2188800, HFPLL, 1, 114 }, L2(19), 1010000, 659 }, - { 1, { 2265600, HFPLL, 1, 118 }, L2(19), 1025000, 691 }, -+ { 1, { 2342400, HFPLL, 1, 122 }, L2(19), 1040000, 714 }, -+ { 1, { 2419200, HFPLL, 1, 126 }, L2(19), 1055000, 738 }, -+ { 1, { 2496000, HFPLL, 1, 130 }, L2(19), 1070000, 761 }, -+ { 1, { 2572800, HFPLL, 1, 134 }, L2(19), 1085000, 784 }, -+ { 1, { 2649600, HFPLL, 1, 138 }, L2(19), 1100000, 808 }, -+ { 1, { 2726400, HFPLL, 1, 142 }, L2(19), 1115000, 831 }, - { 0, { 0 } } - }; - -@@ -834,6 +858,12 @@ static struct acpu_level acpu_freq_tbl_2p3g_pvs4[] __initdata = { - { 0, { 2112000, HFPLL, 1, 110 }, L2(19), 975000, 627 }, - { 0, { 2188800, HFPLL, 1, 114 }, L2(19), 985000, 659 }, - { 1, { 2265600, HFPLL, 1, 118 }, L2(19), 1000000, 691 }, -+ { 1, { 2342400, HFPLL, 1, 122 }, L2(19), 1015000, 714 }, -+ { 1, { 2419200, HFPLL, 1, 126 }, L2(19), 1030000, 738 }, -+ { 1, { 2496000, HFPLL, 1, 130 }, L2(19), 1045000, 761 }, -+ { 1, { 2572800, HFPLL, 1, 134 }, L2(19), 1060000, 784 }, -+ { 1, { 2649600, HFPLL, 1, 138 }, L2(19), 1075000, 808 }, -+ { 1, { 2726400, HFPLL, 1, 142 }, L2(19), 1090000, 831 }, - { 0, { 0 } } - }; - -@@ -865,6 +895,12 @@ static struct acpu_level acpu_freq_tbl_2p3g_pvs5[] __initdata = { - { 0, { 2112000, HFPLL, 1, 110 }, L2(19), 955000, 627 }, - { 0, { 2188800, HFPLL, 1, 114 }, L2(19), 965000, 659 }, - { 1, { 2265600, HFPLL, 1, 118 }, L2(19), 975000, 691 }, -+ { 1, { 2342400, HFPLL, 1, 122 }, L2(19), 990000, 714 }, -+ { 1, { 2419200, HFPLL, 1, 126 }, L2(19), 1005000, 738 }, -+ { 1, { 2496000, HFPLL, 1, 130 }, L2(19), 1020000, 761 }, -+ { 1, { 2572800, HFPLL, 1, 134 }, L2(19), 1035000, 784 }, -+ { 1, { 2649600, HFPLL, 1, 138 }, L2(19), 1050000, 808 }, -+ { 1, { 2726400, HFPLL, 1, 142 }, L2(19), 1065000, 831 }, - { 0, { 0 } } - }; - -@@ -896,6 +932,12 @@ static struct acpu_level acpu_freq_tbl_2p3g_pvs6[] __initdata = { - { 0, { 2112000, HFPLL, 1, 110 }, L2(19), 930000, 627 }, - { 0, { 2188800, HFPLL, 1, 114 }, L2(19), 940000, 659 }, - { 1, { 2265600, HFPLL, 1, 118 }, L2(19), 950000, 691 }, -+ { 1, { 2342400, HFPLL, 1, 122 }, L2(19), 960000, 714 }, -+ { 1, { 2419200, HFPLL, 1, 126 }, L2(19), 975000, 738 }, -+ { 1, { 2496000, HFPLL, 1, 130 }, L2(19), 990000, 761 }, -+ { 1, { 2572800, HFPLL, 1, 134 }, L2(19), 1005000, 784 }, -+ { 1, { 2649600, HFPLL, 1, 138 }, L2(19), 1020000, 808 }, -+ { 1, { 2726400, HFPLL, 1, 142 }, L2(19), 1035000, 831 }, - { 0, { 0 } } - }; - -diff --git a/arch/arm/mach-msm/acpuclock-krait.c b/arch/arm/mach-msm/acpuclock-krait.c -index 2211ad3..bcd3e44 100644 ---- a/arch/arm/mach-msm/acpuclock-krait.c -+++ b/arch/arm/mach-msm/acpuclock-krait.c -@@ -45,6 +45,113 @@ - #define PRI_SRC_SEL_HFPLL 1 - #define PRI_SRC_SEL_HFPLL_DIV2 2 - -+ -+/** elementalx defs **/ -+static int uv_bin = 2; -+static uint32_t arg_max_oc0 = 2265600; -+static uint32_t arg_max_oc1 = 2265600; -+static uint32_t arg_max_oc2 = 2265600; -+static uint32_t arg_max_oc3 = 2265600; -+ -+int pvs_number = 0; -+module_param(pvs_number, int, 0755); -+ -+/* boot arg max_oc */ -+static int __init cpufreq_read_arg_max_oc0(char *max_oc0) -+{ -+ unsigned long ui_khz; -+ int err; -+ err = strict_strtoul(max_oc0, 0, &ui_khz); -+ if (err) { -+ arg_max_oc0 = 2265600; -+ printk(KERN_INFO "[elementalx]: max_oc0='%i'\n", arg_max_oc0); -+ return 1; -+ } -+ -+ arg_max_oc0 = ui_khz; -+ -+ return 0; -+} -+__setup("max_oc0=", cpufreq_read_arg_max_oc0); -+ -+static int __init cpufreq_read_arg_max_oc1(char *max_oc1) -+{ -+ unsigned long ui_khz; -+ int err; -+ err = strict_strtoul(max_oc1, 0, &ui_khz); -+ if (err) { -+ arg_max_oc1 = 2265600; -+ printk(KERN_INFO "[elementalx]: max_oc1='%i'\n", arg_max_oc1); -+ return 1; -+ } -+ -+ arg_max_oc1 = ui_khz; -+ -+ return 0; -+} -+__setup("max_oc1=", cpufreq_read_arg_max_oc1); -+ -+static int __init cpufreq_read_arg_max_oc2(char *max_oc2) -+{ -+ unsigned long ui_khz; -+ int err; -+ err = strict_strtoul(max_oc2, 0, &ui_khz); -+ if (err) { -+ arg_max_oc2 = 2265600; -+ printk(KERN_INFO "[elementalx]: max_oc2='%i'\n", arg_max_oc2); -+ return 1; -+ } -+ -+ arg_max_oc2 = ui_khz; -+ -+ return 0; -+} -+__setup("max_oc2=", cpufreq_read_arg_max_oc2); -+ -+static int __init cpufreq_read_arg_max_oc3(char *max_oc3) -+{ -+ unsigned long ui_khz; -+ int err; -+ err = strict_strtoul(max_oc3, 0, &ui_khz); -+ if (err) { -+ arg_max_oc3 = 2265600; -+ printk(KERN_INFO "[elementalx]: max_oc3='%i'\n", arg_max_oc3); -+ return 1; -+ } -+ -+ arg_max_oc3 = ui_khz; -+ -+ return 0; -+} -+__setup("max_oc3=", cpufreq_read_arg_max_oc3); -+ -+static int __init get_uv_level(char *vdd_uv) -+{ -+ if (strcmp(vdd_uv, "0") == 0) { -+ uv_bin = 0; -+ } else if (strcmp(vdd_uv, "1") == 0) { -+ uv_bin = 1; -+ } else if (strcmp(vdd_uv, "2") == 0) { -+ uv_bin = 2; -+ } else if (strcmp(vdd_uv, "3") == 0) { -+ uv_bin = 3; -+ } else if (strcmp(vdd_uv, "4") == 0) { -+ uv_bin = 4; -+ } else if (strcmp(vdd_uv, "5") == 0) { -+ uv_bin = 5; -+ } else if (strcmp(vdd_uv, "6") == 0) { -+ uv_bin = 6; -+ } else { -+ uv_bin = 0; -+ } -+ return 0; -+} -+ -+__setup("vdd_uv=", get_uv_level); -+ -+/** end elementalx defs **/ -+ -+ - static DEFINE_MUTEX(driver_lock); - static DEFINE_SPINLOCK(l2_lock); - -@@ -992,13 +1099,14 @@ static void __init cpufreq_table_init(void) - { - int cpu; - int freq_cnt = 0; -+ uint32_t limit_max_oc[4] = {arg_max_oc0, arg_max_oc1, arg_max_oc2, arg_max_oc3}; - - for_each_possible_cpu(cpu) { - int i; - /* Construct the freq_table tables from acpu_freq_tbl. */ - for (i = 0, freq_cnt = 0; drv.acpu_freq_tbl[i].speed.khz != 0 - && freq_cnt < ARRAY_SIZE(*freq_table); i++) { -- if (drv.acpu_freq_tbl[i].use_for_scaling) { -+ if (drv.acpu_freq_tbl[i].speed.khz <= limit_max_oc[cpu]) { - freq_table[cpu][freq_cnt].index = freq_cnt; - freq_table[cpu][freq_cnt].frequency - = drv.acpu_freq_tbl[i].speed.khz; -@@ -1109,6 +1217,39 @@ static void __init krait_apply_vmin(struct acpu_level *tbl) - } - } - -+static void apply_undervolting(void) -+{ -+ if (uv_bin == 6) { -+ drv.acpu_freq_tbl[0].vdd_core = 625000; -+ printk(KERN_INFO "[elementalx]: min_voltage='%i'\n", drv.acpu_freq_tbl[0].vdd_core ); -+ } -+ -+ if (uv_bin == 5) { -+ drv.acpu_freq_tbl[0].vdd_core = 650000; -+ printk(KERN_INFO "[elementalx]: min_voltage='%i'\n", drv.acpu_freq_tbl[0].vdd_core ); -+ } -+ -+ if (uv_bin == 4) { -+ drv.acpu_freq_tbl[0].vdd_core = 675000; -+ printk(KERN_INFO "[elementalx]: min_voltage='%i'\n", drv.acpu_freq_tbl[0].vdd_core ); -+ } -+ -+ if (uv_bin == 3) { -+ drv.acpu_freq_tbl[0].vdd_core = 700000; -+ printk(KERN_INFO "[elementalx]: min_voltage='%i'\n", drv.acpu_freq_tbl[0].vdd_core ); -+ } -+ -+ if (uv_bin == 2) { -+ drv.acpu_freq_tbl[0].vdd_core = 725000; -+ printk(KERN_INFO "[elementalx]: min_voltage='%i'\n", drv.acpu_freq_tbl[0].vdd_core ); -+ } -+ -+ if (uv_bin == 1) { -+ drv.acpu_freq_tbl[0].vdd_core = 750000; -+ printk(KERN_INFO "[elementalx]: min_voltage='%i'\n", drv.acpu_freq_tbl[0].vdd_core ); -+ } -+} -+ - void __init get_krait_bin_format_a(void __iomem *base, struct bin_info *bin) - { - u32 pte_efuse = readl_relaxed(base); -@@ -1143,6 +1284,8 @@ void __init get_krait_bin_format_b(void __iomem *base, struct bin_info *bin) - } - bin->speed_valid = true; - -+ pvs_number = bin->pvs; -+ - /* Check PVS_BLOW_STATUS */ - pte_efuse = readl_relaxed(base + 0x4); - bin->pvs_valid = !!(pte_efuse & BIT(21)); -@@ -1229,6 +1372,9 @@ static void __init hw_init(void) - if (krait_needs_vmin()) - krait_apply_vmin(drv.acpu_freq_tbl); - -+ if (uv_bin) -+ apply_undervolting(); -+ - l2->hfpll_base = ioremap(l2->hfpll_phys_base, SZ_32); - BUG_ON(!l2->hfpll_base); - --- -2.9.3 - - -From cbc2f6c8893c773d4dbdf9d5f538f6b44a02baa4 Mon Sep 17 00:00:00 2001 -From: flar2 -Date: Sat, 9 Nov 2013 08:43:31 -0500 -Subject: [PATCH 4/5] L2 cache and bus bandwidth overclocking - -Signed-off-by: flar2 ---- - arch/arm/mach-msm/acpuclock-8974.c | 46 +++++++++++++++++++++++++++++++++++++ - arch/arm/mach-msm/acpuclock-krait.c | 2 +- - 2 files changed, 47 insertions(+), 1 deletion(-) - -diff --git a/arch/arm/mach-msm/acpuclock-8974.c b/arch/arm/mach-msm/acpuclock-8974.c -index cb878d9..933bd0e 100644 ---- a/arch/arm/mach-msm/acpuclock-8974.c -+++ b/arch/arm/mach-msm/acpuclock-8974.c -@@ -28,6 +28,8 @@ - #define LVL_NOM RPM_REGULATOR_CORNER_NORMAL - #define LVL_HIGH RPM_REGULATOR_CORNER_SUPER_TURBO - -+static int opt_bin = 0; -+ - static struct hfpll_data hfpll_data __initdata = { - .mode_offset = 0x00, - .l_offset = 0x04, -@@ -257,6 +259,7 @@ static struct msm_bus_paths bw_level_tbl_v2[] __initdata = { - [6] = BW_MBPS(4912), /* At least 614 MHz on bus. */ - [7] = BW_MBPS(6400), /* At least 800 MHz on bus. */ - [8] = BW_MBPS(7448), /* At least 931 MHz on bus. */ -+ [9] = BW_MBPS(8000), /* At least 1000 MHz on bus. */ - }; - - static struct l2_level l2_freq_tbl_v2[] __initdata = { -@@ -283,6 +286,30 @@ static struct l2_level l2_freq_tbl_v2[] __initdata = { - { } - }; - -+static struct l2_level l2_freq_tbl_v2_elementalx[] __initdata = { -+ [0] = { { 300000, PLL_0, 0, 0 }, LVL_LOW, 950000, 0 }, -+ [1] = { { 345600, HFPLL, 2, 36 }, LVL_LOW, 950000, 1 }, -+ [2] = { { 422400, HFPLL, 2, 44 }, LVL_LOW, 950000, 2 }, -+ [3] = { { 499200, HFPLL, 2, 52 }, LVL_LOW, 950000, 3 }, -+ [4] = { { 576000, HFPLL, 1, 30 }, LVL_LOW, 950000, 4 }, -+ [5] = { { 652800, HFPLL, 1, 34 }, LVL_NOM, 950000, 4 }, -+ [6] = { { 729600, HFPLL, 1, 38 }, LVL_NOM, 950000, 4 }, -+ [7] = { { 806400, HFPLL, 1, 42 }, LVL_NOM, 950000, 4 }, -+ [8] = { { 883200, HFPLL, 1, 46 }, LVL_NOM, 950000, 5 }, -+ [9] = { { 960000, HFPLL, 1, 50 }, LVL_NOM, 950000, 5 }, -+ [10] = { { 1036800, HFPLL, 1, 54 }, LVL_NOM, 950000, 5 }, -+ [11] = { { 1113600, HFPLL, 1, 58 }, LVL_HIGH, 1050000, 6 }, -+ [12] = { { 1190400, HFPLL, 1, 62 }, LVL_HIGH, 1050000, 6 }, -+ [13] = { { 1267200, HFPLL, 1, 66 }, LVL_HIGH, 1050000, 6 }, -+ [14] = { { 1344000, HFPLL, 1, 70 }, LVL_HIGH, 1050000, 6 }, -+ [15] = { { 1420800, HFPLL, 1, 74 }, LVL_HIGH, 1050000, 6 }, -+ [16] = { { 1497600, HFPLL, 1, 78 }, LVL_HIGH, 1050000, 6 }, -+ [17] = { { 1574400, HFPLL, 1, 82 }, LVL_HIGH, 1050000, 7 }, -+ [18] = { { 1651200, HFPLL, 1, 86 }, LVL_HIGH, 1050000, 7 }, -+ [19] = { { 1804800, HFPLL, 1, 94 }, LVL_HIGH, 1050000, 9 }, -+ { } -+}; -+ - static struct acpu_level acpu_freq_tbl_2g_pvs0[] __initdata = { - { 1, { 300000, PLL_0, 0, 0 }, L2(0), 815000, 73 }, - { 0, { 345600, HFPLL, 2, 36 }, L2(1), 825000, 85 }, -@@ -1003,6 +1030,20 @@ static struct acpuclk_krait_params acpuclk_8974_params __initdata = { - .stby_khz = 300000, - }; - -+static int __init get_opt_level(char *l2_opt) -+{ -+ if (strcmp(l2_opt, "0") == 0) { -+ opt_bin = 0; -+ } else if (strcmp(l2_opt, "1") == 0) { -+ opt_bin = 1; -+ } else { -+ opt_bin = 0; -+ } -+ return 0; -+} -+ -+__setup("l2_opt=", get_opt_level); -+ - static void __init apply_v1_l2_workaround(void) - { - static struct l2_level resticted_l2_tbl[] __initdata = { -@@ -1042,6 +1083,11 @@ static int __init acpuclk_8974_probe(struct platform_device *pdev) - apply_v1_l2_workaround(); - } - -+ if (opt_bin == 1) { -+ acpuclk_8974_params.l2_freq_tbl = l2_freq_tbl_v2_elementalx; -+ acpuclk_8974_params.l2_freq_tbl_size = sizeof(l2_freq_tbl_v2_elementalx); -+ } -+ - return acpuclk_krait_init(&pdev->dev, &acpuclk_8974_params); - } - -diff --git a/arch/arm/mach-msm/acpuclock-krait.c b/arch/arm/mach-msm/acpuclock-krait.c -index bcd3e44..a1c8fbb 100644 ---- a/arch/arm/mach-msm/acpuclock-krait.c -+++ b/arch/arm/mach-msm/acpuclock-krait.c -@@ -47,7 +47,7 @@ - - - /** elementalx defs **/ --static int uv_bin = 2; -+static int uv_bin = 0; - static uint32_t arg_max_oc0 = 2265600; - static uint32_t arg_max_oc1 = 2265600; - static uint32_t arg_max_oc2 = 2265600; --- -2.9.3 - - -From bfd08d2e2a997ac4f5b6e8353be663472643b746 Mon Sep 17 00:00:00 2001 -From: flar2 -Date: Mon, 11 Nov 2013 00:42:12 -0500 -Subject: [PATCH 5/5] More overclocking options - -Signed-off-by: flar2 ---- - arch/arm/mach-msm/acpuclock-8974.c | 50 ++++++++++++++++++++++++++++++++++++++ - 1 file changed, 50 insertions(+) - -diff --git a/arch/arm/mach-msm/acpuclock-8974.c b/arch/arm/mach-msm/acpuclock-8974.c -index 933bd0e..b436816 100644 ---- a/arch/arm/mach-msm/acpuclock-8974.c -+++ b/arch/arm/mach-msm/acpuclock-8974.c -@@ -310,6 +310,29 @@ static struct l2_level l2_freq_tbl_v2_elementalx[] __initdata = { - { } - }; - -+static struct l2_level l2_freq_tbl_v2_ultra[] __initdata = { -+ [0] = { { 300000, PLL_0, 0, 0 }, LVL_LOW, 950000, 0 }, -+ [1] = { { 345600, HFPLL, 2, 36 }, LVL_LOW, 950000, 1 }, -+ [2] = { { 422400, HFPLL, 2, 44 }, LVL_LOW, 950000, 2 }, -+ [3] = { { 499200, HFPLL, 2, 52 }, LVL_LOW, 950000, 3 }, -+ [4] = { { 576000, HFPLL, 1, 30 }, LVL_LOW, 950000, 4 }, -+ [5] = { { 652800, HFPLL, 1, 34 }, LVL_NOM, 950000, 4 }, -+ [6] = { { 729600, HFPLL, 1, 38 }, LVL_NOM, 950000, 4 }, -+ [7] = { { 806400, HFPLL, 1, 42 }, LVL_NOM, 950000, 4 }, -+ [8] = { { 883200, HFPLL, 1, 46 }, LVL_NOM, 950000, 5 }, -+ [9] = { { 960000, HFPLL, 1, 50 }, LVL_NOM, 950000, 5 }, -+ [10] = { { 1036800, HFPLL, 1, 54 }, LVL_NOM, 950000, 5 }, -+ [11] = { { 1113600, HFPLL, 1, 58 }, LVL_HIGH, 1050000, 6 }, -+ [12] = { { 1190400, HFPLL, 1, 62 }, LVL_HIGH, 1050000, 6 }, -+ [13] = { { 1267200, HFPLL, 1, 66 }, LVL_HIGH, 1050000, 6 }, -+ [14] = { { 1344000, HFPLL, 1, 70 }, LVL_HIGH, 1050000, 6 }, -+ [15] = { { 1420800, HFPLL, 1, 74 }, LVL_HIGH, 1050000, 6 }, -+ [16] = { { 1497600, HFPLL, 1, 78 }, LVL_HIGH, 1050000, 6 }, -+ [17] = { { 1574400, HFPLL, 1, 82 }, LVL_HIGH, 1050000, 7 }, -+ [18] = { { 1651200, HFPLL, 1, 86 }, LVL_HIGH, 1050000, 7 }, -+ [19] = { { 1920000, HFPLL, 1, 100 }, LVL_HIGH, 1050000, 9 }, -+ { } -+}; - static struct acpu_level acpu_freq_tbl_2g_pvs0[] __initdata = { - { 1, { 300000, PLL_0, 0, 0 }, L2(0), 815000, 73 }, - { 0, { 345600, HFPLL, 2, 36 }, L2(1), 825000, 85 }, -@@ -743,6 +766,9 @@ static struct acpu_level acpu_freq_tbl_2p3g_pvs0[] __initdata = { - { 1, { 2572800, HFPLL, 1, 134 }, L2(19), 1160000, 784 }, - { 1, { 2649600, HFPLL, 1, 138 }, L2(19), 1175000, 808 }, - { 1, { 2726400, HFPLL, 1, 142 }, L2(19), 1195000, 831 }, -+ { 1, { 2803200, HFPLL, 1, 146 }, L2(19), 1195000, 854 }, -+ { 1, { 2880000, HFPLL, 1, 150 }, L2(19), 1195000, 876 }, -+ { 1, { 2956800, HFPLL, 1, 154 }, L2(19), 1195000, 897 }, - { 0, { 0 } } - }; - -@@ -780,6 +806,9 @@ static struct acpu_level acpu_freq_tbl_2p3g_pvs1[] __initdata = { - { 1, { 2572800, HFPLL, 1, 134 }, L2(19), 1135000, 784 }, - { 1, { 2649600, HFPLL, 1, 138 }, L2(19), 1150000, 808 }, - { 1, { 2726400, HFPLL, 1, 142 }, L2(19), 1165000, 831 }, -+ { 1, { 2803200, HFPLL, 1, 146 }, L2(19), 1180000, 854 }, -+ { 1, { 2880000, HFPLL, 1, 150 }, L2(19), 1195000, 876 }, -+ { 1, { 2956800, HFPLL, 1, 154 }, L2(19), 1195000, 897 }, - { 0, { 0 } } - }; - -@@ -817,6 +846,9 @@ static struct acpu_level acpu_freq_tbl_2p3g_pvs2[] __initdata = { - { 1, { 2572800, HFPLL, 1, 134 }, L2(19), 1110000, 784 }, - { 1, { 2649600, HFPLL, 1, 138 }, L2(19), 1125000, 808 }, - { 1, { 2726400, HFPLL, 1, 142 }, L2(19), 1140000, 831 }, -+ { 1, { 2803200, HFPLL, 1, 146 }, L2(19), 1165000, 854 }, -+ { 1, { 2880000, HFPLL, 1, 150 }, L2(19), 1180000, 876 }, -+ { 1, { 2956800, HFPLL, 1, 154 }, L2(19), 1195000, 897 }, - { 0, { 0 } } - }; - -@@ -854,6 +886,9 @@ static struct acpu_level acpu_freq_tbl_2p3g_pvs3[] __initdata = { - { 1, { 2572800, HFPLL, 1, 134 }, L2(19), 1085000, 784 }, - { 1, { 2649600, HFPLL, 1, 138 }, L2(19), 1100000, 808 }, - { 1, { 2726400, HFPLL, 1, 142 }, L2(19), 1115000, 831 }, -+ { 1, { 2803200, HFPLL, 1, 146 }, L2(19), 1130000, 854 }, -+ { 1, { 2880000, HFPLL, 1, 150 }, L2(19), 1145000, 876 }, -+ { 1, { 2956800, HFPLL, 1, 154 }, L2(19), 1160000, 897 }, - { 0, { 0 } } - }; - -@@ -891,6 +926,9 @@ static struct acpu_level acpu_freq_tbl_2p3g_pvs4[] __initdata = { - { 1, { 2572800, HFPLL, 1, 134 }, L2(19), 1060000, 784 }, - { 1, { 2649600, HFPLL, 1, 138 }, L2(19), 1075000, 808 }, - { 1, { 2726400, HFPLL, 1, 142 }, L2(19), 1090000, 831 }, -+ { 1, { 2803200, HFPLL, 1, 146 }, L2(19), 1105000, 854 }, -+ { 1, { 2880000, HFPLL, 1, 150 }, L2(19), 1120000, 876 }, -+ { 1, { 2956800, HFPLL, 1, 154 }, L2(19), 1135000, 897 }, - { 0, { 0 } } - }; - -@@ -928,6 +966,9 @@ static struct acpu_level acpu_freq_tbl_2p3g_pvs5[] __initdata = { - { 1, { 2572800, HFPLL, 1, 134 }, L2(19), 1035000, 784 }, - { 1, { 2649600, HFPLL, 1, 138 }, L2(19), 1050000, 808 }, - { 1, { 2726400, HFPLL, 1, 142 }, L2(19), 1065000, 831 }, -+ { 1, { 2803200, HFPLL, 1, 146 }, L2(19), 1080000, 854 }, -+ { 1, { 2880000, HFPLL, 1, 150 }, L2(19), 1095000, 876 }, -+ { 1, { 2956800, HFPLL, 1, 154 }, L2(19), 1110000, 897 }, - { 0, { 0 } } - }; - -@@ -965,6 +1006,9 @@ static struct acpu_level acpu_freq_tbl_2p3g_pvs6[] __initdata = { - { 1, { 2572800, HFPLL, 1, 134 }, L2(19), 1005000, 784 }, - { 1, { 2649600, HFPLL, 1, 138 }, L2(19), 1020000, 808 }, - { 1, { 2726400, HFPLL, 1, 142 }, L2(19), 1035000, 831 }, -+ { 1, { 2803200, HFPLL, 1, 146 }, L2(19), 1050000, 854 }, -+ { 1, { 2880000, HFPLL, 1, 150 }, L2(19), 1065000, 876 }, -+ { 1, { 2956800, HFPLL, 1, 154 }, L2(19), 1080000, 897 }, - { 0, { 0 } } - }; - -@@ -1036,6 +1080,8 @@ static int __init get_opt_level(char *l2_opt) - opt_bin = 0; - } else if (strcmp(l2_opt, "1") == 0) { - opt_bin = 1; -+ } else if (strcmp(l2_opt, "2") == 0) { -+ opt_bin = 2; - } else { - opt_bin = 0; - } -@@ -1087,6 +1133,10 @@ static int __init acpuclk_8974_probe(struct platform_device *pdev) - acpuclk_8974_params.l2_freq_tbl = l2_freq_tbl_v2_elementalx; - acpuclk_8974_params.l2_freq_tbl_size = sizeof(l2_freq_tbl_v2_elementalx); - } -+ if (opt_bin == 2) { -+ acpuclk_8974_params.l2_freq_tbl = l2_freq_tbl_v2_ultra; -+ acpuclk_8974_params.l2_freq_tbl_size = sizeof(l2_freq_tbl_v2_ultra); -+ } - - return acpuclk_krait_init(&pdev->dev, &acpuclk_8974_params); - } --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_kernel_lge_mako/0001-OverUnderClock.patch b/Patches/CyanogenMod-14.1/android_kernel_lge_mako/0001-OverUnderClock.patch deleted file mode 100644 index d6341012..00000000 --- a/Patches/CyanogenMod-14.1/android_kernel_lge_mako/0001-OverUnderClock.patch +++ /dev/null @@ -1,609 +0,0 @@ -From 92d396b53cbdf91a7b61a857ca335f39cdb0f8bb Mon Sep 17 00:00:00 2001 -From: anarkia1976 -Date: Sun, 12 Jan 2014 20:26:27 +0100 -Subject: [PATCH 1/4] msm: cpu: overclock: added low (162Mhz) and high - (1944Mhz) cpu - ---- - arch/arm/mach-msm/Kconfig | 12 +++++ - arch/arm/mach-msm/acpuclock-8064.c | 91 +++++++++++++++++++++++++++++++++++++ - arch/arm/mach-msm/acpuclock-krait.c | 8 +++- - arch/arm/mach-msm/msm_dcvs.c | 5 ++ - 4 files changed, 115 insertions(+), 1 deletion(-) - -diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig -index 5f37d1d..b5ab505 100644 ---- a/arch/arm/mach-msm/Kconfig -+++ b/arch/arm/mach-msm/Kconfig -@@ -1634,6 +1634,18 @@ config MSM_CPU_FREQ_MIN - - endif # CPU_FREQ_MSM - -+config LOW_CPUCLOCKS -+ bool "Enable ultra low CPU clocks" -+ default n -+ help -+ Ultra low cpu frequencies enabled for CPU and L2 Cache -+ -+config CPU_OVERCLOCK -+ bool "Enable CPU Overclocking option" -+ default n -+ help -+ Krait overclocking up to 1.9 GHz -+ - config MSM_AVS_HW - bool "Enable Adaptive Voltage Scaling (AVS)" - default n -diff --git a/arch/arm/mach-msm/acpuclock-8064.c b/arch/arm/mach-msm/acpuclock-8064.c -index 8262946..f40edd3 100644 ---- a/arch/arm/mach-msm/acpuclock-8064.c -+++ b/arch/arm/mach-msm/acpuclock-8064.c -@@ -47,7 +47,11 @@ static struct scalable scalable[] __initdata = { - .aux_clk_sel = 3, - .sec_clk_sel = 2, - .l2cpmr_iaddr = 0x4501, -+#ifdef CONFIG_CPU_OVERCLOCK -+ .vreg[VREG_CORE] = { "krait0", 1450000 }, -+#else - .vreg[VREG_CORE] = { "krait0", 1300000 }, -+#endif - .vreg[VREG_MEM] = { "krait0_mem", 1150000 }, - .vreg[VREG_DIG] = { "krait0_dig", 1150000 }, - .vreg[VREG_HFPLL_A] = { "krait0_hfpll", 1800000 }, -@@ -58,7 +62,11 @@ static struct scalable scalable[] __initdata = { - .aux_clk_sel = 3, - .sec_clk_sel = 2, - .l2cpmr_iaddr = 0x5501, -+#ifdef CONFIG_CPU_OVERCLOCK -+ .vreg[VREG_CORE] = { "krait1", 1450000 }, -+#else - .vreg[VREG_CORE] = { "krait1", 1300000 }, -+#endif - .vreg[VREG_MEM] = { "krait1_mem", 1150000 }, - .vreg[VREG_DIG] = { "krait1_dig", 1150000 }, - .vreg[VREG_HFPLL_A] = { "krait1_hfpll", 1800000 }, -@@ -69,7 +77,11 @@ static struct scalable scalable[] __initdata = { - .aux_clk_sel = 3, - .sec_clk_sel = 2, - .l2cpmr_iaddr = 0x6501, -+#ifdef CONFIG_CPU_OVERCLOCK -+ .vreg[VREG_CORE] = { "krait2", 1450000 }, -+#else - .vreg[VREG_CORE] = { "krait2", 1300000 }, -+#endif - .vreg[VREG_MEM] = { "krait2_mem", 1150000 }, - .vreg[VREG_DIG] = { "krait2_dig", 1150000 }, - .vreg[VREG_HFPLL_A] = { "krait2_hfpll", 1800000 }, -@@ -80,7 +92,11 @@ static struct scalable scalable[] __initdata = { - .aux_clk_sel = 3, - .sec_clk_sel = 2, - .l2cpmr_iaddr = 0x7501, -+#ifdef CONFIG_CPU_OVERCLOCK -+ .vreg[VREG_CORE] = { "krait3", 1450000 }, -+#else - .vreg[VREG_CORE] = { "krait3", 1300000 }, -+#endif - .vreg[VREG_MEM] = { "krait3_mem", 1150000 }, - .vreg[VREG_DIG] = { "krait3_dig", 1150000 }, - .vreg[VREG_HFPLL_A] = { "krait3_hfpll", 1800000 }, -@@ -116,6 +132,24 @@ static struct msm_bus_scale_pdata bus_scale_data __initdata = { - }; - - static struct l2_level l2_freq_tbl[] __initdata = { -+#ifdef CONFIG_LOW_CPUCLOCKS -+ [0] = { { 378000, HFPLL, 2, 0x1C }, 950000, 1050000, 1 }, -+ [1] = { { 384000, PLL_8, 0, 0x00 }, 950000, 1050000, 1 }, -+ [2] = { { 432000, HFPLL, 2, 0x20 }, 1050000, 1050000, 2 }, -+ [3] = { { 486000, HFPLL, 2, 0x24 }, 1050000, 1050000, 2 }, -+ [4] = { { 540000, HFPLL, 2, 0x28 }, 1050000, 1050000, 2 }, -+ [5] = { { 594000, HFPLL, 1, 0x16 }, 1050000, 1050000, 2 }, -+ [6] = { { 648000, HFPLL, 1, 0x18 }, 1050000, 1050000, 4 }, -+ [7] = { { 702000, HFPLL, 1, 0x1A }, 1150000, 1150000, 4 }, -+ [8] = { { 756000, HFPLL, 1, 0x1C }, 1150000, 1150000, 4 }, -+ [9] = { { 810000, HFPLL, 1, 0x1E }, 1150000, 1150000, 4 }, -+ [10] = { { 864000, HFPLL, 1, 0x20 }, 1150000, 1150000, 4 }, -+ [11] = { { 918000, HFPLL, 1, 0x22 }, 1150000, 1150000, 5 }, -+ [12] = { { 972000, HFPLL, 1, 0x24 }, 1150000, 1150000, 5 }, -+ [13] = { { 1026000, HFPLL, 1, 0x26 }, 1150000, 1150000, 5 }, -+ [14] = { { 1080000, HFPLL, 1, 0x28 }, 1150000, 1150000, 5 }, -+ [15] = { { 1134000, HFPLL, 1, 0x2A }, 1150000, 1150000, 5 }, -+#else - [0] = { { 384000, PLL_8, 0, 0x00 }, 950000, 1050000, 1 }, - [1] = { { 432000, HFPLL, 2, 0x20 }, 1050000, 1050000, 2 }, - [2] = { { 486000, HFPLL, 2, 0x24 }, 1050000, 1050000, 2 }, -@@ -131,11 +165,19 @@ static struct l2_level l2_freq_tbl[] __initdata = { - [12] = { { 1026000, HFPLL, 1, 0x26 }, 1150000, 1150000, 5 }, - [13] = { { 1080000, HFPLL, 1, 0x28 }, 1150000, 1150000, 5 }, - [14] = { { 1134000, HFPLL, 1, 0x2A }, 1150000, 1150000, 5 }, -+#endif - { } - }; - - static struct acpu_level tbl_slow[] __initdata = { -+#ifdef CONFIG_LOW_CPUCLOCKS -+ { 1, { 162000, HFPLL, 2, 0x0C }, L2(0), 875000 }, -+ { 1, { 270000, HFPLL, 2, 0x14 }, L2(0), 900000 }, -+ //{ 1, { 378000, HFPLL, 2, 0x1C }, L2(0), 950000 }, -+ { 1, { 384000, PLL_8, 0, 0x00 }, L2(1), 925000 }, -+#else - { 1, { 384000, PLL_8, 0, 0x00 }, L2(0), 950000 }, -+#endif - { 0, { 432000, HFPLL, 2, 0x20 }, L2(5), 975000 }, - { 1, { 486000, HFPLL, 2, 0x24 }, L2(5), 975000 }, - { 0, { 540000, HFPLL, 2, 0x28 }, L2(5), 1000000 }, -@@ -157,11 +199,25 @@ static struct acpu_level tbl_slow[] __initdata = { - { 0, { 1404000, HFPLL, 1, 0x34 }, L2(14), 1237500 }, - { 1, { 1458000, HFPLL, 1, 0x36 }, L2(14), 1237500 }, - { 1, { 1512000, HFPLL, 1, 0x38 }, L2(14), 1250000 }, -+#ifdef CONFIG_CPU_OVERCLOCK -+ { 1, { 1620000, HFPLL, 1, 0x3C }, L2(15), 1300000 }, -+ { 1, { 1728000, HFPLL, 1, 0x40 }, L2(15), 1350000 }, -+ { 1, { 1836000, HFPLL, 1, 0x44 }, L2(15), 1400000 }, -+ { 1, { 1890000, HFPLL, 1, 0x45 }, L2(15), 1425000 }, -+ { 1, { 1944000, HFPLL, 1, 0x46 }, L2(15), 1450000 }, -+#endif - { 0, { 0 } } - }; - - static struct acpu_level tbl_nom[] __initdata = { -+#ifdef CONFIG_LOW_CPUCLOCKS -+ { 1, { 162000, HFPLL, 2, 0x0C }, L2(0), 825000 }, -+ { 1, { 270000, HFPLL, 2, 0x14 }, L2(0), 850000 }, -+ //{ 1, { 378000, HFPLL, 2, 0x1C }, L2(0), 900000 }, -+ { 1, { 384000, PLL_8, 0, 0x00 }, L2(1), 875000 }, -+#else - { 1, { 384000, PLL_8, 0, 0x00 }, L2(0), 900000 }, -+#endif - { 0, { 432000, HFPLL, 2, 0x20 }, L2(5), 925000 }, - { 1, { 486000, HFPLL, 2, 0x24 }, L2(5), 925000 }, - { 0, { 540000, HFPLL, 2, 0x28 }, L2(5), 950000 }, -@@ -183,11 +239,25 @@ static struct acpu_level tbl_nom[] __initdata = { - { 0, { 1404000, HFPLL, 1, 0x34 }, L2(14), 1187500 }, - { 1, { 1458000, HFPLL, 1, 0x36 }, L2(14), 1187500 }, - { 1, { 1512000, HFPLL, 1, 0x38 }, L2(14), 1200000 }, -+#ifdef CONFIG_CPU_OVERCLOCK -+ { 1, { 1620000, HFPLL, 1, 0x3C }, L2(15), 1250000 }, -+ { 1, { 1728000, HFPLL, 1, 0x40 }, L2(15), 1300000 }, -+ { 1, { 1836000, HFPLL, 1, 0x44 }, L2(15), 1350000 }, -+ { 1, { 1890000, HFPLL, 1, 0x45 }, L2(15), 1375000 }, -+ { 1, { 1944000, HFPLL, 1, 0x46 }, L2(15), 1400000 }, -+#endif - { 0, { 0 } } - }; - - static struct acpu_level tbl_fast[] __initdata = { -+#ifdef CONFIG_LOW_CPUCLOCKS -+ { 1, { 162000, HFPLL, 2, 0x0C }, L2(0), 775000 }, -+ { 1, { 270000, HFPLL, 2, 0x14 }, L2(0), 800000 }, -+ //{ 1, { 378000, HFPLL, 2, 0x1C }, L2(0), 850000 }, -+ { 1, { 384000, PLL_8, 0, 0x00 }, L2(1), 825000 }, -+#else - { 1, { 384000, PLL_8, 0, 0x00 }, L2(0), 850000 }, -+#endif - { 0, { 432000, HFPLL, 2, 0x20 }, L2(5), 875000 }, - { 1, { 486000, HFPLL, 2, 0x24 }, L2(5), 875000 }, - { 0, { 540000, HFPLL, 2, 0x28 }, L2(5), 900000 }, -@@ -209,11 +279,25 @@ static struct acpu_level tbl_fast[] __initdata = { - { 0, { 1404000, HFPLL, 1, 0x34 }, L2(14), 1137500 }, - { 1, { 1458000, HFPLL, 1, 0x36 }, L2(14), 1137500 }, - { 1, { 1512000, HFPLL, 1, 0x38 }, L2(14), 1150000 }, -+#ifdef CONFIG_CPU_OVERCLOCK -+ { 1, { 1620000, HFPLL, 1, 0x3C }, L2(15), 1200000 }, -+ { 1, { 1728000, HFPLL, 1, 0x40 }, L2(15), 1250000 }, -+ { 1, { 1836000, HFPLL, 1, 0x44 }, L2(15), 1300000 }, -+ { 1, { 1890000, HFPLL, 1, 0x45 }, L2(15), 1325000 }, -+ { 1, { 1944000, HFPLL, 1, 0x46 }, L2(15), 1350000 }, -+#endif - { 0, { 0 } } - }; - - static struct acpu_level tbl_faster[] __initdata = { -+#ifdef CONFIG_LOW_CPUCLOCKS -+ { 1, { 162000, HFPLL, 2, 0x0C }, L2(0), 775000 }, -+ { 1, { 270000, HFPLL, 2, 0x14 }, L2(0), 800000 }, -+ //{ 1, { 378000, HFPLL, 2, 0x1C }, L2(0), 850000 }, -+ { 1, { 384000, PLL_8, 0, 0x00 }, L2(1), 825000 }, -+#else - { 1, { 384000, PLL_8, 0, 0x00 }, L2(0), 850000 }, -+#endif - { 0, { 432000, HFPLL, 2, 0x20 }, L2(5), 875000 }, - { 1, { 486000, HFPLL, 2, 0x24 }, L2(5), 875000 }, - { 0, { 540000, HFPLL, 2, 0x28 }, L2(5), 900000 }, -@@ -235,6 +319,13 @@ static struct acpu_level tbl_faster[] __initdata = { - { 0, { 1404000, HFPLL, 1, 0x34 }, L2(14), 1112500 }, - { 1, { 1458000, HFPLL, 1, 0x36 }, L2(14), 1112500 }, - { 1, { 1512000, HFPLL, 1, 0x38 }, L2(14), 1125000 }, -+#ifdef CONFIG_CPU_OVERCLOCK -+ { 1, { 1620000, HFPLL, 1, 0x3C }, L2(15), 1150000 }, -+ { 1, { 1728000, HFPLL, 1, 0x40 }, L2(15), 1200000 }, -+ { 1, { 1836000, HFPLL, 1, 0x44 }, L2(15), 1250000 }, -+ { 1, { 1890000, HFPLL, 1, 0x45 }, L2(15), 1275000 }, -+ { 1, { 1944000, HFPLL, 1, 0x46 }, L2(15), 1300000 }, -+#endif - { 0, { 0 } } - }; - -diff --git a/arch/arm/mach-msm/acpuclock-krait.c b/arch/arm/mach-msm/acpuclock-krait.c -index e3a3f54..97f6f39 100644 ---- a/arch/arm/mach-msm/acpuclock-krait.c -+++ b/arch/arm/mach-msm/acpuclock-krait.c -@@ -45,6 +45,12 @@ - #define PRI_SRC_SEL_HFPLL 1 - #define PRI_SRC_SEL_HFPLL_DIV2 2 - -+#ifdef CONFIG_LOW_CPUCLOCKS -+#define FREQ_TABLE_SIZE 39 -+#else -+#define FREQ_TABLE_SIZE 35 -+#endif -+ - static DEFINE_MUTEX(driver_lock); - static DEFINE_SPINLOCK(l2_lock); - -@@ -913,7 +919,7 @@ static void __init bus_init(const struct l2_level *l2_level) - } - - #ifdef CONFIG_CPU_FREQ_MSM --static struct cpufreq_frequency_table freq_table[NR_CPUS][35]; -+static struct cpufreq_frequency_table freq_table[NR_CPUS][FREQ_TABLE_SIZE]; - - static void __init cpufreq_table_init(void) - { -diff --git a/arch/arm/mach-msm/msm_dcvs.c b/arch/arm/mach-msm/msm_dcvs.c -index 1a919fc..1d5e289 100644 ---- a/arch/arm/mach-msm/msm_dcvs.c -+++ b/arch/arm/mach-msm/msm_dcvs.c -@@ -146,7 +146,12 @@ static struct dcvs_core core_list[CORES_MAX]; - - static struct kobject *cores_kobj; - -+#ifdef CONFIG_CPU_OVERCLOCK -+#define DCVS_MAX_NUM_FREQS 20 -+#else - #define DCVS_MAX_NUM_FREQS 15 -+#endif -+ - static struct msm_dcvs_freq_entry cpu_freq_tbl[DCVS_MAX_NUM_FREQS]; - static unsigned num_cpu_freqs; - static struct msm_dcvs_platform_data *dcvs_pdata; --- -2.10.2 - - -From f498c327190b1a30c25010e0ba3600470fc9251b Mon Sep 17 00:00:00 2001 -From: anarkia1976 -Date: Wed, 5 Feb 2014 07:15:12 +0100 -Subject: [PATCH 2/4] msm: cpu: overclock: added ultra low (81Mhz) cpu clock - frequencies - ---- - arch/arm/mach-msm/acpuclock-8064.c | 4 ++++ - arch/arm/mach-msm/acpuclock-krait.c | 2 +- - 2 files changed, 5 insertions(+), 1 deletion(-) - -diff --git a/arch/arm/mach-msm/acpuclock-8064.c b/arch/arm/mach-msm/acpuclock-8064.c -index f40edd3..ba8fe72 100644 ---- a/arch/arm/mach-msm/acpuclock-8064.c -+++ b/arch/arm/mach-msm/acpuclock-8064.c -@@ -171,6 +171,7 @@ static struct l2_level l2_freq_tbl[] __initdata = { - - static struct acpu_level tbl_slow[] __initdata = { - #ifdef CONFIG_LOW_CPUCLOCKS -+ { 1, { 81000, HFPLL, 2, 0x06 }, L2(0), 750000 }, - { 1, { 162000, HFPLL, 2, 0x0C }, L2(0), 875000 }, - { 1, { 270000, HFPLL, 2, 0x14 }, L2(0), 900000 }, - //{ 1, { 378000, HFPLL, 2, 0x1C }, L2(0), 950000 }, -@@ -211,6 +212,7 @@ static struct acpu_level tbl_slow[] __initdata = { - - static struct acpu_level tbl_nom[] __initdata = { - #ifdef CONFIG_LOW_CPUCLOCKS -+ { 1, { 81000, HFPLL, 2, 0x06 }, L2(0), 750000 }, - { 1, { 162000, HFPLL, 2, 0x0C }, L2(0), 825000 }, - { 1, { 270000, HFPLL, 2, 0x14 }, L2(0), 850000 }, - //{ 1, { 378000, HFPLL, 2, 0x1C }, L2(0), 900000 }, -@@ -251,6 +253,7 @@ static struct acpu_level tbl_nom[] __initdata = { - - static struct acpu_level tbl_fast[] __initdata = { - #ifdef CONFIG_LOW_CPUCLOCKS -+ { 1, { 81000, HFPLL, 2, 0x06 }, L2(0), 750000 }, - { 1, { 162000, HFPLL, 2, 0x0C }, L2(0), 775000 }, - { 1, { 270000, HFPLL, 2, 0x14 }, L2(0), 800000 }, - //{ 1, { 378000, HFPLL, 2, 0x1C }, L2(0), 850000 }, -@@ -291,6 +294,7 @@ static struct acpu_level tbl_fast[] __initdata = { - - static struct acpu_level tbl_faster[] __initdata = { - #ifdef CONFIG_LOW_CPUCLOCKS -+ { 1, { 81000, HFPLL, 2, 0x06 }, L2(0), 750000 }, - { 1, { 162000, HFPLL, 2, 0x0C }, L2(0), 775000 }, - { 1, { 270000, HFPLL, 2, 0x14 }, L2(0), 800000 }, - //{ 1, { 378000, HFPLL, 2, 0x1C }, L2(0), 850000 }, -diff --git a/arch/arm/mach-msm/acpuclock-krait.c b/arch/arm/mach-msm/acpuclock-krait.c -index 97f6f39..695b709 100644 ---- a/arch/arm/mach-msm/acpuclock-krait.c -+++ b/arch/arm/mach-msm/acpuclock-krait.c -@@ -46,7 +46,7 @@ - #define PRI_SRC_SEL_HFPLL_DIV2 2 - - #ifdef CONFIG_LOW_CPUCLOCKS --#define FREQ_TABLE_SIZE 39 -+#define FREQ_TABLE_SIZE 40 - #else - #define FREQ_TABLE_SIZE 35 - #endif --- -2.10.2 - - -From 0eb77b9339850d3a7a9854197f2d02756270e5af Mon Sep 17 00:00:00 2001 -From: anarkia1976 -Date: Sun, 12 Jan 2014 21:12:55 +0100 -Subject: [PATCH 3/4] ak_mako_defconfig: enable LOW_CPU and CPU_OVERCLOCK - ---- - arch/arm/configs/cyanogen_mako_defconfig | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/arch/arm/configs/cyanogen_mako_defconfig b/arch/arm/configs/cyanogen_mako_defconfig -index 316b320..1059cb6 100644 ---- a/arch/arm/configs/cyanogen_mako_defconfig -+++ b/arch/arm/configs/cyanogen_mako_defconfig -@@ -451,6 +451,8 @@ CONFIG_MSM_IPC_ROUTER_SMD_XPRT=y - # CONFIG_MSM_IPC_ROUTER_SECURITY is not set - # CONFIG_MSM_DALRPC is not set - # CONFIG_MSM_CPU_FREQ_SET_MIN_MAX is not set -+CONFIG_LOW_CPUCLOCKS=y -+CONFIG_CPU_OVERCLOCK=y - CONFIG_MSM_AVS_HW=y - # CONFIG_MSM_HW3D is not set - CONFIG_AMSS_7X25_VERSION_2009=y --- -2.10.2 - - -From cc891d49f60d6d0ad4d570c14711db9a568b49e5 Mon Sep 17 00:00:00 2001 -From: anarkia1976 -Date: Wed, 5 Feb 2014 07:12:48 +0100 -Subject: [PATCH 4/4] msm: cpu: overclock: use higher bus speed at lower CPU - freqs - -Thanks to @bedalus and @mrg666 - -Bedalus suggested that if lower CPU frequencies can offer higher bus -speed, -GPU use during games wouldn't require higher CPU frequency. -My testing demonstrated 4C drop in CPU temp during 3DMark benchmark. -Still needs to be tested for everyday use. ---- - arch/arm/mach-msm/acpuclock-8064.c | 172 +++++++++++++++++++------------------ - 1 file changed, 88 insertions(+), 84 deletions(-) - -diff --git a/arch/arm/mach-msm/acpuclock-8064.c b/arch/arm/mach-msm/acpuclock-8064.c -index ba8fe72..611776e 100644 ---- a/arch/arm/mach-msm/acpuclock-8064.c -+++ b/arch/arm/mach-msm/acpuclock-8064.c -@@ -131,6 +131,14 @@ static struct msm_bus_scale_pdata bus_scale_data __initdata = { - .name = "acpuclk-8064", - }; - -+#ifdef CONFIG_LOW_CPUCLOCKS -+#define L2_BW_MID 6 -+#define L2_BW_HIGH 15 -+#else -+#define L2_BW_MID 5 -+#define L2_BW_HIGH 14 -+#endif -+ - static struct l2_level l2_freq_tbl[] __initdata = { - #ifdef CONFIG_LOW_CPUCLOCKS - [0] = { { 378000, HFPLL, 2, 0x1C }, 950000, 1050000, 1 }, -@@ -174,32 +182,31 @@ static struct acpu_level tbl_slow[] __initdata = { - { 1, { 81000, HFPLL, 2, 0x06 }, L2(0), 750000 }, - { 1, { 162000, HFPLL, 2, 0x0C }, L2(0), 875000 }, - { 1, { 270000, HFPLL, 2, 0x14 }, L2(0), 900000 }, -- //{ 1, { 378000, HFPLL, 2, 0x1C }, L2(0), 950000 }, - { 1, { 384000, PLL_8, 0, 0x00 }, L2(1), 925000 }, - #else - { 1, { 384000, PLL_8, 0, 0x00 }, L2(0), 950000 }, - #endif -- { 0, { 432000, HFPLL, 2, 0x20 }, L2(5), 975000 }, -- { 1, { 486000, HFPLL, 2, 0x24 }, L2(5), 975000 }, -- { 0, { 540000, HFPLL, 2, 0x28 }, L2(5), 1000000 }, -- { 1, { 594000, HFPLL, 1, 0x16 }, L2(5), 1000000 }, -- { 0, { 648000, HFPLL, 1, 0x18 }, L2(5), 1025000 }, -- { 1, { 702000, HFPLL, 1, 0x1A }, L2(5), 1025000 }, -- { 0, { 756000, HFPLL, 1, 0x1C }, L2(5), 1075000 }, -- { 1, { 810000, HFPLL, 1, 0x1E }, L2(5), 1075000 }, -- { 0, { 864000, HFPLL, 1, 0x20 }, L2(5), 1100000 }, -- { 1, { 918000, HFPLL, 1, 0x22 }, L2(5), 1100000 }, -- { 0, { 972000, HFPLL, 1, 0x24 }, L2(5), 1125000 }, -- { 1, { 1026000, HFPLL, 1, 0x26 }, L2(5), 1125000 }, -- { 0, { 1080000, HFPLL, 1, 0x28 }, L2(14), 1175000 }, -- { 1, { 1134000, HFPLL, 1, 0x2A }, L2(14), 1175000 }, -- { 0, { 1188000, HFPLL, 1, 0x2C }, L2(14), 1200000 }, -- { 1, { 1242000, HFPLL, 1, 0x2E }, L2(14), 1200000 }, -- { 0, { 1296000, HFPLL, 1, 0x30 }, L2(14), 1225000 }, -- { 1, { 1350000, HFPLL, 1, 0x32 }, L2(14), 1225000 }, -- { 0, { 1404000, HFPLL, 1, 0x34 }, L2(14), 1237500 }, -- { 1, { 1458000, HFPLL, 1, 0x36 }, L2(14), 1237500 }, -- { 1, { 1512000, HFPLL, 1, 0x38 }, L2(14), 1250000 }, -+ { 0, { 432000, HFPLL, 2, 0x20 }, L2(L2_BW_MID), 975000 }, -+ { 1, { 486000, HFPLL, 2, 0x24 }, L2(L2_BW_MID), 975000 }, -+ { 0, { 540000, HFPLL, 2, 0x28 }, L2(L2_BW_MID), 1000000 }, -+ { 1, { 594000, HFPLL, 1, 0x16 }, L2(L2_BW_MID), 1000000 }, -+ { 0, { 648000, HFPLL, 1, 0x18 }, L2(L2_BW_MID), 1025000 }, -+ { 1, { 702000, HFPLL, 1, 0x1A }, L2(L2_BW_HIGH), 1025000 }, -+ { 0, { 756000, HFPLL, 1, 0x1C }, L2(L2_BW_HIGH), 1075000 }, -+ { 1, { 810000, HFPLL, 1, 0x1E }, L2(L2_BW_HIGH), 1075000 }, -+ { 0, { 864000, HFPLL, 1, 0x20 }, L2(L2_BW_HIGH), 1100000 }, -+ { 1, { 918000, HFPLL, 1, 0x22 }, L2(L2_BW_HIGH), 1100000 }, -+ { 0, { 972000, HFPLL, 1, 0x24 }, L2(L2_BW_HIGH), 1125000 }, -+ { 1, { 1026000, HFPLL, 1, 0x26 }, L2(L2_BW_HIGH), 1125000 }, -+ { 0, { 1080000, HFPLL, 1, 0x28 }, L2(L2_BW_HIGH), 1175000 }, -+ { 1, { 1134000, HFPLL, 1, 0x2A }, L2(L2_BW_HIGH), 1175000 }, -+ { 0, { 1188000, HFPLL, 1, 0x2C }, L2(L2_BW_HIGH), 1200000 }, -+ { 1, { 1242000, HFPLL, 1, 0x2E }, L2(L2_BW_HIGH), 1200000 }, -+ { 0, { 1296000, HFPLL, 1, 0x30 }, L2(L2_BW_HIGH), 1225000 }, -+ { 1, { 1350000, HFPLL, 1, 0x32 }, L2(L2_BW_HIGH), 1225000 }, -+ { 0, { 1404000, HFPLL, 1, 0x34 }, L2(L2_BW_HIGH), 1237500 }, -+ { 1, { 1458000, HFPLL, 1, 0x36 }, L2(L2_BW_HIGH), 1237500 }, -+ { 1, { 1512000, HFPLL, 1, 0x38 }, L2(L2_BW_HIGH), 1250000 }, - #ifdef CONFIG_CPU_OVERCLOCK - { 1, { 1620000, HFPLL, 1, 0x3C }, L2(15), 1300000 }, - { 1, { 1728000, HFPLL, 1, 0x40 }, L2(15), 1350000 }, -@@ -215,32 +222,31 @@ static struct acpu_level tbl_nom[] __initdata = { - { 1, { 81000, HFPLL, 2, 0x06 }, L2(0), 750000 }, - { 1, { 162000, HFPLL, 2, 0x0C }, L2(0), 825000 }, - { 1, { 270000, HFPLL, 2, 0x14 }, L2(0), 850000 }, -- //{ 1, { 378000, HFPLL, 2, 0x1C }, L2(0), 900000 }, - { 1, { 384000, PLL_8, 0, 0x00 }, L2(1), 875000 }, - #else - { 1, { 384000, PLL_8, 0, 0x00 }, L2(0), 900000 }, - #endif -- { 0, { 432000, HFPLL, 2, 0x20 }, L2(5), 925000 }, -- { 1, { 486000, HFPLL, 2, 0x24 }, L2(5), 925000 }, -- { 0, { 540000, HFPLL, 2, 0x28 }, L2(5), 950000 }, -- { 1, { 594000, HFPLL, 1, 0x16 }, L2(5), 950000 }, -- { 0, { 648000, HFPLL, 1, 0x18 }, L2(5), 975000 }, -- { 1, { 702000, HFPLL, 1, 0x1A }, L2(5), 975000 }, -- { 0, { 756000, HFPLL, 1, 0x1C }, L2(5), 1025000 }, -- { 1, { 810000, HFPLL, 1, 0x1E }, L2(5), 1025000 }, -- { 0, { 864000, HFPLL, 1, 0x20 }, L2(5), 1050000 }, -- { 1, { 918000, HFPLL, 1, 0x22 }, L2(5), 1050000 }, -- { 0, { 972000, HFPLL, 1, 0x24 }, L2(5), 1075000 }, -- { 1, { 1026000, HFPLL, 1, 0x26 }, L2(5), 1075000 }, -- { 0, { 1080000, HFPLL, 1, 0x28 }, L2(14), 1125000 }, -- { 1, { 1134000, HFPLL, 1, 0x2A }, L2(14), 1125000 }, -- { 0, { 1188000, HFPLL, 1, 0x2C }, L2(14), 1150000 }, -- { 1, { 1242000, HFPLL, 1, 0x2E }, L2(14), 1150000 }, -- { 0, { 1296000, HFPLL, 1, 0x30 }, L2(14), 1175000 }, -- { 1, { 1350000, HFPLL, 1, 0x32 }, L2(14), 1175000 }, -- { 0, { 1404000, HFPLL, 1, 0x34 }, L2(14), 1187500 }, -- { 1, { 1458000, HFPLL, 1, 0x36 }, L2(14), 1187500 }, -- { 1, { 1512000, HFPLL, 1, 0x38 }, L2(14), 1200000 }, -+ { 0, { 432000, HFPLL, 2, 0x20 }, L2(L2_BW_MID), 925000 }, -+ { 1, { 486000, HFPLL, 2, 0x24 }, L2(L2_BW_MID), 925000 }, -+ { 0, { 540000, HFPLL, 2, 0x28 }, L2(L2_BW_MID), 950000 }, -+ { 1, { 594000, HFPLL, 1, 0x16 }, L2(L2_BW_MID), 950000 }, -+ { 0, { 648000, HFPLL, 1, 0x18 }, L2(L2_BW_MID), 975000 }, -+ { 1, { 702000, HFPLL, 1, 0x1A }, L2(L2_BW_HIGH), 975000 }, -+ { 0, { 756000, HFPLL, 1, 0x1C }, L2(L2_BW_HIGH), 1025000 }, -+ { 1, { 810000, HFPLL, 1, 0x1E }, L2(L2_BW_HIGH), 1025000 }, -+ { 0, { 864000, HFPLL, 1, 0x20 }, L2(L2_BW_HIGH), 1050000 }, -+ { 1, { 918000, HFPLL, 1, 0x22 }, L2(L2_BW_HIGH), 1050000 }, -+ { 0, { 972000, HFPLL, 1, 0x24 }, L2(L2_BW_HIGH), 1075000 }, -+ { 1, { 1026000, HFPLL, 1, 0x26 }, L2(L2_BW_HIGH), 1075000 }, -+ { 0, { 1080000, HFPLL, 1, 0x28 }, L2(L2_BW_HIGH), 1125000 }, -+ { 1, { 1134000, HFPLL, 1, 0x2A }, L2(L2_BW_HIGH), 1125000 }, -+ { 0, { 1188000, HFPLL, 1, 0x2C }, L2(L2_BW_HIGH), 1150000 }, -+ { 1, { 1242000, HFPLL, 1, 0x2E }, L2(L2_BW_HIGH), 1150000 }, -+ { 0, { 1296000, HFPLL, 1, 0x30 }, L2(L2_BW_HIGH), 1175000 }, -+ { 1, { 1350000, HFPLL, 1, 0x32 }, L2(L2_BW_HIGH), 1175000 }, -+ { 0, { 1404000, HFPLL, 1, 0x34 }, L2(L2_BW_HIGH), 1187500 }, -+ { 1, { 1458000, HFPLL, 1, 0x36 }, L2(L2_BW_HIGH), 1187500 }, -+ { 1, { 1512000, HFPLL, 1, 0x38 }, L2(L2_BW_HIGH), 1200000 }, - #ifdef CONFIG_CPU_OVERCLOCK - { 1, { 1620000, HFPLL, 1, 0x3C }, L2(15), 1250000 }, - { 1, { 1728000, HFPLL, 1, 0x40 }, L2(15), 1300000 }, -@@ -256,32 +262,31 @@ static struct acpu_level tbl_fast[] __initdata = { - { 1, { 81000, HFPLL, 2, 0x06 }, L2(0), 750000 }, - { 1, { 162000, HFPLL, 2, 0x0C }, L2(0), 775000 }, - { 1, { 270000, HFPLL, 2, 0x14 }, L2(0), 800000 }, -- //{ 1, { 378000, HFPLL, 2, 0x1C }, L2(0), 850000 }, - { 1, { 384000, PLL_8, 0, 0x00 }, L2(1), 825000 }, - #else - { 1, { 384000, PLL_8, 0, 0x00 }, L2(0), 850000 }, - #endif -- { 0, { 432000, HFPLL, 2, 0x20 }, L2(5), 875000 }, -- { 1, { 486000, HFPLL, 2, 0x24 }, L2(5), 875000 }, -- { 0, { 540000, HFPLL, 2, 0x28 }, L2(5), 900000 }, -- { 1, { 594000, HFPLL, 1, 0x16 }, L2(5), 900000 }, -- { 0, { 648000, HFPLL, 1, 0x18 }, L2(5), 925000 }, -- { 1, { 702000, HFPLL, 1, 0x1A }, L2(5), 925000 }, -- { 0, { 756000, HFPLL, 1, 0x1C }, L2(5), 975000 }, -- { 1, { 810000, HFPLL, 1, 0x1E }, L2(5), 975000 }, -- { 0, { 864000, HFPLL, 1, 0x20 }, L2(5), 1000000 }, -- { 1, { 918000, HFPLL, 1, 0x22 }, L2(5), 1000000 }, -- { 0, { 972000, HFPLL, 1, 0x24 }, L2(5), 1025000 }, -- { 1, { 1026000, HFPLL, 1, 0x26 }, L2(5), 1025000 }, -- { 0, { 1080000, HFPLL, 1, 0x28 }, L2(14), 1075000 }, -- { 1, { 1134000, HFPLL, 1, 0x2A }, L2(14), 1075000 }, -- { 0, { 1188000, HFPLL, 1, 0x2C }, L2(14), 1100000 }, -- { 1, { 1242000, HFPLL, 1, 0x2E }, L2(14), 1100000 }, -- { 0, { 1296000, HFPLL, 1, 0x30 }, L2(14), 1125000 }, -- { 1, { 1350000, HFPLL, 1, 0x32 }, L2(14), 1125000 }, -- { 0, { 1404000, HFPLL, 1, 0x34 }, L2(14), 1137500 }, -- { 1, { 1458000, HFPLL, 1, 0x36 }, L2(14), 1137500 }, -- { 1, { 1512000, HFPLL, 1, 0x38 }, L2(14), 1150000 }, -+ { 0, { 432000, HFPLL, 2, 0x20 }, L2(L2_BW_MID), 875000 }, -+ { 1, { 486000, HFPLL, 2, 0x24 }, L2(L2_BW_MID), 875000 }, -+ { 0, { 540000, HFPLL, 2, 0x28 }, L2(L2_BW_MID), 900000 }, -+ { 1, { 594000, HFPLL, 1, 0x16 }, L2(L2_BW_MID), 900000 }, -+ { 0, { 648000, HFPLL, 1, 0x18 }, L2(L2_BW_MID), 925000 }, -+ { 1, { 702000, HFPLL, 1, 0x1A }, L2(L2_BW_HIGH), 925000 }, -+ { 0, { 756000, HFPLL, 1, 0x1C }, L2(L2_BW_HIGH), 975000 }, -+ { 1, { 810000, HFPLL, 1, 0x1E }, L2(L2_BW_HIGH), 975000 }, -+ { 0, { 864000, HFPLL, 1, 0x20 }, L2(L2_BW_HIGH), 1000000 }, -+ { 1, { 918000, HFPLL, 1, 0x22 }, L2(L2_BW_HIGH), 1000000 }, -+ { 0, { 972000, HFPLL, 1, 0x24 }, L2(L2_BW_HIGH), 1025000 }, -+ { 1, { 1026000, HFPLL, 1, 0x26 }, L2(L2_BW_HIGH), 1025000 }, -+ { 0, { 1080000, HFPLL, 1, 0x28 }, L2(L2_BW_HIGH), 1075000 }, -+ { 1, { 1134000, HFPLL, 1, 0x2A }, L2(L2_BW_HIGH), 1075000 }, -+ { 0, { 1188000, HFPLL, 1, 0x2C }, L2(L2_BW_HIGH), 1100000 }, -+ { 1, { 1242000, HFPLL, 1, 0x2E }, L2(L2_BW_HIGH), 1100000 }, -+ { 0, { 1296000, HFPLL, 1, 0x30 }, L2(L2_BW_HIGH), 1125000 }, -+ { 1, { 1350000, HFPLL, 1, 0x32 }, L2(L2_BW_HIGH), 1125000 }, -+ { 0, { 1404000, HFPLL, 1, 0x34 }, L2(L2_BW_HIGH), 1137500 }, -+ { 1, { 1458000, HFPLL, 1, 0x36 }, L2(L2_BW_HIGH), 1137500 }, -+ { 1, { 1512000, HFPLL, 1, 0x38 }, L2(L2_BW_HIGH), 1150000 }, - #ifdef CONFIG_CPU_OVERCLOCK - { 1, { 1620000, HFPLL, 1, 0x3C }, L2(15), 1200000 }, - { 1, { 1728000, HFPLL, 1, 0x40 }, L2(15), 1250000 }, -@@ -297,28 +302,27 @@ static struct acpu_level tbl_faster[] __initdata = { - { 1, { 81000, HFPLL, 2, 0x06 }, L2(0), 750000 }, - { 1, { 162000, HFPLL, 2, 0x0C }, L2(0), 775000 }, - { 1, { 270000, HFPLL, 2, 0x14 }, L2(0), 800000 }, -- //{ 1, { 378000, HFPLL, 2, 0x1C }, L2(0), 850000 }, - { 1, { 384000, PLL_8, 0, 0x00 }, L2(1), 825000 }, - #else - { 1, { 384000, PLL_8, 0, 0x00 }, L2(0), 850000 }, - #endif -- { 0, { 432000, HFPLL, 2, 0x20 }, L2(5), 875000 }, -- { 1, { 486000, HFPLL, 2, 0x24 }, L2(5), 875000 }, -- { 0, { 540000, HFPLL, 2, 0x28 }, L2(5), 900000 }, -- { 1, { 594000, HFPLL, 1, 0x16 }, L2(5), 900000 }, -- { 0, { 648000, HFPLL, 1, 0x18 }, L2(5), 925000 }, -- { 1, { 702000, HFPLL, 1, 0x1A }, L2(5), 925000 }, -- { 0, { 756000, HFPLL, 1, 0x1C }, L2(5), 962500 }, -- { 1, { 810000, HFPLL, 1, 0x1E }, L2(5), 962500 }, -- { 0, { 864000, HFPLL, 1, 0x20 }, L2(5), 975000 }, -- { 1, { 918000, HFPLL, 1, 0x22 }, L2(5), 975000 }, -- { 0, { 972000, HFPLL, 1, 0x24 }, L2(5), 1000000 }, -- { 1, { 1026000, HFPLL, 1, 0x26 }, L2(5), 1000000 }, -- { 0, { 1080000, HFPLL, 1, 0x28 }, L2(14), 1050000 }, -- { 1, { 1134000, HFPLL, 1, 0x2A }, L2(14), 1050000 }, -- { 0, { 1188000, HFPLL, 1, 0x2C }, L2(14), 1075000 }, -- { 1, { 1242000, HFPLL, 1, 0x2E }, L2(14), 1075000 }, -- { 0, { 1296000, HFPLL, 1, 0x30 }, L2(14), 1100000 }, -+ { 0, { 432000, HFPLL, 2, 0x20 }, L2(L2_BW_MID), 875000 }, -+ { 1, { 486000, HFPLL, 2, 0x24 }, L2(L2_BW_MID), 875000 }, -+ { 0, { 540000, HFPLL, 2, 0x28 }, L2(L2_BW_MID), 900000 }, -+ { 1, { 594000, HFPLL, 1, 0x16 }, L2(L2_BW_MID), 900000 }, -+ { 0, { 648000, HFPLL, 1, 0x18 }, L2(L2_BW_MID), 925000 }, -+ { 1, { 702000, HFPLL, 1, 0x1A }, L2(L2_BW_HIGH), 925000 }, -+ { 0, { 756000, HFPLL, 1, 0x1C }, L2(L2_BW_HIGH), 962500 }, -+ { 1, { 810000, HFPLL, 1, 0x1E }, L2(L2_BW_HIGH), 962500 }, -+ { 0, { 864000, HFPLL, 1, 0x20 }, L2(L2_BW_HIGH), 975000 }, -+ { 1, { 918000, HFPLL, 1, 0x22 }, L2(L2_BW_HIGH), 975000 }, -+ { 0, { 972000, HFPLL, 1, 0x24 }, L2(L2_BW_HIGH), 1000000 }, -+ { 1, { 1026000, HFPLL, 1, 0x26 }, L2(L2_BW_HIGH), 1000000 }, -+ { 0, { 1080000, HFPLL, 1, 0x28 }, L2(L2_BW_HIGH), 1050000 }, -+ { 1, { 1134000, HFPLL, 1, 0x2A }, L2(L2_BW_HIGH), 1050000 }, -+ { 0, { 1188000, HFPLL, 1, 0x2C }, L2(L2_BW_HIGH), 1075000 }, -+ { 1, { 1242000, HFPLL, 1, 0x2E }, L2(L2_BW_HIGH), 1075000 }, -+ { 0, { 1296000, HFPLL, 1, 0x30 }, L2(L2_BW_HIGH), 1100000 }, - { 1, { 1350000, HFPLL, 1, 0x32 }, L2(14), 1100000 }, - { 0, { 1404000, HFPLL, 1, 0x34 }, L2(14), 1112500 }, - { 1, { 1458000, HFPLL, 1, 0x36 }, L2(14), 1112500 }, --- -2.10.2 - diff --git a/Patches/CyanogenMod-14.1/android_kernel_moto_shamu/0001-OverUnderClock.patch b/Patches/CyanogenMod-14.1/android_kernel_moto_shamu/0001-OverUnderClock.patch deleted file mode 100644 index 4fc7dec2..00000000 --- a/Patches/CyanogenMod-14.1/android_kernel_moto_shamu/0001-OverUnderClock.patch +++ /dev/null @@ -1,834 +0,0 @@ -From ebb9cfb12fea35189ba206f56925e499a4963896 Mon Sep 17 00:00:00 2001 -From: hellsgod -Date: Wed, 22 Apr 2015 22:50:47 +0200 -Subject: [PATCH 1/6] dts: Add some lower frequencies down to 35mhz - -credits: XileForce, Imoseyon ---- - arch/arm/boot/dts/qcom/apq8084.dtsi | 51 +++++++++++++++++++++++++++++++++++++ - 1 file changed, 51 insertions(+) - -diff --git a/arch/arm/boot/dts/qcom/apq8084.dtsi b/arch/arm/boot/dts/qcom/apq8084.dtsi -index 51de8be..1e782d6 100644 ---- a/arch/arm/boot/dts/qcom/apq8084.dtsi -+++ b/arch/arm/boot/dts/qcom/apq8084.dtsi -@@ -1127,6 +1127,9 @@ - /* 2.7GHz RC1 */ - qcom,speed2-pvs0-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 720000 37 >, -+ < 223200000 790000 56 >, - < 300000000 810000 76 >, - < 345600000 820000 88 >, - < 422400000 830000 109 >, -@@ -1162,6 +1165,9 @@ - - qcom,speed2-pvs1-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 710000 37 >, -+ < 223200000 780000 56 >, - < 300000000 800000 76 >, - < 345600000 810000 88 >, - < 422400000 820000 109 >, -@@ -1197,6 +1203,9 @@ - - qcom,speed2-pvs2-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 700000 37 >, -+ < 223200000 770000 56 >, - < 300000000 790000 76 >, - < 345600000 800000 88 >, - < 422400000 810000 109 >, -@@ -1232,6 +1241,9 @@ - - qcom,speed2-pvs3-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 690000 37 >, -+ < 223200000 760000 56 >, - < 300000000 780000 76 >, - < 345600000 790000 88 >, - < 422400000 800000 109 >, -@@ -1267,6 +1279,9 @@ - - qcom,speed2-pvs4-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 680000 37 >, -+ < 223200000 750000 56 >, - < 300000000 770000 76 >, - < 345600000 780000 88 >, - < 422400000 790000 109 >, -@@ -1302,6 +1317,9 @@ - - qcom,speed2-pvs5-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 670000 37 >, -+ < 223200000 740000 56 >, - < 300000000 760000 76 >, - < 345600000 770000 88 >, - < 422400000 780000 109 >, -@@ -1337,6 +1355,9 @@ - - qcom,speed2-pvs6-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 660000 37 >, -+ < 223200000 730000 56 >, - < 300000000 750000 76 >, - < 345600000 760000 88 >, - < 422400000 770000 109 >, -@@ -1372,6 +1393,9 @@ - - qcom,speed2-pvs7-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 650000 37 >, -+ < 223200000 720000 56 >, - < 300000000 740000 76 >, - < 345600000 750000 88 >, - < 422400000 760000 109 >, -@@ -1407,6 +1431,9 @@ - - qcom,speed2-pvs8-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 640000 37 >, -+ < 223200000 710000 56 >, - < 300000000 730000 76 >, - < 345600000 740000 88 >, - < 422400000 750000 109 >, -@@ -1442,6 +1469,9 @@ - - qcom,speed2-pvs9-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 630000 37 >, -+ < 223200000 700000 56 >, - < 300000000 720000 76 >, - < 345600000 730000 88 >, - < 422400000 740000 109 >, -@@ -1477,6 +1507,9 @@ - - qcom,speed2-pvs10-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 620000 37 >, -+ < 223200000 690000 56 >, - < 300000000 710000 76 >, - < 345600000 720000 88 >, - < 422400000 730000 109 >, -@@ -1512,6 +1545,9 @@ - - qcom,speed2-pvs11-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 610000 37 >, -+ < 223200000 680000 56 >, - < 300000000 700000 76 >, - < 345600000 710000 88 >, - < 422400000 720000 109 >, -@@ -1547,6 +1583,9 @@ - - qcom,speed2-pvs12-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 600000 37 >, -+ < 223200000 670000 56 >, - < 300000000 690000 76 >, - < 345600000 700000 88 >, - < 422400000 710000 109 >, -@@ -1582,6 +1621,9 @@ - - qcom,speed2-pvs13-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 590000 37 >, -+ < 223200000 660000 56 >, - < 300000000 680000 76 >, - < 345600000 690000 88 >, - < 422400000 700000 109 >, -@@ -1617,6 +1659,9 @@ - - qcom,speed2-pvs14-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 580000 37 >, -+ < 223200000 650000 56 >, - < 300000000 670000 76 >, - < 345600000 680000 88 >, - < 422400000 690000 109 >, -@@ -1652,6 +1697,9 @@ - - qcom,speed2-pvs15-bin-v1 = - < 0 0 0 >, -+ < 35800000 500000 17 >, -+ < 98300000 570000 37 >, -+ < 223200000 640000 56 >, - < 300000000 660000 76 >, - < 345600000 670000 88 >, - < 422400000 680000 109 >, -@@ -4297,6 +4345,9 @@ - reg = <0 4>; - compatible = "qcom,msm-cpufreq"; - qcom,cpufreq-table = -+ < 35800 35800 762 >, -+ < 98300 98300 762 >, -+ < 223200 223200 762 >, - < 300000 300000 1144 >, - < 422400 422400 2288 >, - < 652800 499200 3051 >, --- -2.9.3 - - -From 143adae138c68fbcd53fa8dbc644ef4a0850879c Mon Sep 17 00:00:00 2001 -From: bhb27 -Date: Thu, 25 Feb 2016 14:46:26 -0800 -Subject: [PATCH 2/6] qcom:apq8084: OC to 2880 MHz - ---- - arch/arm/boot/dts/qcom/apq8084.dtsi | 198 ++++++++++++++++++++++++++++++------ - 1 file changed, 165 insertions(+), 33 deletions(-) - -diff --git a/arch/arm/boot/dts/qcom/apq8084.dtsi b/arch/arm/boot/dts/qcom/apq8084.dtsi -index 1e782d6..c419bc3 100644 ---- a/arch/arm/boot/dts/qcom/apq8084.dtsi -+++ b/arch/arm/boot/dts/qcom/apq8084.dtsi -@@ -1161,7 +1161,11 @@ - < 2419200000 1105000 777 >, - < 2496000000 1120000 813 >, - < 2572800000 1135000 849 >, -- < 2649600000 1150000 886 >; -+ < 2649600000 1150000 886 >, -+ < 2688000000 1160000 917 >, -+ < 2764800000 1170000 952 >, -+ < 2841600000 1185000 980 >, -+ < 2880000000 1195000 1003 >; - - qcom,speed2-pvs1-bin-v1 = - < 0 0 0 >, -@@ -1199,7 +1203,11 @@ - < 2419200000 1095000 777 >, - < 2496000000 1110000 813 >, - < 2572800000 1125000 849 >, -- < 2649600000 1140000 886 >; -+ < 2649600000 1140000 886 >, -+ < 2688000000 1150000 917 >, -+ < 2764800000 1160000 952 >, -+ < 2841600000 1175000 980 >, -+ < 2880000000 1185000 1003 >; - - qcom,speed2-pvs2-bin-v1 = - < 0 0 0 >, -@@ -1237,7 +1245,11 @@ - < 2419200000 1085000 777 >, - < 2496000000 1100000 813 >, - < 2572800000 1115000 849 >, -- < 2649600000 1130000 886 >; -+ < 2649600000 1130000 886 >, -+ < 2688000000 1140000 917 >, -+ < 2764800000 1150000 952 >, -+ < 2841600000 1165000 980 >, -+ < 2880000000 1175000 1003 >; - - qcom,speed2-pvs3-bin-v1 = - < 0 0 0 >, -@@ -1275,7 +1287,11 @@ - < 2419200000 1075000 777 >, - < 2496000000 1090000 813 >, - < 2572800000 1105000 849 >, -- < 2649600000 1120000 886 >; -+ < 2649600000 1120000 886 >, -+ < 2688000000 1130000 917 >, -+ < 2764800000 1140000 952 >, -+ < 2841600000 1155000 980 >, -+ < 2880000000 1165000 1003 >; - - qcom,speed2-pvs4-bin-v1 = - < 0 0 0 >, -@@ -1313,7 +1329,11 @@ - < 2419200000 1065000 777 >, - < 2496000000 1080000 813 >, - < 2572800000 1095000 849 >, -- < 2649600000 1110000 886 >; -+ < 2649600000 1110000 886 >, -+ < 2688000000 1120000 917 >, -+ < 2764800000 1130000 952 >, -+ < 2841600000 1145000 980 >, -+ < 2880000000 1155000 1003 >; - - qcom,speed2-pvs5-bin-v1 = - < 0 0 0 >, -@@ -1351,7 +1371,11 @@ - < 2419200000 1055000 777 >, - < 2496000000 1070000 813 >, - < 2572800000 1085000 849 >, -- < 2649600000 1100000 886 >; -+ < 2649600000 1100000 886 >, -+ < 2688000000 1110000 917 >, -+ < 2764800000 1120000 952 >, -+ < 2841600000 1135000 980 >, -+ < 2880000000 1145000 1003 >; - - qcom,speed2-pvs6-bin-v1 = - < 0 0 0 >, -@@ -1389,7 +1413,11 @@ - < 2419200000 1045000 777 >, - < 2496000000 1060000 813 >, - < 2572800000 1075000 849 >, -- < 2649600000 1090000 886 >; -+ < 2649600000 1090000 886 >, -+ < 2688000000 1100000 917 >, -+ < 2764800000 1110000 952 >, -+ < 2841600000 1125000 980 >, -+ < 2880000000 1135000 1003 >; - - qcom,speed2-pvs7-bin-v1 = - < 0 0 0 >, -@@ -1427,7 +1455,11 @@ - < 2419200000 1035000 777 >, - < 2496000000 1050000 813 >, - < 2572800000 1065000 849 >, -- < 2649600000 1080000 886 >; -+ < 2649600000 1080000 886 >, -+ < 2688000000 1090000 917 >, -+ < 2764800000 1100000 952 >, -+ < 2841600000 1115000 980 >, -+ < 2880000000 1125000 1003 >; - - qcom,speed2-pvs8-bin-v1 = - < 0 0 0 >, -@@ -1465,7 +1497,11 @@ - < 2419200000 1025000 777 >, - < 2496000000 1040000 813 >, - < 2572800000 1055000 849 >, -- < 2649600000 1070000 886 >; -+ < 2649600000 1070000 886 >, -+ < 2688000000 1080000 917 >, -+ < 2764800000 1090000 952 >, -+ < 2841600000 1105000 980 >, -+ < 2880000000 1115000 1003 >; - - qcom,speed2-pvs9-bin-v1 = - < 0 0 0 >, -@@ -1503,7 +1539,11 @@ - < 2419200000 1015000 777 >, - < 2496000000 1030000 813 >, - < 2572800000 1045000 849 >, -- < 2649600000 1060000 886 >; -+ < 2649600000 1060000 886 >, -+ < 2688000000 1070000 917 >, -+ < 2764800000 1090000 952 >, -+ < 2841600000 1105000 980 >, -+ < 2880000000 1115000 1003 >; - - qcom,speed2-pvs10-bin-v1 = - < 0 0 0 >, -@@ -1541,7 +1581,11 @@ - < 2419200000 1005000 777 >, - < 2496000000 1020000 813 >, - < 2572800000 1035000 849 >, -- < 2649600000 1050000 886 >; -+ < 2649600000 1050000 886 >, -+ < 2688000000 1060000 917 >, -+ < 2764800000 1080000 952 >, -+ < 2841600000 1095000 980 >, -+ < 2880000000 1105000 1003 >; - - qcom,speed2-pvs11-bin-v1 = - < 0 0 0 >, -@@ -1579,7 +1623,11 @@ - < 2419200000 995000 777 >, - < 2496000000 1010000 813 >, - < 2572800000 1025000 849 >, -- < 2649600000 1040000 886 >; -+ < 2649600000 1040000 886 >, -+ < 2688000000 1050000 917 >, -+ < 2764800000 1060000 952 >, -+ < 2841600000 1075000 980 >, -+ < 2880000000 1085000 1003 >; - - qcom,speed2-pvs12-bin-v1 = - < 0 0 0 >, -@@ -1617,7 +1665,11 @@ - < 2419200000 985000 777 >, - < 2496000000 1000000 813 >, - < 2572800000 1015000 849 >, -- < 2649600000 1030000 886 >; -+ < 2649600000 1030000 886 >, -+ < 2688000000 1040000 917 >, -+ < 2764800000 1050000 952 >, -+ < 2841600000 1065000 980 >, -+ < 2880000000 1075000 1003 >; - - qcom,speed2-pvs13-bin-v1 = - < 0 0 0 >, -@@ -1655,7 +1707,11 @@ - < 2419200000 975000 777 >, - < 2496000000 990000 813 >, - < 2572800000 1005000 849 >, -- < 2649600000 1020000 886 >; -+ < 2649600000 1020000 886 >, -+ < 2688000000 1030000 917 >, -+ < 2764800000 1040000 952 >, -+ < 2841600000 1055000 980 >, -+ < 2880000000 1065000 1003 >; - - qcom,speed2-pvs14-bin-v1 = - < 0 0 0 >, -@@ -1693,7 +1749,11 @@ - < 2419200000 965000 777 >, - < 2496000000 980000 813 >, - < 2572800000 995000 849 >, -- < 2649600000 1010000 886 >; -+ < 2649600000 1010000 886 >, -+ < 2688000000 1020000 917 >, -+ < 2764800000 1030000 952 >, -+ < 2841600000 1045000 980 >, -+ < 2880000000 1055000 1003 >; - - qcom,speed2-pvs15-bin-v1 = - < 0 0 0 >, -@@ -1731,7 +1791,11 @@ - < 2419200000 955000 777 >, - < 2496000000 970000 813 >, - < 2572800000 985000 849 >, -- < 2649600000 1000000 886 >; -+ < 2649600000 1000000 886 >, -+ < 2688000000 1010000 917 >, -+ < 2764800000 1020000 952 >, -+ < 2841600000 1035000 980 >, -+ < 2880000000 1045000 1003 >; - - /* 2.7GHz RC0 */ - qcom,speed2-pvs0-bin-v0 = -@@ -1767,7 +1831,11 @@ - < 2419200000 1105000 777 >, - < 2496000000 1120000 813 >, - < 2572800000 1135000 849 >, -- < 2649600000 1150000 886 >; -+ < 2649600000 1150000 886 >, -+ < 2688000000 1160000 917 >, -+ < 2764800000 1170000 952 >, -+ < 2841600000 1185000 980 >, -+ < 2880000000 1195000 1003 >; - - qcom,speed2-pvs1-bin-v0 = - < 0 0 0 >, -@@ -1802,7 +1870,11 @@ - < 2419200000 1095000 777 >, - < 2496000000 1110000 813 >, - < 2572800000 1125000 849 >, -- < 2649600000 1140000 886 >; -+ < 2649600000 1140000 886 >, -+ < 2688000000 1150000 917 >, -+ < 2764800000 1160000 952 >, -+ < 2841600000 1185000 980 >, -+ < 2880000000 1195000 1003 >; - - qcom,speed2-pvs2-bin-v0 = - < 0 0 0 >, -@@ -1837,7 +1909,11 @@ - < 2419200000 1085000 777 >, - < 2496000000 1100000 813 >, - < 2572800000 1115000 849 >, -- < 2649600000 1130000 886 >; -+ < 2649600000 1130000 886 >, -+ < 2688000000 1140000 917 >, -+ < 2764800000 1150000 952 >, -+ < 2841600000 1165000 980 >, -+ < 2880000000 1175000 1003 >; - - qcom,speed2-pvs3-bin-v0 = - < 0 0 0 >, -@@ -1872,7 +1948,11 @@ - < 2419200000 1075000 777 >, - < 2496000000 1090000 813 >, - < 2572800000 1105000 849 >, -- < 2649600000 1120000 886 >; -+ < 2649600000 1120000 886 >, -+ < 2688000000 1130000 917 >, -+ < 2764800000 1140000 952 >, -+ < 2841600000 1165000 980 >, -+ < 2880000000 1175000 1003 >; - - qcom,speed2-pvs4-bin-v0 = - < 0 0 0 >, -@@ -1907,7 +1987,11 @@ - < 2419200000 1065000 777 >, - < 2496000000 1080000 813 >, - < 2572800000 1095000 849 >, -- < 2649600000 1110000 886 >; -+ < 2649600000 1110000 886 >, -+ < 2688000000 1120000 917 >, -+ < 2764800000 1130000 952 >, -+ < 2841600000 1145000 980 >, -+ < 2880000000 1155000 1003 >; - - qcom,speed2-pvs5-bin-v0 = - < 0 0 0 >, -@@ -1942,7 +2026,11 @@ - < 2419200000 1055000 777 >, - < 2496000000 1070000 813 >, - < 2572800000 1085000 849 >, -- < 2649600000 1100000 886 >; -+ < 2649600000 1100000 886 >, -+ < 2688000000 1110000 917 >, -+ < 2764800000 1120000 952 >, -+ < 2841600000 1135000 980 >, -+ < 2880000000 1145000 1003 >; - - qcom,speed2-pvs6-bin-v0 = - < 0 0 0 >, -@@ -1977,7 +2065,11 @@ - < 2419200000 1045000 777 >, - < 2496000000 1060000 813 >, - < 2572800000 1075000 849 >, -- < 2649600000 1090000 886 >; -+ < 2649600000 1090000 886 >, -+ < 2688000000 1100000 917 >, -+ < 2764800000 1110000 952 >, -+ < 2841600000 1125000 980 >, -+ < 2880000000 1135000 1003 >; - - qcom,speed2-pvs7-bin-v0 = - < 0 0 0 >, -@@ -2012,7 +2104,11 @@ - < 2419200000 1035000 777 >, - < 2496000000 1050000 813 >, - < 2572800000 1065000 849 >, -- < 2649600000 1080000 886 >; -+ < 2649600000 1080000 886 >, -+ < 2688000000 1090000 917 >, -+ < 2764800000 1100000 952 >, -+ < 2841600000 1115000 980 >, -+ < 2880000000 1125000 1003 >; - - qcom,speed2-pvs8-bin-v0 = - < 0 0 0 >, -@@ -2047,7 +2143,11 @@ - < 2419200000 1025000 777 >, - < 2496000000 1040000 813 >, - < 2572800000 1055000 849 >, -- < 2649600000 1070000 886 >; -+ < 2649600000 1070000 886 >, -+ < 2688000000 1080000 917 >, -+ < 2764800000 1090000 952 >, -+ < 2841600000 1105000 980 >, -+ < 2880000000 1115000 1003 >; - - qcom,speed2-pvs9-bin-v0 = - < 0 0 0 >, -@@ -2082,7 +2182,11 @@ - < 2419200000 1015000 777 >, - < 2496000000 1030000 813 >, - < 2572800000 1045000 849 >, -- < 2649600000 1060000 886 >; -+ < 2649600000 1060000 886 >, -+ < 2688000000 1070000 917 >, -+ < 2764800000 1080000 952 >, -+ < 2841600000 1095000 980 >, -+ < 2880000000 1105000 1003 >; - - qcom,speed2-pvs10-bin-v0 = - < 0 0 0 >, -@@ -2117,7 +2221,11 @@ - < 2419200000 1005000 777 >, - < 2496000000 1020000 813 >, - < 2572800000 1035000 849 >, -- < 2649600000 1050000 886 >; -+ < 2649600000 1050000 886 >, -+ < 2688000000 1060000 917 >, -+ < 2764800000 1070000 952 >, -+ < 2841600000 1085000 980 >, -+ < 2880000000 1095000 1003 >; - - qcom,speed2-pvs11-bin-v0 = - < 0 0 0 >, -@@ -2152,7 +2260,11 @@ - < 2419200000 995000 777 >, - < 2496000000 1010000 813 >, - < 2572800000 1025000 849 >, -- < 2649600000 1040000 886 >; -+ < 2649600000 1040000 886 >, -+ < 2688000000 1050000 917 >, -+ < 2764800000 1060000 952 >, -+ < 2841600000 1075000 980 >, -+ < 2880000000 1085000 1003 >; - - qcom,speed2-pvs12-bin-v0 = - < 0 0 0 >, -@@ -2187,7 +2299,11 @@ - < 2419200000 985000 777 >, - < 2496000000 1000000 813 >, - < 2572800000 1015000 849 >, -- < 2649600000 1030000 886 >; -+ < 2649600000 1030000 886 >, -+ < 2688000000 1040000 917 >, -+ < 2764800000 1050000 952 >, -+ < 2841600000 1065000 980 >, -+ < 2880000000 1075000 1003 >; - - qcom,speed2-pvs13-bin-v0 = - < 0 0 0 >, -@@ -2222,7 +2338,11 @@ - < 2419200000 975000 777 >, - < 2496000000 990000 813 >, - < 2572800000 1005000 849 >, -- < 2649600000 1020000 886 >; -+ < 2649600000 1020000 886 >, -+ < 2688000000 1030000 917 >, -+ < 2764800000 1040000 952 >, -+ < 2841600000 1055000 980 >, -+ < 2880000000 1065000 1003 >; - - qcom,speed2-pvs14-bin-v0 = - < 0 0 0 >, -@@ -2257,7 +2377,11 @@ - < 2419200000 965000 777 >, - < 2496000000 980000 813 >, - < 2572800000 995000 849 >, -- < 2649600000 1010000 886 >; -+ < 2649600000 1010000 886 >, -+ < 2688000000 1020000 917 >, -+ < 2764800000 1030000 952 >, -+ < 2841600000 1045000 980 >, -+ < 2880000000 1055000 1003 >; - - qcom,speed2-pvs15-bin-v0 = - < 0 0 0 >, -@@ -2292,7 +2416,11 @@ - < 2419200000 955000 777 >, - < 2496000000 970000 813 >, - < 2572800000 985000 849 >, -- < 2649600000 1000000 886 >; -+ < 2649600000 1000000 886 >, -+ < 2688000000 1010000 917 >, -+ < 2764800000 1020000 952 >, -+ < 2841600000 1035000 980 >, -+ < 2880000000 1045000 1003 >; - - /* 2.5GHz RC1 */ - qcom,speed1-pvs0-bin-v1 = -@@ -4365,7 +4493,11 @@ - < 2457600 1728000 16250 >, - < 2496000 1728000 16250 >, - < 2572800 1728000 16250 >, -- < 2649600 1728000 16250 >; -+ < 2649600 1728000 16250 >, -+ < 2688000 1728000 16250 >, /* overclock */ -+ < 2764800 1728000 16250 >, -+ < 2841600 1728000 16250 >, -+ < 2880000 1728000 16250 >; - }; - - usb_otg: usb@f9a55000 { --- -2.9.3 - - -From aeca3d3b8d3177ddf8aab303b54f5ef3a1d0ce05 Mon Sep 17 00:00:00 2001 -From: XileForce -Date: Mon, 11 May 2015 21:43:20 -0700 -Subject: [PATCH 3/6] APQ8084: 2457600 Is Not A Real Frequency. Replace It With - 2419200 2457600 does not exist in our voltage/current tables. Thus its - voltage cant be adjusted, nor am I sure what voltage it actually uses since - it isnt defined anywhere. Let's replace that with the existing, but currently - unused, 2419200 step. - ---- - arch/arm/boot/dts/qcom/apq8084.dtsi | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/arch/arm/boot/dts/qcom/apq8084.dtsi b/arch/arm/boot/dts/qcom/apq8084.dtsi -index c419bc3..1fe7174 100644 ---- a/arch/arm/boot/dts/qcom/apq8084.dtsi -+++ b/arch/arm/boot/dts/qcom/apq8084.dtsi -@@ -4490,7 +4490,7 @@ - < 1728000 1651200 12145 >, - < 1958400 1728000 16250 >, - < 2265600 1728000 16250 >, -- < 2457600 1728000 16250 >, -+ < 2419200 1728000 16250 >, - < 2496000 1728000 16250 >, - < 2572800 1728000 16250 >, - < 2649600 1728000 16250 >, --- -2.9.3 - - -From 591d576aba39ec8ecb3c4c564577490e451d8839 Mon Sep 17 00:00:00 2001 -From: Felipe Leon -Date: Sat, 17 Dec 2016 03:30:45 -0800 -Subject: [PATCH 4/6] apq8084: DTB Fix qcom,bcl table - ---- - arch/arm/boot/dts/qcom/apq8084.dtsi | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/arch/arm/boot/dts/qcom/apq8084.dtsi b/arch/arm/boot/dts/qcom/apq8084.dtsi -index 1fe7174..a5f2a26 100644 ---- a/arch/arm/boot/dts/qcom/apq8084.dtsi -+++ b/arch/arm/boot/dts/qcom/apq8084.dtsi -@@ -5030,9 +5030,9 @@ - qcom,ibat-monitor { - high-threshold-uamp = <3000000>; - low-threshold-uamp = <1000000>; -- mitigation-freq-khz = <1958400>; -- mitigation-gpu-freq-khz = <389000>; -- max-gpu-freq-khz = <600000>; -+ mitigation-freq-khz = <2880000>; -+ mitigation-gpu-freq-khz = <350000>; -+ max-gpu-freq-khz = <800000>; - ibat-channel = <0x15>; - adc-interval-usec = <3900>; - uv-to-ua-numerator = <2>; --- -2.9.3 - - -From 170faa65e72f696aaa6a60cc9653c530c2225d32 Mon Sep 17 00:00:00 2001 -From: Felipe de Leon -Date: Sat, 17 Dec 2016 04:04:13 -0800 -Subject: [PATCH 5/6] boot: dtsi: Adds the current values for the cores in uA - for under and overclock - -Current value based on calculos made using the stock values -orginal commit -bhb27/android_kernel_motorola_apq8084@0e332d0 -bhb27/android_kernel_motorola_apq8084@9d21c12 ---- - arch/arm/boot/dts/qcom/apq8084.dtsi | 36 ++++++++++++++++++++++++++++-------- - 1 file changed, 28 insertions(+), 8 deletions(-) - -diff --git a/arch/arm/boot/dts/qcom/apq8084.dtsi b/arch/arm/boot/dts/qcom/apq8084.dtsi -index a5f2a26..8b264bd 100644 ---- a/arch/arm/boot/dts/qcom/apq8084.dtsi -+++ b/arch/arm/boot/dts/qcom/apq8084.dtsi -@@ -38,7 +38,8 @@ - reg = <0x0>; - // The currents(uA) correspond to the frequencies in the - // frequency table. -- current = < 71000 //300000 kHz -+ current = < 64000 //268800 kHz underclock -+ 71000 //300000 kHz - 83000 //422400 kHz - 97000 //652800 kHz - 106000 //729600 kHz -@@ -55,7 +56,11 @@ - 405000 //2457600 kHz - 405000 //2496000 kHz - 413000 //2572800 kHz -- 414000>; //2649600 kHz -+ 414000 //2649600 kHz -+ 420000 //2688000 kHz overclock -+ 432000 //2764800 kHz -+ 444000 //2841600 kHz -+ 450000>; //2880000 kHz - }; - - CPU1: cpu@1 { -@@ -64,7 +69,8 @@ - reg = <0x1>; - // The currents(uA) correspond to the frequencies in the - // frequency table. -- current = < 40470 //300000 kHz -+ current = < 36260 //268800 kHz underclock -+ 40470 //300000 kHz - 47309 //422400 kHz - 55289 //652800 kHz - 60419 //729600 kHz -@@ -81,7 +87,11 @@ - 230849 //2457600 kHz - 230849 //2496000 kHz - 235409 //2572800 kHz -- 235979>; //2649600 kHz -+ 414000 //2649600 kHz -+ 420000 //2688000 kHz overclock -+ 432000 //2764800 kHz -+ 444000 //2841600 kHz -+ 450000>; //2880000 kHz - }; - - CPU2: cpu@2 { -@@ -90,7 +100,8 @@ - reg = <0x2>; - // The currents(uA) correspond to the frequencies in the - // frequency table. -- current = < 46860 //300000 kHz -+ current = < 41980 //268800 kHz underclock -+ 46860 //300000 kHz - 54780 //422400 kHz - 64020 //652800 kHz - 69960 //729600 kHz -@@ -107,7 +118,11 @@ - 267300 //2457600 kHz - 267300 //2496000 kHz - 272580 //2572800 kHz -- 273240>; //2649600 kHz -+ 414000 //2649600 kHz -+ 420000 //2688000 kHz overclock -+ 432000 //2764800 kHz -+ 444000 //2841600 kHz -+ 450000>; //2880000 kHz - }; - - CPU3: cpu@3 { -@@ -116,7 +131,8 @@ - reg = <0x3>; - // The currents(uA) correspond to the frequencies in the - // frequency table. -- current = < 53960 //300000 kHz -+ current = < 48340 //268800 kHz underclock -+ 53960 //300000 kHz - 63080 //422400 kHz - 73720 //652800 kHz - 80560 //729600 kHz -@@ -133,7 +149,11 @@ - 307800 //2457600 kHz - 307800 //2496000 kHz - 313880 //2572800 kHz -- 314640>; //2649600 kHz -+ 414000 //2649600 kHz -+ 420000 //2688000 kHz overclock -+ 432000 //2764800 kHz -+ 444000 //2841600 kHz -+ 450000>; //2880000 kHz - }; - }; - memory { --- -2.9.3 - - -From c170f85350b5bf5148283a85f27504496d063852 Mon Sep 17 00:00:00 2001 -From: hellsgod -Date: Tue, 23 Jun 2015 08:42:24 +0200 -Subject: [PATCH 6/6] arm/dt: shamu: Prevent BCL driver messing around with - cores - -credits to neobuddy for the heads up! ---- - arch/arm/boot/dts/qcom/apq8084.dtsi | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/arch/arm/boot/dts/qcom/apq8084.dtsi b/arch/arm/boot/dts/qcom/apq8084.dtsi -index 8b264bd..26f95e4 100644 ---- a/arch/arm/boot/dts/qcom/apq8084.dtsi -+++ b/arch/arm/boot/dts/qcom/apq8084.dtsi -@@ -5046,7 +5046,6 @@ - qcom,bcl-enable; - qcom,ibat-vadc = <&pma8084_vadc>; - qcom,ibat-threshold-adc_tm = <&pma8084_adc_tm>; -- qcom,bcl-hotplug-list = <&CPU2 &CPU3>; - qcom,ibat-monitor { - high-threshold-uamp = <3000000>; - low-threshold-uamp = <1000000>; --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_kernel_motorola_msm8992/0001-OverUnderClock.patch b/Patches/CyanogenMod-14.1/android_kernel_motorola_msm8992/0001-OverUnderClock.patch deleted file mode 100644 index 40914170..00000000 --- a/Patches/CyanogenMod-14.1/android_kernel_motorola_msm8992/0001-OverUnderClock.patch +++ /dev/null @@ -1,484 +0,0 @@ -From 28793d3021e480bba68fe8b76d9848a6b8aee5d5 Mon Sep 17 00:00:00 2001 -From: flar2 -Date: Tue, 3 Nov 2015 21:21:34 -0500 -Subject: [PATCH 1/3] msm8992 initial overclocking - ---- - arch/arm/boot/dts/qcom/msm8992-regulator.dtsi | 30 ++++++++++++-------- - arch/arm/boot/dts/qcom/msm8992.dtsi | 40 +++++++++++++++++++------- - drivers/clk/qcom/clock-cpu-8994.c | 8 +++--- - drivers/cpufreq/qcom-cpufreq.c | 41 +++++++++++++++++++++++++++ - 4 files changed, 93 insertions(+), 26 deletions(-) - -diff --git a/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -index d5f6860..23b23ba 100644 ---- a/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -+++ b/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -@@ -605,7 +605,7 @@ - regulator-name = "apc0_corner"; - qcom,cpr-fuse-corners = <4>; - regulator-min-microvolt = <1>; -- regulator-max-microvolt = <10>; -+ regulator-max-microvolt = <12>; - - qcom,cpr-voltage-ceiling = <900000 900000 1000000 1180000>; - qcom,cpr-voltage-floor = <640000 700000 800000 850000>; -@@ -669,15 +669,15 @@ - qcom,cpr-init-voltage-ref = <900000 900000 1000000 1230000>; - qcom,cpr-init-voltage-step = <10000>; - -- qcom,cpr-corner-map = <1 1 2 2 3 3 4 4 4 4>; -+ qcom,cpr-corner-map = <1 1 2 2 3 3 4 4 4 4 4 4>; - qcom,cpr-voltage-ceiling-override = - <0xFFFFFFFF 0 800000 800000 900000 900000 - 1000000 1000000 1115000 1115000 -- 1180000 1180000>; -+ 1180000 1180000 1180000 1180000>; - qcom,cpr-voltage-floor-override = - <0xFFFFFFFF 0 640000 655000 700000 735000 - 800000 835000 850000 875000 -- 950000 1000000>; -+ 950000 1000000 1000000 1000000>; - qcom,cpr-fuse-version-map = - <0 0xffffffff 0 0 0 0 0>, - <0 0xffffffff 1 0 0 0 0>, -@@ -759,10 +759,12 @@ - <7 864000000>, - <8 960000000>, - <9 1248000000>, -- <10 1440000000>; -+ <10 1440000000>, -+ <11 1536000000>, -+ <12 1632000000>; - qcom,cpr-speed-bin-max-corners = - <0 0 2 4 6 9>, -- <1 0 2 4 6 10>; -+ <1 0 2 4 6 12>; - qcom,cpr-enable; - }; - -@@ -774,7 +776,7 @@ - regulator-name = "apc1_corner"; - qcom,cpr-fuse-corners = <4>; - regulator-min-microvolt = <1>; -- regulator-max-microvolt = <15>; -+ regulator-max-microvolt = <17>; - - qcom,cpr-voltage-ceiling = <900000 900000 1000000 1180000>; - qcom,cpr-voltage-floor = <640000 640000 745000 850000>; -@@ -841,17 +843,19 @@ - qcom,cpr-init-voltage-ref = <900000 900000 1000000 1230000>; - qcom,cpr-init-voltage-step = <10000>; - -- qcom,cpr-corner-map = <1 2 2 2 2 3 3 3 4 4 4 4 4 4 4>; -+ qcom,cpr-corner-map = <1 2 2 2 2 3 3 3 4 4 4 4 4 4 4 4 4>; - qcom,cpr-voltage-ceiling-override = - <0xFFFFFFFF 0 900000 900000 900000 900000 - 900000 1000000 1000000 1000000 - 1115000 1115000 1115000 1115000 -- 1115000 1115000 1180000>; -+ 1115000 1115000 1180000 1180000 -+ 1180000>; - qcom,cpr-voltage-floor-override = - <0xFFFFFFFF 0 640000 640000 665000 690000 - 735000 745000 770000 785000 - 850000 860000 880000 900000 -- 920000 935000 1000000>; -+ 920000 935000 1000000 1000000 -+ 1000000>; - qcom,cpr-fuse-version-map = - <0xffffffff 0xffffffff 0 4 4 4 4>, - <0xffffffff 0xffffffff 1 4 4 4 4>, -@@ -908,9 +912,11 @@ - <12 1536000000>, - <13 1632000000>, - <14 1689600000>, -- <15 1824000000>; -+ <15 1824000000>, -+ <16 1958400000>, -+ <17 2016000000>; - qcom,cpr-speed-bin-max-corners = -- <0xFFFFFFFF 0 1 5 8 15>; -+ <0xFFFFFFFF 0 1 5 8 17>; - qcom,cpr-enable; - }; - -diff --git a/arch/arm/boot/dts/qcom/msm8992.dtsi b/arch/arm/boot/dts/qcom/msm8992.dtsi -index 5ba420c..8892b56 100644 ---- a/arch/arm/boot/dts/qcom/msm8992.dtsi -+++ b/arch/arm/boot/dts/qcom/msm8992.dtsi -@@ -852,7 +852,9 @@ - < 787200 3509 >, - < 864000 4173 >, - < 960000 5271 >, -- < 1440000 7102 >; -+ < 1440000 7102 >, -+ < 1536000 7102 >, -+ < 1632000 7102 >; - cpu-to-dev-map-4 = - < 384000 1525 >, - < 633600 2288 >, -@@ -860,16 +862,22 @@ - < 864000 4173 >, - < 960000 5271 >, - < 1344000 5928 >, -- < 1824000 7102 >; -+ < 1824000 7102 >, -+ < 1958400 7102 >, -+ < 2016000 7102 >; - }; - - mincpubw-cpufreq { - target-dev = <&mincpubw>; - cpu-to-dev-map-0 = -- < 1440000 1525 >; -+ < 1440000 1525 >, -+ < 1536000 1525 >, -+ < 1632000 1525 >; - cpu-to-dev-map-4 = - < 1689600 1525 >, -- < 1824000 5928 >; -+ < 1824000 1525 >, -+ < 1958400 1525 >, -+ < 2016000 5928 >; - }; - - cci-cpufreq { -@@ -880,7 +888,9 @@ - < 787200 384000 >, - < 864000 556800 >, - < 960000 729600 >, -- < 1440000 787200 >; -+ < 1440000 787200 >, -+ < 1536000 787200 >, -+ < 1632000 787200 >; - cpu-to-dev-map-4 = - < 384000 134400 >, - < 480000 300000 >, -@@ -888,7 +898,9 @@ - < 768000 556800 >, - < 960000 600000 >, - < 1440000 729600 >, -- < 1824000 787200 >; -+ < 1824000 787200 >, -+ < 1958400 787200 >, -+ < 2016000 787200 >; - }; - }; - -@@ -915,7 +927,9 @@ - < 864000 >, - < 960000 >, - < 1248000 >, -- < 1440000 >; -+ < 1440000 >, -+ < 1536000 >, -+ < 1632000 >; - - qcom,cpufreq-table-4 = - < 384000 >, -@@ -930,7 +944,9 @@ - < 1536000 >, - < 1632000 >, - < 1689600 >, -- < 1824000 >; -+ < 1824000 >, -+ < 1958400 >, -+ < 2016000 >; - - }; - -@@ -968,7 +984,9 @@ - < 864000000 7>, - < 960000000 8>, - < 1248000000 9>, -- < 1440000000 10>; -+ < 1440000000 10>, -+ < 1536000000 11>, -+ < 1632000000 12>; - qcom,a57-speedbin0-v0 = - < 0 0>, - < 384000000 5>, -@@ -983,7 +1001,9 @@ - < 1536000000 12>, - < 1632000000 13>, - < 1689600000 14>, -- < 1824000000 15>; -+ < 1824000000 15>, -+ < 1958400000 16>, -+ < 2016000000 17>; - qcom,cci-speedbin0-v0 = - < 0 0>, - < 134400000 2>, -diff --git a/drivers/clk/qcom/clock-cpu-8994.c b/drivers/clk/qcom/clock-cpu-8994.c -index 6eb346b..de3d72f 100644 ---- a/drivers/clk/qcom/clock-cpu-8994.c -+++ b/drivers/clk/qcom/clock-cpu-8994.c -@@ -191,13 +191,13 @@ static struct pll_clk a57_pll0 = { - .test_ctl_lo_val = 0x00010000, - }, - .min_rate = 1209600000, -- .max_rate = 1996800000, -+ .max_rate = 2073600000, - .base = &vbases[C1_PLL_BASE], - .c = { - .parent = &xo_ao.c, - .dbg_name = "a57_pll0", - .ops = &clk_ops_variable_rate_pll, -- VDD_DIG_FMAX_MAP2(LOW, 1593600000, NOMINAL, 1996800000), -+ VDD_DIG_FMAX_MAP2(LOW, 1593600000, NOMINAL, 2073600000), - CLK_INIT(a57_pll0.c), - }, - }; -@@ -229,13 +229,13 @@ static struct pll_clk a57_pll1 = { - /* Necessary since we'll be setting a rate before handoff on V1 */ - .src_rate = 19200000, - .min_rate = 1209600000, -- .max_rate = 1996800000, -+ .max_rate = 2073600000, - .base = &vbases[C1_PLL_BASE], - .c = { - .parent = &xo_ao.c, - .dbg_name = "a57_pll1", - .ops = &clk_ops_variable_rate_pll, -- VDD_DIG_FMAX_MAP2(LOW, 1593600000, NOMINAL, 1996800000), -+ VDD_DIG_FMAX_MAP2(LOW, 1593600000, NOMINAL, 2073600000), - CLK_INIT(a57_pll1.c), - }, - }; -diff --git a/drivers/cpufreq/qcom-cpufreq.c b/drivers/cpufreq/qcom-cpufreq.c -index e30b0cb..dd3a589 100644 ---- a/drivers/cpufreq/qcom-cpufreq.c -+++ b/drivers/cpufreq/qcom-cpufreq.c -@@ -31,6 +31,40 @@ - - static DEFINE_MUTEX(l2bw_lock); - -+static unsigned long arg_cpu_max_a53 = 1440000; -+ -+static int __init cpufreq_read_cpu_max_a53(char *cpu_max_a53) -+{ -+ unsigned long ui_khz; -+ int ret; -+ -+ ret = kstrtoul(cpu_max_a53, 0, &ui_khz); -+ if (ret) -+ return -EINVAL; -+ -+ arg_cpu_max_a53 = ui_khz; -+ printk("cpu_max_a53=%lu\n", arg_cpu_max_a53); -+ return ret; -+} -+__setup("cpu_max_a53=", cpufreq_read_cpu_max_a53); -+ -+static unsigned long arg_cpu_max_a57 = 1824000; -+ -+static int __init cpufreq_read_cpu_max_a57(char *cpu_max_a57) -+{ -+ unsigned long ui_khz; -+ int ret; -+ -+ ret = kstrtoul(cpu_max_a57, 0, &ui_khz); -+ if (ret) -+ return -EINVAL; -+ -+ arg_cpu_max_a57 = ui_khz; -+ printk("cpu_max_a57=%lu\n", arg_cpu_max_a57); -+ return ret; -+} -+__setup("cpu_max_a57=", cpufreq_read_cpu_max_a57); -+ - static struct clk *cpu_clk[NR_CPUS]; - static struct clk *l2_clk; - static DEFINE_PER_CPU(struct cpufreq_frequency_table *, freq_table); -@@ -364,6 +398,13 @@ static struct cpufreq_frequency_table *cpufreq_parse_dt(struct device *dev, - if (i > 0 && f <= ftbl[i-1].frequency) - break; - -+ //Custom max freq -+ if ((cpu < 4 && f > arg_cpu_max_a53) || -+ (cpu >= 4 && f > arg_cpu_max_a57)) { -+ nf = i; -+ break; -+ } -+ - ftbl[i].driver_data = i; - ftbl[i].frequency = f; - } --- -2.9.3 - - -From 9dfe99b9f8eead920f7cdefdb2ae7b1cea776d9b Mon Sep 17 00:00:00 2001 -From: dirtyhank -Date: Thu, 14 Jan 2016 12:56:07 +0100 -Subject: [PATCH 2/3] CPU underclocking - - Based on underclocking to Nexus 6P by anarkia1976 ---- - arch/arm/boot/dts/qcom/msm8992-regulator.dtsi | 6 +++--- - arch/arm/boot/dts/qcom/msm8992.dtsi | 14 +++++++++++--- - 2 files changed, 14 insertions(+), 6 deletions(-) - -diff --git a/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -index 23b23ba..1ef9eb3 100644 ---- a/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -+++ b/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -@@ -750,7 +750,7 @@ - qcom,cpr-voltage-scaling-factor-max = <0 0 2000 2000>; - qcom,cpr-quot-adjust-scaling-factor-max = <0 2000 2000 2000>; - qcom,cpr-corner-frequency-map = -- <1 300000000>, -+ <1 302400000>, - <2 384000000>, - <3 460800000>, - <4 600000000>, -@@ -898,8 +898,8 @@ - qcom,cpr-voltage-scaling-factor-max = <0 0 2000 2000>; - qcom,cpr-quot-adjust-scaling-factor-max = <0 0 2000 2000>; - qcom,cpr-corner-frequency-map = -- <1 300000000>, /* SVS Fmin for "SVS2" */ -- <2 300000000>, -+ <1 302400000>, /* SVS Fmin for "SVS2" */ -+ <2 302400000>, - <3 384000000>, - <4 480000000>, - <5 633600000>, -diff --git a/arch/arm/boot/dts/qcom/msm8992.dtsi b/arch/arm/boot/dts/qcom/msm8992.dtsi -index 8892b56..f6a39cd 100644 ---- a/arch/arm/boot/dts/qcom/msm8992.dtsi -+++ b/arch/arm/boot/dts/qcom/msm8992.dtsi -@@ -796,7 +796,7 @@ - governor = "cpufreq"; - freq-tbl-khz = - < 134400 >, -- < 300000 >, -+ < 302400 >, - < 384000 >, - < 556800 >, - < 600000 >, -@@ -856,7 +856,8 @@ - < 1536000 7102 >, - < 1632000 7102 >; - cpu-to-dev-map-4 = -- < 384000 1525 >, -+ < 302400 1525 >, -+ < 384000 1525 >, - < 633600 2288 >, - < 768000 3509 >, - < 864000 4173 >, -@@ -883,6 +884,7 @@ - cci-cpufreq { - target-dev = <&cci_cache>; - cpu-to-dev-map-0 = -+ < 302400 134400 >, - < 384000 134400 >, - < 600000 300000 >, - < 787200 384000 >, -@@ -892,6 +894,7 @@ - < 1536000 787200 >, - < 1632000 787200 >; - cpu-to-dev-map-4 = -+ < 302400 134400 >, - < 384000 134400 >, - < 480000 300000 >, - < 633600 384000 >, -@@ -919,6 +922,7 @@ - qcom,governor-per-policy; - - qcom,cpufreq-table-0 = -+ < 302400 >, - < 384000 >, - < 460800 >, - < 600000 >, -@@ -932,6 +936,7 @@ - < 1632000 >; - - qcom,cpufreq-table-4 = -+ < 302400 >, - < 384000 >, - < 480000 >, - < 633600 >, -@@ -966,6 +971,7 @@ - vdd-dig-supply = <&pm8994_s2_corner_ao>; - qcom,a53-speedbin0-v0 = - < 0 0>, -+ < 302400000 1>, - < 384000000 2>, - < 460800000 3>, - < 600000000 4>, -@@ -976,6 +982,7 @@ - < 1248000000 9>; - qcom,a53-speedbin1-v0 = - < 0 0>, -+ < 302400000 1>, - < 384000000 2>, - < 460800000 3>, - < 600000000 4>, -@@ -989,6 +996,7 @@ - < 1632000000 12>; - qcom,a57-speedbin0-v0 = - < 0 0>, -+ < 302400000 5>, - < 384000000 5>, - < 480000000 5>, - < 633600000 5>, -@@ -1007,7 +1015,7 @@ - qcom,cci-speedbin0-v0 = - < 0 0>, - < 134400000 2>, -- < 300000000 4>, -+ < 302400000 4>, - < 384000000 6>, - < 556800000 6>, - < 600000000 8>, --- -2.9.3 - - -From b7e24657fb125b77bb5d9a39493040e1234c7c83 Mon Sep 17 00:00:00 2001 -From: flar2 -Date: Mon, 21 Nov 2016 21:40:09 -0500 -Subject: [PATCH 3/3] msm8992: bump oc voltages - ---- - arch/arm/boot/dts/qcom/msm8992-regulator.dtsi | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -index 1ef9eb3..d2a875b 100644 ---- a/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -+++ b/arch/arm/boot/dts/qcom/msm8992-regulator.dtsi -@@ -673,11 +673,11 @@ - qcom,cpr-voltage-ceiling-override = - <0xFFFFFFFF 0 800000 800000 900000 900000 - 1000000 1000000 1115000 1115000 -- 1180000 1180000 1180000 1180000>; -+ 1180000 1180000 1180000 1200000>; - qcom,cpr-voltage-floor-override = - <0xFFFFFFFF 0 640000 655000 700000 735000 - 800000 835000 850000 875000 -- 950000 1000000 1000000 1000000>; -+ 950000 1000000 1000000 1100000>; - qcom,cpr-fuse-version-map = - <0 0xffffffff 0 0 0 0 0>, - <0 0xffffffff 1 0 0 0 0>, -@@ -849,13 +849,13 @@ - 900000 1000000 1000000 1000000 - 1115000 1115000 1115000 1115000 - 1115000 1115000 1180000 1180000 -- 1180000>; -+ 1200000>; - qcom,cpr-voltage-floor-override = - <0xFFFFFFFF 0 640000 640000 665000 690000 - 735000 745000 770000 785000 - 850000 860000 880000 900000 - 920000 935000 1000000 1000000 -- 1000000>; -+ 1100000>; - qcom,cpr-fuse-version-map = - <0xffffffff 0xffffffff 0 4 4 4 4>, - <0xffffffff 0xffffffff 1 4 4 4 4>, --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_kernel_motorola_msm8992/0002-MMC_Tweak.patch b/Patches/CyanogenMod-14.1/android_kernel_motorola_msm8992/0002-MMC_Tweak.patch deleted file mode 100644 index 0c6fc863..00000000 --- a/Patches/CyanogenMod-14.1/android_kernel_motorola_msm8992/0002-MMC_Tweak.patch +++ /dev/null @@ -1,42 +0,0 @@ -From f24f2dec25043cf7e6ef0f80a65dde45f2f131dd Mon Sep 17 00:00:00 2001 -From: franciscofranco -Date: Wed, 20 Jan 2016 01:45:39 +0000 -Subject: [PATCH] IKSWM-6057: dts: mmc: remove wakeup on idle flag - -Remove the wakeup-on-idle flag can improve the mmc -performance(verified with iozone). No current drain -and other system performance impact. - -Change-Id: Ia90cdfb66569b5ee3713d2c9785a2b7a9d24760e -Signed-off-by: Lianwei Wang -Reviewed-on: http://gerrit.mot.com/785887 -SLTApproved: Slta Waiver -SME-Granted: SME Approvals Granted -Tested-by: Jira Key -Reviewed-by: Zhi-Ming Yuan -Submit-Approved: Jira Key -Signed-off-by: franciscofranco ---- - arch/arm/boot/dts/qcom/msm8992.dtsi | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/arch/arm/boot/dts/qcom/msm8992.dtsi b/arch/arm/boot/dts/qcom/msm8992.dtsi -index 5dedecb..dc70365 100644 ---- a/arch/arm/boot/dts/qcom/msm8992.dtsi -+++ b/arch/arm/boot/dts/qcom/msm8992.dtsi -@@ -1706,7 +1706,6 @@ - qcom,cpu-dma-latency-us = <301 70>; - qcom,cpu-affinity = "affine_cores"; - qcom,cpu-affinity-mask = <0x0f 0xf0>; -- qcom,wakeup-on-idle; - - qcom,msm-bus,name = "sdhc1"; - qcom,msm-bus,num-cases = <9>; -@@ -1746,7 +1745,6 @@ - qcom,cpu-dma-latency-us = <301 70>; - qcom,cpu-affinity = "affine_cores"; - qcom,cpu-affinity-mask = <0x0f 0xf0>; -- qcom,wakeup-on-idle; - - qcom,msm-bus,name = "sdhc2"; - qcom,msm-bus,num-cases = <8>; diff --git a/Patches/CyanogenMod-14.1/android_kernel_motorola_msm8992/0004-Enable_Overclock.patch b/Patches/CyanogenMod-14.1/android_kernel_motorola_msm8992/0004-Enable_Overclock.patch deleted file mode 100644 index 17b6cdd1..00000000 --- a/Patches/CyanogenMod-14.1/android_kernel_motorola_msm8992/0004-Enable_Overclock.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 87a5b2ff5c53d13f937bdcb20ab462e4aaa61e3b Mon Sep 17 00:00:00 2001 -From: Tad -Date: Fri, 18 Nov 2016 12:38:14 -0500 -Subject: [PATCH] Enable overclock by default - -Change-Id: Idc640d7f58271892ae91678de847d9d1fcc4b281 ---- - drivers/cpufreq/qcom-cpufreq.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/cpufreq/qcom-cpufreq.c b/drivers/cpufreq/qcom-cpufreq.c -index dd3a589..4cc8680 100644 ---- a/drivers/cpufreq/qcom-cpufreq.c -+++ b/drivers/cpufreq/qcom-cpufreq.c -@@ -31,7 +31,7 @@ - - static DEFINE_MUTEX(l2bw_lock); - --static unsigned long arg_cpu_max_a53 = 1440000; -+static unsigned long arg_cpu_max_a53 = 1632000; - - static int __init cpufreq_read_cpu_max_a53(char *cpu_max_a53) - { -@@ -48,7 +48,7 @@ static int __init cpufreq_read_cpu_max_a53(char *cpu_max_a53) - } - __setup("cpu_max_a53=", cpufreq_read_cpu_max_a53); - --static unsigned long arg_cpu_max_a57 = 1824000; -+static unsigned long arg_cpu_max_a57 = 2016000; - - static int __init cpufreq_read_cpu_max_a57(char *cpu_max_a57) - { --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_kernel_oneplus_msm8974/0001-OverUnderClock-EXTREME.patch b/Patches/CyanogenMod-14.1/android_kernel_oneplus_msm8974/0001-OverUnderClock-EXTREME.patch deleted file mode 100644 index 4a8dbfc7..00000000 --- a/Patches/CyanogenMod-14.1/android_kernel_oneplus_msm8974/0001-OverUnderClock-EXTREME.patch +++ /dev/null @@ -1,1369 +0,0 @@ -From 4868289ebd16ed32f1c8d85db7029b87ea24406c Mon Sep 17 00:00:00 2001 -From: savoca -Date: Tue, 15 Jul 2014 17:12:39 +0000 -Subject: [PATCH 1/9] msm8974pro: dts: cpufreq: introduce 268MHz clock - ---- - arch/arm/boot/dts/msm8974pro.dtsi | 46 +++++++++++++++++++++++++++++++++++++++ - 1 file changed, 46 insertions(+) - -diff --git a/arch/arm/boot/dts/msm8974pro.dtsi b/arch/arm/boot/dts/msm8974pro.dtsi -index ded56d8..56ec557 100644 ---- a/arch/arm/boot/dts/msm8974pro.dtsi -+++ b/arch/arm/boot/dts/msm8974pro.dtsi -@@ -91,6 +91,7 @@ - qcom,clock-krait@f9016000 { - qcom,speed1-pvs0-bin-v0 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 74 >, - < 345600000 775000 85 >, - < 422400000 775000 104 >, -@@ -122,6 +123,7 @@ - - qcom,speed1-pvs1-bin-v0 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 74 >, - < 345600000 775000 85 >, - < 422400000 775000 104 >, -@@ -153,6 +155,7 @@ - - qcom,speed1-pvs2-bin-v0 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 74 >, - < 345600000 750000 85 >, - < 422400000 750000 104 >, -@@ -184,6 +187,7 @@ - - qcom,speed1-pvs3-bin-v0 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 74 >, - < 345600000 750000 85 >, - < 422400000 750000 104 >, -@@ -215,6 +219,7 @@ - - qcom,speed1-pvs4-bin-v0 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 74 >, - < 345600000 750000 85 >, - < 422400000 750000 104 >, -@@ -246,6 +251,7 @@ - - qcom,speed1-pvs5-bin-v0 = - < 0 0 0 >, -+ < 268800000 720000 68 >, - < 300000000 725000 74 >, - < 345600000 725000 85 >, - < 422400000 725000 104 >, -@@ -277,6 +283,7 @@ - - qcom,speed1-pvs6-bin-v0 = - < 0 0 0 >, -+ < 268800000 720000 68 >, - < 300000000 725000 74 >, - < 345600000 725000 85 >, - < 422400000 725000 104 >, -@@ -308,6 +315,7 @@ - - qcom,speed3-pvs0-bin-v0 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -342,6 +350,7 @@ - - qcom,speed3-pvs1-bin-v0 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -376,6 +385,7 @@ - - qcom,speed3-pvs2-bin-v0 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -410,6 +420,7 @@ - - qcom,speed3-pvs3-bin-v0 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -444,6 +455,7 @@ - - qcom,speed3-pvs4-bin-v0 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -478,6 +490,7 @@ - - qcom,speed3-pvs5-bin-v0 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 76 >, - < 345600000 750000 87 >, - < 422400000 750000 106 >, -@@ -512,6 +525,7 @@ - - qcom,speed3-pvs6-bin-v0 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 76 >, - < 345600000 750000 87 >, - < 422400000 750000 106 >, -@@ -546,6 +560,7 @@ - - qcom,speed1-pvs0-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 810000 87 >, - < 422400000 820000 108 >, -@@ -577,6 +592,7 @@ - - qcom,speed1-pvs1-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 810000 108 >, -@@ -608,6 +624,7 @@ - - qcom,speed1-pvs2-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 108 >, -@@ -639,6 +656,7 @@ - - qcom,speed1-pvs3-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 108 >, -@@ -670,6 +688,7 @@ - - qcom,speed1-pvs4-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 108 >, -@@ -701,6 +720,7 @@ - - qcom,speed1-pvs5-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 108 >, -@@ -732,6 +752,7 @@ - - qcom,speed1-pvs6-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -763,6 +784,7 @@ - - qcom,speed1-pvs7-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -794,6 +816,7 @@ - - qcom,speed1-pvs8-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -825,6 +848,7 @@ - - qcom,speed1-pvs9-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -856,6 +880,7 @@ - - qcom,speed1-pvs10-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -887,6 +912,7 @@ - - qcom,speed1-pvs11-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -918,6 +944,7 @@ - - qcom,speed1-pvs12-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -949,6 +976,7 @@ - - qcom,speed1-pvs13-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -980,6 +1008,7 @@ - - qcom,speed1-pvs14-bin-v1 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 76 >, - < 345600000 750000 87 >, - < 422400000 750000 108 >, -@@ -1011,6 +1040,7 @@ - - qcom,speed1-pvs15-bin-v1 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 76 >, - < 345600000 750000 87 >, - < 422400000 750000 108 >, -@@ -1042,6 +1072,7 @@ - - qcom,speed3-pvs0-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -1076,6 +1107,7 @@ - - qcom,speed3-pvs1-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -1110,6 +1142,7 @@ - - qcom,speed3-pvs2-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -1144,6 +1177,7 @@ - - qcom,speed3-pvs3-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -1178,6 +1212,7 @@ - - qcom,speed3-pvs4-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -1212,6 +1247,7 @@ - - qcom,speed3-pvs5-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -1246,6 +1282,7 @@ - - qcom,speed3-pvs6-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1280,6 +1317,7 @@ - - qcom,speed3-pvs7-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1314,6 +1352,7 @@ - - qcom,speed3-pvs8-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1348,6 +1387,7 @@ - - qcom,speed3-pvs9-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1382,6 +1422,7 @@ - - qcom,speed3-pvs10-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1416,6 +1457,7 @@ - - qcom,speed3-pvs11-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1450,6 +1492,7 @@ - - qcom,speed3-pvs12-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1484,6 +1527,7 @@ - - qcom,speed3-pvs13-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1518,6 +1562,7 @@ - - qcom,speed3-pvs14-bin-v1 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 76 >, - < 345600000 750000 87 >, - < 422400000 750000 106 >, -@@ -1552,6 +1597,7 @@ - - qcom,speed3-pvs15-bin-v1 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 76 >, - < 345600000 750000 87 >, - < 422400000 750000 106 >, --- -2.10.2 - - -From 4f8754a25b6c3d84b2b47f44a6f662349689b018 Mon Sep 17 00:00:00 2001 -From: anarkia1976 -Date: Mon, 22 Sep 2014 06:27:11 +0200 -Subject: [PATCH 2/9] msm8974pro: dts: cpufreq: added qcom cpufreq reference - table - ---- - arch/arm/boot/dts/msm8974pro.dtsi | 24 ++++++++++++++++++++++++ - 1 file changed, 24 insertions(+) - -diff --git a/arch/arm/boot/dts/msm8974pro.dtsi b/arch/arm/boot/dts/msm8974pro.dtsi -index 56ec557..edaf44e 100644 ---- a/arch/arm/boot/dts/msm8974pro.dtsi -+++ b/arch/arm/boot/dts/msm8974pro.dtsi -@@ -1631,6 +1631,30 @@ - < 2457600000 970000 802 >; - }; - -+ qcom,msm-cpufreq@0 { -+ reg = <0 4>; -+ compatible = "qcom,msm-cpufreq"; -+ qcom,cpufreq-table = -+ < 268800 /* 75 MHz */ >, -+ < 300000 /* 75 MHz */ >, -+ < 422400 /* 150 MHz */ >, -+ < 652800 /* 200 MHz */ >, -+ < 729600 /* 307 MHz */ >, -+ < 883200 /* 307 MHz */ >, -+ < 960000 /* 460 MHz */ >, -+ < 1036800 /* 460 MHz */ >, -+ < 1190400 /* 460 MHz */ >, -+ < 1267200 /* 614 MHz */ >, -+ < 1497600 /* 614 MHz */ >, -+ < 1574400 /* 800 MHz */ >, -+ < 1728000 /* 800 MHz */ >, -+ < 1958400 /* 931 MHz */ >, -+ < 2265600 /* 931 MHz */ >, -+ < 2342400 /* 931 MHz */ >, -+ < 2419200 /* 931 MHz */ >, -+ < 2457600 /* 931 MHz */ >; -+ }; -+ - i2c@f9928000 { /* BLSP-1 QUP-6 */ - cell-index = <3>; - compatible = "qcom,i2c-qup"; --- -2.10.2 - - -From a0ad4e60da9fd1a1fff7c96c60c3fa4cb38ebebd Mon Sep 17 00:00:00 2001 -From: anarkia1976 -Date: Wed, 24 Sep 2014 17:45:31 +0200 -Subject: [PATCH 3/9] msm8974pro: dts: cpu overclocking to 2880Ghz - -Conflicts: - arch/arm/boot/dts/msm8974pro-pma8084-regulator.dtsi ---- - arch/arm/boot/dts/msm8974pro-pm8941.dtsi | 8 +-- - arch/arm/boot/dts/msm8974pro.dtsi | 120 ++++++++++++++++++++++++------- - 2 files changed, 100 insertions(+), 28 deletions(-) - -diff --git a/arch/arm/boot/dts/msm8974pro-pm8941.dtsi b/arch/arm/boot/dts/msm8974pro-pm8941.dtsi -index b502078..79729ea 100644 ---- a/arch/arm/boot/dts/msm8974pro-pm8941.dtsi -+++ b/arch/arm/boot/dts/msm8974pro-pm8941.dtsi -@@ -39,22 +39,22 @@ - }; - - &krait0_vreg { -- regulator-max-microvolt = <1120000>; -+ regulator-max-microvolt = <1250000>; - qcom,ldo-delta-voltage = <12500>; - }; - - &krait1_vreg { -- regulator-max-microvolt = <1120000>; -+ regulator-max-microvolt = <1250000>; - qcom,ldo-delta-voltage = <12500>; - }; - - &krait2_vreg { -- regulator-max-microvolt = <1120000>; -+ regulator-max-microvolt = <1250000>; - qcom,ldo-delta-voltage = <12500>; - }; - - &krait3_vreg { -- regulator-max-microvolt = <1120000>; -+ regulator-max-microvolt = <1250000>; - qcom,ldo-delta-voltage = <12500>; - }; - -diff --git a/arch/arm/boot/dts/msm8974pro.dtsi b/arch/arm/boot/dts/msm8974pro.dtsi -index edaf44e..9d59eaf 100644 ---- a/arch/arm/boot/dts/msm8974pro.dtsi -+++ b/arch/arm/boot/dts/msm8974pro.dtsi -@@ -346,7 +346,10 @@ - < 2265600000 1065000 700 >, - < 2342400000 1080000 734 >, - < 2419200000 1095000 769 >, -- < 2457600000 1100000 785 >; -+ < 2457600000 1100000 785 >, -+ < 2572800000 1120000 827 >, -+ < 2726400000 1180000 900 >, -+ < 2880000000 1210000 937 >; - - qcom,speed3-pvs1-bin-v0 = - < 0 0 0 >, -@@ -381,7 +384,10 @@ - < 2265600000 1040000 700 >, - < 2342400000 1055000 734 >, - < 2419200000 1070000 769 >, -- < 2457600000 1075000 785 >; -+ < 2457600000 1075000 785 >, -+ < 2572800000 1120000 827 >, -+ < 2726400000 1180000 900 >, -+ < 2880000000 1210000 937 >; - - qcom,speed3-pvs2-bin-v0 = - < 0 0 0 >, -@@ -416,7 +422,10 @@ - < 2265600000 1015000 700 >, - < 2342400000 1030000 734 >, - < 2419200000 1045000 769 >, -- < 2457600000 1050000 785 >; -+ < 2457600000 1050000 785 >, -+ < 2572800000 1100000 827 >, -+ < 2726400000 1170000 900 >, -+ < 2880000000 1200000 937 >; - - qcom,speed3-pvs3-bin-v0 = - < 0 0 0 >, -@@ -451,7 +460,10 @@ - < 2265600000 990000 700 >, - < 2342400000 1005000 734 >, - < 2419200000 1020000 769 >, -- < 2457600000 1025000 785 >; -+ < 2457600000 1025000 785 >, -+ < 2572800000 1090000 827 >, -+ < 2726400000 1160000 900 >, -+ < 2880000000 1190000 937 >; - - qcom,speed3-pvs4-bin-v0 = - < 0 0 0 >, -@@ -486,7 +498,10 @@ - < 2265600000 965000 700 >, - < 2342400000 980000 734 >, - < 2419200000 995000 769 >, -- < 2457600000 1000000 785 >; -+ < 2457600000 1000000 785 >, -+ < 2572800000 1050000 827 >, -+ < 2726400000 1150000 900 >, -+ < 2880000000 1180000 937 >; - - qcom,speed3-pvs5-bin-v0 = - < 0 0 0 >, -@@ -521,7 +536,10 @@ - < 2265600000 940000 700 >, - < 2342400000 955000 734 >, - < 2419200000 970000 769 >, -- < 2457600000 975000 785 >; -+ < 2457600000 975000 785 >, -+ < 2572800000 1000000 827 >, -+ < 2726400000 1150000 900 >, -+ < 2880000000 1170000 937 >; - - qcom,speed3-pvs6-bin-v0 = - < 0 0 0 >, -@@ -556,7 +574,10 @@ - < 2265600000 915000 700 >, - < 2342400000 930000 734 >, - < 2419200000 945000 769 >, -- < 2457600000 950000 785 >; -+ < 2457600000 950000 785 >, -+ < 2572800000 985000 827 >, -+ < 2726400000 1130000 900 >, -+ < 2880000000 1150000 937 >; - - qcom,speed1-pvs0-bin-v1 = - < 0 0 0 >, -@@ -1103,7 +1124,10 @@ - < 2265600000 1085000 716 >, - < 2342400000 1100000 751 >, - < 2419200000 1115000 786 >, -- < 2457600000 1120000 802 >; -+ < 2457600000 1120000 802 >, -+ < 2572800000 1150000 827 >, -+ < 2726400000 1200000 900 >, -+ < 2880000000 1240000 937 >; - - qcom,speed3-pvs1-bin-v1 = - < 0 0 0 >, -@@ -1138,7 +1162,10 @@ - < 2265600000 1075000 716 >, - < 2342400000 1090000 751 >, - < 2419200000 1105000 786 >, -- < 2457600000 1110000 802 >; -+ < 2457600000 1110000 802 >, -+ < 2572800000 1140000 827 >, -+ < 2726400000 1190000 900 >, -+ < 2880000000 1220000 937 >; - - qcom,speed3-pvs2-bin-v1 = - < 0 0 0 >, -@@ -1173,7 +1200,10 @@ - < 2265600000 1065000 716 >, - < 2342400000 1080000 751 >, - < 2419200000 1095000 786 >, -- < 2457600000 1100000 802 >; -+ < 2457600000 1100000 802 >, -+ < 2572800000 1120000 827 >, -+ < 2726400000 1160000 900 >, -+ < 2880000000 1190000 937 >; - - qcom,speed3-pvs3-bin-v1 = - < 0 0 0 >, -@@ -1208,7 +1238,10 @@ - < 2265600000 1055000 716 >, - < 2342400000 1070000 751 >, - < 2419200000 1085000 786 >, -- < 2457600000 1090000 802 >; -+ < 2457600000 1090000 802 >, -+ < 2572800000 1120000 827 >, -+ < 2726400000 1150000 900 >, -+ < 2880000000 1180000 937 >; - - qcom,speed3-pvs4-bin-v1 = - < 0 0 0 >, -@@ -1243,7 +1276,10 @@ - < 2265600000 1045000 716 >, - < 2342400000 1060000 751 >, - < 2419200000 1075000 786 >, -- < 2457600000 1080000 802 >; -+ < 2457600000 1080000 802 >, -+ < 2572800000 1110000 827 >, -+ < 2726400000 1140000 900 >, -+ < 2880000000 1170000 937 >; - - qcom,speed3-pvs5-bin-v1 = - < 0 0 0 >, -@@ -1278,7 +1314,10 @@ - < 2265600000 1035000 716 >, - < 2342400000 1050000 751 >, - < 2419200000 1065000 786 >, -- < 2457600000 1070000 802 >; -+ < 2457600000 1070000 802 >, -+ < 2572800000 1100000 827 >, -+ < 2726400000 1130000 900 >, -+ < 2880000000 1160000 937 >; - - qcom,speed3-pvs6-bin-v1 = - < 0 0 0 >, -@@ -1313,7 +1352,10 @@ - < 2265600000 1025000 716 >, - < 2342400000 1040000 751 >, - < 2419200000 1055000 786 >, -- < 2457600000 1060000 802 >; -+ < 2457600000 1060000 802 >, -+ < 2572800000 1090000 827 >, -+ < 2726400000 1120000 900 >, -+ < 2880000000 1150000 937 >; - - qcom,speed3-pvs7-bin-v1 = - < 0 0 0 >, -@@ -1348,7 +1390,10 @@ - < 2265600000 1015000 716 >, - < 2342400000 1030000 751 >, - < 2419200000 1045000 786 >, -- < 2457600000 1050000 802 >; -+ < 2457600000 1050000 802 >, -+ < 2572800000 1080000 827 >, -+ < 2726400000 1110000 900 >, -+ < 2880000000 1140000 937 >; - - qcom,speed3-pvs8-bin-v1 = - < 0 0 0 >, -@@ -1383,7 +1428,10 @@ - < 2265600000 1005000 716 >, - < 2342400000 1020000 751 >, - < 2419200000 1035000 786 >, -- < 2457600000 1040000 802 >; -+ < 2457600000 1040000 802 >, -+ < 2572800000 1070000 827 >, -+ < 2726400000 1100000 900 >, -+ < 2880000000 1130000 937 >; - - qcom,speed3-pvs9-bin-v1 = - < 0 0 0 >, -@@ -1418,7 +1466,10 @@ - < 2265600000 995000 716 >, - < 2342400000 1010000 751 >, - < 2419200000 1025000 786 >, -- < 2457600000 1030000 802 >; -+ < 2457600000 1030000 802 >, -+ < 2572800000 1060000 827 >, -+ < 2726400000 1090000 900 >, -+ < 2880000000 1120000 937 >; - - qcom,speed3-pvs10-bin-v1 = - < 0 0 0 >, -@@ -1453,7 +1504,10 @@ - < 2265600000 985000 716 >, - < 2342400000 1000000 751 >, - < 2419200000 1015000 786 >, -- < 2457600000 1020000 802 >; -+ < 2457600000 1020000 802 >, -+ < 2572800000 1050000 827 >, -+ < 2726400000 1080000 900 >, -+ < 2880000000 1110000 937 >; - - qcom,speed3-pvs11-bin-v1 = - < 0 0 0 >, -@@ -1488,7 +1542,10 @@ - < 2265600000 975000 716 >, - < 2342400000 990000 751 >, - < 2419200000 1005000 786 >, -- < 2457600000 1010000 802 >; -+ < 2457600000 1010000 802 >, -+ < 2572800000 1040000 827 >, -+ < 2726400000 1070000 900 >, -+ < 2880000000 1100000 937 >; - - qcom,speed3-pvs12-bin-v1 = - < 0 0 0 >, -@@ -1523,7 +1580,10 @@ - < 2265600000 965000 716 >, - < 2342400000 980000 751 >, - < 2419200000 995000 786 >, -- < 2457600000 1000000 802 >; -+ < 2457600000 1000000 802 >, -+ < 2572800000 1040000 827 >, -+ < 2726400000 1060000 900 >, -+ < 2880000000 1090000 937 >; - - qcom,speed3-pvs13-bin-v1 = - < 0 0 0 >, -@@ -1558,7 +1618,10 @@ - < 2265600000 955000 716 >, - < 2342400000 970000 751 >, - < 2419200000 985000 786 >, -- < 2457600000 990000 802 >; -+ < 2457600000 990000 802 >, -+ < 2572800000 1020000 827 >, -+ < 2726400000 1040000 900 >, -+ < 2880000000 1070000 937 >; - - qcom,speed3-pvs14-bin-v1 = - < 0 0 0 >, -@@ -1593,7 +1656,10 @@ - < 2265600000 945000 716 >, - < 2342400000 960000 751 >, - < 2419200000 975000 786 >, -- < 2457600000 980000 802 >; -+ < 2457600000 980000 802 >, -+ < 2572800000 1010000 827 >, -+ < 2726400000 1030000 900 >, -+ < 2880000000 1060000 937 >; - - qcom,speed3-pvs15-bin-v1 = - < 0 0 0 >, -@@ -1628,7 +1694,10 @@ - < 2265600000 935000 716 >, - < 2342400000 950000 751 >, - < 2419200000 965000 786 >, -- < 2457600000 970000 802 >; -+ < 2457600000 970000 802 >, -+ < 2572800000 1000000 827 >, -+ < 2726400000 1020000 900 >, -+ < 2880000000 1050000 937 >; - }; - - qcom,msm-cpufreq@0 { -@@ -1652,7 +1721,10 @@ - < 2265600 /* 931 MHz */ >, - < 2342400 /* 931 MHz */ >, - < 2419200 /* 931 MHz */ >, -- < 2457600 /* 931 MHz */ >; -+ < 2457600 /* 931 MHz */ >, -+ < 2572800 /* 931 MHz */ >, -+ < 2726400 /* 931 MHz */ >, -+ < 2880000 /* 931 MHz */ >; - }; - - i2c@f9928000 { /* BLSP-1 QUP-6 */ --- -2.10.2 - - -From 79da7e38c37f157c196a4cdb35415720f319b9b9 Mon Sep 17 00:00:00 2001 -From: "stefano.villa1976@gmail.com" -Date: Sat, 21 Feb 2015 01:24:45 -0700 -Subject: [PATCH 4/9] msm8974pro: dts: cpufreq: enable low steps for CPU - frequencies - ---- - arch/arm/boot/dts/msm8974pro.dtsi | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/arch/arm/boot/dts/msm8974pro.dtsi b/arch/arm/boot/dts/msm8974pro.dtsi -index 9d59eaf..a3c6552 100644 ---- a/arch/arm/boot/dts/msm8974pro.dtsi -+++ b/arch/arm/boot/dts/msm8974pro.dtsi -@@ -1706,9 +1706,13 @@ - qcom,cpufreq-table = - < 268800 /* 75 MHz */ >, - < 300000 /* 75 MHz */ >, -+ < 345600 /* 75 MHz */ >, - < 422400 /* 150 MHz */ >, -+ < 499200 /* 150 MHz */ >, -+ < 576000 /* 150 MHz */ >, - < 652800 /* 200 MHz */ >, - < 729600 /* 307 MHz */ >, -+ < 806400 /* 307 MHz */ >, - < 883200 /* 307 MHz */ >, - < 960000 /* 460 MHz */ >, - < 1036800 /* 460 MHz */ >, --- -2.10.2 - - -From e87bbd0e60f847c832e2e7f04f83a2c50e81ff7f Mon Sep 17 00:00:00 2001 -From: "stefano.villa1976@gmail.com" -Date: Sat, 21 Feb 2015 05:22:56 -0700 -Subject: [PATCH 5/9] msm8974pro: dts: cpufreq: enable middle steps for CPU - frequencies - ---- - arch/arm/boot/dts/msm8974pro.dtsi | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/arch/arm/boot/dts/msm8974pro.dtsi b/arch/arm/boot/dts/msm8974pro.dtsi -index a3c6552..d8073bc 100644 ---- a/arch/arm/boot/dts/msm8974pro.dtsi -+++ b/arch/arm/boot/dts/msm8974pro.dtsi -@@ -1716,10 +1716,14 @@ - < 883200 /* 307 MHz */ >, - < 960000 /* 460 MHz */ >, - < 1036800 /* 460 MHz */ >, -+ < 1113600 /* 460 MHz */ >, - < 1190400 /* 460 MHz */ >, - < 1267200 /* 614 MHz */ >, -+ < 1344000 /* 614 MHz */ >, -+ < 1420800 /* 614 MHz */ >, - < 1497600 /* 614 MHz */ >, - < 1574400 /* 800 MHz */ >, -+ < 1651200 /* 800 MHz */ >, - < 1728000 /* 800 MHz */ >, - < 1958400 /* 931 MHz */ >, - < 2265600 /* 931 MHz */ >, --- -2.10.2 - - -From a4518d0fbd58d59538b1b094e5b5b99ae9ed9938 Mon Sep 17 00:00:00 2001 -From: nikhil18 -Date: Sat, 19 Dec 2015 18:44:44 +0530 -Subject: [PATCH 6/9] add more cpu overclock frequencies - ---- - arch/arm/boot/dts/msm8974.dtsi | 3 +- - arch/arm/boot/dts/msm8974pro.dtsi | 214 +++++++++++++++++++++++++------------- - 2 files changed, 145 insertions(+), 72 deletions(-) - -diff --git a/arch/arm/boot/dts/msm8974.dtsi b/arch/arm/boot/dts/msm8974.dtsi -index 80907a3..949d47e 100644 ---- a/arch/arm/boot/dts/msm8974.dtsi -+++ b/arch/arm/boot/dts/msm8974.dtsi -@@ -1484,7 +1484,8 @@ - < 3509 /* 460 MHz */ >, - < 4684 /* 614 MHz */ >, - < 6103 /* 800 MHz */ >, -- < 7102 /* 931 MHz */ >; -+ < 7102 /* 931 MHz */ >, -+ < 7674 /* 1006 MHz */ >; - }; - - qcom,kraitbw-l2pm { -diff --git a/arch/arm/boot/dts/msm8974pro.dtsi b/arch/arm/boot/dts/msm8974pro.dtsi -index d8073bc..1ef99df 100644 ---- a/arch/arm/boot/dts/msm8974pro.dtsi -+++ b/arch/arm/boot/dts/msm8974pro.dtsi -@@ -347,9 +347,12 @@ - < 2342400000 1080000 734 >, - < 2419200000 1095000 769 >, - < 2457600000 1100000 785 >, -- < 2572800000 1120000 827 >, -- < 2726400000 1180000 900 >, -- < 2880000000 1210000 937 >; -+ < 2572800000 1145000 827 >, -+ < 2649600000 1185000 866 >, -+ < 2726400000 1205000 900 >, -+ < 2803200000 1215000 937 >, -+ < 2880000000 1235000 937 >, -+ < 2956800000 1250000 937 >; - - qcom,speed3-pvs1-bin-v0 = - < 0 0 0 >, -@@ -385,9 +388,12 @@ - < 2342400000 1055000 734 >, - < 2419200000 1070000 769 >, - < 2457600000 1075000 785 >, -- < 2572800000 1120000 827 >, -- < 2726400000 1180000 900 >, -- < 2880000000 1210000 937 >; -+ < 2572800000 1145000 827 >, -+ < 2649600000 1175000 866 >, -+ < 2726400000 1205000 900 >, -+ < 2803200000 1215000 937 >, -+ < 2880000000 1235000 937 >, -+ < 2956800000 1250000 937 >; - - qcom,speed3-pvs2-bin-v0 = - < 0 0 0 >, -@@ -423,9 +429,12 @@ - < 2342400000 1030000 734 >, - < 2419200000 1045000 769 >, - < 2457600000 1050000 785 >, -- < 2572800000 1100000 827 >, -- < 2726400000 1170000 900 >, -- < 2880000000 1200000 937 >; -+ < 2572800000 1125000 827 >, -+ < 2649600000 1165000 866 >, -+ < 2726400000 1195000 900 >, -+ < 2803200000 1205000 937 >, -+ < 2880000000 1225000 937 >, -+ < 2956800000 1240000 937 >; - - qcom,speed3-pvs3-bin-v0 = - < 0 0 0 >, -@@ -461,9 +470,13 @@ - < 2342400000 1005000 734 >, - < 2419200000 1020000 769 >, - < 2457600000 1025000 785 >, -- < 2572800000 1090000 827 >, -- < 2726400000 1160000 900 >, -- < 2880000000 1190000 937 >; -+ < 2572800000 1115000 827 >, -+ < 2649600000 1155000 866 >, -+ < 2726400000 1185000 900 >, -+ < 2803200000 1195000 937 >, -+ < 2880000000 1215000 937 >, -+ < 2956800000 1230000 937 >; -+ - - qcom,speed3-pvs4-bin-v0 = - < 0 0 0 >, -@@ -499,9 +512,12 @@ - < 2342400000 980000 734 >, - < 2419200000 995000 769 >, - < 2457600000 1000000 785 >, -- < 2572800000 1050000 827 >, -- < 2726400000 1150000 900 >, -- < 2880000000 1180000 937 >; -+ < 2572800000 1075000 827 >, -+ < 2649600000 1155000 866 >, -+ < 2726400000 1175000 900 >, -+ < 2803200000 1185000 937 >, -+ < 2880000000 1205000 937 >, -+ < 2956800000 1220000 937 >; - - qcom,speed3-pvs5-bin-v0 = - < 0 0 0 >, -@@ -537,9 +553,12 @@ - < 2342400000 955000 734 >, - < 2419200000 970000 769 >, - < 2457600000 975000 785 >, -- < 2572800000 1000000 827 >, -- < 2726400000 1150000 900 >, -- < 2880000000 1170000 937 >; -+ < 2572800000 1025000 827 >, -+ < 2649600000 1145000 866 >, -+ < 2726400000 1175000 900 >, -+ < 2803200000 1185000 937 >, -+ < 2880000000 1195000 937 >, -+ < 2956800000 1210000 937 >; - - qcom,speed3-pvs6-bin-v0 = - < 0 0 0 >, -@@ -575,9 +594,12 @@ - < 2342400000 930000 734 >, - < 2419200000 945000 769 >, - < 2457600000 950000 785 >, -- < 2572800000 985000 827 >, -- < 2726400000 1130000 900 >, -- < 2880000000 1150000 937 >; -+ < 2572800000 1010000 827 >, -+ < 2649600000 1135000 866 >, -+ < 2726400000 1155000 900 >, -+ < 2803200000 1165000 937 >, -+ < 2880000000 1175000 937 >, -+ < 2956800000 1200000 937 >; - - qcom,speed1-pvs0-bin-v1 = - < 0 0 0 >, -@@ -1125,9 +1147,12 @@ - < 2342400000 1100000 751 >, - < 2419200000 1115000 786 >, - < 2457600000 1120000 802 >, -- < 2572800000 1150000 827 >, -- < 2726400000 1200000 900 >, -- < 2880000000 1240000 937 >; -+ < 2572800000 1175000 827 >, -+ < 2649600000 1200000 866 >, -+ < 2726400000 1225000 900 >, -+ < 2803200000 1245000 937 >, -+ < 2880000000 1265000 937 >, -+ < 2956800000 1280000 937 >; - - qcom,speed3-pvs1-bin-v1 = - < 0 0 0 >, -@@ -1163,9 +1188,12 @@ - < 2342400000 1090000 751 >, - < 2419200000 1105000 786 >, - < 2457600000 1110000 802 >, -- < 2572800000 1140000 827 >, -- < 2726400000 1190000 900 >, -- < 2880000000 1220000 937 >; -+ < 2572800000 1165000 827 >, -+ < 2649600000 1190000 866 >, -+ < 2726400000 1215000 900 >, -+ < 2803200000 1225000 937 >, -+ < 2880000000 1245000 937 >, -+ < 2956800000 1260000 937 >; - - qcom,speed3-pvs2-bin-v1 = - < 0 0 0 >, -@@ -1201,9 +1229,12 @@ - < 2342400000 1080000 751 >, - < 2419200000 1095000 786 >, - < 2457600000 1100000 802 >, -- < 2572800000 1120000 827 >, -- < 2726400000 1160000 900 >, -- < 2880000000 1190000 937 >; -+ < 2572800000 1145000 827 >, -+ < 2649600000 1160000 866 >, -+ < 2726400000 1185000 900 >, -+ < 2803200000 1205000 937 >, -+ < 2880000000 1215000 937 >, -+ < 2956800000 1240000 937 >; - - qcom,speed3-pvs3-bin-v1 = - < 0 0 0 >, -@@ -1239,9 +1270,12 @@ - < 2342400000 1070000 751 >, - < 2419200000 1085000 786 >, - < 2457600000 1090000 802 >, -- < 2572800000 1120000 827 >, -- < 2726400000 1150000 900 >, -- < 2880000000 1180000 937 >; -+ < 2572800000 1145000 827 >, -+ < 2649600000 1160000 866 >, -+ < 2726400000 1175000 900 >, -+ < 2803200000 1195000 937 >, -+ < 2880000000 1205000 937 >, -+ < 2956800000 1220000 937 >; - - qcom,speed3-pvs4-bin-v1 = - < 0 0 0 >, -@@ -1277,9 +1311,12 @@ - < 2342400000 1060000 751 >, - < 2419200000 1075000 786 >, - < 2457600000 1080000 802 >, -- < 2572800000 1110000 827 >, -- < 2726400000 1140000 900 >, -- < 2880000000 1170000 937 >; -+ < 2572800000 1135000 827 >, -+ < 2649600000 1150000 866 >, -+ < 2726400000 1165000 900 >, -+ < 2803200000 1185000 937 >, -+ < 2880000000 1195000 937 >, -+ < 2956800000 1210000 937 >; - - qcom,speed3-pvs5-bin-v1 = - < 0 0 0 >, -@@ -1315,9 +1352,12 @@ - < 2342400000 1050000 751 >, - < 2419200000 1065000 786 >, - < 2457600000 1070000 802 >, -- < 2572800000 1100000 827 >, -- < 2726400000 1130000 900 >, -- < 2880000000 1160000 937 >; -+ < 2572800000 1125000 827 >, -+ < 2649600000 1140000 866 >, -+ < 2726400000 1155000 900 >, -+ < 2803200000 1175000 937 >, -+ < 2880000000 1185000 937 >, -+ < 2956800000 1200000 937 >; - - qcom,speed3-pvs6-bin-v1 = - < 0 0 0 >, -@@ -1353,9 +1393,12 @@ - < 2342400000 1040000 751 >, - < 2419200000 1055000 786 >, - < 2457600000 1060000 802 >, -- < 2572800000 1090000 827 >, -- < 2726400000 1120000 900 >, -- < 2880000000 1150000 937 >; -+ < 2572800000 1115000 827 >, -+ < 2649600000 1130000 866 >, -+ < 2726400000 1145000 900 >, -+ < 2803200000 1165000 937 >, -+ < 2880000000 1175000 937 >, -+ < 2956800000 1190000 937 >; - - qcom,speed3-pvs7-bin-v1 = - < 0 0 0 >, -@@ -1391,9 +1434,12 @@ - < 2342400000 1030000 751 >, - < 2419200000 1045000 786 >, - < 2457600000 1050000 802 >, -- < 2572800000 1080000 827 >, -- < 2726400000 1110000 900 >, -- < 2880000000 1140000 937 >; -+ < 2572800000 1105000 827 >, -+ < 2649600000 1120000 866 >, -+ < 2726400000 1135000 900 >, -+ < 2803200000 1155000 937 >, -+ < 2880000000 1165000 937 >, -+ < 2956800000 1180000 937 >; - - qcom,speed3-pvs8-bin-v1 = - < 0 0 0 >, -@@ -1429,9 +1475,12 @@ - < 2342400000 1020000 751 >, - < 2419200000 1035000 786 >, - < 2457600000 1040000 802 >, -- < 2572800000 1070000 827 >, -- < 2726400000 1100000 900 >, -- < 2880000000 1130000 937 >; -+ < 2572800000 1095000 827 >, -+ < 2649600000 1110000 866 >, -+ < 2726400000 1125000 900 >, -+ < 2803200000 1145000 937 >, -+ < 2880000000 1155000 937 >, -+ < 2956800000 1170000 937 >; - - qcom,speed3-pvs9-bin-v1 = - < 0 0 0 >, -@@ -1467,9 +1516,12 @@ - < 2342400000 1010000 751 >, - < 2419200000 1025000 786 >, - < 2457600000 1030000 802 >, -- < 2572800000 1060000 827 >, -- < 2726400000 1090000 900 >, -- < 2880000000 1120000 937 >; -+ < 2572800000 1085000 827 >, -+ < 2649600000 1100000 866 >, -+ < 2726400000 1115000 900 >, -+ < 2803200000 1135000 937 >, -+ < 2880000000 1145000 937 >, -+ < 2956800000 1160000 937 >; - - qcom,speed3-pvs10-bin-v1 = - < 0 0 0 >, -@@ -1505,9 +1557,12 @@ - < 2342400000 1000000 751 >, - < 2419200000 1015000 786 >, - < 2457600000 1020000 802 >, -- < 2572800000 1050000 827 >, -- < 2726400000 1080000 900 >, -- < 2880000000 1110000 937 >; -+ < 2572800000 1075000 827 >, -+ < 2649600000 1090000 866 >, -+ < 2726400000 1105000 900 >, -+ < 2803200000 1125000 937 >, -+ < 2880000000 1135000 937 >, -+ < 2956800000 1150000 937 >; - - qcom,speed3-pvs11-bin-v1 = - < 0 0 0 >, -@@ -1543,9 +1598,12 @@ - < 2342400000 990000 751 >, - < 2419200000 1005000 786 >, - < 2457600000 1010000 802 >, -- < 2572800000 1040000 827 >, -- < 2726400000 1070000 900 >, -- < 2880000000 1100000 937 >; -+ < 2572800000 1065000 827 >, -+ < 2649600000 1080000 866 >, -+ < 2726400000 1095000 900 >, -+ < 2803200000 1115000 937 >, -+ < 2880000000 1125000 937 >, -+ < 2956800000 1140000 937 >; - - qcom,speed3-pvs12-bin-v1 = - < 0 0 0 >, -@@ -1581,9 +1639,12 @@ - < 2342400000 980000 751 >, - < 2419200000 995000 786 >, - < 2457600000 1000000 802 >, -- < 2572800000 1040000 827 >, -- < 2726400000 1060000 900 >, -- < 2880000000 1090000 937 >; -+ < 2572800000 1065000 827 >, -+ < 2649600000 1075000 866 >, -+ < 2726400000 1085000 900 >, -+ < 2803200000 1105000 937 >, -+ < 2880000000 1115000 937 >, -+ < 2956800000 1130000 937 >; - - qcom,speed3-pvs13-bin-v1 = - < 0 0 0 >, -@@ -1619,9 +1680,12 @@ - < 2342400000 970000 751 >, - < 2419200000 985000 786 >, - < 2457600000 990000 802 >, -- < 2572800000 1020000 827 >, -- < 2726400000 1040000 900 >, -- < 2880000000 1070000 937 >; -+ < 2572800000 1045000 827 >, -+ < 2649600000 1055000 866 >, -+ < 2726400000 1065000 900 >, -+ < 2803200000 1085000 937 >, -+ < 2880000000 1095000 937 >, -+ < 2956800000 1110000 937 >; - - qcom,speed3-pvs14-bin-v1 = - < 0 0 0 >, -@@ -1657,9 +1721,12 @@ - < 2342400000 960000 751 >, - < 2419200000 975000 786 >, - < 2457600000 980000 802 >, -- < 2572800000 1010000 827 >, -- < 2726400000 1030000 900 >, -- < 2880000000 1060000 937 >; -+ < 2572800000 1035000 827 >, -+ < 2649600000 1045000 866 >, -+ < 2726400000 1055000 900 >, -+ < 2803200000 1075000 937 >, -+ < 2880000000 1085000 937 >, -+ < 2956800000 1100000 937 >; - - qcom,speed3-pvs15-bin-v1 = - < 0 0 0 >, -@@ -1695,16 +1762,19 @@ - < 2342400000 950000 751 >, - < 2419200000 965000 786 >, - < 2457600000 970000 802 >, -- < 2572800000 1000000 827 >, -- < 2726400000 1020000 900 >, -- < 2880000000 1050000 937 >; -+ < 2572800000 1025000 827 >, -+ < 2649600000 1035000 866 >, -+ < 2726400000 1045000 900 >, -+ < 2803200000 1065000 937 >, -+ < 2880000000 1075000 937 >, -+ < 2956800000 1090000 937 >; - }; - - qcom,msm-cpufreq@0 { - reg = <0 4>; - compatible = "qcom,msm-cpufreq"; - qcom,cpufreq-table = -- < 268800 /* 75 MHz */ >, -+ < 268800 /* 50 MHz */ >, - < 300000 /* 75 MHz */ >, - < 345600 /* 75 MHz */ >, - < 422400 /* 150 MHz */ >, -@@ -1725,13 +1795,15 @@ - < 1574400 /* 800 MHz */ >, - < 1651200 /* 800 MHz */ >, - < 1728000 /* 800 MHz */ >, -- < 1958400 /* 931 MHz */ >, -+ < 1958400 /* 800 MHz */ >, - < 2265600 /* 931 MHz */ >, - < 2342400 /* 931 MHz */ >, - < 2419200 /* 931 MHz */ >, - < 2457600 /* 931 MHz */ >, - < 2572800 /* 931 MHz */ >, -+ < 2649600 /* 931 MHz */ >, - < 2726400 /* 931 MHz */ >, -+ < 2803200 /* 931 MHz */ >, - < 2880000 /* 931 MHz */ >; - }; - --- -2.10.2 - - -From 2b75e5bcb9f3f8a72e6d2df812a7e06c52b525ae Mon Sep 17 00:00:00 2001 -From: Evisceration -Date: Mon, 8 Dec 2014 01:22:03 +0100 -Subject: [PATCH 7/9] dts: fix incorrect frequency - - * causes core 0 to be stuck at 2265 MHz - -Change-Id: I8d60596ca12255290d0f673666227ad28ea5514f ---- - arch/arm/boot/dts/msm8974-v2.dtsi | 2 +- - arch/arm/boot/dts/msm8974pro.dtsi | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/arch/arm/boot/dts/msm8974-v2.dtsi b/arch/arm/boot/dts/msm8974-v2.dtsi -index 91844c3..f98f53a 100644 ---- a/arch/arm/boot/dts/msm8974-v2.dtsi -+++ b/arch/arm/boot/dts/msm8974-v2.dtsi -@@ -123,7 +123,7 @@ - <1880000 2068000>, - <3008000 3309000>, - <3760000 4136000>, -- <4468000 2457000>; -+ <4468000 2457600>; - qcom,dec-ocmem-ab-ib = <0 0>, - <176000 519000>, - <456000 519000>, -diff --git a/arch/arm/boot/dts/msm8974pro.dtsi b/arch/arm/boot/dts/msm8974pro.dtsi -index 1ef99df..fed5f66 100644 ---- a/arch/arm/boot/dts/msm8974pro.dtsi -+++ b/arch/arm/boot/dts/msm8974pro.dtsi -@@ -1967,7 +1967,7 @@ - <1880000 2068000>, - <3008000 3309000>, - <3760000 4136000>, -- <4468000 2457000>; -+ <4468000 2457600>; - qcom,dec-ocmem-ab-ib = <0 0>, - <176000 519000>, - <456000 519000>, --- -2.10.2 - - -From 7fd5237c0cc7487b73ce9eec61853dcd126869c5 Mon Sep 17 00:00:00 2001 -From: WedyDQ10 -Date: Sun, 11 Jan 2015 20:55:23 +0900 -Subject: [PATCH 8/9] CPU Overclock over 2.889GHz - ---- - arch/arm/mach-msm/clock-krait-8974.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/arch/arm/mach-msm/clock-krait-8974.c b/arch/arm/mach-msm/clock-krait-8974.c -index f7ca20a..d96eb37 100644 ---- a/arch/arm/mach-msm/clock-krait-8974.c -+++ b/arch/arm/mach-msm/clock-krait-8974.c -@@ -44,7 +44,7 @@ static int hfpll_uv[] = { - static DEFINE_VDD_REGULATORS(vdd_hfpll, ARRAY_SIZE(hfpll_uv)/2, 2, - hfpll_uv, NULL); - --static unsigned long hfpll_fmax[] = { 0, 998400000, 1996800000, 2900000000UL }; -+static unsigned long hfpll_fmax[] = { 0, 998400000, 1996800000, 3100000000UL }; - - static struct hfpll_data hdata = { - .mode_offset = 0x0, -@@ -58,7 +58,7 @@ static struct hfpll_data hdata = { - .user_val = 0x8, - .low_vco_max_rate = 1248000000, - .min_rate = 537600000UL, -- .max_rate = 2900000000UL, -+ .max_rate = 3100000000UL, - }; - - static struct hfpll_clk hfpll0_clk = { --- -2.10.2 - - -From 4b054faec6161af8f34b3206d785b6b2e7d30bd3 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sat, 27 Feb 2016 16:58:05 -0500 -Subject: [PATCH 9/9] Enable 2.95Ghz overclock - -Change-Id: I022f7581ac48f184dbf5f2a9bb3f734f8335478f ---- - arch/arm/boot/dts/msm8974pro.dtsi | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/arch/arm/boot/dts/msm8974pro.dtsi b/arch/arm/boot/dts/msm8974pro.dtsi -index fed5f66..70fac47 100644 ---- a/arch/arm/boot/dts/msm8974pro.dtsi -+++ b/arch/arm/boot/dts/msm8974pro.dtsi -@@ -1804,7 +1804,8 @@ - < 2649600 /* 931 MHz */ >, - < 2726400 /* 931 MHz */ >, - < 2803200 /* 931 MHz */ >, -- < 2880000 /* 931 MHz */ >; -+ < 2880000 /* 931 MHz */ >, -+ < 2956800 /* 931 MHz */ >; - }; - - i2c@f9928000 { /* BLSP-1 QUP-6 */ --- -2.10.2 - diff --git a/Patches/CyanogenMod-14.1/android_kernel_oneplus_msm8974/0001-OverUnderClock.patch b/Patches/CyanogenMod-14.1/android_kernel_oneplus_msm8974/0001-OverUnderClock.patch deleted file mode 100644 index 4a23466b..00000000 --- a/Patches/CyanogenMod-14.1/android_kernel_oneplus_msm8974/0001-OverUnderClock.patch +++ /dev/null @@ -1,709 +0,0 @@ -From 0b95ae785c6f1df0e7466a1922f5f3ff858897ae Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sat, 17 Oct 2015 20:49:57 -0400 -Subject: [PATCH] Overclocked to 2.8Ghz, underclocked to 268Mhz - ---- - arch/arm/boot/dts/msm8974-v2.dtsi | 2 +- - arch/arm/boot/dts/msm8974pro-pm8941.dtsi | 8 +- - .../arm/boot/dts/msm8974pro-pma8084-regulator.dtsi | 16 +- - arch/arm/boot/dts/msm8974pro.dtsi | 190 ++++++++++++++++++--- - 4 files changed, 179 insertions(+), 37 deletions(-) - -diff --git a/arch/arm/boot/dts/msm8974-v2.dtsi b/arch/arm/boot/dts/msm8974-v2.dtsi -index dbb3bd6..40a730e 100644 ---- a/arch/arm/boot/dts/msm8974-v2.dtsi -+++ b/arch/arm/boot/dts/msm8974-v2.dtsi -@@ -123,7 +123,7 @@ - <1880000 2068000>, - <3008000 3309000>, - <3760000 4136000>, -- <4468000 2457000>; -+ <4468000 2457600>; - qcom,dec-ocmem-ab-ib = <0 0>, - <176000 519000>, - <456000 519000>, -diff --git a/arch/arm/boot/dts/msm8974pro-pm8941.dtsi b/arch/arm/boot/dts/msm8974pro-pm8941.dtsi -index b502078..79729ea 100644 ---- a/arch/arm/boot/dts/msm8974pro-pm8941.dtsi -+++ b/arch/arm/boot/dts/msm8974pro-pm8941.dtsi -@@ -39,22 +39,22 @@ - }; - - &krait0_vreg { -- regulator-max-microvolt = <1120000>; -+ regulator-max-microvolt = <1250000>; - qcom,ldo-delta-voltage = <12500>; - }; - - &krait1_vreg { -- regulator-max-microvolt = <1120000>; -+ regulator-max-microvolt = <1250000>; - qcom,ldo-delta-voltage = <12500>; - }; - - &krait2_vreg { -- regulator-max-microvolt = <1120000>; -+ regulator-max-microvolt = <1250000>; - qcom,ldo-delta-voltage = <12500>; - }; - - &krait3_vreg { -- regulator-max-microvolt = <1120000>; -+ regulator-max-microvolt = <1250000>; - qcom,ldo-delta-voltage = <12500>; - }; - -diff --git a/arch/arm/boot/dts/msm8974pro-pma8084-regulator.dtsi b/arch/arm/boot/dts/msm8974pro-pma8084-regulator.dtsi -index 433d466..428a520 100644 ---- a/arch/arm/boot/dts/msm8974pro-pma8084-regulator.dtsi -+++ b/arch/arm/boot/dts/msm8974pro-pma8084-regulator.dtsi -@@ -492,9 +492,9 @@ - <0xf908a800 0x1000>; /* APCS_ALIAS0_KPSS_MDD */ - reg-names = "acs", "mdd"; - regulator-min-microvolt = <500000>; -- regulator-max-microvolt = <1120000>; -+ regulator-max-microvolt = <1250000>; - qcom,headroom-voltage = <150000>; -- qcom,retention-voltage = <675000>; -+ qcom,retention-voltage = <600000>; - qcom,ldo-default-voltage = <750000>; - qcom,ldo-threshold-voltage = <850000>; - qcom,ldo-delta-voltage = <12500>; -@@ -508,9 +508,9 @@ - <0xf909a800 0x1000>; /* APCS_ALIAS1_KPSS_MDD */ - reg-names = "acs", "mdd"; - regulator-min-microvolt = <500000>; -- regulator-max-microvolt = <1120000>; -+ regulator-max-microvolt = <1250000>; - qcom,headroom-voltage = <150000>; -- qcom,retention-voltage = <675000>; -+ qcom,retention-voltage = <600000>; - qcom,ldo-default-voltage = <750000>; - qcom,ldo-threshold-voltage = <850000>; - qcom,ldo-delta-voltage = <12500>; -@@ -524,9 +524,9 @@ - <0xf90aa800 0x1000>; /* APCS_ALIAS2_KPSS_MDD */ - reg-names = "acs", "mdd"; - regulator-min-microvolt = <500000>; -- regulator-max-microvolt = <1120000>; -+ regulator-max-microvolt = <1250000>; - qcom,headroom-voltage = <150000>; -- qcom,retention-voltage = <675000>; -+ qcom,retention-voltage = <600000>; - qcom,ldo-default-voltage = <750000>; - qcom,ldo-threshold-voltage = <850000>; - qcom,ldo-delta-voltage = <12500>; -@@ -540,9 +540,9 @@ - <0xf90ba800 0x1000>; /* APCS_ALIAS3_KPSS_MDD */ - reg-names = "acs", "mdd"; - regulator-min-microvolt = <500000>; -- regulator-max-microvolt = <1120000>; -+ regulator-max-microvolt = <1250000>; - qcom,headroom-voltage = <150000>; -- qcom,retention-voltage = <675000>; -+ qcom,retention-voltage = <600000>; - qcom,ldo-default-voltage = <750000>; - qcom,ldo-threshold-voltage = <850000>; - qcom,ldo-delta-voltage = <12500>; -diff --git a/arch/arm/boot/dts/msm8974pro.dtsi b/arch/arm/boot/dts/msm8974pro.dtsi -index e332793..8524180 100644 ---- a/arch/arm/boot/dts/msm8974pro.dtsi -+++ b/arch/arm/boot/dts/msm8974pro.dtsi -@@ -91,6 +91,7 @@ - qcom,clock-krait@f9016000 { - qcom,speed1-pvs0-bin-v0 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 74 >, - < 345600000 775000 85 >, - < 422400000 775000 104 >, -@@ -122,6 +123,7 @@ - - qcom,speed1-pvs1-bin-v0 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 74 >, - < 345600000 775000 85 >, - < 422400000 775000 104 >, -@@ -153,6 +155,7 @@ - - qcom,speed1-pvs2-bin-v0 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 74 >, - < 345600000 750000 85 >, - < 422400000 750000 104 >, -@@ -184,6 +187,7 @@ - - qcom,speed1-pvs3-bin-v0 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 74 >, - < 345600000 750000 85 >, - < 422400000 750000 104 >, -@@ -215,6 +219,7 @@ - - qcom,speed1-pvs4-bin-v0 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 74 >, - < 345600000 750000 85 >, - < 422400000 750000 104 >, -@@ -246,6 +251,7 @@ - - qcom,speed1-pvs5-bin-v0 = - < 0 0 0 >, -+ < 268800000 720000 68 >, - < 300000000 725000 74 >, - < 345600000 725000 85 >, - < 422400000 725000 104 >, -@@ -277,6 +283,7 @@ - - qcom,speed1-pvs6-bin-v0 = - < 0 0 0 >, -+ < 268800000 720000 68 >, - < 300000000 725000 74 >, - < 345600000 725000 85 >, - < 422400000 725000 104 >, -@@ -308,6 +315,7 @@ - - qcom,speed3-pvs0-bin-v0 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -338,10 +346,14 @@ - < 2265600000 1065000 700 >, - < 2342400000 1080000 734 >, - < 2419200000 1095000 769 >, -- < 2457600000 1100000 785 >; -+ < 2457600000 1100000 785 >, -+ < 2572800000 1145000 827 >, -+ < 2726400000 1205000 900 >, -+ < 2880000000 1235000 937 >; - - qcom,speed3-pvs1-bin-v0 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -372,10 +384,14 @@ - < 2265600000 1040000 700 >, - < 2342400000 1055000 734 >, - < 2419200000 1070000 769 >, -- < 2457600000 1075000 785 >; -+ < 2457600000 1075000 785 >, -+ < 2572800000 1145000 827 >, -+ < 2726400000 1205000 900 >, -+ < 2880000000 1235000 937 >; - - qcom,speed3-pvs2-bin-v0 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -406,10 +422,14 @@ - < 2265600000 1015000 700 >, - < 2342400000 1030000 734 >, - < 2419200000 1045000 769 >, -- < 2457600000 1050000 785 >; -+ < 2457600000 1050000 785 >, -+ < 2572800000 1125000 827 >, -+ < 2726400000 1195000 900 >, -+ < 2880000000 1225000 937 >; - - qcom,speed3-pvs3-bin-v0 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -440,10 +460,14 @@ - < 2265600000 990000 700 >, - < 2342400000 1005000 734 >, - < 2419200000 1020000 769 >, -- < 2457600000 1025000 785 >; -+ < 2457600000 1025000 785 >, -+ < 2572800000 1115000 827 >, -+ < 2726400000 1185000 900 >, -+ < 2880000000 1215000 937 >; - - qcom,speed3-pvs4-bin-v0 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -474,10 +498,14 @@ - < 2265600000 965000 700 >, - < 2342400000 980000 734 >, - < 2419200000 995000 769 >, -- < 2457600000 1000000 785 >; -+ < 2457600000 1000000 785 >, -+ < 2572800000 1075000 827 >, -+ < 2726400000 1175000 900 >, -+ < 2880000000 1205000 937 >; - - qcom,speed3-pvs5-bin-v0 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 76 >, - < 345600000 750000 87 >, - < 422400000 750000 106 >, -@@ -508,10 +536,14 @@ - < 2265600000 940000 700 >, - < 2342400000 955000 734 >, - < 2419200000 970000 769 >, -- < 2457600000 975000 785 >; -+ < 2457600000 975000 785 >, -+ < 2572800000 1025000 827 >, -+ < 2726400000 1175000 900 >, -+ < 2880000000 1195000 937 >; - - qcom,speed3-pvs6-bin-v0 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 76 >, - < 345600000 750000 87 >, - < 422400000 750000 106 >, -@@ -542,10 +574,14 @@ - < 2265600000 915000 700 >, - < 2342400000 930000 734 >, - < 2419200000 945000 769 >, -- < 2457600000 950000 785 >; -+ < 2457600000 950000 785 >, -+ < 2572800000 1010000 827 >, -+ < 2726400000 1155000 900 >, -+ < 2880000000 1175000 937 >; - - qcom,speed1-pvs0-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 810000 87 >, - < 422400000 820000 108 >, -@@ -577,6 +613,7 @@ - - qcom,speed1-pvs1-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 810000 108 >, -@@ -608,6 +645,7 @@ - - qcom,speed1-pvs2-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 108 >, -@@ -639,6 +677,7 @@ - - qcom,speed1-pvs3-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 108 >, -@@ -670,6 +709,7 @@ - - qcom,speed1-pvs4-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 108 >, -@@ -701,6 +741,7 @@ - - qcom,speed1-pvs5-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 108 >, -@@ -732,6 +773,7 @@ - - qcom,speed1-pvs6-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -763,6 +805,7 @@ - - qcom,speed1-pvs7-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -794,6 +837,7 @@ - - qcom,speed1-pvs8-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -825,6 +869,7 @@ - - qcom,speed1-pvs9-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -856,6 +901,7 @@ - - qcom,speed1-pvs10-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -887,6 +933,7 @@ - - qcom,speed1-pvs11-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -918,6 +965,7 @@ - - qcom,speed1-pvs12-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -949,6 +997,7 @@ - - qcom,speed1-pvs13-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 108 >, -@@ -980,6 +1029,7 @@ - - qcom,speed1-pvs14-bin-v1 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 76 >, - < 345600000 750000 87 >, - < 422400000 750000 108 >, -@@ -1011,6 +1061,7 @@ - - qcom,speed1-pvs15-bin-v1 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 76 >, - < 345600000 750000 87 >, - < 422400000 750000 108 >, -@@ -1042,6 +1093,7 @@ - - qcom,speed3-pvs0-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -1072,10 +1124,14 @@ - < 2265600000 1085000 716 >, - < 2342400000 1100000 751 >, - < 2419200000 1115000 786 >, -- < 2457600000 1120000 802 >; -+ < 2457600000 1120000 802 >, -+ < 2572800000 1175000 827 >, -+ < 2726400000 1225000 900 >, -+ < 2880000000 1265000 937 >; - - qcom,speed3-pvs1-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -1106,10 +1162,14 @@ - < 2265600000 1075000 716 >, - < 2342400000 1090000 751 >, - < 2419200000 1105000 786 >, -- < 2457600000 1110000 802 >; -+ < 2457600000 1110000 802 >, -+ < 2572800000 1165000 827 >, -+ < 2726400000 1215000 900 >, -+ < 2880000000 1245000 937 >; - - qcom,speed3-pvs2-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -1140,10 +1200,14 @@ - < 2265600000 1065000 716 >, - < 2342400000 1080000 751 >, - < 2419200000 1095000 786 >, -- < 2457600000 1100000 802 >; -+ < 2457600000 1100000 802 >, -+ < 2572800000 1145000 827 >, -+ < 2726400000 1185000 900 >, -+ < 2880000000 1215000 937 >; - - qcom,speed3-pvs3-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -1174,10 +1238,14 @@ - < 2265600000 1055000 716 >, - < 2342400000 1070000 751 >, - < 2419200000 1085000 786 >, -- < 2457600000 1090000 802 >; -+ < 2457600000 1090000 802 >, -+ < 2572800000 1145000 827 >, -+ < 2726400000 1175000 900 >, -+ < 2880000000 1205000 937 >; - - qcom,speed3-pvs4-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -1208,10 +1276,14 @@ - < 2265600000 1045000 716 >, - < 2342400000 1060000 751 >, - < 2419200000 1075000 786 >, -- < 2457600000 1080000 802 >; -+ < 2457600000 1080000 802 >, -+ < 2572800000 1135000 827 >, -+ < 2726400000 1165000 900 >, -+ < 2880000000 1195000 937 >; - - qcom,speed3-pvs5-bin-v1 = - < 0 0 0 >, -+ < 268800000 795000 68 >, - < 300000000 800000 76 >, - < 345600000 800000 87 >, - < 422400000 800000 106 >, -@@ -1242,10 +1314,14 @@ - < 2265600000 1035000 716 >, - < 2342400000 1050000 751 >, - < 2419200000 1065000 786 >, -- < 2457600000 1070000 802 >; -+ < 2457600000 1070000 802 >, -+ < 2572800000 1125000 827 >, -+ < 2726400000 1155000 900 >, -+ < 2880000000 1185000 937 >; - - qcom,speed3-pvs6-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1276,10 +1352,14 @@ - < 2265600000 1025000 716 >, - < 2342400000 1040000 751 >, - < 2419200000 1055000 786 >, -- < 2457600000 1060000 802 >; -+ < 2457600000 1060000 802 >, -+ < 2572800000 1115000 827 >, -+ < 2726400000 1145000 900 >, -+ < 2880000000 1175000 937 >; - - qcom,speed3-pvs7-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1310,10 +1390,14 @@ - < 2265600000 1015000 716 >, - < 2342400000 1030000 751 >, - < 2419200000 1045000 786 >, -- < 2457600000 1050000 802 >; -+ < 2457600000 1050000 802 >, -+ < 2572800000 1105000 827 >, -+ < 2726400000 1135000 900 >, -+ < 2880000000 1165000 937 >; - - qcom,speed3-pvs8-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1344,10 +1428,14 @@ - < 2265600000 1005000 716 >, - < 2342400000 1020000 751 >, - < 2419200000 1035000 786 >, -- < 2457600000 1040000 802 >; -+ < 2457600000 1040000 802 >, -+ < 2572800000 1095000 827 >, -+ < 2726400000 1125000 900 >, -+ < 2880000000 1155000 937 >; - - qcom,speed3-pvs9-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1378,10 +1466,14 @@ - < 2265600000 995000 716 >, - < 2342400000 1010000 751 >, - < 2419200000 1025000 786 >, -- < 2457600000 1030000 802 >; -+ < 2457600000 1030000 802 >, -+ < 2572800000 1085000 827 >, -+ < 2726400000 1115000 900 >, -+ < 2880000000 1145000 937 >; - - qcom,speed3-pvs10-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1412,10 +1504,14 @@ - < 2265600000 985000 716 >, - < 2342400000 1000000 751 >, - < 2419200000 1015000 786 >, -- < 2457600000 1020000 802 >; -+ < 2457600000 1020000 802 >, -+ < 2572800000 1075000 827 >, -+ < 2726400000 1105000 900 >, -+ < 2880000000 1135000 937 >; - - qcom,speed3-pvs11-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1446,10 +1542,14 @@ - < 2265600000 975000 716 >, - < 2342400000 990000 751 >, - < 2419200000 1005000 786 >, -- < 2457600000 1010000 802 >; -+ < 2457600000 1010000 802 >, -+ < 2572800000 1065000 827 >, -+ < 2726400000 1095000 900 >, -+ < 2880000000 1125000 937 >; - - qcom,speed3-pvs12-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1480,10 +1580,14 @@ - < 2265600000 965000 716 >, - < 2342400000 980000 751 >, - < 2419200000 995000 786 >, -- < 2457600000 1000000 802 >; -+ < 2457600000 1000000 802 >, -+ < 2572800000 1065000 827 >, -+ < 2726400000 1085000 900 >, -+ < 2880000000 1115000 937 >; - - qcom,speed3-pvs13-bin-v1 = - < 0 0 0 >, -+ < 268800000 770000 68 >, - < 300000000 775000 76 >, - < 345600000 775000 87 >, - < 422400000 775000 106 >, -@@ -1514,10 +1618,14 @@ - < 2265600000 955000 716 >, - < 2342400000 970000 751 >, - < 2419200000 985000 786 >, -- < 2457600000 990000 802 >; -+ < 2457600000 990000 802 >, -+ < 2572800000 1045000 827 >, -+ < 2726400000 1065000 900 >, -+ < 2880000000 1095000 937 >; - - qcom,speed3-pvs14-bin-v1 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 76 >, - < 345600000 750000 87 >, - < 422400000 750000 106 >, -@@ -1548,10 +1656,14 @@ - < 2265600000 945000 716 >, - < 2342400000 960000 751 >, - < 2419200000 975000 786 >, -- < 2457600000 980000 802 >; -+ < 2457600000 980000 802 >, -+ < 2572800000 1035000 827 >, -+ < 2726400000 1055000 900 >, -+ < 2880000000 1085000 937 >; - - qcom,speed3-pvs15-bin-v1 = - < 0 0 0 >, -+ < 268800000 745000 68 >, - < 300000000 750000 76 >, - < 345600000 750000 87 >, - < 422400000 750000 106 >, -@@ -1582,9 +1694,39 @@ - < 2265600000 935000 716 >, - < 2342400000 950000 751 >, - < 2419200000 965000 786 >, -- < 2457600000 970000 802 >; -+ < 2457600000 970000 802 >, -+ < 2572800000 1025000 827 >, -+ < 2726400000 1045000 900 >, -+ < 2880000000 1075000 937 >; - }; - -+ qcom,msm-cpufreq@0 { -+ reg = <0 4>; -+ compatible = "qcom,msm-cpufreq"; -+ qcom,cpufreq-table = -+ < 268800 /* 75 MHz */ >, -+ < 300000 /* 75 MHz */ >, -+ < 422400 /* 150 MHz */ >, -+ < 652800 /* 200 MHz */ >, -+ < 729600 /* 307 MHz */ >, -+ < 883200 /* 307 MHz */ >, -+ < 960000 /* 460 MHz */ >, -+ < 1036800 /* 460 MHz */ >, -+ < 1190400 /* 460 MHz */ >, -+ < 1267200 /* 614 MHz */ >, -+ < 1497600 /* 614 MHz */ >, -+ < 1574400 /* 800 MHz */ >, -+ < 1728000 /* 800 MHz */ >, -+ < 1958400 /* 931 MHz */ >, -+ < 2265600 /* 931 MHz */ >, -+ < 2342400 /* 931 MHz */ >, -+ < 2419200 /* 931 MHz */ >, -+ < 2457600 /* 931 MHz */ >, -+ < 2572800 /* 931 MHz */ >, -+ < 2726400 /* 931 MHz */ >, -+ < 2880000 /* 931 MHz */ >; -+ }; -+ - i2c@f9928000 { /* BLSP-1 QUP-6 */ - cell-index = <3>; - compatible = "qcom,i2c-qup"; -@@ -1745,7 +1887,7 @@ - <1880000 2068000>, - <3008000 3309000>, - <3760000 4136000>, -- <4468000 2457000>; -+ <4468000 2457600>; - qcom,dec-ocmem-ab-ib = <0 0>, - <176000 519000>, - <456000 519000>, --- -2.10.2 - diff --git a/Patches/CyanogenMod-14.1/android_kernel_oneplus_msm8974/0002-Enable_Diag.patch b/Patches/CyanogenMod-14.1/android_kernel_oneplus_msm8974/0002-Enable_Diag.patch deleted file mode 100644 index 53c5d08c..00000000 --- a/Patches/CyanogenMod-14.1/android_kernel_oneplus_msm8974/0002-Enable_Diag.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 94d13624a7710818698d5787a7bcd7f8a272762b Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sat, 17 Oct 2015 20:50:31 -0400 -Subject: [PATCH] Update defconfig - ---- - arch/arm/configs/cyanogenmod_bacon_defconfig | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/arch/arm/configs/cyanogenmod_bacon_defconfig b/arch/arm/configs/cyanogenmod_bacon_defconfig -index 33ceebd..8cb1936 100644 ---- a/arch/arm/configs/cyanogenmod_bacon_defconfig -+++ b/arch/arm/configs/cyanogenmod_bacon_defconfig -@@ -591,3 +591,6 @@ CONFIG_CRYPTO_TWOFISH=y - CONFIG_CRYPTO_DEV_QCRYPTO=y - CONFIG_CRYPTO_DEV_QCE=y - CONFIG_CRYPTO_DEV_QCEDEV=y -+ -+CONFIG_DIAG_CHAR=y -+CONFIG_DIAG_OVER_USB=y --- -2.10.2 - diff --git a/Patches/CyanogenMod-14.1/android_packages_apps_CMParts/0001-Remove_Analytics.patch b/Patches/CyanogenMod-14.1/android_packages_apps_CMParts/0001-Remove_Analytics.patch deleted file mode 100644 index b1b4b871..00000000 --- a/Patches/CyanogenMod-14.1/android_packages_apps_CMParts/0001-Remove_Analytics.patch +++ /dev/null @@ -1,1068 +0,0 @@ -From 3b221ea04b84cf9df2098598c0d4979446b0c914 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Fri, 23 Dec 2016 23:09:33 -0500 -Subject: [PATCH] Remove stats - -Change-Id: I13313c99c3a839f6ae53d5d87a9999da23fb1103 ---- - AndroidManifest.xml | 25 -- - proguard.flags | 1 - - res/values/config.xml | 5 - - res/values/strings.xml | 22 -- - res/xml/anonymous_stats.xml | 32 --- - res/xml/parts_catalog.xml | 5 - - res/xml/preview_data.xml | 52 ---- - res/xml/privacy_settings.xml | 8 - - .../cmparts/cmstats/AnonymousStats.java | 101 ------- - .../cyanogenmod/cmparts/cmstats/PreviewData.java | 49 ---- - .../cmparts/cmstats/ReportingService.java | 106 -------- - .../cmparts/cmstats/ReportingServiceManager.java | 123 --------- - .../cmparts/cmstats/StatsUploadJobService.java | 291 --------------------- - src/org/cyanogenmod/cmparts/cmstats/Utilities.java | 102 -------- - 14 files changed, 922 deletions(-) - delete mode 100644 res/xml/anonymous_stats.xml - delete mode 100644 res/xml/preview_data.xml - delete mode 100644 src/org/cyanogenmod/cmparts/cmstats/AnonymousStats.java - delete mode 100644 src/org/cyanogenmod/cmparts/cmstats/PreviewData.java - delete mode 100644 src/org/cyanogenmod/cmparts/cmstats/ReportingService.java - delete mode 100644 src/org/cyanogenmod/cmparts/cmstats/ReportingServiceManager.java - delete mode 100644 src/org/cyanogenmod/cmparts/cmstats/StatsUploadJobService.java - delete mode 100644 src/org/cyanogenmod/cmparts/cmstats/Utilities.java - -diff --git a/AndroidManifest.xml b/AndroidManifest.xml -index 1bdf33d..ceec90e 100644 ---- a/AndroidManifest.xml -+++ b/AndroidManifest.xml -@@ -179,31 +179,6 @@ - android:value="status_bar_settings" /> - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - - - -- -- https://stats.cyanogenmod.org/submit -- https://shopvac.cyngn.com/community/heartbeat -- https://account.cyngn.com/api/v1/community/heartbeat_token -- - - true - -diff --git a/res/values/strings.xml b/res/values/strings.xml -index 0557279..cfcf049 100644 ---- a/res/values/strings.xml -+++ b/res/values/strings.xml -@@ -483,28 +483,6 @@ - Total commits: %2$s

- Last update: %3$s]]>
- -- -- -- CyanogenMod statistics -- Help make CyanogenMod better by opting into anonymous statistics reporting -- About -- Opting into CyanogenMod Statistics will allow non-personal data to be submitted to the -- developers of CyanogenMod to track unique installations across devices. The information submitted includes an unique identifier, -- which does not compromise your privacy or personal data. The data is submitted during each boot.\n\nFor an example of the data that is submitted, tap on Preview Data. -- Enable reporting -- Preview data -- View stats -- Learn more -- -- -- Unique ID -- Device -- Version -- Country -- Carrier -- Stats collection -- When enabled, allows metrics collection -- - - Auto-rotate screen - Rotation settings -diff --git a/res/xml/anonymous_stats.xml b/res/xml/anonymous_stats.xml -deleted file mode 100644 -index b29885c..0000000 ---- a/res/xml/anonymous_stats.xml -+++ /dev/null -@@ -1,32 +0,0 @@ -- -- -- -- -- -- -- -- -- -- -diff --git a/res/xml/parts_catalog.xml b/res/xml/parts_catalog.xml -index 07329d9..649e808 100644 ---- a/res/xml/parts_catalog.xml -+++ b/res/xml/parts_catalog.xml -@@ -73,11 +73,6 @@ - android:fragment="org.cyanogenmod.cmparts.statusbar.StatusBarSettings" - cm:xmlRes="@xml/status_bar_settings" /> - -- -- - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -diff --git a/res/xml/privacy_settings.xml b/res/xml/privacy_settings.xml -index 5ae923a..45df2a1 100644 ---- a/res/xml/privacy_settings.xml -+++ b/res/xml/privacy_settings.xml -@@ -36,12 +36,4 @@ - android:targetClass="com.android.settings.applications.ProtectedAppsActivity" /> - - -- -- -- -- - -diff --git a/src/org/cyanogenmod/cmparts/cmstats/AnonymousStats.java b/src/org/cyanogenmod/cmparts/cmstats/AnonymousStats.java -deleted file mode 100644 -index 7c6294e..0000000 ---- a/src/org/cyanogenmod/cmparts/cmstats/AnonymousStats.java -+++ /dev/null -@@ -1,101 +0,0 @@ --/* -- * Copyright (C) 2015 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package org.cyanogenmod.cmparts.cmstats; -- --import android.content.Context; --import android.content.SharedPreferences; --import android.os.Bundle; -- --import android.os.UserHandle; --import android.support.v7.preference.Preference; --import android.support.v7.preference.PreferenceScreen; --import android.support.v14.preference.SwitchPreference; -- --import org.cyanogenmod.cmparts.R; --import org.cyanogenmod.cmparts.SettingsPreferenceFragment; -- --import cyanogenmod.providers.CMSettings; -- --public class AnonymousStats extends SettingsPreferenceFragment { -- -- private static final String PREF_FILE_NAME = "CMStats"; -- /* package */ static final String ANONYMOUS_OPT_IN = "pref_anonymous_opt_in"; -- /* package */ static final String ANONYMOUS_LAST_CHECKED = "pref_anonymous_checked_in"; -- -- /* package */ static final String KEY_LAST_JOB_ID = "last_job_id"; -- /* package */ static final int QUEUE_MAX_THRESHOLD = 1000; -- -- public static final String KEY_STATS = "stats_collection"; -- -- SwitchPreference mStatsSwitch; -- -- public static SharedPreferences getPreferences(Context context) { -- return context.getSharedPreferences(PREF_FILE_NAME, 0); -- } -- -- @Override -- public void onCreate(Bundle savedInstanceState) { -- super.onCreate(savedInstanceState); -- addPreferencesFromResource(R.xml.anonymous_stats); -- mStatsSwitch = (SwitchPreference) findPreference(KEY_STATS); -- } -- -- @Override -- public boolean onPreferenceTreeClick(Preference preference) { -- if (preference == mStatsSwitch) { -- boolean checked = mStatsSwitch.isChecked(); -- if (checked) { -- // clear opt out flags -- CMSettings.Secure.putIntForUser(getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION_REPORTED, 0, UserHandle.USER_OWNER); -- } -- // will initiate opt out sequence if necessary -- ReportingServiceManager.setAlarm(getActivity()); -- return true; -- } -- return super.onPreferenceTreeClick(preference); -- } -- -- public static void updateLastSynced(Context context) { -- getPreferences(context) -- .edit() -- .putLong(ANONYMOUS_LAST_CHECKED,System.currentTimeMillis()) -- .commit(); -- } -- -- private static int getLastJobId(Context context) { -- return getPreferences(context).getInt(KEY_LAST_JOB_ID, 0); -- } -- -- private static void setLastJobId(Context context, int id) { -- getPreferences(context) -- .edit() -- .putInt(KEY_LAST_JOB_ID, id) -- .commit(); -- } -- -- public static int getNextJobId(Context context) { -- int lastId = getLastJobId(context); -- if (lastId >= QUEUE_MAX_THRESHOLD) { -- lastId = 1; -- } else { -- lastId += 1; -- } -- setLastJobId(context, lastId); -- return lastId; -- } --} -diff --git a/src/org/cyanogenmod/cmparts/cmstats/PreviewData.java b/src/org/cyanogenmod/cmparts/cmstats/PreviewData.java -deleted file mode 100644 -index a14f76b..0000000 ---- a/src/org/cyanogenmod/cmparts/cmstats/PreviewData.java -+++ /dev/null -@@ -1,49 +0,0 @@ --/* -- * Copyright (C) 2012 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package org.cyanogenmod.cmparts.cmstats; -- --import android.content.Context; --import android.os.Bundle; --import android.support.v7.preference.Preference; --import android.support.v7.preference.PreferenceScreen; -- --import org.cyanogenmod.cmparts.R; --import org.cyanogenmod.cmparts.SettingsPreferenceFragment; -- --public class PreviewData extends SettingsPreferenceFragment { -- private static final String UNIQUE_ID = "preview_id"; -- private static final String DEVICE = "preview_device"; -- private static final String VERSION = "preview_version"; -- private static final String COUNTRY = "preview_country"; -- private static final String CARRIER = "preview_carrier"; -- -- @Override -- public void onCreate(Bundle savedInstanceState) { -- super.onCreate(savedInstanceState); -- -- addPreferencesFromResource(R.xml.preview_data); -- -- final PreferenceScreen prefSet = getPreferenceScreen(); -- final Context context = getActivity(); -- -- prefSet.findPreference(UNIQUE_ID).setSummary(Utilities.getUniqueID(context)); -- prefSet.findPreference(DEVICE).setSummary(Utilities.getDevice()); -- prefSet.findPreference(VERSION).setSummary(Utilities.getModVersion()); -- prefSet.findPreference(COUNTRY).setSummary(Utilities.getCountryCode(context)); -- prefSet.findPreference(CARRIER).setSummary(Utilities.getCarrier(context)); -- } --} -diff --git a/src/org/cyanogenmod/cmparts/cmstats/ReportingService.java b/src/org/cyanogenmod/cmparts/cmstats/ReportingService.java -deleted file mode 100644 -index 0725676..0000000 ---- a/src/org/cyanogenmod/cmparts/cmstats/ReportingService.java -+++ /dev/null -@@ -1,106 +0,0 @@ --/* -- * Copyright (C) 2015 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package org.cyanogenmod.cmparts.cmstats; -- --import android.app.IntentService; --import android.app.job.JobInfo; --import android.app.job.JobScheduler; --import android.content.ComponentName; --import android.content.Context; --import android.content.Intent; --import android.os.PersistableBundle; --import android.os.UserHandle; --import android.util.Log; --import cyanogenmod.providers.CMSettings; -- --import java.util.List; -- --public class ReportingService extends IntentService { -- /* package */ static final String TAG = "CMStats"; -- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); -- -- public static final String EXTRA_OPTING_OUT = "cmstats::opt_out"; -- -- public ReportingService() { -- super(ReportingService.class.getSimpleName()); -- } -- -- @Override -- protected void onHandleIntent(Intent intent) { -- JobScheduler js = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); -- -- String deviceId = Utilities.getUniqueID(getApplicationContext()); -- String deviceName = Utilities.getDevice(); -- String deviceVersion = Utilities.getModVersion(); -- String deviceCountry = Utilities.getCountryCode(getApplicationContext()); -- String deviceCarrier = Utilities.getCarrier(getApplicationContext()); -- String deviceCarrierId = Utilities.getCarrierId(getApplicationContext()); -- boolean optOut = intent.getBooleanExtra(EXTRA_OPTING_OUT, false); -- -- final int cyanogenJobId = AnonymousStats.getNextJobId(getApplicationContext()); -- final int cmOrgJobId = AnonymousStats.getNextJobId(getApplicationContext()); -- -- if (DEBUG) Log.d(TAG, "scheduling jobs id: " + cyanogenJobId + ", " + cmOrgJobId); -- -- PersistableBundle cyanogenBundle = new PersistableBundle(); -- cyanogenBundle.putBoolean(StatsUploadJobService.KEY_OPT_OUT, optOut); -- cyanogenBundle.putString(StatsUploadJobService.KEY_DEVICE_NAME, deviceName); -- cyanogenBundle.putString(StatsUploadJobService.KEY_UNIQUE_ID, deviceId); -- cyanogenBundle.putString(StatsUploadJobService.KEY_VERSION, deviceVersion); -- cyanogenBundle.putString(StatsUploadJobService.KEY_COUNTRY, deviceCountry); -- cyanogenBundle.putString(StatsUploadJobService.KEY_CARRIER, deviceCarrier); -- cyanogenBundle.putString(StatsUploadJobService.KEY_CARRIER_ID, deviceCarrierId); -- cyanogenBundle.putLong(StatsUploadJobService.KEY_TIMESTAMP, System.currentTimeMillis()); -- -- // get snapshot and persist it -- PersistableBundle cmBundle = new PersistableBundle(cyanogenBundle); -- -- // set job types -- cyanogenBundle.putInt(StatsUploadJobService.KEY_JOB_TYPE, -- StatsUploadJobService.JOB_TYPE_CYANOGEN); -- cmBundle.putInt(StatsUploadJobService.KEY_JOB_TYPE, -- StatsUploadJobService.JOB_TYPE_CMORG); -- -- // schedule cyanogen stats upload -- js.schedule(new JobInfo.Builder(cyanogenJobId, new ComponentName(getPackageName(), -- StatsUploadJobService.class.getName())) -- .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) -- .setMinimumLatency(1000) -- .setExtras(cyanogenBundle) -- .setPersisted(true) -- .build()); -- -- // schedule cmorg stats upload -- js.schedule(new JobInfo.Builder(cmOrgJobId, new ComponentName(getPackageName(), -- StatsUploadJobService.class.getName())) -- .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) -- .setMinimumLatency(1000) -- .setExtras(cmBundle) -- .setPersisted(true) -- .build()); -- -- if (optOut) { -- // we've successfully scheduled the opt out. -- CMSettings.Secure.putIntForUser(getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION_REPORTED, 1, UserHandle.USER_OWNER); -- } -- -- // reschedule -- AnonymousStats.updateLastSynced(this); -- ReportingServiceManager.setAlarm(this); -- } --} -diff --git a/src/org/cyanogenmod/cmparts/cmstats/ReportingServiceManager.java b/src/org/cyanogenmod/cmparts/cmstats/ReportingServiceManager.java -deleted file mode 100644 -index 8264739..0000000 ---- a/src/org/cyanogenmod/cmparts/cmstats/ReportingServiceManager.java -+++ /dev/null -@@ -1,123 +0,0 @@ --/* -- * Copyright (C) 2012 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package org.cyanogenmod.cmparts.cmstats; -- --import android.app.AlarmManager; --import android.app.PendingIntent; --import android.app.job.JobScheduler; --import android.content.BroadcastReceiver; --import android.content.Context; --import android.content.Intent; --import android.content.SharedPreferences; --import android.os.UserHandle; --import android.util.Log; --import cyanogenmod.providers.CMSettings; -- --public class ReportingServiceManager extends BroadcastReceiver { -- private static final long MILLIS_PER_HOUR = 60L * 60L * 1000L; -- private static final long MILLIS_PER_DAY = 24L * MILLIS_PER_HOUR; -- private static final long UPDATE_INTERVAL = 1L * MILLIS_PER_DAY; -- -- private static final String TAG = ReportingServiceManager.class.getSimpleName(); -- -- public static final String ACTION_LAUNCH_SERVICE = -- "org.cyanogenmod.cmparts.action.TRIGGER_REPORT_METRICS"; -- public static final String EXTRA_FORCE = "force"; -- -- @Override -- public void onReceive(Context context, Intent intent) { -- if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { -- setAlarm(context); -- } else if (intent.getAction().equals(ACTION_LAUNCH_SERVICE)){ -- launchService(context, intent.getBooleanExtra(EXTRA_FORCE, false)); -- } -- } -- -- /** -- * opt out if we haven't yet -- */ -- public static void initiateOptOut(Context context) { -- final boolean optOutReported = CMSettings.Secure.getIntForUser(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION_REPORTED, 0, UserHandle.USER_OWNER) == 1; -- if (!optOutReported) { -- Intent intent = new Intent(); -- intent.setClass(context, ReportingService.class); -- intent.putExtra(ReportingService.EXTRA_OPTING_OUT, true); -- context.startServiceAsUser(intent, UserHandle.OWNER); -- } -- } -- -- public static void setAlarm(Context context) { -- SharedPreferences prefs = AnonymousStats.getPreferences(context); -- if (prefs.contains(AnonymousStats.ANONYMOUS_OPT_IN)) { -- migrate(context, prefs); -- } -- if (!Utilities.isStatsCollectionEnabled(context)) { -- initiateOptOut(context); -- return; -- } -- long lastSynced = prefs.getLong(AnonymousStats.ANONYMOUS_LAST_CHECKED, 0); -- if (lastSynced == 0) { -- launchService(context, true); // service will reschedule the next alarm -- return; -- } -- long millisFromNow = (lastSynced + UPDATE_INTERVAL) - System.currentTimeMillis(); -- -- Intent intent = new Intent(ACTION_LAUNCH_SERVICE); -- intent.setClass(context, ReportingServiceManager.class); -- -- AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); -- alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + millisFromNow, -- PendingIntent.getBroadcast(context, 0, intent, 0)); -- Log.d(TAG, "Next sync attempt in : " -- + (millisFromNow / MILLIS_PER_HOUR) + " hours"); -- } -- -- public static void launchService(Context context, boolean force) { -- SharedPreferences prefs = AnonymousStats.getPreferences(context); -- -- if (!Utilities.isStatsCollectionEnabled(context)) { -- return; -- } -- -- if (!force) { -- long lastSynced = prefs.getLong(AnonymousStats.ANONYMOUS_LAST_CHECKED, 0); -- if (lastSynced == 0) { -- setAlarm(context); -- return; -- } -- long timeElapsed = System.currentTimeMillis() - lastSynced; -- if (timeElapsed < UPDATE_INTERVAL) { -- long timeLeft = UPDATE_INTERVAL - timeElapsed; -- Log.d(TAG, "Waiting for next sync : " -- + timeLeft / MILLIS_PER_HOUR + " hours"); -- return; -- } -- } -- -- Intent intent = new Intent(); -- intent.setClass(context, ReportingService.class); -- context.startServiceAsUser(intent, UserHandle.OWNER); -- } -- -- private static void migrate(Context context, SharedPreferences prefs) { -- Utilities.setStatsCollectionEnabled(context, -- prefs.getBoolean(AnonymousStats.ANONYMOUS_OPT_IN, true)); -- prefs.edit().remove(AnonymousStats.ANONYMOUS_OPT_IN).commit(); -- } -- --} -diff --git a/src/org/cyanogenmod/cmparts/cmstats/StatsUploadJobService.java b/src/org/cyanogenmod/cmparts/cmstats/StatsUploadJobService.java -deleted file mode 100644 -index 09f4ea1..0000000 ---- a/src/org/cyanogenmod/cmparts/cmstats/StatsUploadJobService.java -+++ /dev/null -@@ -1,291 +0,0 @@ --/* -- * Copyright (C) 2015 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package org.cyanogenmod.cmparts.cmstats; -- --import android.app.job.JobParameters; --import android.app.job.JobService; --import android.net.Uri; --import android.os.AsyncTask; --import android.os.PersistableBundle; --import android.util.ArrayMap; --import android.util.Log; --import org.cyanogenmod.cmparts.R; --import org.json.JSONException; --import org.json.JSONObject; -- --import java.io.BufferedInputStream; --import java.io.BufferedReader; --import java.io.BufferedWriter; --import java.io.IOException; --import java.io.InputStream; --import java.io.InputStreamReader; --import java.io.OutputStream; --import java.io.OutputStreamWriter; --import java.net.HttpURLConnection; --import java.net.URL; --import java.util.Collections; --import java.util.Map; -- --public class StatsUploadJobService extends JobService { -- -- private static final String TAG = StatsUploadJobService.class.getSimpleName(); -- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); -- -- public static final String KEY_JOB_TYPE = "job_type"; -- public static final int JOB_TYPE_CYANOGEN = 1; -- public static final int JOB_TYPE_CMORG = 2; -- -- public static final String KEY_UNIQUE_ID = "uniqueId"; -- public static final String KEY_DEVICE_NAME = "deviceName"; -- public static final String KEY_VERSION = "version"; -- public static final String KEY_COUNTRY = "country"; -- public static final String KEY_CARRIER = "carrier"; -- public static final String KEY_CARRIER_ID = "carrierId"; -- public static final String KEY_TIMESTAMP = "timeStamp"; -- public static final String KEY_OPT_OUT = "optOut"; -- -- private final Map mCurrentJobs -- = Collections.synchronizedMap(new ArrayMap()); -- -- @Override -- public boolean onStartJob(JobParameters jobParameters) { -- if (DEBUG) -- Log.d(TAG, "onStartJob() called with " + "jobParameters = [" + jobParameters + "]"); -- final StatsUploadTask uploadTask = new StatsUploadTask(jobParameters); -- mCurrentJobs.put(jobParameters, uploadTask); -- uploadTask.execute((Void) null); -- return true; -- } -- -- @Override -- public boolean onStopJob(JobParameters jobParameters) { -- if (DEBUG) -- Log.d(TAG, "onStopJob() called with " + "jobParameters = [" + jobParameters + "]"); -- -- final StatsUploadTask cancelledJob; -- cancelledJob = mCurrentJobs.remove(jobParameters); -- -- if (cancelledJob != null) { -- // cancel the ongoing background task -- cancelledJob.cancel(true); -- return true; // reschedule -- } -- -- return false; -- } -- -- private class StatsUploadTask extends AsyncTask { -- -- private JobParameters mJobParams; -- -- public StatsUploadTask(JobParameters jobParams) { -- this.mJobParams = jobParams; -- } -- -- @Override -- protected Boolean doInBackground(Void... params) { -- -- PersistableBundle extras = mJobParams.getExtras(); -- -- String deviceId = extras.getString(KEY_UNIQUE_ID); -- String deviceName = extras.getString(KEY_DEVICE_NAME); -- String deviceVersion = extras.getString(KEY_VERSION); -- String deviceCountry = extras.getString(KEY_COUNTRY); -- String deviceCarrier = extras.getString(KEY_CARRIER); -- String deviceCarrierId = extras.getString(KEY_CARRIER_ID); -- long timeStamp = extras.getLong(KEY_TIMESTAMP); -- boolean optOut = extras.getBoolean(KEY_OPT_OUT); -- -- boolean success = false; -- int jobType = extras.getInt(KEY_JOB_TYPE, -1); -- if (!isCancelled()) { -- switch (jobType) { -- case JOB_TYPE_CYANOGEN: -- try { -- JSONObject json = new JSONObject(); -- json.put("optOut", optOut); -- json.put("uniqueId", deviceId); -- json.put("deviceName", deviceName); -- json.put("version", deviceVersion); -- json.put("country", deviceCountry); -- json.put("carrier", deviceCarrier); -- json.put("carrierId", deviceCarrierId); -- json.put("timestamp", timeStamp); -- -- success = uploadToCyanogen(json); -- } catch (IOException | JSONException e) { -- Log.e(TAG, "Could not upload stats checkin to cyanogen server", e); -- success = false; -- } -- break; -- -- case JOB_TYPE_CMORG: -- try { -- success = uploadToCM(deviceId, deviceName, deviceVersion, deviceCountry, -- deviceCarrier, deviceCarrierId, optOut); -- } catch (IOException e) { -- Log.e(TAG, "Could not upload stats checkin to commnity server", e); -- success = false; -- } -- break; -- } -- } -- if (DEBUG) -- Log.d(TAG, "job id " + mJobParams.getJobId() + ", has finished with success=" -- + success); -- return success; -- } -- -- @Override -- protected void onPostExecute(Boolean success) { -- mCurrentJobs.remove(mJobParams); -- jobFinished(mJobParams, !success); -- } -- } -- -- -- private boolean uploadToCM(String deviceId, String deviceName, String deviceVersion, -- String deviceCountry, String deviceCarrier, String deviceCarrierId, -- boolean optOut) -- throws IOException { -- -- final Uri uri = Uri.parse(getString(R.string.stats_cm_url)).buildUpon() -- .appendQueryParameter("opt_out", optOut ? "1" : "0") -- .appendQueryParameter("device_hash", deviceId) -- .appendQueryParameter("device_name", deviceName) -- .appendQueryParameter("device_version", deviceVersion) -- .appendQueryParameter("device_country", deviceCountry) -- .appendQueryParameter("device_carrier", deviceCarrier) -- .appendQueryParameter("device_carrier_id", deviceCarrierId).build(); -- URL url = new URL(uri.toString()); -- HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); -- try { -- urlConnection.setInstanceFollowRedirects(true); -- urlConnection.setDoOutput(true); -- urlConnection.connect(); -- -- final int responseCode = urlConnection.getResponseCode(); -- if (DEBUG) Log.d(TAG, "cm server response code=" + responseCode); -- final boolean success = responseCode == HttpURLConnection.HTTP_OK; -- if (!success) { -- Log.w(TAG, "failed sending, server returned: " + getResponse(urlConnection, -- !success)); -- } -- return success; -- } finally { -- urlConnection.disconnect(); -- } -- -- } -- -- private boolean uploadToCyanogen(JSONObject json) -- throws IOException, JSONException { -- String authToken = getAuthToken(); -- -- if (authToken.isEmpty()) { -- Log.w(TAG, "no auth token!"); -- } -- -- URL url = new URL(getString(R.string.stats_cyanogen_url)); -- HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); -- try { -- urlConnection.setInstanceFollowRedirects(true); -- urlConnection.setDoInput(true); -- urlConnection.setDoOutput(true); -- -- urlConnection.setRequestProperty("Accept-Encoding", "identity"); -- urlConnection.setRequestProperty("Authorization", authToken); -- urlConnection.setRequestProperty("Content-Type", "application/json"); -- -- OutputStream os = urlConnection.getOutputStream(); -- BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); -- writer.write(json.toString()); -- writer.flush(); -- writer.close(); -- os.close(); -- -- urlConnection.connect(); -- -- final int responseCode = urlConnection.getResponseCode(); -- final boolean success = responseCode == HttpURLConnection.HTTP_OK; -- -- final String response = getResponse(urlConnection, !success); -- if (DEBUG) -- Log.d(TAG, "server responseCode: " + responseCode +", response=" + response); -- -- if (!success) { -- Log.w(TAG, "failed sending, server returned: " + response); -- } -- return success; -- } finally { -- urlConnection.disconnect(); -- } -- } -- -- private String getAuthToken() { -- HttpURLConnection urlConnection = null; -- try { -- URL url = new URL(getString(R.string.stats_cyanogen_token_url)); -- urlConnection = (HttpURLConnection) url.openConnection(); -- urlConnection.setInstanceFollowRedirects(true); -- urlConnection.setDoInput(true); -- -- urlConnection.setRequestProperty("Accept-Encoding", "identity"); -- urlConnection.setRequestProperty("Content-Type", "text/plain"); -- -- urlConnection.connect(); -- -- final int responseCode = urlConnection.getResponseCode(); -- final boolean success = responseCode == HttpURLConnection.HTTP_OK; -- if (DEBUG) Log.d(TAG, "server auth response code=" + responseCode); -- final String response = getResponse(urlConnection, !success); -- if (DEBUG) -- Log.d(TAG, "server auth response=" + response); -- -- if (success) { -- return response; -- } -- } catch (IOException e) { -- Log.e(TAG, "error getting auth token", e); -- } finally { -- if (urlConnection != null) { -- urlConnection.disconnect(); -- } -- } -- return ""; -- } -- -- private String getResponse(HttpURLConnection httpUrlConnection, boolean errorStream) -- throws IOException { -- InputStream responseStream = new BufferedInputStream(errorStream -- ? httpUrlConnection.getErrorStream() -- : httpUrlConnection.getInputStream()); -- -- BufferedReader responseStreamReader = new BufferedReader( -- new InputStreamReader(responseStream)); -- String line = ""; -- StringBuilder stringBuilder = new StringBuilder(); -- while ((line = responseStreamReader.readLine()) != null) { -- stringBuilder.append(line).append("\n"); -- } -- responseStreamReader.close(); -- responseStream.close(); -- -- return stringBuilder.toString(); -- } -- --} -diff --git a/src/org/cyanogenmod/cmparts/cmstats/Utilities.java b/src/org/cyanogenmod/cmparts/cmstats/Utilities.java -deleted file mode 100644 -index eefafba..0000000 ---- a/src/org/cyanogenmod/cmparts/cmstats/Utilities.java -+++ /dev/null -@@ -1,102 +0,0 @@ --/* -- * Copyright (C) 2012 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package org.cyanogenmod.cmparts.cmstats; -- --import android.content.Context; --import android.os.Build; --import android.os.SystemProperties; --import android.provider.Settings; --import android.telephony.TelephonyManager; --import android.text.TextUtils; -- --import cyanogenmod.providers.CMSettings; -- --import java.math.BigInteger; --import java.net.NetworkInterface; --import java.security.MessageDigest; -- --public class Utilities { -- public static String getUniqueID(Context context) { -- final String id = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); -- return digest(context.getPackageName() + id); -- } -- -- public static String getCarrier(Context context) { -- TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); -- String carrier = tm.getNetworkOperatorName(); -- if (TextUtils.isEmpty(carrier)) { -- carrier = "Unknown"; -- } -- return carrier; -- } -- -- public static String getCarrierId(Context context) { -- TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); -- String carrierId = tm.getNetworkOperator(); -- if (TextUtils.isEmpty(carrierId)) { -- carrierId = "0"; -- } -- return carrierId; -- } -- -- public static String getCountryCode(Context context) { -- TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); -- String countryCode = tm.getNetworkCountryIso(); -- if (TextUtils.isEmpty(countryCode)) { -- countryCode = "Unknown"; -- } -- return countryCode; -- } -- -- public static String getDevice() { -- return SystemProperties.get("ro.cm.device", Build.PRODUCT); -- } -- -- public static String getModVersion() { -- return SystemProperties.get("ro.cm.version", Build.DISPLAY); -- } -- -- public static String digest(String input) { -- try { -- MessageDigest md = MessageDigest.getInstance("MD5"); -- return new BigInteger(1, md.digest(input.getBytes())).toString(16).toUpperCase(); -- } catch (Exception e) { -- return null; -- } -- } -- -- /** -- * Check to see if global stats are enabled. -- * @param context -- * @return Whether or not stats collection is enabled. -- */ -- public static boolean isStatsCollectionEnabled(Context context) { -- return CMSettings.Secure.getInt(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, 1) != 0; -- } -- -- /** -- * Enabled or disable stats collection -- * @param context -- * @param enabled Boolean that sets collection being enabled. -- */ -- public static void setStatsCollectionEnabled(Context context, boolean enabled) { -- int enable = (enabled) ? 1 : 0; -- CMSettings.Secure.putInt(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, enable); -- } --} --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_packages_apps_FDroid/0001.patch b/Patches/CyanogenMod-14.1/android_packages_apps_FDroid/0001.patch deleted file mode 100644 index e8c84031..00000000 --- a/Patches/CyanogenMod-14.1/android_packages_apps_FDroid/0001.patch +++ /dev/null @@ -1,21 +0,0 @@ -From 17d82df9831a6e5801203ffe3b0e1aba177f7b20 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Tue, 19 Jan 2016 19:24:47 -0500 -Subject: [PATCH] mark as privileged app - ---- - Android.mk | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/Android.mk b/Android.mk -index c6110a3..ce4e8cf 100644 ---- a/Android.mk -+++ b/Android.mk -@@ -19,6 +19,7 @@ $(fdroid_root)/$(fdroid_dir)/$(fdroid_apk): - cd $(fdroid_root)/$(fdroid_dir) && gradle assembleRelease - - LOCAL_CERTIFICATE := platform -+LOCAL_PRIVILEGED_MODULE := true - LOCAL_SRC_FILES := $(fdroid_dir)/$(fdroid_apk) - LOCAL_MODULE_CLASS := APPS - LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) diff --git a/Patches/CyanogenMod-14.1/android_packages_apps_FDroid/0002.patch b/Patches/CyanogenMod-14.1/android_packages_apps_FDroid/0002.patch deleted file mode 100644 index 4ab6aa25..00000000 --- a/Patches/CyanogenMod-14.1/android_packages_apps_FDroid/0002.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 11419a198fb864d5479c9ce3f1ffdc63114020c0 Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Fri, 4 Mar 2016 08:53:19 -0500 -Subject: [PATCH] remove privileged extension settings - ---- - .../java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java | 4 +++- - app/src/main/res/xml/preferences.xml | 2 ++ - 2 files changed, 5 insertions(+), 1 deletion(-) - -diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java -index 4304b87..b94ca31 100644 ---- a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java -+++ b/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java -@@ -41,7 +41,7 @@ - Preferences.PREF_LANGUAGE, - Preferences.PREF_KEEP_CACHE_TIME, - Preferences.PREF_EXPERT, -- Preferences.PREF_PRIVILEGED_INSTALLER, -+ //Preferences.PREF_PRIVILEGED_INSTALLER, - Preferences.PREF_ENABLE_PROXY, - Preferences.PREF_PROXY_HOST, - Preferences.PREF_PROXY_PORT, -@@ -259,8 +259,10 @@ public void onResume() { - - currentKeepCacheTime = Preferences.get().getKeepCacheTime(); - -+ /* - initPrivilegedInstallerPreference(); - initUpdatePrivilegedExtensionPreference(); -+ */ - // this pref's default is dynamically set based on whether Orbot is installed - boolean useTor = Preferences.get().isTorEnabled(); - useTorCheckPref.setDefaultValue(useTor); -diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml -index aa80594..573e443 100644 ---- a/app/src/main/res/xml/preferences.xml -+++ b/app/src/main/res/xml/preferences.xml -@@ -91,6 +91,7 @@ - android:summary="@string/unstable_updates_summary" - android:defaultValue="false" - android:dependency="expert" /> -+ - - diff --git a/Patches/CyanogenMod-14.1/android_packages_apps_FDroid/0003.patch b/Patches/CyanogenMod-14.1/android_packages_apps_FDroid/0003.patch deleted file mode 100644 index 18a5f0eb..00000000 --- a/Patches/CyanogenMod-14.1/android_packages_apps_FDroid/0003.patch +++ /dev/null @@ -1,94 +0,0 @@ -From c8fa50c18694d35a4c2e334d886056556b35749c Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Sun, 20 Nov 2016 05:35:13 -0500 -Subject: [PATCH] non-Copperhead system app updates are incompatible - ---- - .../org/fdroid/fdroid/CompatibilityChecker.java | 42 +++++++++++++++++++++- - 1 file changed, 41 insertions(+), 1 deletion(-) - -diff --git a/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java b/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java -index 74d3b0f..f71375f 100644 ---- a/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java -+++ b/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java -@@ -2,18 +2,23 @@ - - import android.content.Context; - import android.content.SharedPreferences; -+import android.content.pm.ApplicationInfo; - import android.content.pm.FeatureInfo; - import android.content.pm.PackageManager; -+import android.content.pm.PackageManager.NameNotFoundException; -+import android.content.pm.Signature; - import android.os.Build; - import android.preference.PreferenceManager; - import android.support.annotation.Nullable; - import android.text.TextUtils; -+import android.util.Log; - - import org.fdroid.fdroid.compat.SupportedArchitectures; - import org.fdroid.fdroid.data.Apk; -- -+import org.fdroid.fdroid.Utils; - import java.util.ArrayList; - import java.util.Collections; -+import java.util.HashMap; - import java.util.HashSet; - import java.util.List; - import java.util.Set; -@@ -29,6 +34,7 @@ - private final String[] cpuAbis; - private final String cpuAbisDesc; - private final boolean ignoreTouchscreen; -+ private final HashMap systemApps; - - public CompatibilityChecker(Context ctx) { - -@@ -56,6 +62,34 @@ public CompatibilityChecker(Context ctx) { - } - } - -+ systemApps = new HashMap<>(); -+ for (final ApplicationInfo ai: pm.getInstalledApplications(0)) { -+ Signature sig; -+ try { -+ sig = ctx.getPackageManager().getPackageInfo( -+ ai.packageName, PackageManager.GET_SIGNATURES).signatures[0]; -+ } catch (NameNotFoundException e) { -+ continue; -+ } -+ byte[] rawCertBytes = sig.toByteArray(); -+ -+ final byte[] fdroidSig = new byte[rawCertBytes.length * 2]; -+ for (int j = 0; j < rawCertBytes.length; j++) { -+ byte v = rawCertBytes[j]; -+ int d = (v >> 4) & 0xF; -+ fdroidSig[j * 2] = (byte) (d >= 10 ? ('a' + d - 10) : ('0' + d)); -+ d = v & 0xF; -+ fdroidSig[j * 2 + 1] = (byte) (d >= 10 ? ('a' + d - 10) : ('0' + d)); -+ } -+ -+ String hash = Utils.hashBytes(fdroidSig, "md5"); -+ -+ if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0 || -+ (ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { -+ systemApps.put(ai.packageName, hash); -+ } -+ } -+ - cpuAbis = SupportedArchitectures.getAbis(); - - StringBuilder builder = new StringBuilder(); -@@ -119,6 +153,12 @@ private boolean compatibleApi(@Nullable String[] nativecode) { - + " while your architectures are " + cpuAbisDesc); - } - -+ String hash = systemApps.get(apk.packageName); -+ if (hash != null && !hash.equalsIgnoreCase(apk.sig)) { -+ Log.i(TAG, "incompatible system app: " + apk.packageName + " " + hash + " " + apk.sig); -+ Collections.addAll(incompatibleReasons, "Not already installed as a system app"); -+ } -+ - return incompatibleReasons; - } - } diff --git a/Patches/CyanogenMod-14.1/android_packages_apps_FDroid/0004.patch b/Patches/CyanogenMod-14.1/android_packages_apps_FDroid/0004.patch deleted file mode 100644 index 73471f4f..00000000 --- a/Patches/CyanogenMod-14.1/android_packages_apps_FDroid/0004.patch +++ /dev/null @@ -1,22 +0,0 @@ -From c58e3bb0f5ee76b82c4249cd7b4432b7fb711add Mon Sep 17 00:00:00 2001 -From: Daniel Micay -Date: Tue, 6 Dec 2016 17:11:48 -0500 -Subject: [PATCH] use build tools 25.0.1 - ---- - app/build.gradle | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/app/build.gradle b/app/build.gradle -index 7ae8ca4..a81160d 100644 ---- a/app/build.gradle -+++ b/app/build.gradle -@@ -146,7 +146,7 @@ if (!hasProperty('sourceDeps')) { - - android { - compileSdkVersion 24 -- buildToolsVersion '25.0.0' -+ buildToolsVersion '25.0.1' - useLibrary 'org.apache.http.legacy' - - buildTypes { diff --git a/Patches/CyanogenMod-14.1/android_packages_apps_FDroidPrivilegedExtension/0001-Update_Build_Tools.patch b/Patches/CyanogenMod-14.1/android_packages_apps_FDroidPrivilegedExtension/0001-Update_Build_Tools.patch deleted file mode 100644 index 404be1d3..00000000 --- a/Patches/CyanogenMod-14.1/android_packages_apps_FDroidPrivilegedExtension/0001-Update_Build_Tools.patch +++ /dev/null @@ -1,25 +0,0 @@ -From bb788ab88084c09a34444f3e12d4f6cd1cc7398b Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sun, 18 Dec 2016 17:38:28 -0500 -Subject: [PATCH] Update build tools - ---- - app/build.gradle | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/app/build.gradle b/app/build.gradle -index cbba2e6..88b97c7 100644 ---- a/app/build.gradle -+++ b/app/build.gradle -@@ -36,7 +36,7 @@ dependencies { - - android { - compileSdkVersion 24 -- buildToolsVersion '24.0.1' -+ buildToolsVersion '25.0.1' - - defaultConfig { - archivesBaseName = "FDroidPrivilegedExtension" --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_packages_apps_FDroidPrivilegedExtension/0002-Release_Key.patch b/Patches/CyanogenMod-14.1/android_packages_apps_FDroidPrivilegedExtension/0002-Release_Key.patch deleted file mode 100644 index d74cd8a7..00000000 --- a/Patches/CyanogenMod-14.1/android_packages_apps_FDroidPrivilegedExtension/0002-Release_Key.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 77ca61398922d69a2b97dc3a0e4e149c40b5bbc1 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sun, 18 Dec 2016 19:01:10 -0500 -Subject: [PATCH] Change to release key - ---- - app/src/main/java/org/fdroid/fdroid/privileged/ClientWhitelist.java | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/app/src/main/java/org/fdroid/fdroid/privileged/ClientWhitelist.java b/app/src/main/java/org/fdroid/fdroid/privileged/ClientWhitelist.java -index f42bbd8..ee22bb7 100644 ---- a/app/src/main/java/org/fdroid/fdroid/privileged/ClientWhitelist.java -+++ b/app/src/main/java/org/fdroid/fdroid/privileged/ClientWhitelist.java -@@ -31,8 +31,8 @@ import java.util.HashSet; - public class ClientWhitelist { - - public static HashSet> whitelist = new HashSet<>(Arrays.asList( -- // certificate SHA-256 of https//f-droid.org/FDroid.apk -- new Pair<>("org.fdroid.fdroid", "43238d512c1e5eb2d6569f4a3afbf5523418b82e0a3ed1552770abb9a9c9ccab") -+ //release-key -+ new Pair<>("org.fdroid.fdroid", "cb1ee2ec40d05ed678f42ae701cdfa29eea79d0e6d633276de230bf3494067c3") - )); - - } --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_packages_apps_FDroidPrivilegedExtension/0003-Test_Keys.patch b/Patches/CyanogenMod-14.1/android_packages_apps_FDroidPrivilegedExtension/0003-Test_Keys.patch deleted file mode 100644 index 5c9fb89a..00000000 --- a/Patches/CyanogenMod-14.1/android_packages_apps_FDroidPrivilegedExtension/0003-Test_Keys.patch +++ /dev/null @@ -1,27 +0,0 @@ -From a588fda0e220292e0b742999e08e1a54355a9a78 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sun, 18 Dec 2016 19:01:55 -0500 -Subject: [PATCH] Add test-keys - ---- - app/src/main/java/org/fdroid/fdroid/privileged/ClientWhitelist.java | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/app/src/main/java/org/fdroid/fdroid/privileged/ClientWhitelist.java b/app/src/main/java/org/fdroid/fdroid/privileged/ClientWhitelist.java -index ee22bb7..fd8ad3f 100644 ---- a/app/src/main/java/org/fdroid/fdroid/privileged/ClientWhitelist.java -+++ b/app/src/main/java/org/fdroid/fdroid/privileged/ClientWhitelist.java -@@ -32,7 +32,9 @@ public class ClientWhitelist { - - public static HashSet> whitelist = new HashSet<>(Arrays.asList( - //release-key -- new Pair<>("org.fdroid.fdroid", "cb1ee2ec40d05ed678f42ae701cdfa29eea79d0e6d633276de230bf3494067c3") -+ new Pair<>("org.fdroid.fdroid", "cb1ee2ec40d05ed678f42ae701cdfa29eea79d0e6d633276de230bf3494067c3"), -+ //test-key -+ new Pair<>("org.fdroid.fdroid", "c8a2e9bccf597c2fb6dc66bee293fc13f2fc47ec77bc6b2b0d52c11f51192ab8") - )); - - } --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_packages_apps_FakeStore/0001-Fixes.patch b/Patches/CyanogenMod-14.1/android_packages_apps_FakeStore/0001-Fixes.patch deleted file mode 100644 index 7d25b257..00000000 --- a/Patches/CyanogenMod-14.1/android_packages_apps_FakeStore/0001-Fixes.patch +++ /dev/null @@ -1,48 +0,0 @@ -From fbc5ea49609b7719a9399541d6a9525910478961 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sun, 18 Dec 2016 16:54:51 -0500 -Subject: [PATCH] Build fixes - -Change-Id: I5ae430d0af5b1a111079f92f6d7e001597152008 ---- - Android.mk | 4 ++-- - build.gradle | 2 +- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/Android.mk b/Android.mk -index 2102bd1..9cc8e60 100644 ---- a/Android.mk -+++ b/Android.mk -@@ -21,14 +21,14 @@ LOCAL_PACKAGE_NAME := FakeStore - - fakestore_root := $(LOCAL_PATH) - fakestore_dir := fake-store --fakestore_out := $(OUT_DIR)/target/common/obj/APPS/$(LOCAL_MODULE)_intermediates -+fakestore_out := $(PWD)/$(OUT_DIR)/target/common/obj/APPS/$(LOCAL_MODULE)_intermediates - fakestore_build := $(fakestore_root)/$(fakestore_dir)/build - fakestore_apk := build/outputs/apk/fake-store-release-unsigned.apk - - $(fakestore_root)/$(fakestore_dir)/$(fakestore_apk): - rm -Rf $(fakestore_build) - mkdir -p $(fakestore_out) -- ln -s $(fakestore_out) $(fakestore_build) -+ ln -sf $(fakestore_out) $(fakestore_build) - echo "sdk.dir=$(ANDROID_HOME)" > $(fakestore_root)/local.properties - cd $(fakestore_root) && git submodule update --recursive --init - cd $(fakestore_root)/$(fakestore_dir) && JAVA_TOOL_OPTIONS="$(JAVA_TOOL_OPTIONS) -Dfile.encoding=UTF8" ../gradlew assembleRelease -diff --git a/build.gradle b/build.gradle -index 3ec4bfc..8a7d2e2 100644 ---- a/build.gradle -+++ b/build.gradle -@@ -26,7 +26,7 @@ buildscript { - - allprojects { - apply plugin: 'idea' -- ext.androidBuildVersionTools = "24.0.3" -+ ext.androidBuildVersionTools = "25.0.1" - ext.isReleaseVersion = false - } - --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_packages_apps_GmsCore/0001-Fixes.patch b/Patches/CyanogenMod-14.1/android_packages_apps_GmsCore/0001-Fixes.patch deleted file mode 100644 index e6e44559..00000000 --- a/Patches/CyanogenMod-14.1/android_packages_apps_GmsCore/0001-Fixes.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 98f96597bc7ac50a9a1968f57921c751585977c3 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sun, 18 Dec 2016 16:53:19 -0500 -Subject: [PATCH] Build fixes - -Change-Id: Icfae5b47655f9e1a8dceb48f2f4ab08c6bbe5001 ---- - Android.mk | 4 ++-- - build.gradle | 2 +- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/Android.mk b/Android.mk -index 516e72b..bfb2794 100644 ---- a/Android.mk -+++ b/Android.mk -@@ -21,14 +21,14 @@ LOCAL_PACKAGE_NAME := GmsCore - - gmscore_root := $(LOCAL_PATH) - gmscore_dir := play-services-core --gmscore_out := $(OUT_DIR)/target/common/obj/APPS/$(LOCAL_MODULE)_intermediates -+gmscore_out := $(PWD)/$(OUT_DIR)/target/common/obj/APPS/$(LOCAL_MODULE)_intermediates - gmscore_build := $(gmscore_root)/$(gmscore_dir)/build - gmscore_apk := build/outputs/apk/play-services-core-release-unsigned.apk - - $(gmscore_root)/$(gmscore_dir)/$(gmscore_apk): - rm -Rf $(gmscore_build) - mkdir -p $(gmscore_out) -- ln -s $(gmscore_out) $(gmscore_build) -+ ln -sf $(gmscore_out) $(gmscore_build) - echo "sdk.dir=$(ANDROID_HOME)" > $(gmscore_root)/local.properties - cd $(gmscore_root) && git submodule update --recursive --init - cd $(gmscore_root)/$(gmscore_dir) && JAVA_TOOL_OPTIONS="$(JAVA_TOOL_OPTIONS) -Dfile.encoding=UTF8" ../gradlew assembleRelease -diff --git a/build.gradle b/build.gradle -index 3ec4bfc..8a7d2e2 100644 ---- a/build.gradle -+++ b/build.gradle -@@ -26,7 +26,7 @@ buildscript { - - allprojects { - apply plugin: 'idea' -- ext.androidBuildVersionTools = "24.0.3" -+ ext.androidBuildVersionTools = "25.0.1" - ext.isReleaseVersion = false - } - --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_packages_apps_GsfProxy/0001-Fixes.patch b/Patches/CyanogenMod-14.1/android_packages_apps_GsfProxy/0001-Fixes.patch deleted file mode 100644 index f183f457..00000000 --- a/Patches/CyanogenMod-14.1/android_packages_apps_GsfProxy/0001-Fixes.patch +++ /dev/null @@ -1,50 +0,0 @@ -From e81a668b7d57f230c4b2e924981d579d13d78ce4 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Fri, 23 Dec 2016 19:58:47 -0500 -Subject: [PATCH] Fix build tools - -Change-Id: I7e30cb163233980e1faded4041791f5311a3ebda ---- - Android.mk | 4 ++-- - services-framework-proxy/build.gradle | 4 ++-- - 2 files changed, 4 insertions(+), 4 deletions(-) - -diff --git a/Android.mk b/Android.mk -index 50889ae..5193277 100644 ---- a/Android.mk -+++ b/Android.mk -@@ -21,14 +21,14 @@ LOCAL_PACKAGE_NAME := GsfProxy - - gsfproxy_root := $(LOCAL_PATH) - gsfproxy_dir := services-framework-proxy --gsfproxy_out := $(OUT_DIR)/target/common/obj/APPS/$(LOCAL_MODULE)_intermediates -+gsfproxy_out := $(PWD)/$(OUT_DIR)/target/common/obj/APPS/$(LOCAL_MODULE)_intermediates - gsfproxy_build := $(gsfproxy_root)/$(gsfproxy_dir)/build - gsfproxy_apk := build/outputs/apk/services-framework-proxy-release-unsigned.apk - - $(gsfproxy_root)/$(gsfproxy_dir)/$(gsfproxy_apk): - rm -Rf $(gsfproxy_build) - mkdir -p $(gsfproxy_out) -- ln -s $(gsfproxy_out) $(gsfproxy_build) -+ ln -sf $(gsfproxy_out) $(gsfproxy_build) - echo "sdk.dir=$(ANDROID_HOME)" > $(gsfproxy_root)/local.properties - cd $(gsfproxy_root) && git submodule update --recursive --init - cd $(gsfproxy_root)/$(gsfproxy_dir) && JAVA_TOOL_OPTIONS="$(JAVA_TOOL_OPTIONS) -Dfile.encoding=UTF8" ../gradlew assembleRelease -diff --git a/services-framework-proxy/build.gradle b/services-framework-proxy/build.gradle -index 6824f94..7243816 100644 ---- a/services-framework-proxy/build.gradle -+++ b/services-framework-proxy/build.gradle -@@ -44,8 +44,8 @@ int getMyVersionCode() { - } - - android { -- compileSdkVersion 23 -- buildToolsVersion "23.0.2" -+ compileSdkVersion 24 -+ buildToolsVersion "25.0.1" - - defaultConfig { - versionName getMyVersionName() --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_packages_apps_Nfc/0001-Disable_NFC.patch b/Patches/CyanogenMod-14.1/android_packages_apps_Nfc/0001-Disable_NFC.patch deleted file mode 100644 index 84a282fa..00000000 --- a/Patches/CyanogenMod-14.1/android_packages_apps_Nfc/0001-Disable_NFC.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 5cb02870e993ec2704645ade6d5fb79ed56ee710 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sun, 18 Dec 2016 09:38:09 -0500 -Subject: [PATCH] Disable NFC and NDEF by default - -Change-Id: I227fa330916166346e6dfc1aff36b40c993fa57f ---- - src/com/android/nfc/NfcService.java | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/com/android/nfc/NfcService.java b/src/com/android/nfc/NfcService.java -index ab50f23..bd78f77 100755 ---- a/src/com/android/nfc/NfcService.java -+++ b/src/com/android/nfc/NfcService.java -@@ -105,9 +105,9 @@ public class NfcService implements DeviceHostListener { - public static final String PREF = "NfcServicePrefs"; - - static final String PREF_NFC_ON = "nfc_on"; -- static final boolean NFC_ON_DEFAULT = true; -+ static final boolean NFC_ON_DEFAULT = false; - static final String PREF_NDEF_PUSH_ON = "ndef_push_on"; -- static final boolean NDEF_PUSH_ON_DEFAULT = true; -+ static final boolean NDEF_PUSH_ON_DEFAULT = false; - static final String PREF_FIRST_BEAM = "first_beam"; - static final String PREF_FIRST_BOOT = "first_boot"; - --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_packages_apps_Settings/0001-Hide_Passwords.patch b/Patches/CyanogenMod-14.1/android_packages_apps_Settings/0001-Hide_Passwords.patch deleted file mode 100644 index a794e1d6..00000000 --- a/Patches/CyanogenMod-14.1/android_packages_apps_Settings/0001-Hide_Passwords.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 40a15771d3907c6bb883e8f4829a89db241d15fe Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sun, 18 Dec 2016 09:41:02 -0500 -Subject: [PATCH] Hide passwords by default - -Change-Id: I5329a76ea7a93da95fbb4e02a114b0aa5fd368bd ---- - src/com/android/settings/CryptKeeperConfirm.java | 2 +- - src/com/android/settings/SecuritySettings.java | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/com/android/settings/CryptKeeperConfirm.java b/src/com/android/settings/CryptKeeperConfirm.java -index 1cc5b6a..4162232 100644 ---- a/src/com/android/settings/CryptKeeperConfirm.java -+++ b/src/com/android/settings/CryptKeeperConfirm.java -@@ -129,7 +129,7 @@ public class CryptKeeperConfirm extends InstrumentedFragment { - } - int value = Settings.System.getInt(getContext().getContentResolver(), - Settings.System.TEXT_SHOW_PASSWORD, -- 1); -+ 0); - utils.setVisiblePasswordEnabled(value != 0, UserHandle.USER_SYSTEM); - - Intent intent = new Intent(getActivity(), Blank.class); -diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java -index 106eedf..f3c0976 100644 ---- a/src/com/android/settings/SecuritySettings.java -+++ b/src/com/android/settings/SecuritySettings.java -@@ -621,7 +621,7 @@ public class SecuritySettings extends SettingsPreferenceFragment - - if (mShowPassword != null) { - mShowPassword.setChecked(Settings.System.getInt(getContentResolver(), -- Settings.System.TEXT_SHOW_PASSWORD, 1) != 0); -+ Settings.System.TEXT_SHOW_PASSWORD, 0) != 0); - } - - if (mResetCredentials != null && !mResetCredentials.isDisabledByAdmin()) { --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_packages_apps_SetupWizard/0001-Remove_Analytics.patch b/Patches/CyanogenMod-14.1/android_packages_apps_SetupWizard/0001-Remove_Analytics.patch deleted file mode 100644 index 6a6eeb93..00000000 --- a/Patches/CyanogenMod-14.1/android_packages_apps_SetupWizard/0001-Remove_Analytics.patch +++ /dev/null @@ -1,898 +0,0 @@ -From 16ad98fe210328d994c264e258d77379e350d8fb Mon Sep 17 00:00:00 2001 -From: Tad -Date: Fri, 23 Dec 2016 22:21:15 -0500 -Subject: [PATCH] Remove stats - -Change-Id: I4fbf5ce0d2878d7ffce49771b025d6a35b12ed29 ---- - AndroidManifest.xml | 1 - - .../setupwizard/cmstats/SetupStats.java | 163 --------------------- - .../setupwizard/cmstats/StatsUtils.java | 44 ------ - .../setupwizard/setup/BluetoothSetupPage.java | 7 - - .../setupwizard/setup/ChooseDataSimPage.java | 6 +- - .../setupwizard/setup/CyanogenServicesPage.java | 13 -- - .../setupwizard/setup/CyanogenSettingsPage.java | 20 --- - .../setupwizard/setup/DateTimePage.java | 19 --- - .../setupwizard/setup/FingerprintSetupPage.java | 4 - - .../setupwizard/setup/GmsAccountPage.java | 25 +--- - .../setupwizard/setup/MobileDataPage.java | 4 - - .../setupwizard/setup/OtherSettingsPage.java | 13 -- - .../setupwizard/setup/ScreenLockSetupPage.java | 4 - - .../cyanogenmod/setupwizard/setup/SetupPage.java | 7 - - .../cyanogenmod/setupwizard/setup/WelcomePage.java | 16 -- - .../setupwizard/setup/WifiSetupPage.java | 25 ---- - .../setupwizard/ui/SetupPageFragment.java | 3 - - .../setupwizard/ui/SetupWizardActivity.java | 6 - - .../util/EnableAccessibilityController.java | 3 - - 19 files changed, 2 insertions(+), 381 deletions(-) - delete mode 100644 src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java - delete mode 100644 src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java - -diff --git a/AndroidManifest.xml b/AndroidManifest.xml -index deb607c..c5878fa 100644 ---- a/AndroidManifest.xml -+++ b/AndroidManifest.xml -@@ -43,7 +43,6 @@ - - - -- - - - -diff --git a/src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java b/src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java -deleted file mode 100644 -index f3a47b3..0000000 ---- a/src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java -+++ /dev/null -@@ -1,163 +0,0 @@ --/* -- * Copyright (C) 2014 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.cyanogenmod.setupwizard.cmstats; -- --import android.content.Context; --import android.content.Intent; --import android.os.UserHandle; --import android.util.Log; -- --import java.util.LinkedList; -- -- --public class SetupStats { -- -- private static final String TAG = SetupStats.class.getSimpleName(); -- -- private static final String ANALYTIC_INTENT = "com.cyngn.stats.action.SEND_ANALYTIC_EVENT"; -- private static final String ANALYTIC_PERMISSION = "com.cyngn.stats.SEND_ANALYTICS"; -- -- public static final String TRACKING_ID = "tracking_id"; -- -- private final LinkedList mEvents = new LinkedList(); -- -- private static final SetupStats sInstance = new SetupStats(); -- -- private static final boolean DEBUG = false; -- -- private SetupStats() {} -- -- public static void addEvent(String category, String action, -- String label, String value) { -- sInstance.mEvents.add(new Event(category, action, label, value)); -- } -- -- public static void addEvent(String category, String action) { -- sInstance.mEvents.add(new Event(category, action, null, null)); -- } -- -- public static void sendEvents(Context context) { -- while (!sInstance.mEvents.isEmpty()) { -- sInstance.sendEvent(context, sInstance.mEvents.remove()); -- } -- } -- -- private void sendEvent(Context context, Event event) { -- -- if (!StatsUtils.isStatsPackageInstalled(context) -- || !StatsUtils.isStatsCollectionEnabled(context)) { -- return; -- } -- -- // Create new intent -- Intent intent = new Intent(); -- intent.setAction(ANALYTIC_INTENT); -- -- // add tracking id -- intent.putExtra(TRACKING_ID, context.getPackageName()); -- // append -- intent.putExtra(Fields.EVENT_CATEGORY, event.category); -- if (DEBUG) Log.d(TAG, Fields.EVENT_CATEGORY + "=" + event.category); -- intent.putExtra(Fields.EVENT_ACTION, event.action); -- if (DEBUG) Log.d(TAG, Fields.EVENT_ACTION + "=" + event.action); -- // check if exist -- if (event.label != null) { -- intent.putExtra(Fields.EVENT_LABEL, event.label); -- if (DEBUG) Log.d(TAG, Fields.EVENT_LABEL + "=" + event.label); -- } -- -- if (event.value != null) { -- intent.putExtra(Fields.EVENT_VALUE, event.value); -- if (DEBUG) Log.d(TAG, Fields.EVENT_VALUE + "=" + event.value); -- } -- -- // broadcast for internal package -- context.sendBroadcastAsUser(intent, -- new UserHandle(UserHandle.USER_CURRENT), ANALYTIC_PERMISSION); -- } -- -- private static final class Event { -- private final String category; -- private final String action; -- private final String label; -- private final String value; -- -- public Event(String category, String action, String label, String value) { -- this.action = action; -- this.category = category; -- this.label = label; -- this.value = value; -- } -- } -- -- public static final class Fields { -- public static final String EVENT_CATEGORY = "category"; -- public static final String EVENT_ACTION = "action"; -- public static final String EVENT_LABEL = "label"; -- public static final String EVENT_VALUE = "value"; -- } -- -- public static final class Categories { -- public static final String APP_LAUNCH = "app_launch"; -- public static final String APP_FINISHED = "app_finish"; -- public static final String PAGE_LOAD = "page_load"; -- public static final String EXTERNAL_PAGE_LOAD = "external_page_load"; -- public static final String BUTTON_CLICK = "button_click"; -- public static final String SETTING_CHANGED = "setting_changed"; -- } -- -- public static final class Action { -- public static final String PAGE_LOADED = "page_loaded"; -- public static final String PREVIOUS_BUTTON = "previous_button"; -- public static final String NEXT_BUTTON = "next_button"; -- public static final String CHANGE_LOCALE = "change_local"; -- public static final String EXTERNAL_PAGE_LAUNCH = "external_page_launch"; -- public static final String EXTERNAL_PAGE_RESULT = "external_page_result"; -- public static final String ENABLE_MOBILE_DATA = "enable_mobile_data"; -- public static final String PREFERRED_DATA_SIM = "preferred_data_sim"; -- public static final String APPLY_CUSTOM_THEME = "apply_custom_theme"; -- public static final String USE_SECURE_SMS = "use_secure_sms"; -- public static final String ENABLE_BACKUP = "enable_backup"; -- public static final String ENABLE_NAV_KEYS = "enable_nav_keys"; -- public static final String ENABLE_LOCATION = "enable_location"; -- public static final String ENABLE_NETWORK_LOCATION = "enable_network_location"; -- public static final String ENABLE_GPS_LOCATION = "enable_gps_location"; -- public static final String DATE_CHANGED = "date_changed"; -- public static final String TIME_CHANGED = "time_changed"; -- public static final String TIMEZONE_CHANGED = "timezone_changed"; -- } -- -- public static final class Label { -- public static final String PAGE = "page"; -- public static final String LOCALE = "local"; -- public static final String RESULT = "result"; -- public static final String WIFI_SETUP = "wifi_setup"; -- public static final String BLUETOOTH_SETUP = "bluetooth_setup"; -- public static final String CYANOGEN_ACCOUNT = "cyanogen_account_setup"; -- public static final String CAPTIVE_PORTAL_LOGIN = "captive_portal_login"; -- public static final String EMERGENCY_CALL = "emergency_call"; -- public static final String GMS_ACCOUNT = "gms_account"; -- public static final String RESTORE = "restore"; -- public static final String CHECKED = "checked"; -- public static final String VALUE = "value"; -- public static final String SLOT = "slot"; -- public static final String TOTAL_TIME = "total_time"; -- public static final String FINGERPRINT_SETUP = "fingerprint_setup"; -- public static final String LOCKSCREEN_SETUP = "lockscreen_setup"; -- } -- --} -diff --git a/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java b/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java -deleted file mode 100644 -index 8be8fad..0000000 ---- a/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java -+++ /dev/null -@@ -1,44 +0,0 @@ -- --/* -- * Copyright (C) 2014 The CyanogenMod Project -- * -- * Licensed under the Apache License, Version 2.0 (the "License"); -- * you may not use this file except in compliance with the License. -- * You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ -- --package com.cyanogenmod.setupwizard.cmstats; -- --import android.content.Context; --import android.content.pm.ApplicationInfo; --import android.content.pm.PackageInfo; --import android.content.pm.PackageManager; -- --import cyanogenmod.providers.CMSettings; -- --public class StatsUtils { -- private static final String STATS_PACKAGE = "com.cyngn.stats"; -- -- public static boolean isStatsCollectionEnabled(Context context) { -- return CMSettings.Secure.getInt(context.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, 1) != 0; -- } -- -- public static boolean isStatsPackageInstalled(Context context) { -- try { -- PackageInfo pi = context.getPackageManager().getPackageInfo(STATS_PACKAGE, 0); -- return pi.applicationInfo.enabled -- && ((pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0); -- } catch (PackageManager.NameNotFoundException e) { -- return false; -- } -- } --} -diff --git a/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -index 915abec..8609dbb 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/BluetoothSetupPage.java -@@ -28,7 +28,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -91,9 +90,6 @@ public class BluetoothSetupPage extends SetupPage { - @Override - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_BLUETOOTH) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.BLUETOOTH_SETUP, "success"); - getCallbacks().onNextPage(); - } else { - return false; -@@ -111,9 +107,6 @@ public class BluetoothSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.BLUETOOTH_SETUP); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_BLUETOOTH, options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java b/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -index a302d8f..5505031 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java -@@ -48,7 +48,6 @@ import com.android.internal.telephony.TelephonyIntents; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -355,10 +354,7 @@ public class ChooseDataSimPage extends SetupPage { - for (int i = 0; i < mCheckBoxes.size(); i++) { - if (subInfoRecord.getSimSlotIndex() == i) { - mCheckBoxes.get(i).setChecked(true); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.PREFERRED_DATA_SIM, -- SetupStats.Label.SLOT, String.valueOf(i + 1)); -- } else { -+ } else { - mCheckBoxes.get(i).setChecked(false); - } - -diff --git a/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java b/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -index e71dd79..5bfe3b0 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java -@@ -32,7 +32,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -95,10 +94,6 @@ public class CyanogenServicesPage extends SetupPage { - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CYANOGEN) { - if (resultCode == Activity.RESULT_OK || resultCode == Activity.RESULT_FIRST_USER) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CYANOGEN_ACCOUNT, -- resultCode == Activity.RESULT_OK ? "success" : "skipped"); - if (SetupWizardUtils.accountExists(mContext, - mContext.getString(R.string.cm_account_type))) { - if (SetupWizardUtils.isDeviceLocked()) { -@@ -108,9 +103,6 @@ public class CyanogenServicesPage extends SetupPage { - } - getCallbacks().onNextPage(); - } else if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CYANOGEN_ACCOUNT, "canceled"); - getCallbacks().onPreviousPage(); - } - } -@@ -136,11 +128,6 @@ public class CyanogenServicesPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats -- .addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, -- SetupStats.Label.CYANOGEN_ACCOUNT); - mFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_CYANOGEN, - options.toBundle()); -diff --git a/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java b/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -index 03a04b6..080e9b1 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java -@@ -42,7 +42,6 @@ import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -116,37 +115,18 @@ public class CyanogenSettingsPage extends SetupPage { - @Override - public void run() { - if (getData().containsKey(DISABLE_NAV_KEYS)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_NAV_KEYS, -- SetupStats.Label.CHECKED, -- String.valueOf(getData().getBoolean(DISABLE_NAV_KEYS))); - writeDisableNavkeysOption(mContext, getData().getBoolean(DISABLE_NAV_KEYS)); - } - } - }); -- handleEnableMetrics(); - handleDefaultThemeSetup(); - } - -- private void handleEnableMetrics() { -- Bundle privacyData = getData(); -- if (privacyData != null -- && privacyData.containsKey(KEY_SEND_METRICS)) { -- CMSettings.Secure.putInt(mContext.getContentResolver(), -- CMSettings.Secure.STATS_COLLECTION, privacyData.getBoolean(KEY_SEND_METRICS) -- ? 1 : 0); -- } -- } -- - private void handleDefaultThemeSetup() { - Bundle privacyData = getData(); - if (!SetupWizardUtils.getDefaultThemePackageName(mContext).equals( - ThemeConfig.SYSTEM_DEFAULT) && privacyData != null && - privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.APPLY_CUSTOM_THEME, -- SetupStats.Label.CHECKED, -- String.valueOf(privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME))); - Log.i(TAG, "Applying default theme"); - final ThemeManager tm = ThemeManager.getInstance(mContext); - tm.applyDefaultTheme(); -diff --git a/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java b/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -index 7a5922b..a669163 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java -@@ -42,7 +42,6 @@ import android.widget.TextView; - import android.widget.TimePicker; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - - import org.xmlpull.v1.XmlPullParserException; -@@ -136,8 +135,6 @@ public class DateTimePage extends SetupPage { - mDateView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "date_picker"); - showDatePicker(); - } - }); -@@ -145,8 +142,6 @@ public class DateTimePage extends SetupPage { - mTimeView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "time_picker"); - showTimePicker(); - } - }); -@@ -167,17 +162,11 @@ public class DateTimePage extends SetupPage { - final Map map = (Map) adapterView.getItemAtPosition(position); - final String tzId = (String) map.get(KEY_ID); - if (mCurrentTimeZone != null && !mCurrentTimeZone.getID().equals(tzId)) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- "timezone_picker"); - // Update the system timezone value - final Activity activity = getActivity(); - final AlarmManager alarm = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE); - alarm.setTimeZone(tzId); - mCurrentTimeZone = TimeZone.getTimeZone(tzId); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.TIMEZONE_CHANGED, -- SetupStats.Label.VALUE, -- mCurrentTimeZone.getDisplayName()); - } - - } -@@ -232,10 +221,6 @@ public class DateTimePage extends SetupPage { - if (activity != null) { - setDate(activity, year, month, day); - updateTimeAndDateDisplay(activity); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.DATE_CHANGED, -- SetupStats.Label.VALUE, -- month+"/"+day+"/"+year); - } - } - -@@ -245,10 +230,6 @@ public class DateTimePage extends SetupPage { - if (activity != null) { - setTime(activity, hourOfDay, minute); - updateTimeAndDateDisplay(activity); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.TIME_CHANGED, -- SetupStats.Label.VALUE, -- hourOfDay+":"+minute); - } - } - -diff --git a/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -index 890a4f6..c9174c6 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/FingerprintSetupPage.java -@@ -28,7 +28,6 @@ import android.widget.TextView; - import com.android.internal.widget.LockPatternUtils; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - - public class FingerprintSetupPage extends SetupPage { -@@ -113,9 +112,6 @@ public class FingerprintSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(getActivity(), - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.FINGERPRINT_SETUP); - startActivityForResult(intent, SetupWizardApp.REQUEST_CODE_SETUP_FINGERPRINT, - options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -index 436da08..79b5f2c 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java -@@ -35,7 +35,6 @@ import android.util.Log; - import com.android.setupwizardlib.util.ResultCodes; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -148,10 +147,6 @@ public class GmsAccountPage extends SetupPage { - boolean restorePicker = !data.hasExtra(EXTRA_RESTORE_TOKEN) - && !data.hasExtra(EXTRA_RESTORE_ACCOUNT) && - data.hasExtra(EXTRA_AUTH_ACCOUNT); -- -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.GMS_ACCOUNT, "success"); - launchGmsRestorePage(restorePicker); - } else { - handleResult(requestCode, resultCode); -@@ -179,24 +174,12 @@ public class GmsAccountPage extends SetupPage { - - private void handleResult(int requestCode, int resultCode) { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "canceled"); - getCallbacks().onPreviousPage(); - } else { - if (resultCode == Activity.RESULT_OK) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "success"); - getCallbacks().onNextPage(); - } else { - if (canSkip()) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? -- SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "skipped"); - getCallbacks().onNextPage(); - } else { - getCallbacks().onPreviousPage(); -@@ -236,9 +219,6 @@ public class GmsAccountPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.RESTORE); - mFragment.startActivityForResult( - intent, - SetupWizardApp.REQUEST_CODE_RESTORE_GMS, options.toBundle()); -@@ -310,10 +290,7 @@ public class GmsAccountPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.GMS_ACCOUNT); -- mFragment.startActivityForResult(intent, -+ mFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_GMS, options.toBundle()); - } catch (OperationCanceledException e) { - error = true; -diff --git a/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java b/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -index 9f96b1d..cfbc676 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java -@@ -38,7 +38,6 @@ import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -147,9 +146,6 @@ public class MobileDataPage extends SetupPage { - } else { - onDataStateReady(); - } -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_MOBILE_DATA, -- SetupStats.Label.CHECKED, String.valueOf(checked)); - } - }; - -diff --git a/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java b/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -index 7ed23dc..270ac41 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java -@@ -17,7 +17,6 @@ - package com.cyanogenmod.setupwizard.setup; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; - -@@ -229,10 +228,6 @@ public class OtherSettingsPage extends SetupPage { - } - - private void onToggleLocationAccess(boolean checked) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); -- - if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_SENSORS_ONLY); - } else { -@@ -241,10 +236,6 @@ public class OtherSettingsPage extends SetupPage { - } - - private void onToggleBatterySaving(boolean checked) { -- /* SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_BATTERY_SAVING_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); */ -- - if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_BATTERY_SAVING); - } else { -@@ -253,10 +244,6 @@ public class OtherSettingsPage extends SetupPage { - } - - private void onToggleNetwork(boolean checked) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.ENABLE_NETWORK_LOCATION, -- SetupStats.Label.CHECKED, String.valueOf(checked)); -- - if (checked) { - setLocationMode(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY); - } else { -diff --git a/src/com/cyanogenmod/setupwizard/setup/ScreenLockSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/ScreenLockSetupPage.java -index 3c9da33..72ee3f7 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/ScreenLockSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/ScreenLockSetupPage.java -@@ -27,7 +27,6 @@ import android.view.View; - import android.widget.TextView; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - - public class ScreenLockSetupPage extends SetupPage { -@@ -106,9 +105,6 @@ public class ScreenLockSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(getActivity(), - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.LOCKSCREEN_SETUP); - startActivityForResult(intent, SetupWizardApp.REQUEST_CODE_SETUP_LOCKSCREEN, - options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/setup/SetupPage.java b/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -index 05bf9c5..142c04a 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/SetupPage.java -@@ -26,7 +26,6 @@ import android.transition.Transition; - import android.view.Gravity; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - - - public abstract class SetupPage implements Page { -@@ -81,18 +80,12 @@ public abstract class SetupPage implements Page { - public void doLoadAction(FragmentManager fragmentManager, int action) { - Fragment fragment = getFragment(fragmentManager, action); - if (action == Page.ACTION_NEXT) { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- SetupStats.Action.NEXT_BUTTON, getKey(), -- String.valueOf(System.currentTimeMillis())); - Transition t = new Slide(Gravity.RIGHT); - fragment.setEnterTransition(t); - fragmentManager.beginTransaction() - .replace(R.id.content,fragment, getKey()) - .commit(); - } else { -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, -- SetupStats.Action.PREVIOUS_BUTTON, getKey(), -- String.valueOf(System.currentTimeMillis())); - Transition t = new Slide(Gravity.LEFT); - fragment.setEnterTransition(t); - fragmentManager.beginTransaction() -diff --git a/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java b/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -index 460a0ac..3a3d029 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java -@@ -42,7 +42,6 @@ import android.widget.Toast; - import com.android.internal.telephony.MccTable; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LocalePicker; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -86,9 +85,6 @@ public class WelcomePage extends SetupPage { - confirmCyanogenCredentials(mWelcomeFragment); - return true; - } else { -- if (mWelcomeFragment != null) { -- mWelcomeFragment.sendLocaleStats(); -- } - return super.doNextAction(); - } - } -@@ -102,10 +98,6 @@ public class WelcomePage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, SetupStats.Label.EMERGENCY_CALL); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.EMERGENCY_CALL); - mContext.startActivity(intent, options.toBundle()); - return true; - } -@@ -269,14 +261,6 @@ public class WelcomePage extends SetupPage { - return R.layout.setup_welcome_page; - } - -- public void sendLocaleStats() { -- if (!mCurrentLocale.equals(mInitialLocale)) { -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- SetupStats.Action.CHANGE_LOCALE, SetupStats.Label.LOCALE, -- mCurrentLocale.getDisplayName()); -- } -- } -- - public void fetchAndUpdateSimLocale() { - if (mIgnoreSimLocale || isDetached()) { - return; -diff --git a/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -index 2d8084a..3a131f7 100644 ---- a/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -+++ b/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java -@@ -31,7 +31,6 @@ import android.util.Log; - - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.ui.LoadingFragment; - import com.cyanogenmod.setupwizard.ui.SetupPageFragment; - import com.cyanogenmod.setupwizard.util.SetupWizardUtils; -@@ -86,9 +85,6 @@ public class WifiSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.CAPTIVE_PORTAL_LOGIN); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL, - options.toBundle()); -@@ -157,19 +153,10 @@ public class WifiSetupPage extends SetupPage { - public boolean onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_WIFI) { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "canceled"); - getCallbacks().onPreviousPage(); - } else if (resultCode == Activity.RESULT_OK) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "success"); - checkForCaptivePortal(); - } else { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.WIFI_SETUP, "skipped"); - getCallbacks().onNextPage(); - } - } else if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL) { -@@ -179,20 +166,11 @@ public class WifiSetupPage extends SetupPage { - } - String token = data.getStringExtra("response_token"); - if (token != null && !token.equals(mResponseToken)) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "token_mismatch"); - launchWifiSetup(); - } else { - if (resultCode == Activity.RESULT_CANCELED) { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "canceled"); - launchWifiSetup(); - } else { -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_RESULT, -- SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "success"); - getCallbacks().onNextPage(); - } - } -@@ -256,9 +234,6 @@ public class WifiSetupPage extends SetupPage { - ActivityOptions.makeCustomAnimation(mContext, - android.R.anim.fade_in, - android.R.anim.fade_out); -- SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, -- SetupStats.Action.EXTERNAL_PAGE_LAUNCH, -- SetupStats.Label.PAGE, SetupStats.Label.WIFI_SETUP); - mLoadingFragment.startActivityForResult(intent, - SetupWizardApp.REQUEST_CODE_SETUP_WIFI, options.toBundle()); - } -diff --git a/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java b/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -index b0df440..33c61c7 100644 ---- a/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -+++ b/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java -@@ -26,7 +26,6 @@ import android.view.ViewGroup; - import android.widget.TextView; - - import com.cyanogenmod.setupwizard.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.setup.Page; - import com.cyanogenmod.setupwizard.setup.SetupDataCallbacks; - -@@ -43,8 +42,6 @@ public abstract class SetupPageFragment extends Fragment { - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setRetainInstance(true); -- SetupStats.addEvent(SetupStats.Categories.PAGE_LOAD, SetupStats.Action.PAGE_LOADED, -- mKey, String.valueOf(System.currentTimeMillis())); - } - - @Override -diff --git a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -index 9f3b27a..bcc4425 100644 ---- a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -+++ b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java -@@ -45,7 +45,6 @@ import android.widget.ProgressBar; - import com.android.setupwizardlib.util.SystemBarHelper; - import com.cyanogenmod.setupwizard.R; - import com.cyanogenmod.setupwizard.SetupWizardApp; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - import com.cyanogenmod.setupwizard.setup.CMSetupWizardData; - import com.cyanogenmod.setupwizard.setup.GmsAccountPage; - import com.cyanogenmod.setupwizard.setup.Page; -@@ -95,7 +94,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - } - SystemBarHelper.hideSystemBars(getWindow()); - if (sLaunchTime == 0) { -- SetupStats.addEvent(SetupStats.Categories.APP_LAUNCH, TAG); - sLaunchTime = System.nanoTime(); - } - setContentView(R.layout.setup_main); -@@ -371,9 +369,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - @Override - public void finishSetup() { - if (!mIsFinishing) { -- SetupStats.addEvent(SetupStats.Categories.APP_FINISHED, TAG, -- SetupStats.Label.TOTAL_TIME, String.valueOf( -- System.nanoTime() - sLaunchTime)); - final SetupWizardApp setupWizardApp = (SetupWizardApp)getApplication(); - setupWizardApp.sendStickyBroadcastAsUser( - new Intent(SetupWizardApp.ACTION_FINISHED), -@@ -463,7 +458,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks, - } - final ThemeManager tm = ThemeManager.getInstance(SetupWizardActivity.this); - tm.unregisterThemeChangeListener(SetupWizardActivity.this); -- SetupStats.sendEvents(SetupWizardActivity.this); - SetupWizardUtils.disableGMSSetupWizard(SetupWizardActivity.this); - final WallpaperManager wallpaperManager = - WallpaperManager.getInstance(SetupWizardActivity.this); -diff --git a/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java b/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -index 440129b..47d6de5 100644 ---- a/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -+++ b/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java -@@ -39,7 +39,6 @@ import android.view.accessibility.AccessibilityManager; - import android.view.accessibility.IAccessibilityManager; - - import com.android.internal.R; --import com.cyanogenmod.setupwizard.cmstats.SetupStats; - - import java.util.ArrayList; - import java.util.Iterator; -@@ -284,8 +283,6 @@ public class EnableAccessibilityController { - // Turn on accessibility mode last. - Settings.Secure.putIntForUser(resolver, Settings.Secure.ACCESSIBILITY_ENABLED, - 1, userId); -- SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, -- "accessibility_enabled"); - } else if (keyguardLocked) { - try { - mAccessibilityManager.temporaryEnableAccessibilityStateUntilKeyguardRemoved( --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_system_core/0001-Hardening.patch b/Patches/CyanogenMod-14.1/android_system_core/0001-Hardening.patch deleted file mode 100644 index 172cbb3d..00000000 --- a/Patches/CyanogenMod-14.1/android_system_core/0001-Hardening.patch +++ /dev/null @@ -1,66 +0,0 @@ -From b3c84ac50cce7f7f9a045a1b8a43adc77408bf6e Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sun, 18 Dec 2016 09:51:27 -0500 -Subject: [PATCH] Misc hardening - -Change-Id: I19525796263febdcf616fcf82eb5bb714a236a0d ---- - init/init.cpp | 6 +++--- - rootdir/init.rc | 16 ++++++++++++++++ - 2 files changed, 19 insertions(+), 3 deletions(-) - -diff --git a/init/init.cpp b/init/init.cpp -index 9992b47..fa82d3b 100755 ---- a/init/init.cpp -+++ b/init/init.cpp -@@ -573,10 +573,10 @@ int main(int argc, char** argv) { - mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755"); - mkdir("/dev/pts", 0755); - mkdir("/dev/socket", 0755); -- mount("devpts", "/dev/pts", "devpts", 0, NULL); -+ mount("devpts", "/dev/pts", "devpts", MS_NOSUID|MS_NOEXEC, NULL); - #define MAKE_STR(x) __STRING(x) -- mount("proc", "/proc", "proc", 0, "hidepid=2,gid=" MAKE_STR(AID_READPROC)); -- mount("sysfs", "/sys", "sysfs", 0, NULL); -+ mount("proc", "/proc", "proc", MS_NOSUID|MS_NODEV|MS_NOEXEC, "hidepid=2,gid=" MAKE_STR(AID_READPROC)); -+ mount("sysfs", "/sys", "sysfs", MS_NOSUID|MS_NODEV|MS_NOEXEC, NULL); - } - - // We must have some place other than / to create the device nodes for -diff --git a/rootdir/init.rc b/rootdir/init.rc -index cd97776..38e68d1 100644 ---- a/rootdir/init.rc -+++ b/rootdir/init.rc -@@ -122,6 +122,7 @@ on init - write /proc/sys/kernel/sched_child_runs_first 0 - - write /proc/sys/kernel/randomize_va_space 2 -+ write /proc/sys/kernel/dmesg_restrict 1 - write /proc/sys/kernel/kptr_restrict 2 - write /proc/sys/vm/mmap_min_addr 32768 - write /proc/sys/net/ipv4/ping_group_range "0 2147483647" -@@ -140,6 +141,21 @@ on init - write /proc/sys/net/ipv4/conf/all/accept_redirects 0 - write /proc/sys/net/ipv6/conf/all/accept_redirects 0 - -+ # IPv4 hardening -+ # -+ # reverse path filtering is done with netfilter for consistency with IPv6 -+ write /proc/sys/net/ipv4/tcp_rfc1337 1 -+ write /proc/sys/net/ipv4/conf/all/accept_source_route 0 -+ write /proc/sys/net/ipv4/conf/default/accept_source_route 0 -+ write /proc/sys/net/ipv4/conf/default/accept_redirects 0 -+ write /proc/sys/net/ipv4/conf/all/send_redirects 0 -+ write /proc/sys/net/ipv4/conf/default/send_redirects 0 -+ -+ # IPv6 hardening -+ write /proc/sys/net/ipv6/conf/default/accept_redirects 0 -+ write /proc/sys/net/ipv6/conf/all/use_tempaddr 2 -+ write /proc/sys/net/ipv6/conf/default/use_tempaddr 2 -+ - # Create cgroup mount points for process groups - mkdir /dev/cpuctl - mount cgroup none /dev/cpuctl cpu --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_vendor_cm/0001-SCE.patch b/Patches/CyanogenMod-14.1/android_vendor_cm/0001-SCE.patch deleted file mode 100644 index c0da5b79..00000000 --- a/Patches/CyanogenMod-14.1/android_vendor_cm/0001-SCE.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 5b06904bd8fa8009881cf215a0ddecce2a48bdd5 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sun, 18 Dec 2016 10:40:41 -0500 -Subject: [PATCH] SC Extras - -Change-Id: Iee06a1cf026e00fc7312454d90a0fef6fcda16e3 ---- - config/common.mk | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/config/common.mk b/config/common.mk -index ab54327..577235b 100644 ---- a/config/common.mk -+++ b/config/common.mk -@@ -125,6 +125,9 @@ include vendor/cm/config/cm_audio.mk - # Theme engine - include vendor/cm/config/themes_common.mk - -+# SC Extras -+include vendor/cm/config/sce.mk -+ - ifneq ($(TARGET_DISABLE_CMSDK), true) - # CMSDK - include vendor/cm/config/cmsdk_common.mk --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_vendor_cm/0002-Monochromium.patch b/Patches/CyanogenMod-14.1/android_vendor_cm/0002-Monochromium.patch deleted file mode 100644 index f95b6484..00000000 --- a/Patches/CyanogenMod-14.1/android_vendor_cm/0002-Monochromium.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 99c3d764e8d8f374d327735d729d7ece1c760c9e Mon Sep 17 00:00:00 2001 -From: Tad -Date: Sun, 18 Dec 2016 18:14:40 -0500 -Subject: [PATCH] Add Chromium webview support - -Change-Id: I58c429c88d224af0e7c55ddd27eda85a8448379e ---- - .../common/frameworks/base/core/res/res/xml/config_webview_packages.xml | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/overlay/common/frameworks/base/core/res/res/xml/config_webview_packages.xml b/overlay/common/frameworks/base/core/res/res/xml/config_webview_packages.xml -index e05f4aa..fe6f40b 100644 ---- a/overlay/common/frameworks/base/core/res/res/xml/config_webview_packages.xml -+++ b/overlay/common/frameworks/base/core/res/res/xml/config_webview_packages.xml -@@ -32,6 +32,8 @@ - MIIDuzCCAqOgAwIBAgIJANi6DgBQG4ZTMA0GCSqGSIb3DQEBBQUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKDAtHb29nbGUgSW5jLjEQMA4GA1UECwwHQW5kcm9pZDEQMA4GA1UEAwwHd2VidmlldzAeFw0xNDA4MDgyMzIwMjBaFw00MTEyMjQyMzIwMjBaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKDAtHb29nbGUgSW5jLjEQMA4GA1UECwwHQW5kcm9pZDEQMA4GA1UEAwwHd2VidmlldzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbtaFX0r5aZJMAbPVMAgK1ZZ29dTn91VsGxXv2hqrQo7IpqEy2JmPvPnoMsSiuTAe+UcQy8oKDQ2aYVSAd1DGIy+nSRyFTt3LSIAdwSBkB1qT4a+OqkpsR6bSNXQXQ18lCQu9gREY3h3QlYBQAyzRxw4hRGlrXAzuSz1Ec4W+6x4nLG5DG61MAMR8ClF9XSqbmGB3kyZ70A0X9OPYYxiMWP1ExaYvpaVqjyZZcrPwr+vtW8oCuGBUtHpBUH3OoG+9s2YMcgLG7vCK9awKDqlPcJSpIAAj6uGs4gORmkqxZRMskLSTWbhP4p+3Ap8jYzTVB6Y1/DMVmYTWRMcPW0macCAwEAAaNQME4wHQYDVR0OBBYEFJ6bAR6/QVm4w9LRSGQiaR5Rhp3TMB8GA1UdIwQYMBaAFJ6bAR6/QVm4w9LRSGQiaR5Rhp3TMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAEQu8QiVxax7/diEiJrgKE1LwdXsIygJK/KnaKdnYEkAQpeu/QmrLiycm+OFbL1qHJIB7OuI/PQBUtcaNSiJSCVgtwtEbZWWIdsynqG/Nf4aGOndXegSQNRH54M05sRHLoeRycPrY7xQlEwGikNFR76+5UdwFBQI3Gn22g6puJnVukQm/wXQ+ajoiS4QclrNlixoDQsZ4STLH4+Wju2wIWKFFArIhVEIlbamq+p6BghuzH3aIz/Fy0YTQKi7SA+0fuNeCaqlSm5pYSt6p5CH89y1Fr+wFc5r3iLRnUwRcy08ESC7bZJnxV3d/YQ5valTxBbzku/dQbXVj/xg69H8l8M - - -+ -+ - - - --- -2.9.3 - diff --git a/Patches/CyanogenMod-14.1/android_vendor_cm/sce.mk b/Patches/CyanogenMod-14.1/android_vendor_cm/sce.mk deleted file mode 100644 index 2bc55eb9..00000000 --- a/Patches/CyanogenMod-14.1/android_vendor_cm/sce.mk +++ /dev/null @@ -1,10 +0,0 @@ -# MicroG -PRODUCT_PACKAGES += \ - GmsCore \ - GsfProxy \ - FakeStore - -# F-Droid -PRODUCT_PACKAGES += \ - F-Droid \ - FDroidPrivilegedExtension diff --git a/Patches/CyanogenMod-11.0/android_device_zte_nex/Fixes.patch b/Patches/LineageOS-11.0/android_device_zte_nex/Fixes.patch similarity index 100% rename from Patches/CyanogenMod-11.0/android_device_zte_nex/Fixes.patch rename to Patches/LineageOS-11.0/android_device_zte_nex/Fixes.patch diff --git a/Patches/CyanogenMod-11.0/android_device_zte_nex/Lower_DPI.patch b/Patches/LineageOS-11.0/android_device_zte_nex/Lower_DPI.patch similarity index 100% rename from Patches/CyanogenMod-11.0/android_device_zte_nex/Lower_DPI.patch rename to Patches/LineageOS-11.0/android_device_zte_nex/Lower_DPI.patch diff --git a/Patches/CyanogenMod-11.0/android_kernel_zte_msm8930/MDP-Fix.patch b/Patches/LineageOS-11.0/android_kernel_zte_msm8930/MDP-Fix.patch similarity index 100% rename from Patches/CyanogenMod-11.0/android_kernel_zte_msm8930/MDP-Fix.patch rename to Patches/LineageOS-11.0/android_kernel_zte_msm8930/MDP-Fix.patch diff --git a/Patches/CyanogenMod-11.0/android_kernel_zte_msm8930/OC.patch b/Patches/LineageOS-11.0/android_kernel_zte_msm8930/OC.patch similarity index 100% rename from Patches/CyanogenMod-11.0/android_kernel_zte_msm8930/OC.patch rename to Patches/LineageOS-11.0/android_kernel_zte_msm8930/OC.patch diff --git a/Patches/CyanogenMod-11.0/android_kernel_zte_msm8930/Timeconst-Fix.patch b/Patches/LineageOS-11.0/android_kernel_zte_msm8930/Timeconst-Fix.patch similarity index 100% rename from Patches/CyanogenMod-11.0/android_kernel_zte_msm8930/Timeconst-Fix.patch rename to Patches/LineageOS-11.0/android_kernel_zte_msm8930/Timeconst-Fix.patch diff --git a/Patches/OLD/Bacon-TWRP.patch b/Patches/OLD/Bacon-TWRP.patch deleted file mode 100644 index 7fc37aeb..00000000 --- a/Patches/OLD/Bacon-TWRP.patch +++ /dev/null @@ -1,1550 +0,0 @@ -From 8acb37b2afedfdc15d1f0b3632c4ef90320930e6 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Wed, 30 Dec 2015 12:26:18 -0500 -Subject: [PATCH 1/3] Add TWRP - -Change-Id: I5d5d9f7c9eabcbc934afbd626d864f106e3d84ca ---- - BoardConfig.mk | 13 ++++++ - recovery/root/etc/twrp.fstab | 29 ++++++++++++ - recovery/root/init.recovery.bacon.rc | 58 ++++++++++++++++++++++++ - recovery/root/sbin/libQSEEComAPI.so | Bin 0 -> 17496 bytes - recovery/root/sbin/libdiag.so | Bin 0 -> 60360 bytes - recovery/root/sbin/libdrmfs.so | Bin 0 -> 13488 bytes - recovery/root/sbin/libdrmtime.so | Bin 0 -> 5300 bytes - recovery/root/sbin/librpmb.so | Bin 0 -> 9912 bytes - recovery/root/sbin/libssd.so | Bin 0 -> 5296 bytes - recovery/root/sbin/qseecomd | Bin 0 -> 9644 bytes - recovery/root/vendor/lib/hw/keystore.msm8974.so | Bin 0 -> 13532 bytes - 11 files changed, 100 insertions(+) - create mode 100644 recovery/root/etc/twrp.fstab - create mode 100644 recovery/root/init.recovery.bacon.rc - create mode 100755 recovery/root/sbin/libQSEEComAPI.so - create mode 100755 recovery/root/sbin/libdiag.so - create mode 100755 recovery/root/sbin/libdrmfs.so - create mode 100755 recovery/root/sbin/libdrmtime.so - create mode 100755 recovery/root/sbin/librpmb.so - create mode 100755 recovery/root/sbin/libssd.so - create mode 100755 recovery/root/sbin/qseecomd - create mode 100755 recovery/root/vendor/lib/hw/keystore.msm8974.so - -diff --git a/BoardConfig.mk b/BoardConfig.mk -index fa3feee..6bfb764 100644 ---- a/BoardConfig.mk -+++ b/BoardConfig.mk -@@ -210,3 +210,16 @@ endif - endif - - -include vendor/oneplus/bacon/BoardConfigVendor.mk -+ -+# TWRP -+DEVICE_RESOLUTION := 1080x1920 -+TW_TARGET_USES_QCOM_BSP := true -+TARGET_RECOVERY_PIXEL_FORMAT := "RGB_565" -+RECOVERY_GRAPHICS_USE_LINELENGTH := true -+TW_NO_USB_STORAGE := true -+TW_INCLUDE_CRYPTO := true -+BOARD_SUPPRESS_SECURE_ERASE := true -+RECOVERY_SDCARD_ON_DATA := true -+BOARD_HAS_NO_REAL_SDCARD := true -+RECOVERY_VARIANT := twrp -+TW_UNMOUNT_FIRMWARE_ON_BOOT := true -diff --git a/recovery/root/etc/twrp.fstab b/recovery/root/etc/twrp.fstab -new file mode 100644 -index 0000000..af4036b ---- /dev/null -+++ b/recovery/root/etc/twrp.fstab -@@ -0,0 +1,29 @@ -+# mount point fstype device [device2] -+ -+# firmware -+/aboot emmc /dev/block/platform/msm_sdcc.1/by-name/aboot flags=backup=1;subpartitionof=/firmware -+/rpm emmc /dev/block/platform/msm_sdcc.1/by-name/rpm flags=backup=1;subpartitionof=/firmware -+/logo emmc /dev/block/platform/msm_sdcc.1/by-name/LOGO flags=backup=1;subpartitionof=/firmware -+/dbi emmc /dev/block/platform/msm_sdcc.1/by-name/dbi flags=backup=1;subpartitionof=/firmware -+/tz emmc /dev/block/platform/msm_sdcc.1/by-name/tz flags=backup=1;subpartitionof=/firmware -+/firmware vfat /dev/block/platform/msm_sdcc.1/by-name/modem flags=mounttodecrypt;backup=1;display=Firmware -+/static_nv_bk emmc /dev/block/platform/msm_sdcc.1/by-name/oppostanvbk flags=backup=1;subpartitionof=/firmware -+/sbl1 emmc /dev/block/platform/msm_sdcc.1/by-name/sbl1 flags=backup=1;subpartitionof=/firmware -+ -+# efs -+/modem_st1 emmc /dev/block/platform/msm_sdcc.1/by-name/modemst1 flags=backup=1;display=EFS -+/modem_st2 emmc /dev/block/platform/msm_sdcc.1/by-name/modemst2 flags=backup=1;subpartitionof=/modem_st1 -+ -+/oppodycnvbk emmc /dev/block/platform/msm_sdcc.1/by-name/oppodycnvbk -+/reserve4 emmc /dev/block/platform/msm_sdcc.1/by-name/reserve4 -+ -+/system ext4 /dev/block/platform/msm_sdcc.1/by-name/system flags=fsflags="barrier=1" -+/data ext4 /dev/block/platform/msm_sdcc.1/by-name/userdata flags=encryptable=/dev/block/platform/msm_sdcc.1/by-name/reserve4;fsflags="noatime,nosuid,nodev,barrier=1,data=ordered,noauto_da_alloc" -+/cache ext4 /dev/block/platform/msm_sdcc.1/by-name/cache flags=fsflags="noatime,nosuid,nodev,barrier=1,data=ordered,noauto_da_alloc" -+/persist ext4 /dev/block/platform/msm_sdcc.1/by-name/persist flags=backup=1;display=Persist;fsflags="nosuid,nodev,barrier=1,data=ordered,nodelalloc,nomblk_io_submit" -+/boot emmc /dev/block/platform/msm_sdcc.1/by-name/boot -+/recovery emmc /dev/block/platform/msm_sdcc.1/by-name/recovery -+/misc emmc /dev/block/platform/msm_sdcc.1/by-name/misc -+ -+/usb_otg vfat /dev/block/sda1 /dev/block/sda flags=display="USB-OTG";storage;wipeingui;removable -+ -diff --git a/recovery/root/init.recovery.bacon.rc b/recovery/root/init.recovery.bacon.rc -new file mode 100644 -index 0000000..6bc9217 ---- /dev/null -+++ b/recovery/root/init.recovery.bacon.rc -@@ -0,0 +1,58 @@ -+on load_all_props_action -+ load_all_props -+ -+on firmware_mounts_complete -+ rm /dev/.booting -+ -+on fs -+ #mount_all ./fstab.bacon -+ mkdir /firmware 0771 system system -+ wait /dev/block/platform/msm_sdcc.1/by-name/modem -+ mount vfat /dev/block/platform/msm_sdcc.1/by-name/modem /firmware ro shortname=lower,uid=1000,gid=1000,dmask=227,fmask=337,context=u:object_r:firmware_file:s0 -+ -+on late-init -+ #export LD_PRELOAD libsigchain.so -+ trigger fs -+ trigger load_all_props_action -+ -+ # Remove a file to wake up anything waiting for firmware. -+ trigger firmware_mounts_complete -+ -+ trigger early-boot -+ trigger boot -+ -+on boot -+ # Enable Power modes and set the CPU Freq Sampling rates -+ write /sys/module/lpm_levels/enable_low_power/l2 4 -+ write /sys/module/msm_pm/modes/cpu0/power_collapse/suspend_enabled 1 -+ write /sys/module/msm_pm/modes/cpu1/power_collapse/suspend_enabled 1 -+ write /sys/module/msm_pm/modes/cpu2/power_collapse/suspend_enabled 1 -+ write /sys/module/msm_pm/modes/cpu3/power_collapse/suspend_enabled 1 -+ write /sys/module/msm_pm/modes/cpu0/power_collapse/idle_enabled 1 -+ write /sys/module/msm_thermal/core_control/enabled 0 -+ write /sys/devices/system/cpu/cpu1/online 1 -+ write /sys/devices/system/cpu/cpu2/online 1 -+ write /sys/devices/system/cpu/cpu3/online 1 -+ write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor "ondemand" -+ write /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor "ondemand" -+ write /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor "ondemand" -+ write /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor "ondemand" -+ write /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq 300000 -+ write /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq 300000 -+ write /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq 300000 -+ write /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq 300000 -+ write /sys/module/msm_thermal/core_control/enabled 1 -+ setprop recovery.perf.mode 0 -+ -+service qseecomd /sbin/qseecomd -+ -+on property:recovery.perf.mode=1 -+ write /sys/devices/system/cpu/cpu1/online 1 -+ write /sys/devices/system/cpu/cpu2/online 1 -+ write /sys/devices/system/cpu/cpu3/online 1 -+ -+on property:recovery.perf.mode=0 -+ write /sys/devices/system/cpu/cpu1/online 0 -+ write /sys/devices/system/cpu/cpu2/online 0 -+ write /sys/devices/system/cpu/cpu3/online 0 -+ -diff --git a/recovery/root/sbin/libQSEEComAPI.so b/recovery/root/sbin/libQSEEComAPI.so -new file mode 100755 -index 0000000000000000000000000000000000000000..cf3f8d8560000503aea3491bfd8d6c164a232e86 -GIT binary patch -literal 17496 -zcmeHvd3;n=mjA6KmC6DM5Ec>eB`j7*2*qZ{ppb;hGZoonv2mGBid2PHc9JTpDj0Ap -zz;SF_+XzVri;z*;RzxgR?BLQcw%W8GoUU~H(WrDA5v=TlG+H(4RL%FirBaD;#+mv3 -z{`&pihnsWHUCurCZ1>(*_whi{a$coUG3C)P15>btD9kMoYvL9%j_FaC#>O!nil|OW -zVh426qKuM;>VPY09B@ihhvF!GWW}f92F57G5tb^|A6UZJft6Ac(1{X_OZ94iX4E&M -zo>D(>N>oo{+;Y)l1^C`0_D3m5IkPhvQ&J1cC{bTZYtTP-d@DLoQs~chZ*_ZYRdYAm -ztLIkQtAB2Dq0_Jj&7;p)W -zkAoA;nI_GP>SqHVe+^@`fP^mvd@P-@33B^efd3k}GJhBF_cIvV0J_xvm%wMvU~Gnr -z9|Ufm$=JPe|K9?C2lxgVKLdQ~tU>$};5ESSl=}yPw_eNGIl28<1ceu1)Lt3S0j^yQ -z1Wziv99c9BFBpci($ex;OKF9@+EQuXW|L8i$5w0iFo)At&FqeHPbJDN)mE3oZY`~J -zY$|oS?A0DtUg>b#SXGt9$*O9q380nDve8~zQ+>C++FDxfbfT$|RoSZCHV><^R8~65 -zncL&4t^{FswMeFdRfywMxNH_HtFXCT4i~F%dn_JSA&r0<8xw1tQY|P{mOHm%IN;R| -zKr}D^d1<-u^U?~7owyw=*i>V2Sy6J!+M=Rmj;d0tO=P1KOgUUznNsW)YCKlQ-PNTQ -zr!!hu>9AN!ZM7bo3*srYRaQi6YN~&@&Sl$VM<8>RRuZU27*htRss4W5AZJ^k0xLvc -z>b8;as;s5^yBlLT>-Rcpd?H~v!8v@u|V}qau`P_u&0-9IaqHQ5=mq!%cU^BbhT_exMZF6n0 -zm)mGggI#EnBUO|`)eyqZZLwqCZFi!3rOo0JE0mdw#ne(M_gPD@#T~NQ^%7`#pgODyhoD5R|v8=FBNC>adXF75zNLVsNSw<`5Ogvx) -z61FMggU~AOhe$3Aag$)(D##E*Z3d+E>o7sY-De46!bb^$VIM(E;uV6}#Iz8^0B;b4 -zAWjp6Am1hkVVofd;h!Z4#{C2#m=6f1FxEy86FWx`f@miQ0bL-7$#xKg5_HVUi;po=h;_pTvYO*D}(v| -zn0!Y}zC9-27L)hK!B -zJ`u;?Qv8^2G|$p&O_AX2OWJ9t2Ojt8zK*z7UD;KTapi&Xvjb@=-I3}2DedTTNf9#&G=E0j)}XBoZ9xV}`k{tNJ6x4~}y@;KE4oN*~8( -zTSoc%-;6t?ny%Zc$xzj?J&|Bv-?Az3{0x8GUL&8lFWWM=%x>ut+ofZyba||Q?fWQj -z4e)DZ{N27k1*V!c{L~U1Cvo$;zIOwW;OV}TfvZ;PxT{L;2aof>_e*^SLARG`nBf_J -zTFE?qF|Xr@|HFL;17kpQj7;-DA94II0e0$P1kHs=uOgj65d9jd1!*ksX8@Z4>j3ir -zuS2pT??Rf>*}v)w-)Es4OxM2fSt!@)JWJQFK=I+o)2EVeO$Vh&qZ!qA7|1T-3B(WZ~JGVD^GjUm+=Pv8xz~J2DPrf -ze={5St(b$WPb*S*!@DqDm7(3QX^I4^`?UD$>f6pULw^4=Ud`S|9$P;pp}{&QZddKO -z4i*XWeTiZ(>vq#IPllN{g64I75)Vtj!%mTh+`bK_om1UeY+(2HH9T>^_E5|DeMa64 -z80syYqUBltW7|hvHYQNXl0KD@_1ACzIAm;2Z1Q%bY7-8qvTObSYGyMMpWJHFKatu_ -z?PiPZeBQYIs)cCF=@%U+d?&$@CTx|9D~ -z>l@|;{2Nidzt#I1bog2cS(#)BExk1VaBm|1vcA#n){K|UY*!ZlaM_~eHntd;0lJ{Pm!^uUBPs -z`t5>hp+QK&sHWa$3iX%un&gj*_;Hv=BYSQ#v`mrEzhThhzY4JMVl5^=!Z8o%E>5WhKT-`N49s!f2;_d??+ -zPdcRG;-9QAe|uL2yr=TOHq-N<@m&wNM!Z3+xodWRit6`vCj2qPjL<_bGgw>W57pY4 -z;WjZ^l<>KBiWiaKCq2xt^vcW^*TbLJ50T^tJy!)j3z?2j=Wjvzwl -zCAZ0be7fiNftw-Un`J+4=}8Hg&7SGzsGfX1q~&jVpdsU^K>Pvoz$kf6?U>WP9-7lX -z`y)Yh?~UdgOQyrKBwgwR9mg6Y!MdJZh%LLQ|Gcf1_(KN+i@@umA-vw-^LSt$Mx7TO -z)zfqQ%ekWL-|IR0_AFGszy1{{RVpm4*68%X^mO3@*jOmN>cdyO&UZ|im -zTVUB%|I_wyS*t!a4&WKxD-UeUfIYxMy8BNC?Al{xc0Q!PFB0tN -zp3jSGhinTUbnAHENzNV#p6e#vv~?TscUli(z>Ms&IIJEVB+o@<{8slz(9Eo!sphFA -z3!t}crg+jB)|FSgKMh=kX#cc8d`5!Dy07Pn;^FR>1GEZAYrs?8WD|c5jER=)6HERW -z7!@t46H88GT`)ox4?+$;?5EBH9so>)-0G2EiR6cz29PlS&Cu+r8*j#naML}e8{}h-B1$GPr2&_Kwk6%}kDf6^}#=9=%kddD$yjXZ^YbwQ| -zf8wxS+||7Umb%2BU91+@_}p%0crTR9vOhHsByLt8k^E^sWLSHAhDdJ#PjfeRe}Y!} -zw$419pZ>6 -zC3b%tNR4u;?S2k&%H$WwoPXE#9<*WYKC)P{;jgj(Y=&H(K{|}of>emK0dl(+knCy3 -z%ALL$B^pjyuRrNxa~8px*1gO@1Cs9iUG0K-U^HaK -znq6XdF3+ZCm1$rnk>KR+R8Uw92{3`x=^($OU7rV%qk28uMY`_@Bt%ONh$Wu|+OdDG -z0Dl*d-a=Y~q(_1_m;KULy?i{+b|qnLuY^8FgU57H%J+6H7Siy6*9FAIifZ(Y}RzWt -zP1a~}7wsG#?JDM_ks`r^T_q(q^TZS8cYPfBLqjB(({(XWB=Sb3q{|sy=K^hr&MLkw -zl*VTB(6{$YNV__|ZW2b;mnAglck5schA#7fYBP;@b|4k|N5sjlIKJg1?6E6eNS!s-*5xO4QY5+cE`J6{N7MP<>~SsTcNhq5|FI$w4+btEv&*O4u=t~^kgEk=jF -z&bE_np(&|}M~Nd-Xwp8QpBAL(x1*D6Qw`hP(iz9+zyAH0x1*C87PNk$M7zy&fh~0IxaU?qThpX7X&YPU1k*9jJWgE8e9*VDnyrjdpCu$-&R3TU8U0ID -znkN>R>I0Bu?&(0hc`+XkDYHge1*t3&T-fnSz@H-Ntx<*~%U}7t{3!mfp$*Lw_`UqZ -z1Mef!BhEzPG57rbMlVH$wvd+7G)^|XA4+R(Ai1Th(w`)`rL#=luWookmhfI#!Yd)+ -z)Vgx`f_C$-Ay1=<6VylIcbD706!Z;AyJy;;wqLO8>L`vRG$!v(Y#3D^4xYoQ5@WVv -zL`EaBZgp~TQPZig(k5y!z@5)9+OSK36LiAR8y9gqdo;0>SpyX)x|Yx_Kh=XcRvNmt2@%n -z<3-8;BL``=&UqyVT_b-jpG)y+#L(>1rYXLp1SWjn=pRnCqO>5CV9Q0f| -zhM03J-rYQeSVQk{=)DW%Uoe{A;hV_Qu5*(gn=W|K&HmGnT-@exaNVUi-guJiW0K#% -zt7(4Q!@*ZBsf2ib%vbCIgI_0P@mUxz3tq$EQQ=_zC8cG3Mqe*3pQ)y!@&cW$X*MOyWvv4OkWF%lR$A2QLHD56E5Wn(%9s^<6u|g%-c*`QImKH -zvoyXGNJab95}GZou;E}>JUu@X6I;SK^HbXcfunejMSITM0Y?MAhJDlx$QzJ003Qoj -zhCPAtL=vR3)0fJ#>|9wgnSL80%B(g{h%-Hmc|BJ+`p-|>%>%m41oq@#t8g2}vyVdk`nW+6G;9W#Ql>II)Jx*2V12!oi1n<3M9=tGa2Np~bS}6nD^j9oNVm -zyua+^WtKA0Kh8ia#UHTJjQKd1r?dZz$g-*E)8F8IXli_G2)k6+MQ<+j^-AxN05rBY -z9LxyQZc4>-`*LB&uHO6XixCU-o4JE$2a;7GL3c#gpl^)d9S-ssf70t`Ld^MS;3lm6 -zH_0o17^ikWc6YSylLSa3*Y*A(P$2FaBpc7^Jr!6ImDH?WJM{8M?`NSN-{O)i{#)3k -ziuM*y+y>qz_3n}OW^|G-$NNH95!b8Z`%nIxebnU*iM95UQ1Mj60+P3J4PR@aJ(_f$ -z4+jT&==6|l4@)QR`D}Wg1w0!c2&7{q>D0amqg?3uC?MG(o!l0QQRI`J^8u_zbsHeP -zJU-$1aBw}OL+=OdFUIb5!Z<1a6f?-_tu{(_bsF!`y|AN7taD{Z&*BGyM#PjR#NAhr -z4x)Y|%I-y33m{(1vQGeC1x!VK>WLk`G(M4MyH)Aap}E(?YG3M`>=ec8hkZ>vyLR-G -z@VosJc_dSM#& -z7E4TVjp3jbvT1>>EcWa6Yxh}&wq-jC)optx{d3`*kAE|Hmiby*!S_fJXdOJjd5GsdjFZ~ae&b{-tyNg3blS#O0{Q%G -zJ`T2afKJjme?dfgv?s-!BA=O+=r{$n?*x)SH%a#4vErMG*Ab6Ch{rmHIP?r)2A}}A -z5^y!(tCHVBPHYBFL{E<9)%7WJwDr3BoBXMBjIG)iwX;TD*6Xo%XiVhu`6S3UDa;II -z@FZ1wBzW7u)7v3c!}YwnX+E!=se7JIEQJv*Jf3AQ@*BSQW-> -z&c|E&8LC9s;@gSJ~uY5^Wu -zuj5p^rj(GRS$C$8k(qYN(XZ1w`V+K&3rs}2iP6~9--R0XQ9#{5oM{@g4RH;+hWG}3 -zLqfwVLspD)V#~K6+rsXRS(0BLfZvwk_cIQ%$pzd6nIr?Q0X&c2*Dk<^mrYY;(K&60 -zZxlbFZGtS7XS;OMuKx5c%zEr*`X%GB4kLDrhr6`mKImu{hux3!%_N)?>2xAlz&`QJ -zPUW$ya-CQj2t0(b$}r|L_?@i;a5-?}303+|UmPs@4cP03lcQjXqhjRg!Z^~d -zEawitQM9Yg!b`#x{_n!kjud9JZ??Z=|GS;?Y|eUEUgA-*yYE}wq|L>!Iullr3!OT? -z`Q#j&Rp!LVsJ*ioHg~?$$d5ZjTpTJaXdO>hw=*2f?V5qsveh+`)uoFvd$&`uI=v27 -zr~7MQ3ffJHYVy@iN57tZ7*IEgR@X>pMO|ZjqrNer@i&3QhNOn%hEWZp8&Vol8^$y| -zKg153#J(-C!*J(>Ovw&;tP?%>eK#4hd<(D^vTOuAhja1mfOjGe(pu5PKkCyV!m*rH -z@(woN-w4ao?3!tMRNTMjo>D(C@6R+(^T2q#SJCI69WdZjk;c?Vw7YRaG2(>b)Yapp -zv>NX@@)J=u#h6gnFU0ME*VHFrCy)<0R$wpjZ09(0njFQYvmzu0IZ8eY3&$Djsm?P2 -zwu{c+N>n$9Xa1fc``u|`+4;az_>oe;+_nMg0qL$)JKhbX;@q!!!hjvGd0^sZjrgt+ -zakYbNek^u~c>l6rIX#3rIJ~(?#ZG)f=O{CkOE$0Cl_ct}L#~%jO_JyRtpoAW_(g#3 -zU^y|a7BGZyzr@d}%dtLlUql}8J)i77a3S)*i%T=So=(EG-uf;;pHG6vQoKjIsa)+{ -z*8})MqBp+}@QB9y#wEaGab8?^0vzS79RNJ4@;>@^z~|K7<|}}p@BIq!#R=a2AmFnq -zFAD)4jrZ1mLomr(|1IDVl~?~AAo}?TzL4hChNb#8g3oHat0R#IFa0q -zI9zC{M6+0WE2x~VOxdi_apeBsL%h_*Nf)KK3WtlM>p+~n%CgCpL*sKdax(|}5r6!e -zq9RVbF*e8_?r5Q_)KnQ;x(X(boWm`1)KpqIl2ml+(x}8P!)38e9)WXIa88Ry$mS}l -zEmbxS7mzqy&Eo8Ch|B@jFk8ctnbu4;(>-^lJEzL(L0{M4d}DRt5o}xq34NwJI&V%= -z23<5G$yK-mc42dZt~&Qk{eg~ -z44Ff9O&8uI^BJb^Arlsr%eifvs%+JsJ7!w{LD3P2$u_&p;oQoZ$q2XttJM`XAEkbI -z)JPy9+#Pd6ev(NlCX>y{g{txz{!H)*dIyOW{ZIF{^Ek -zG(E|3ayaRV8YzeTBRxF_qE~p7)$+YQxRJPJ#EwO4)~s5S$E{zvd{u#|6g=i}=4$c6 -z9=F+TvvFH&E;m8}cOy9j9)<7NYlYbyU8x(Ko5Vk-G#xfY=}M(6x^(Vtk6noRoH7qi -zBteECceZ$BrN{it&$TU+$=i -zk?mmo5W`+u(4`wRCshXPvRJot+9zVFsL&!6Plf5qOwWdZAWBK>?%g?Bizpv -zjb^CLNUbQ0h&Mbr-0=KSb~9qXAG94s)+6u~YsVuHB?ropod6*xqON#tM86DIqtr^4O5?AT= -zRJ%B{iMXa9Pud-{he5vA$k%K+<(lnKL5b^C45?W}NOVtmKH}=;RQzRycpaD%Tgkyk -zZZ~MpbP-ux#z$z3IsMe)A_3*)4VghD#n-JET)Gr&vkr?v>!Wvqb7C~0ge;i{*~_Fg -z%W89%yX;O6Edg%MDB6&s`w?y!lN@91Y;eGlC6~huajK!JllfUs*S({%E3B!&y=^7R -z59v(<%Y8`KvfyI22_u>HppFMkQWi)oJvsi0m!z>ZaA8*fKX&I~`NGxWjWrd}BTU_y -z?M9xgU({tw!XdO(kr7IJ8j0B-3aauvhtT7eaGYfemOslz>^9s^ -zOSx^h|B2%$x3@VIYmikxEl -zii>@$sD4C$PGJY4atjvhi(>WhKhk%U~o+O_;_Czi9hgfwHkZZ)5MEQ~9w|p)cY3xD!6iKgILC2AG%S+c5 -ztt(wow4!u%!J2{*0YDxYat3S+K{!T-d -zEesH!^>Ba~h(WM#5;CKWqcqnJ`(i_;N-p}tZJZXjn+}(FAiEzPv(j-l -zUdJdg1xL@p3D&sjtRX2tmj6&cl)e~&JC?h)Iz6OteC;6~Se33n%DC39UskksZC>7g -zo4C8Cyxit?4-IyTO%5YRU#xI+qWj-*3tmTJ_D50w0d^JH51qdB`ON@@QDd6m75-#qXNT>J(L -zufEw);CM|deoKYdw)mPAcZMSo2VRMb-Fawa?yd_ -zlk&g`u9V>&GAx&&6A-U~*}Z_c5+;6+h3m~C4O|lwANuBvXn%|GiPr!2c@V_@ZzlSd -zjNP7b2(X#b!)YIYn22&E|w!$+ycYqr;=)t{(^-ZY#6MysBwrN -zKIY&%VSA~?<+5xQiCC)aJw%TZ?PW;UR8D?G30IAVv?G6-kEFCC -z|D$wTZiknq`sD2$1ek&AZDE|Kv_u`C$&z?Ona(dtQ|NiImSw7Eq-LKDj -z*0a{eZS#|Pj^mi;r({OvK~v#ra!4WSsm#E%2)mQr!8GuqFprZGAdw1w~TYY -z$x#^PP0suGS_5O`)a0pmhadWZu|v&ncaJ|~A7+Wvr?}J5g -z30NoNk-)9MXJtGE*z=?Qm^A>$0iU?LKmL8dTkdhM2dZB_@OI#FNK5$f0qLIxwxWM& -z{ZRit2Yd|itK|5HfK%>e%qHW%0$2ZrF$JdhA5(mUd-DGZIKQKRyv_lCkMOA|fXa6O -zdw$fO_5t|D0DN-*?j3+Nm`9!;*e_q#9}FYem~}cjb3;OaC#?W^@v98 -zTLwG`7(*iA9N)}p_2P!`qqYv5B07z_1v*XKuI&yVVJ3HZZ!y)?cgPg;PNU+*9PUx3ee -zVQT0uukwR|mw1JT19zc5Ajl2 -zz0ZRAKAo{r%nR!OKTv@Dqx6S>OT5PGZQzq$_+#Mbyzm#m?|I?xfIUCT@A3fLG64TJ -z0BfYp(VYXO_Xl1FAy0cS)px{z@G#(GI~X&_;gf)$*v43-jOPJ=g>aLM?*~4Da1UMs -zTzi1A3dkAC|7qX~ulDQ)UTzFzRZnu#c)bE#%G$d0_>ZCJP?<{{jeEl0DmiEBk=fTC{xBWfG+@xGEM>Z{HVMf;Qx65 -za}qq|R|5Rta?Dw|{9Oa$zc2vr9e`g34))ql{sdgr(Z8PF2DYL7IVg|j+bQ6%hcG^9 -z7nT1Vu;)kh`*8sN&j8#EJU83jpOoGOJRg|$HNr!D7<&nY6(TRf(ZK3l$W$4dfgb^0 -zF2`R2-1Bm3}txE-#!2oDBJl>Pq9Y -z2>6u(=x1{NHek<>@-G^Iw+_Hh057b9JV9Kl-+tg%(4Qt5{~7qo6O0KmJ_UT_$^P;B -zC$MEZW3h7he}I4Xl3(q>%jfCk`4q%N;I89?m?7CMKNXPMC3E#`KE{{iX#ns}ul9xk -zH#~wo{Z}&8BYZ61jZDX;?DzKx}hIu0M`OP -zCx@>Ep1-jlKLy+X+#!em5%}Xxn8PwY1-xc+fB8QEAMwI2;48qM`VYbx#q*>2F>C-H -z4ZL(qe}2&e!Y2*DbAfjwKAI@CF9FzhYyW&$0{q#*{`zJEAMzTn4ZtP$>ZQXHjej}t -z_mJ<03-K`hoe*6^h_~$T2a`-;r{{i-l|Lee>AI;bIDE;%Oqg>u6z(-!_ -zAFnTfm%iAK{|(HQ^_O=U_yq7tySHCHB>}(m5@R>y`aJ+#<~9FT13&$T{`s;E_(dP;Lm_N>p5XF`M-) -z7}yH^joM4|+XTGVt3P?*I_xj$a`=6~dg$*SoCkav`O#0$I(rKT;LX4vB0oLWv^Fm%Gk@(W -z#LFuvVbZ@VSx#Qos?40c;;a?(+JfxdKH%<3G^an@?X|8z@?2M#gAwt{C1-7B-`KEq#re6ph3?LKEbHN1 -zO5z?D^g==QnnH|YK0Mjl!rX!Z(Q!`~0hoXnE752H%bznS?+PeYWSS@>{C -z=8APIS7P?j)I%3w1dG|qqTF1z=3yGiHMwhOx_Cwfa}F8jt-@ls-S4q1EC+X1?yfCd -zyEfk>XI{(*O}Y)iuV`(yd*;w2L7TJCLi7(Bj)~8(7z(Hcn06%$;|zPHdtOP^&&n@E -zN3AWA8iE9966%HZDNQU1Vx>V5>ziok&3vqgRp<&&#}?-nCvx+3@Df#q*a)i?bN5 -z%f^~3DZ(OKTjUP3EcOIrRh3ZFSLGGZy2ohr)kG@jewt8A)|&IYmWd>Wr2cbHH|bxD -z0Ht45lv|9!%wJb5xO=o@ZJ}E#F$`hun!=I|R7LPv*(G^v3nVTlhx|O_jWB6dN`tee -zcvYsn(j-s!vZ5~a_RW2iy3^aoD@IOsp0qI8ZL#`%X<5*mOkSKKbpYy*dGW|PEJB7h -zNwttC1CyAPOd1b&=g1YH -zJ%lzGnu~0uB%D@4W@NLKZhB%s#hP{-$IN?S{xOzZQaEu&;zF*DP)MPq8twP2r=@Zv|a -zGgBm)lR2NZ(!Mz97$C2BQo0n(JlW4PGgq(8E5H_nrpeo_kb?y*&2@Qlcw#;bN!K@_ -z-P?vos(YeHV$I{3>0VP1)CHI?)F1L_K9*OKEv+P)T75ZYqY{wwQX-n^5HDE!Yl~>l -zz~H$Tq*S?_Oj_anEtUG>wknVoL938PRw@|7RG61Du*3Q~QR*D(u-ko-QH|Sur~_~J -znJ+C<$!}H8WAh{-XfdPC@@_75tyBm1Qtj^tS}l_N%9Q4wH0=4sYck0{j~YOX*Ye6l -z1IP;tnRWorq?C6t3URN!-w7Z|nbkLqrL9vc#yf#~ULuz)NfARS?u=-6rOb=h6&7Nj -zaL;>pWzjwEoJm-$%v$>?ld5=Plu##e`n@rG1A#cERW+cV?r$KS1 -z)MRPOWUpJZE)n7BBprV3XdP@Wl#rKl?YOlVga>= -zDkjB3P&VyQ9zb#wlLi_o`AE~KKPAEb*lx+{X&YkGQXbf<%(W|5Qu(CZP>%UoP?MlU -ztdV?ZKd1H(a4S#VKHmN25g(rXSCK~wC0$H9S3g`t0y!RwoN}TH7Z*eM#Ojm!jXd3Z -z%}Vx2aZ#p(Y0G>xtLS!*DYwJPx5G)d!M+){&NJou@-4(vkg7tnxR1%i*4GyWni|!L -zYB9N=ozl-z-Ds_n;y^8e8kw~r7mb1vL1(mLw|t^tY!HGwyf1|mTb?YQT&TOT=-8^I -z#koaG0HjT+FNrkH*jc5q_N1Xv%>FOWbt`aelWIjWR<0!Gp2zq9l)_6mQQhTKRL<{* -z{CC?2mI!t8zxroj9Ew3bmyJWMr^4=~bC2x+U)G1QdAl=VnYprxxB^Nq -zh5)iHlV)vx-iquA#cL(Ht|TwNSO#lkT3nKo9TOu1Y80`I`H+1Dt{40{$(q5~>oT1W -zx>)941BE$N`hA0cSHjug{E>DhDE+>IgNf_Eerw=!L-uV0-315Jy!87}rbH%s@jrtf -z1vg#x3q(2ejK=}o4Yv?315N`!`jxneWY5&eezI2|vG#GWz03S7pfKA?zbcs$A-m!j -z84r^4TLgR&?xyVTA(v$4Ezq%W?Qk7%opAK~-c6)`kIDRXnSL%)1O3V -z>LJx&U~-dwsrVP>Q}!ero)X>m`!~@4z`;Dm0+27va_k>)U%)*Iw;hgt6X51ZT>n3J -zfQ4DJ@8@}^QVgFII2H2q{9vACxME-ixQF1rgOh%8oM;aQ{Ttj1aJRhta2?V2`?8O7 -zzmeDvd>W4IcfZ25z}*K&zxUx_ie?YP{RK{hTLy>g7?uS`zgW0`N*wI!pvPt2L*4}A -zl)(_tZ{hwWVFHlKL#AtGIt+9&+z}b)$p{}4XhD~_)hPwbsCzQ@Zy&WrbEP2ND}(+BwZ0sDLTg?RDACJn%0UU-EU -zKVIfXgC@$n;1&M=$}X1^9>$e~-)<;CV0b -zk^z1M%Le$(1I~ui!fk~+07t(E;08$?>w8Cdw~XJBX(VVNToD{E`^^QN1h)rn7TnWt -z^gHS%>_O0vWS+=uxOcs9fz1CMGy?7=xQ}H&A|J^7CtiMcfnVi?iTyKNrtEi8re|bI -zWQxr1^YY`sPm}QpnKprLk@>G>N+b%dlo*21!U4Z)&9Q_*Iggpy- -zR^~nADwtC;=mPx>EGNX_riC^Pu&sm8njq!7>ezsX?ZZG94#VlT2e}I!C5vnI_0IU8YN9x?H93cH$P^NVR%$Wtt$iHn@n?LD#$cnriC&s -zk?DGwZkB1OOn1t3mrS3NX_-v-%CthJ2V`0$(?c>nEYqVht(NI~GCe8N4`o^>(=#$X -zE7LD!S}#*lYH8lQhjAM^6nYm?2zxui?|=aMnJ6}O2T>JtHljYzg^5B)-yrIXbVU8} -zo`R70$fK_4?T$}l#yVf*jPe{4#E2aqEH|VM4==_5*>+m2Si6f -zk0gqX(L@vq!c?LV{INvGK=&m&7H<-WLRmEvje+bUIuY`a=nUL(6NN&#gy>A%D-*>A -zv79J20UOadc$-7?ZoGLSIv;n{M6tOP5?z2Z3ei-^SE5UyFA{}PTT1kP=x0Q&I3E$s -zfR0G?LF{`(vFYz6iVd%VXb$!}qPcj7M|350J)#26E<}s5ZxP*sH-kj6LB2*iiZ#J;`Ls<){AFeyx7&Bw!@2ec=2{G{+t(I@5P_>;_JNllU{ta7k}7`ukzw6 -zy!bLNewPcy}3;tRca!Hc(f@m4QB-HT7~;^VydSTEk>#T&hNgBKs-#p}IztryR{ -zc+ut6|6aVqi?@66=e+oOFaE3-U+2Z2^x~_%_`_a&l^0*(#g}>UyS(^PFMhojU+BdP -zUcAkVw|epEUVMTVALqr#dhsSN-sr^}y!a3=Uhl+6#thcwB?K#O?GpX}}JEkv1$1Qxd5tm%0E6g$2AQUG(F -z2sZROb#1{ZLzB0dho){eZ#DbycK9jU23sO{_JDXTk>zYmoECm`b#wUAe9AUAD$oeON@HKJc(uk%3b?8I-v&|CX9nytvSvX%Zl*vgqq -z4ZY5)){Ek|rPIrVo~x%iJV;~rB0F7q5_=8C -z>1Q|xoDJjV12^PF397>Mqsu)0#{p9_L=esTy06~$nl$D -z@pEZ@o1XZvbV>?bY@^x02Xt0xd!6T6mWuwSi5Qnr -zm=PPzaXih4uUq2qZ+#1AnuwA4rsbkoRcge@7=LGEcC|!W)>w_gpKlwL9Z0jeY6?Hv -zqA}b;&hGv#YQeae7Nd7*j`cbVQFjx1n)-fM%Y)R{w)dpIKG>2e_w{iY)}+2(!`M|g -z>hF!{yA5y;z_kFs1OI!$J6>R{C*Qq>W&ocBFP>2GgHi_ZgRqv`toMlq*6Vz -z@=Nqj-emSq*lgZ!U60wnsD)PJk`|vN1HZ{UQXt;Q$DZnX4|PDAsTTs6mh=g@*b{2r -zKS`IULk_yW986LUQ(JtKHkm_&`Av*7@WX7U9I=oV)(_s7^SSYq=t^+o8-JPG -z>pa;zC30xW7PF6WbUow(R@$hRUgxo1ZqBcm<8h@^#tur;7)0|Rj2^9!cz!l&dbC-W -z|RJ&dwQ_-M}lT@3*tlg(&mi=)>opXY8Jb-ThjKx~C*>HpkYcq-qQ) -zDJhU8Td;m6*^^Q4VZzOtq{NNpAmRI(Vd1^bpPKREQ^)qw1&F&KWvh9Ch2l=;V^H4e -zW^>}})?osRDr_+EQRwkPwDgDfhZ%aEXPfV#Ua*zb-i?%Zr`#i#;!c^`JUt=O8ZNNt -zG%2OQ9>r5>E1Rb!#9im+PEDZ^Iob?~U^Lo-&ts-Fn^Go8Wk>T$K?Awc>x^!WwAidF -zA^(F(f)VvGHXH3xQhG}LLi1gg4M?xG4MY0$=E#&W1Je672TQdWUh7V;Z5}C&T(6UF -zR@z6TaAUWa753pN40M965c5cZ{(J-dS+*K;6>bj3QiXA>f?p2shj1kSKZ1dV{Gx$( -zz`YLs&<_FZHPATVBcLU~he64(G#UIjxJbC6NrfjiVUG$CwwkMJgCQG(v1bKaHlyF8 -z`3SW0c+*AETz8+SvrQ46ttA=h?)g#g>(F8?X71G{|3vcJXx0mwj_~)X?(dxsU=O_m -z`zFflg>G-obJw*9{v~jn)b_#!_kfR->JXV6BG5dEzz9a9M93rPXAe)^YMv(isWuG$ -zVJTs^jjXL{R6>~5Pni5c|BUzsb?kM1*)$BbQ}9|L3h47DHE%*q>zba3*Vhk0PD79n -z%`8a&rhvpl)(9b@)+D#Arnc~u3H3S;Q^7?}G0+wTL| -zYQ$Lq{QtilU5)?UjsmG2!fowXDYs+!@3iB5mY9`Uz^B`8_j;_eJm_up>>(H -zES_tKi!WTDnqrJ`HZb%i>WZ`~q@_Ll+3G=jdy2a3eo^JW#q3+oB7F8}%QWShm$jAU -z@uk;4-yVxz{0i)~zg$&-2#d|m@ha?eAzN_5vcmO^cTAG{*fxy})4zbFI%$_KmW}fXHM%7w5l@FgZ}obZszCn>pEU7RqaPxQa@|<^V15X)0R4p -zXF%WmmZrbfE}e;W>H-%g_}IyBxPiHJ_gE4F;fKDhTaIz!rufBJ#0l(T!z4kuN9*Da -z26isT*v2^~qg2HKU8j}xI9u9HLVYKvj6KaFrr0JSgxjO&v?1giLX`WdehZ0=Z=WnopVUw3p$s^;@hdaH#GVlddl)`8U`yaG0$-Kg8Q9Ar;TMW{Br{a}XDLUjKTFEF -zYm51;<)Ro_?tolY2zTu%u&T;^Tq=yauT5D-^=Hv>9dDF=j9LA$G^=}@U$&i2h_Vh6 -zp5{l_euSCb<6P2?mHJv7uR6lQX$|){3))pL`|#PdJs@=3@=(gJ*Vd<==R -zYJi;?hoA3pUT%9Q_1$C&;{+c%aqX_gP8)%>)Z?sZgHCRulVNq~EP-_O9_QY+Blc>X -zpx!&Z9cy;uhBp$9bSf01!Z4SrIG3U$5jE~{I@-RIWKcC^-R5_wPX2nV3`64l=<}+V -z7mML_2gD(4f-$TfBW8LCqxN|Gi1Q>-(mF=@`MH#Sy3Qe3RTFiK`E*hBfo=Xg{Cl&3 -z?FuPP>tM=f#E~W%>v^HH-nhx%Tw@W$r8Pa}hj9N7=D*dc^7E-zRrq&u{^_D0X4%=c -zU#_VtdYot4P>!@pO!bc?pgiBvZ$(-6(A=r>b?N@|G_ULo@edKSQx=P=&n{Mp-}2AW+1tXv&HlUpon1`19?-rU1P{h -z7R{N^!WO2+LvBSNc2n!y8MB1p(7&lyn_4q4z8UiP{@A)8@tAd@FuHcBG`cx$$a8AG -zeX(V6+LELKYfji=?9k6Uw5oahMzaa&Z?raN@VLnki3k>`Ac=A$N5m(g+_e@i!SbD{+jb~*L$Ze8irnE^O~7* -zUdyBy6aQO#4g0E9@89E0ZBy~PYA%ZBs;BVNQD+zOU50#jw2}?stp+PJ0z!X+#o@zJ -zje&9&&EqX!HL?ggeM~`Ue(Ovj3N4?+Q)rKKb*pl}fxqjZPIv?7zaCfxqU3e?m$#tP -zV13aVGhpp(&4S7+@6&rhBjNWZ=wTbqCJ&;1YhPvPE#i$^$KX0oP-aE1r11Euvk5_`|i`5#ncG^c6!&1OxR&z?d2Wvgc5 -zec1JBMh27z3BF~1duHxV!fs`IsRAjMpSWpunSEb5Jiqk%tevE>Hn`$L)w~~Km~%A- -z{JRuxsQV0+j1_rNj8&gKt(uNpN9cBkTNTaf!R5kijANt}KN4{_m}l5^ubB96pbJ+l -zsP1Hbf#)s!GOXRj=-ZEQ_GUwEuo?}oB@Lp-`C-chv$m7dzJHC45BlMv=!ksPx=z{mtIfYu9z6tF>U)rv25x^u|&1WJX~0UeVj!e -zus6%PMD#WJxzzdq%)&cb11h)kw;-`9&<5LkaEDwd*%nL|nq@e-?L-^D67_YgoLZXL -zg1wqu05;bCh<(7_T60S+b^`+>+oQ1_;Ybn3S`HWGYA(bDjckg%l4Qg)q0PP8^zl^nZ*(3ic|2Q@-u4B;SKS4r#f0>01 -zI^5&@rg>21tiu7FXZ+&C>haino0WVztVQ2R)}kKg*Uc*Xx01Dp_?)nB5;&K-=Yzxu -zYkfjsv(oo<>px*9DmIgi=y``q^;Kd5)ah^Da -z>1|QxFN*qdjp1(=kBr$&^<#SIWIfK!%{|WQX6#OTZbJTeM&NzRGR!p^gOwE5^!Nuf -z1_?ZT(O)ZY7RUU1M`L)$lEiy@b&-^72zr%9D!utA_9=g1S*V{a$Ub{C7ZZ5y2>R%V -z+()yTw@PQp;kAE~WauZ&>Po#ZFO+qx+o71asX?>fr?SWS1}qfX3kMT?_D5J3i(?Fa -zX0*wWa=FKOU$YM^1)&ocHmpfxV=-#8-n8B?j@5Hf8dx2m_jV!WX&O~-y5EG(2GT+N -z>Yqamo=dc)koMW*6q{CM%n_omJ(&RA`tn_v?SY2-(e5DO*?8UeT$mB)h&^MAC59KxDXAniF}6*IG7QkZ(i7NY20CbPwzsN@=BD-9Aa6vG_}q{gN6hvj8je&~DV-Ur5VKxM|LVZ745^ -z&TsyI*hI2zx3=83GB>4sepW{5^~Kv~2%ADRkV;$xiy(QYE7Se)Up3#0DpLyje^CAE -z(72AH+m}h>!D3j)OWUmp9Bk-Js95lss7hDAJkrKZQ#IUUj=B^es4Ius-r?EAxL?Ay -z)0oV~n1pV}SqJ(=>AW6iB*rA}m%XJ4DfbTFVb0DNE-1{yZC9_w57slqo9_MK>j!ZT -zgg&(%ZUXp2a8n`A*8y(?@6q4LZWjxGJgjG0_>cNJK(ZmyzVQq82>o)rU4;7v{MQd4 -z5Afz=c<%|f{Hp*q2k{Kxmq35}3E@8<#Ty?`6YvDMzkojpNBhV^q>Y0c5BDzaNq<^~ -zyH3z*(3e4Xfgb!b-Uxzj2YwbV4*7qVfiRSB2Hynw46p-qIj9Z$-&oMMtavYj_|L=9 -znU()MfEnNtz++7|aRO|LQHpvd_!}2D1az9UEUYv<4r9KfNxi=`Tr13V^A#*C9+H&p -zwubt{r?iPPjczas#9b7B-X0@}=Jghz$_-fmzD#47hdBEh*CoDc)e6kG?MCF=6nAw~ -z4Dy3T0ov4ajl-^~E9dfhp)|b5nbSnEg5J)9<;j2l7PIE%Xyj1Rm?O`{Z8wx}8+pzC -z9%o@=_f^Wv+?1IXBU}(orQ6I8S+wqwx!I7@Jx(jmq}Gp@;7l=GSX4`~C!pk+{8!jZ -zU<*R&sg1fIXd%~`oI1dupw4IH?zcnK5z!gu#Z#Yl;Z;*(U_%S!? -zOUz~#hPgajSC0G*cM7%fkqxLt*(6?Fkq8|byHF!DsxRCPDdIkB1>1XY#$G1vBhuZ( -zZt7D_tQS=4?6~tu4}xo~|xSElb*JE=#yi -zq!SA(O_ugO;VvH+w?iSF9nU(jx20?L`nc4O&*!azKzp4Y&VV@2__!3$`r*Xs-)ZG~ -zoVvzsX`EqOBF=w)zhtnxl;t>E+TNveQMsyu&eZARU68}~HiQddf}cyV+0VsoRX0DU -z48%zUQcY)ldYTw+QkN;p)fGGEkE#z7X7h+ss0hPJSg}+LXOJ|LzY++@`hzv%M~bJCm{GX(`&&mted>4S?=HW+Yo)Z={G -z#ZC1accWpdr4ZVmUk&EaP0h04eYHk;1-i4+G+ss!?vY^V4<%SrQbmB!q|C99P-twpSoyF{kJ} -zZH3dq(OH|$-^=0XuB{mIJ8_+R-WnG}Ho~9g-;32hB>NxkaZYxePugr|;krG3$Lv<$ -z<59d{nGQ7_2kR2mhcgXo_y+6o8%aaxc1E{1SXN-=-d|gf)!6NPr(KQnkPbZ=g1C+K -zoM95rAk#t|>ub-ZerEYBajW?=X(g-nZ8NKPYxem30h;9Nx6E_xe@DK5Pdp{<``ym2 -zw(N`$$jkpUkgcrSxwHKzoQBxrT*PT;0t^yIn|>6wHSwJoTNvrUr6ixJXP3}@ob7Lr -ztsypM{AWFMqeA^e){(q}8SAcFc1*|F?MwrQJ^blXZKsL_jaGK}-;723zP!-5OW6UtsBL!oWML9!GdI(>Q>XQ-DNkVb -za!9O2VuYUTNee`yzO{i;3pmfSO<3C)`7>?LCN2>bWeI5QM{QBiN|HijY{Z+e3K>@6 -za>P=>W`uS9n2(gEx{b7#hCa&^=4RV?VNA`2R105~(e1p^M!6kmtG%R{sA`~IQFOf0 -zQ*uq!hZNmwuKo4b(rup5gFON;>%*#U+coV(MLpuI)io%iw>gKrjTc+t><|9Pt>&E} -zysBfPEA^TI{r*wu^0ce4qbj0&>ZvRi4*5IPo|?CWCA#*B&lXXtmteJD_B@pQzSB*pY~af@_VPq4Fb-OjD< -z6dAr!tWk(X?c^TkTU}EGeJ$dyH(VN@0J@1q -zU}x*p`YLz(S(KHPRxVoAkRdABu6TC+yHc`t|I#pB5XPuon)RAX>@@uiy53%n2`}Tm -z3TrQR5p*r+I<$|JfimE(h0uktPDjAe-(C9&_+f-S11BI&7vkoF7Q)fGrnOEsv9Sn0 -zfVW~M#3vcxS^KocOW@YSkxYo2xb4RLAczm{C&Et%N8Y=Rr|E)E!o`{E=N{3kKN}u;NKi>UL`IIzcaKDP$d= -zC$0GBT956TU>xDdyQ_~%D*YKeA|srj-~TaLbvnF7RA*`f&i;7SG>%| -zA|?yWrRaP(efSv24g;OT)Gl@pti8IyHF)z-%|YWRsfL`NTW?l%w11#Y;=+HnuCP_vF4^>_ -z&b$OYIvH(|^9}}`it?N%ScEY-fWMPJCTdKu%kZVOW03b4Iqz8XZJE@!qXjl`W3$^+R!| -zH5BJE+%w@^HVdPtX{pNKge=@HMM=oV9+=2Q9I~pKbweMv9k;dH=&ors>c0f_KLS0T -z`sOd7qDFx+Fz!aZ-d^Zn*K5~f=x3E$U73$d^`1zNFgIMrNpI9k%y{OT~WnXK-O;*au< -zYow=LxyBhnFt@Fx8p9o_qWKQkyMfB+^~n@I9;qfb!=|1dgFTKckCe}ZW@bQ5p|R*R -z(}a74Q_z#UowjE9J*bvu_0M>BO7_R=ka_=x&djZW4wC3@e+TX%pQ=vlFeq`C+JIfa -zq_iuHs)n^4*n!Hlk!V-s&?N5ojA5J1ck>}ahA{kT<=;*G{*BS4M+#M){_<;NC_X)$s^&_MHWaOoBJKq6!gmhoU%qp?{tVyvX~^UYMUqc?G{Z-|~jFKd1Fg?)Oxakn8%Ud*z&-L{7#U)fn`hUqG|kXR^K9 -zc@VkUOJluqr7^QMjT1s^X9^^vtxeR&lk6s}Ta&zQ6A;eEU2hmKt=jsg)@$@$O8;Zs -zJ9(j7jq8^NH^lO)F}=>EJ^#S{1ZlFV&GSNA8vN|4@huHuDJwFxV-`VE*X=-UUS*D+76*yElTrI10i7IuPO#`(!$fkhJZOSp~% -zoa^CV0scGi<)H7wRe~>p`xgB7a4N*1HFN~lW#djY?8cE(S(u2~YbddbO4~N`F)>;n -z1OMRQS(4Uvm!z|Oj?=L=(kd$AH2Wf?yLgg7XBxXLMrpjhZQ8+C*LFLvBc9{&TT;)` -z*`MCObUWW_j6~1Hb$kii5cTfiMgxEL63z+l26RS4wqNaKceSUu%5)v_8i7l1&bE#bITj)wPRdIN2#jf -zX}kaaBk_Y88X&nEB-!hhyortBIIXzlZek;M*C{a?cU9x-i$?iG2cP2%?3SWuNK@dT -zdm8?pGKD7%on9YBqo(5;$%0+gV1yhvX=fA0*MEe(Ke9}LTxT!2b06LqCf$|4T}p2p -zC{;+~Vf&}pL(g5-7)~H=j}-SSQD-kgsG`vTD~7I)>>nj>+vGGojy2c(D>$Ar`K>oZ -z->UcD?f-Jf`du}%jfw^qKDc#`v|YrBW=76zfX|=GrH0pT^K-*6xoHR=~2NtHYXigh_1)tF=MLn2h`? -z9lg#kx{dF~2%Bm*By52N7$v2XtuY3nJCQq!-gZMguC5qlFNW=BU8>K1s@GQOwO2Pz -zi`1LjZd^M~cLv?gBFCkxzMY)!Pgl9Se!Pm?h3)C^eX=nRvouMnwY2)t+7Xb}7KB+H -zY~o|}D=>;H&Qe%rW`T{XVZ|{nAlaOu9S+j-Qn1R+c0kUJb>gpsw2q%>8Ig$P+FhiDyRg;BMsQpg@h3PMt( -zkS=FeJJmc%3VG6zh>%1%q^+H5y+8_C@8A)_%ORKBBZaB8W+^1!!P(P!25nKZ|E^d3 -zgqI`GrqA0jfC3=9`;>!FZdj|hrmAxN@>mD -zsf>Ma(csHKKZDbQ?*;9G`)wW^=nc3Z!MB69!hHhX0eThgF!)QL)TUl%$p?^;^VIwk -z)r!tR>}g){c6_R#!-w-7f2^4c*ov1GOc~6(N&`Bz+Mw^}pkL=C-Yva+>2gkOpPn%V -z<1q_;+vWVIo%WF|JBz;aN33SZ(&;G?xF4N{7k;$*6ZtM@X!``{TYi|;4&0Q6Vf}YG -zL)tH2qr0Uc*g309G4oSIa}3hZjcyFW742b(f3Z%%`uw_qtn?%8rQv6xg9p5Oa%8vj -zp6{sMRv -zc*k6f8TiAXdgw2~$xl{qHV^uK2>NS?JP!}zReKIz(7jt5B=y(W_8|N7;vGy85ttAb -zc1#R5K`XU-UXbYp^;=y|Z98YDUe#3VPfdM>9{%9{18g+3H(m$r0^No;XhWd=SJX-` -z_V6Bb2zqa_+{k6LeQ^S1{iUBasfPf1!KJgm$4O`E$URW-d!{Pbzq -z-;w`Mu#3MH=Pr-R8sFHvfQ2U{C8Tb`YyIIiWyjQRMaOHs#u`P(-*KxSa+)LkjGrrM -z)w}rk&~^1}jBglw2`~9yis2P6DPQV>O@TA|@T2Ryoat@QPGCi|SIx$V&7il4f(mkq -z?V*uV;YER;>0i(==oUx=yJP}h)h*bXR9a;6P4hO` -zd|8>>1~(h=?X8nDf`xIg!OfKB+)qf)BIy*@=7WI8f%bEk;K9`n=e_fC8_slg-vEXWqx3VWEgZW7%Mo9J#h9(^;tm5Wf>)s^4K)+BW~o3N^0UCE;7V3e1) -zvWQY%Y2yrdGu*?O?!-#}`5m~|XawlJ-d`=t`d;f{)}xH5T7*e=&s~xwpzfWt4z(6< -zA6}!k5yw$Os@F2i^2I2>qa|9PdtrBN+FI18=?%1~;xg<-IR9(kJ%p8bNbZ$$Eu=la -zD)q^VR)$*r{boStU}$G|x;SGgAJ^e1JtYoibv~@~W8w_E!F^S_&%zmEZQ0i0LIuC4 -zrW`qz%Q;rJ7_l?%mU5icT4u?%>cT>VE~le)mY|4M{>Y&|M_a{f&!jC8eX5^Hv!c#T -zElb2*OrEd|v2o${45e+A_5GEzY_64?Y;3~%`cjlvDwnsuWde4{ -ztx|akwDZO#v=ehVxHS$re}b3l(LJ`>^+>T^PVrC+Y5eP?6!_i&c7`sz2l0VTq6=S% -zkTto>xeqi4v;wpa^aao}pk<(EL7xQu5_DH9thzTtYPy}nZgo2!xryEM2-?~bg7ro1 -z8f@=!u7HIgfA<6O-L+DB0|oitLbGuu)-mx*QNN{f{Q_IY%h~|SZ(#NS=gt{M%q{7E%T%= -zQxxtu3wsu!jC!PCG23nodfWYCVJ`f>Z1%aP+#glpC*Ykb<}hoCk?k?RJ>}LBj99lM -zhmV35!$!9mj%;rN=-+Kv)9{}Q{(kV{-T3<|;3L4F0bhoA`#|r9UmhIU@XWv>_+gL< -zBqzv5w*<~(%Om^Uw{x&}BThFQ+3#Kh?g2j-X+8!G2Ufs+0sh}`=V#-Ll#cxg?j-nj -zP!6_072FHJZkh8|@>A7sCGEod8@u#X)IR9PZ=y%vOng(aymvX{npa|{rx$Cpw!e;^ -zt+l^y$+gA^6Zwc5T0gILGlS7a_fCpvMZIFeiiR=vmo03}Tl}B-Y^xggMNw8RDi|*^ -zx}2AKU_ba|U&1~*9UJD0it2D{wsmj95o?TjSa!Jei1lw`h4fBCHH}_s*c-mP_B`Hs -z^iF=>5@CHlVYn^V%EH2}{`l^z%bAK9HSYtQ=^z(&Npg!u)X}s-x?9!pdYrer@b-QO -z+OtERA?KP%SKKDekQL3a{D?G{-xa%^{vz$RUC!thE_{|P)vlTl1X*dJ=~?CJ!F}{ -zMMpO57lJ-mg;({9aQ4`Wzhp^!beD5a)6aN;a2FpU@6csUHq_N7*L6n|z5m+U@E~gI -zLo+Z<*`a%%o8~wEn}&=u*d_UUQZ8lm@8v$&4O^OWGnnxX>}gdv{hN0$>|2F&M(x6h -zpXU1#yh=^rJ$ZgkH-}7N3~BJzoz0TPf^_FD=hsd1aQhL9-h8fUF7BPXoIf_X(Y>he -zy>fk{n@AGQky5<@IJiid>_ -z`*0I(A#geg!^;Ki1x;fd;q={>g9*ZYtbC@<(`6EdHht_)pVNFx;2p@9{F`uNF4c4<$-44y?sTZfEPbRObH+w@cBiMnJq -zcAltBem4HMhG!Ed@z17>v#KQ7zN~Q)uaczu=S{?sd{3ABNW#}iek9|0$&aM`UnD=0 -z^K&FWlJrNL)+bKl4`Zw+H$G|+tdmfe*P5C#N-XQ}Wy%nn@>iWf`Rj8N%7~lu3GDF7 -zU%$C)wN?4+#IUhhS8Z?D-dMGA)!0?5Q$G<|-Tk)Rwzo34u~pd-*=NLxx-;Tb`x)^- -z;Tf??&mFzPMzi5oBi$$VpE{xcH!jAP20pk?q?0H0j~dof9p-rl;x^VZLm2M$uv0V@ -z*7Tn*vF07~Evv0}V4qwlr7LJmPupgmEtJ=$rDBy&O|_&Y9?sZcPEFm27vEdWNwy)j -zDK_XaHnVNEZLr;fm1@BYUW@dV&tz$Ce&{gag|Ht^wDfAX%lW=zUK$IVm*~&8WNgIu -zf6!H$48r=_d!diri*b#_8H8qWmBWZLNGGf+#1FUA9Ee5j^fu_ty;Zf-QPy-=g6LZt -z?60sNSn0b=SXGChB#b}o1aogOL$F=Z@vocA=&a{Dif=LFFQ5&e?Vuw?W^Bez^~Ww| -zf*vk?i!q_pJ%6vH;qQpS^-OoK8Jg>~Mrf^g<}t08UD(@b9XY1qj2VYBFI+YF&vEXd -zGZ1?-0Efoj-uIt`-ugxW`yB2E_&npG0poNP-$oE?6m~ov<^MTe6ysTTuU8e0+U` -zFr)^S;`vjsIjD}n|59`CwAC;YYT?VY!FGyOwDl~ikaoDRL;eW-u=xAPR^Xc^E -z)D>O$f?^n~@b6V?4CB(+OD^*dxNC@k)=Xbm%tpNn+9Ra*36pCh1gms5`9W|wSGUv2 -zNnKB0QQq6j;iSUsTqJ5&=+kLrF6Z&~sWqwtH)^my^FEbT3x?V6gp~;|Y|FO5(tlIZ -zv7@m|;kBUio_2rf96lRgTv?#?d-~J;Yn>)1#iM#{fv6UE*3F5 -zxvUg>t$uM*ongkl9gm@vB^dW6+}No2SX)Sg%NdC`7U`wIeU@2zfA4bsg!7$Q -z`r3IEY@q+Z{b3whb*@copN5+O>D-3zK0o>hvuCP&j@z!?gtnj!vDH!!W+ZLW2AxWEXc{gx5ceIU`Bu){&r!=6xrEO96P|H+XfpxMF -zY?~pt$MH7%sA<$m%dw#>v*Cx8F5|sCSseNEJJ|}7R0v5v2V4;!J>h`gfgM9VLswDU7HX2 -z5EnK?u!ibwlWf6;Z(uQ)AjBnpidA|DyRQbaf-8496WTbuu3cKM!`B!tXMEe^JgcBr -zzzXzzPMgIZxIds$_cE6iZ~L3A4tdmx+A@3z1GCE)qKbVXYMDmrPhH#O)t`!nYVKf! -zfDi-qGD2;ih}vowtQJwiES~Gsvbh*9bDK}6mNN?I@fkhNQ#Vh>-&sEf_ujPn9MZS? -z#odt@JHl66>2A@(rl9cy1|Q!HsEd(I#XG#dQgk`LYjv05{#Nmg$J}ENIcyApO)2sMiy3p_ -zPJEGT5Df3ejZs5pWAB`%hvd~Qe~`)YH#7)V6_@ktRs&k5$6GVYO|*9kS~IyKUUxc# -z*W;UQnrHOyX8h}x(Cl;(%A+4Zz9SwT^NNqVieZD8#h*CGYV@vIE_?Z{z0$u -zCZoK4twxM3l@}zHR}nwFUXPigmuJe)ErFOB!9sp*fHa@-TeVW(7D}}!lxji$wwa{w -zh~>H*9}oK;?wd%rOb6X|LWkZftx=WH8N@F^y+`%du-ois!@^w7$#OsXNZ))4kGlJD -z8``Bu>cJP%LsiDX=U%N*?+Hj$?cR^{s<-;JcFJLJt7qh?kKCi;&W)Xpmh;mizhHi7 -z;*-@I&7l`=)EpD_dKNL*qAp)#9o{#tdO`J;3+HeegNpdT2KD|L+~oe)$rOv4b;^iB -zPdPLSR8E^@U;J*JyUyNajJVKpTNxt;lyOonBLHP2j{2sP>6SMu{?V>eg0sRPg3+x*& -zz|r0k48I)sbwD0t3@-&&#M`;qh5JekU#M%9J)zP8;~%FiYWy4d#&KW53ot_;_`|uXT&zmilId -zP8l~6-_ped3S(`G<0^a^sGSqYC)9Aq(r(l(G@}20YNo$L0L>V0FY3}2BZKgYZ9nW; -zE@uU9-RmBtoux2NSxx0#eZ+0o^1<65R$f*UKWebZjkeTq9T%0>7_q^}vKpG8%UOr{ -z%pLIyci|foR>mrnlEh=DOK_(Jc^9VP6^C8USlmg6y#6nIoko8>V^PSw=1aw|x!8Q5 -zBIZ&qRaUTwkMDFj4>qgAQQok*&1!CLi^+dSd$oFDi{9Vm+|$g$=eA7pFKe$E`g|)J -zk;GTLnulSxB$c7JV;r36oTo~){ -zVcact<9>XnZGUI~^1GApU4ZH)Uazy5)fX;`Emim9Epm{ksAEk!ZE!8wJTBC$I|uu5 -zVd=c0BS=(1>-e^w{1pw*D@qlZbF4^VBi)9phkc_;)#-~jDgk)8QrR1^@#-Ur@t^*p -z92?Owh@0D_!P{#aTl>pD1{)p;FB*2vud~-gDHW8G1=>eI0*puu#k;AE7@gIPA7l)J -zg>;yE{Wq#R{d^R5b*H~iZV5O3kf<&U->9iq{7W%jS+BOQ{e>T_vghJo&K}=kQ-l{u -ze>LDKHtyaVo8QLWpSJQ^Df+4!ef%EWNx1jN;(Z0~5NT}>!`-7Mkws`Mao6XE;=Rp@ -zMbv79{z6B9AcSgRf#AZp -zju(2RS4xlL{d9p_Uge{`-{5V@;W6%Zx8Oe{q&nWoN2fkf9gWvnTg?IdFVf8bH<_ -zEAEsmL-dzryj!u+G1&4bwExMswW7okfF2%+R)ol{i0M^e_v>|L$gSb!w!DFR%VB8C -z&ynu7j73{~@t1ctVe}4I!-R#k+Jxa&Z9Ecwx1ryUf&3nmOm98L;0#0W!)Bp{xc^T)f){pL*omjv>CHztZg9WU#$8uO*ha=* -zPgf{i8r9zTJH8*57QqjL9faQ7;crdgZ|YEbg<~-OdK6j1e!>nwe|hSbv#0&swV(tJ -zx76HSKDW5v##=LQJ=vB0psq=&daqfhSQx*sS;6RiT>|QBLVLGkzloOH8w5NTxG4hP -zp`tC~iMn6>eboLM{`5QltG#c5kE+P>u1-2h(|Hi&6(r~lA<#ew;h}?((L6erR}wOS -z8Wc@;l1{p%)7^A;koe-_Jd6%I8x*OY~ePZa0GcPAvJbQZ_yCdPICIbmBxd~ebxzes=g<x91_b-amS*sYWG=p*dVTDYl#T8{odX4roXU+R0bab2>r+C8U5e{|e8-2zO -zlg6*BTXlq=M3Pc^qnrZiBliFF2C`2ZutGWuef2u_0NsH4rksBD=$k9W7)@tW+>)x=JWw|=? -z__<<^Pjtt)%?F!dr&_3t{P??zu+Q`aG&72{} -zuEP4Kv@IClVp&C0?hTl5cEduP%aZ}zFLYsFA6mW#cJlXHG8UgRXK=|tr@5i!*k`1B -z>~_F8@!q5A!a~N8Cx}K&ZP)1eENczUA}C9bx4;LKB_!RL&xdsk!J2RH -zN(B9;L5qA0Uu04*%3UT|?At86Tl8fk)~jEz`L1-jwoW32^%(8+17`dq_|P(a!T{iBsN(cgUhHSES|G8cpw -z)386dd-$T^kWQPy;Ysol?4G!)G_4{=S-$)Sw|_tFw%cQ7UOgoq_DxdfpHqGwjOqBK -zJrO4jCYI6I8CNmcvT1p5U}u+*U^FH_vSS}1##!YDyaJhNKPya=jcvn& -zy2&f1=-PF;sr&P$oNJpt<>U6?(bWCMh32zT(dNSK2gb;>w-zS_>|S4NcrUIb6&~9W -z%agFLgm%t;dNg-`3Fmy3imWN%5@n2l!zL13S~6ydb%3S%qZTxO_Y$J-GUmWDyiW?@7AMsW|&eCz0KX{f6u? -z>gYiD5aAet@K2FE$BwPm-oRO`zzYeEGpFj{%LPpGq7*Lk$&0nZUefwd;TF5@@Ycfk -zzy2|pof-StBHt%RB{_A!a&>H{qSr}B>_!Xv?m#p0Q=5jqLZjf}mg>^fEf~Mqtb3ng -z#VCle$2RL`(us;4_%d)=D5kj=E6VXQ!`Fmc?Y)7=PQ^XPJ{~jL(i95p57FMnt%}ti -z_jF<*gO@0tkCDCR#V0lo8FD6$Ek2jKjC(j|StL4ffv$!DptcEgKIUd^sdNil1I5A82B`v*X*P-!6Lq`&P2;-?CSw -zPq8$n&#+iK8u6tG8}capI7awlsSM+pw3LnT!VY_WJ^s48N9cYu)+4u=pSABPo^xQH -z+%3mFeuF&E+#AU0%9j&@x-GqdiKiwlTrS5veXrS^z7;3_^#=Zg^Zt4RSD*ThJTEKV-K|c?M^OAzb(gzRg7#2ixX3toin0 -z?(0n#<2D!RblzQ@JX9Vf8(UfCaErZ3_Z-IQ1!kJtrrYGOr$XDE)7Co<=jNPvi1)?z -zUhI=;sN#46c+=IM5vu9lu-DM%j!38j~{6Z1B1NoGGnup=x% -zNCDr4il&xL#jKb36Pov$WZlg9q#sV2EEfh14}=0g<{IKnZ9CXr@LhUJ()QTq4aMmA%}jTtwE@+clz3Mq}O54|~!+R?z>kr-dH5S)Kqrast-iA2g4aKdZ>L>t^2= -z)_7wxLV;}Fq8XSm(v=K3q3U38LUZg>CU8?XEMJ-zcL2A+wcp;rU7Z(ezrBHq&cuG& -z@6cYM{a&aRINyQw(5YktUoCKc?FM7?NQUpPTHN78zCkHC4Miu3bx@cZ1Dzt4{m -zI8Rh@9x7*m&KY5=;#)-H2|BVXN<)ErIlj}{erwH;P4-yuMWIUD^H@i}6m45h3`E-< -z9M4G0!m8rAsY=i`^ey;AFprk0cs{sU&~|X!$HZ~eY#;PK&bs5h{{3sG5e4+@d-G^^ZWsp -za3;p6KzcoPLN9Lz*Z%0lvu0h!LuN>@ZiQROOWVQ{Wh?f$=T02AtM#v^jETQG-7+$6 -z{CD69V41yv^_>Oq4j7+nKHUtjfN?BYlSaG8a>RmDPsfoI!ub%PYZtJI_y!3l<9rYD -z{9Z^RgFSOq$TUiw6*^Ys*e6;^2E7PxR&QWF*1ikVJH|kVIziawpIC;xBAW@(92ewNbE4G5^D-1)~y#ytcTfwRM5zX@amJvY%2oUiVwGpFB>1`yu7w} -z*s}*ur!ul>|ML_}jM)$hERC>i0!Wtlntm(k@C6+Od@Pt1{mzjsJ4nl#?BRG+8-O24&=$cWu -zlHCz$zhXw@xX!?=hIPnXVTJbwMjTI!vR_&Ee}n|C-b#V%AF+n~ask$rRa}>-HuzA; -zp@$(m`=k&kJAo)G#xgax$k8Z+viHdPj6vqAi2EBoU1NaRv7xeQRux_u4 -zF+1?aT>|F};QY_|_>F*(g1*~-tjW$S;GDInPj=o!{J^n};nGOMdLhSpI^=#D -z3;c6|Kj{tKML%fCDVq*nN&Xj2b0{PHvxr}AAnoB!PWc~)0{_JEzqt)(pAFdwEg~%? -zWqVxnTU?7sf)wRJa#%cYG%X7 -zP8Z^-ZCs0B2R5w`?Q6$6^n0-hy7>vLl#PTP?th;Hecpt;xw{`}NiP|PeHR~8B->Y})2{#QHp?!< -zj+l)24F+&z>bG(F<_?^Ym~4`@b*rRIDnE5EP7*W?YfHh-ffVk$pMqK@qK&!gn!!}; -z80f*OybhL2Ob2`^9ckD-kc+yNJ4AaVv}fj3qOblItU1Us(N_iMajIULycFvWNxPnH -zdadx9_J7!=rsUR-npj5;_CmpD5tAhwro^a?fVZyPh$tmap2p>fKdOTmE9{2{d)-B*XsZ4aw{ogznuKStap1CM{x< -z?l(^=?WoXa>g+T-=rU@TvnO>=#ylDOWUjpj=ODz%+xPYaTDq<&yH?#bBzD;L1n%w{ -zi**kA;^hX+Y&`*cSC&lnJ~;9qn|R*5^Ne1f^x1`bEOygg*wu^g!(RC<_M{GQZ5Q-5 -z_rAh2?H?cAS19(3{P%@zSiKLxo1?DnEEjuv$i5hkwjN9sZJhx8KW;`F5XdTwlbt1x -zw>ZI1&ILy*Qti$1u;$u|Z`oVrMx09YqH?+^ZG6nRgzg@Edk@PHHXzR5ht&?gGcJSo -zqym`to~p!Hz*%0ozSk?{xD7q{S|C;GfiENOslwnCoTXX;j;jcBT-T{v`3lc)&TS`8 -zQS0yRqLT8uz7G$0YSL8fp8tWmdtU6b@nD~gzC)Y|rVM=(dmod}q#K7mS-hwm`;2rg -zQpSB|+7pcP^5L8637n)e@H<$>EZGR#UzfDE5N8_3j(Kl4cCls#)Ans|$_$Q5I%dxe -z&S+tszht@@nZXhJTJRQo^|E7+>+>^%SMAFTroQ#TQHHPk*alOkZbQt5*bTIIDD{b+ -zKuXsp^z0j_CY4T7Tc-8wgQu>+Iy`-6bpuY;?g`v~YS>d`7d}-u7Ji!HBqbKJ?)d#z -zgDO`eFJuhP>!q=1Ifb(@uy!XXV>vbK8RYZ)JJv&b0vk{9oY-5Li@v3Aa;a}m!oK&T -zFUzo>;NVcv$F!Gg6rK|hUdqA#uM}(tL;MTG@ZPK;?~TsmnK!33cFm%xx;AAh&i6%X -z2q*jIN2bBUv-oTXkok7cyaEgN{XBxdnX&8ej3CZ(PhEuFyL^{T8qOEf!LvDMzwXS{ -z45!U>*PUagvuz0rV>9&D_cP5_{g_`_UKp>lq~&I=u38<39R}<`a@z~ektWe)J&i?(v*tVzb -zfus1T(2jBPtwF=SU*Ib!+A-p5E1Z7=yp*vU3e)S`*tA0U_L7V-Snt7?n&(VqQB_8^<;S@pyOo$ -zPyO%NukbwGTqio)CVSZUVg)uoJi4L4-_Mt~k|zSE9G}nKyX{OG=alWeM~+H3vr3X} -z>pc6rmx=O&yGP53CGm3N!en^+x4}zRn4Z+8NMlgWXXo?b2hnB7o?@lQlCZ8|9lVB8 -zaQ}KW@0{JKm|Htq%dy(JxiH~vnkC-PDqdzVzmQo3&KpvK?@HBOTs?tjI}`Z+t?_%c -zS$E{?bM{xDtle1ipOPr(1s}}31i21WC+_@>g0oq-u+0462<&W3olC2ItowDvvcQk? -z`JaWigLS{6+zBkE+IQh>m3*A+eA5NRGy^Lnp+E(`=(!E6e{pt_mN=VGZraCd>7Nf_r~^MeRy;S`TVh$VqLK%2>%s0wXiR%A -zJlrHB-#IY`^qhhIC8@G|VGQF#9#o@)?3!Ty1pkhX0Id~c74Ir8C_TX9~oe#2UG>QC}PsdAhsyR>8( -zWCfik{KF2zv~g{_(YxvRsxcpXRTr1gO3q?+ZLJVE`%jcCSX+^YorU?`-^E_l$?y+q -zWA(`1*i6>I7St!<_XyBNtfPLenBwG^wnZjmdk7=sd8A37 -z$2QZuiJ!;G)YqXze7oFo9d=AJ!-M9yC*q#QxAW4yyPBI~H#ZedZNIhYu3}UBAF;dj -z>v2NGj>6N?yv;{Fe~r~Wdb4@Mz;)RfFtpl=?4 -zz4J~2tw(hi+>$tR{JceAQz5U4%X7*Fp}_`h8qmfqeHhy4)UoLvdBddhAHf -zRx;&8tbqm5XVfPA1LJ%mGAYuX%|%Wm7_ -zndjN9n>?W;4zdVe&rBZEc2mcA?Bq$s>f?=VQrRz-lP>f2@oRC;1Iw(fi0}NhuEaiK -z@9xif-J{>7vt~YPAKNi!zI`vGp -z+!E9&I0cOT3TsQy{*IfmE7RDik1@B_z*D85EX -z+k|vOt5SpbIm90#-Wl7fly9bdI~2>)B7Y5!cPJ;fi05O7w-0Sql72$ZJC$vSsr>W& -zxkZtlLHbKZrQ}(PP0FV~r#MeByhO1 -z$1BU;66LS>FUr4NS%a9``xZR|pJnZ6H}VtMAYA_&LS&cgnXzY3A{ECN`N>AbGk!4Qz)l^%(HPdSx*1Afk -zyUr)>>T7Uc>2Y8cs?O%GbUSNoK7VDc!)aq?f-G5DT8ZxwT@F7ZK)<`P#`8i&_b?RR?{ -z1-RE%=kWP$-bx>e0YcSPDjtq14v?4S%aefaG{2)p%5v6BLy(N(m9)SmW%;tDGPhr{ -zRyl2w-z|ySq;M_SlEbyy>O|&nl2q&V)?5AAl#+)6j4W$;R()1YW!C(x(yXN{SG_7l -z%<5MI2>+uiHEZqAs;vWllZY9fEg`SPZP)4VIHROmLF2YMCcD>cNQt~yrs;QA~Z?;tJZgBY{ -z+o}R;bk}%9A~w((N!@03dTrL4M#&B)1ZPNAm)mc*d8Kd$hfDI?9X`q9bywSbVFIb; -zS6f}kfKtGKR=-WEx7CBIsB@)zoRy-o>AptabdUQUn|C^u3MQ;xsS*ijgOjKPx5wt{ -ztCZRv)q(xXXmDM+lxYG$x~L%0z0~q>3kk+2S-m!n2n`|!c=cXem~RAA-Q&dzPzZby -zl~rxZfIw0N8qs{A4LMtlBnF*S4I)-qt5-_34X$dx!|l?#2|YmgMslwhu3wl_?WCnP -zKgZl%tL3Pzk!r1Ic1;e3uNavs7LJ-raM3dNO7xPep}q3|B&> -zMzNRK2I*Iit_McdZkONY^7|x^E1ZLKbhX1<-Qcu(!%~6c@zwJ(!h#P0*CfA$nE)eA -z!?Mze=5rdWsA5FbL}1y68F2MFY|-tZJjFsX^Z{~#!i&Xlw$*$5jYcdaJ0MBq2B$MG -zg2A+kY?7Fo_%PxmsIfV1f;YcvPBfbSvFXex$*PD0K49_&pAEb-Sh=XzMlHybI7{?_ -zNoI}{dJe*xw-LgeSRF$clNIF4qC$;ZG-mg6Mpg$_Q9(&bVL{O%sdTZqSY;uX`{MBk -zF)qd(#w-aql8ERbHHR2aBpo1gQG8T>BAFO4QX!wY`->X>k|WP0IjXW&+ffgStGBKZ -z^vAdZ7=|zyfqH>P57!*TYa`=?u=NeY=w~L#%>}JGYj~VCD~OJoAdxlMEmRHE6fr`m -zU-%%RN?o>lM2(;`(lwfL?4fT|dmSFA7K6Wu=whh|gU#V;pknWF`0bJp(~~Itj;xwH -zsrWv+k^tuF1=R$_fvZFyPoq?2gX-bKK!`xOugm#hS4YEOvR1NNeY{VqY>;q$9c^S> -zhUSUU#QT(R^`Qf*{bHIUtg?9>psJ>DsJUeP8q(6G#mgjcc&*h5T3c%&X(Z7UwGM5g1yB5m6=R` -zPkQk>x%A;y8n1m&{f%1)TqKhc4*5eu#K^o=Y$--|BV>q`lny={lrAlW7=<3dB}C+; -zAQTcVXrn~y0A-lJY#CY~l`mObBoTvmZ$;@Vt@tcfahw)7!6Fvg}k;snANop32Lbc$sue;cS2pLu(<7Eb^pS{dV%MK;^G>)Nu#Qm(IYJYJ#G#bYC7iZlGkA -zD@~Iy+>F`{E2yc#r0AwuEQ}n~R~H&0#sbk#Oxix7B3;yh#&4n!HiIxT12gr8%@heU -zjo~{sOC-%QhVR&Hku=*FzGK%R={rk{B-7H;TPh|S`#txQ-cFmV4tgK4KAE}w-m2zh -zI`YPFajwl3mjF?*(I7l-2TVh+z!W0g9PO*igC#;< -zx&@0#tM$5}m#8+j*T#J_Q4_)d^4;%kRQ0~QQIqIxq0!KQ)bQo1rCO9!?R5Jn4>3DU -zRDJbmny9E}snB0E4MZ!eUvilGeA0nh2;KuCAeX?5coE~&Dfu0kQ#eh1eyhKME1yvl -zL`3W01JT@W(Dy_xXrs~P({N!dED -zwLWa>^iNj{hdytu_BVjnH5afC25PmPOAmOR!^80l0a>5bqWYm!Lza^)%4#CZ2^U05 -zgefJ`a#Xx7@)B}=LDOb!QJx8nj(r1Am4I54_z1o{C?*N6A6Udm_th9$`-wI}+zRW)Y&Y|(lvq-J!hE)QBQS{3n2g`V$l -z)q)vSKYf&Y+N@4MIn|M^P`NB(tY6e*%D8lOb!91c+*cAE!lRE#VV6$-2~X2Lp)h*f -zE_gH0O!8Y`63>HZ_WC@PbjxKpmBL>-!oCE**Xr_NRB6sI;ronYU`%KZ&5si{o%&V@ -zNEEKNNq`8uJT)l6o=e2s&b@3{Ak*~e2uH)<5GwH_0Z;;|<55JvxT1@p!bPcc8rbQl -zjl3lqIR^&QhMwR+O2 -z?B4JQ5|z -zvK)*zxss0`)jODtl@Sn88#FfXJr?C`m@8BVmA^r(dGJhDJ`9BVYy3t_V>G(?yjn~S -zo;>L`?l`R#emHf=3a{W`-U`7;+Hl91a(E`1+l@nfHG_#(wkY-;nEU45l -zt}QKHURG3Dd~0#pvdZ#B%PP4XqLzho4m^KHF*hIPQJI$Tg%7V_S;0q|KEj1O-1yo$ -zuFBimN-!2BG-gDzze@jxvGLi-9f#S4n3K>`6Ep%-a^xabKTI?ULyITW!H{r1K8N|a -zbwX1L*2BJmLew&}vEfx`BoCH$F-G|C)9TS+)OXx*M4p#^KztfCWBk!vRO^85jhz!v -zMFEC2GdP^61<)GHU=HPS1r^>(nv}`1Hf7aJ#;SgeRCY^AN%*BIq%s&8kbV0?$c*Ip -zYdb+`=3`ubEOXORp?Ik&p_MclRg&E$(rNsVJyuEfSfwxxS&h4rCWcDduE1)Y4L-ZJ -zd!@hmAPUhI*DI~nkUL)B(@ -zMI<`i?v)K5zOjaeeT1GO3Wj%{%Z7{ECME%|jXcGw3>Ob@Ej2pb_&IJ!HMp1R>(#A1 -zoD$euf({e!d<|9f4%aH|g^j)*jm6JUG75BEGeEe2olcSI*8=8$B7{(A|8gVieLogw -z8HZvyE*C;;!#GhMf}=Ps0yj#-kq6;4dZ(pPx>lE#C$g@{GPV22_jLbE=w^y3e&{nIf|9fl+jwLvvu?9oW+C9aQxKcl@MVeMNy}tm$Q9Mw-$h-ujg>)uGm8+!> -z7WXf^KODW+>e6Bj$FCdruj?k%^>xEQI1%0&?%KWf+#iR*o;6+??EU{lI<-ZsH-vF< -zGoHVw9)kI%0@X!0MAC}NUfVB?;4UW&)Hh!z?Q-h;Ixy63t^I@Hc>%KPi(m%JOX(ax -zjPtd)zZrpIN`p8I(=-%X#p~!_&P{;R(g@e{fV&?t-Sg*&do3+8rg|u7WegN+F#kWr -z1GVGJq(!#%%jDBw>wR^VJ`e0-e=S?(^H%a_(k@n8y)67NqwjWR-|ejE95bRHBLE}I -ziUNvysGQYTv|p@`kn*eQ6q+tfJBDff2rDDd!1($GS6v8H7$<55Fw2$e3I(oE;0gt< -zP~Zv$u2A3#1+Gxwe;EZFEcN&Jjka+q>{DH@ZrNKn2Y7S}I~IF7HvPXCD;b}{+7b>W -ztoR-7uTEim5`U987wPGM-#T>1(B?nj%<0S&wsF{t!`2}EL%;`zC0upzKNuS^A%!&! -z|JUL3+whHIS_->=ecW!ld+!^gSrkiE{F<&A+xA=_OeyY<5OT#)qhP8SYJ)xtS+Xjvi&EXJuu5 -zN-!wr(4-@iJScNLa7#1|H5~$sIU|M5HO)2c1B@AYU8YA&TLI%l`c~76re#R~6nWEd -zE&xn7_D&ame-Cj!{)|RkGacZLNi?3IM}(q%yW=EtDdjj8xycKm7^1gx4g!E;I&*R-m1U=sSk#7&edW2UH_M@&%h*y}< -z7l>OB%8_Rc;t{}QEAm+Iyc5q(ge?e72=A7ozk$bxC|AMr{RsYoRJM)cn^W0bViL;Xtn-H4ut^zo0M0~I)6~E=3%G;*>*){`b -zMqCMl(tx3#*ax4*4f5S9Im0zlej_oC2nfMX8~Pl9&O*RA2w@C{dJyOwfdIk-chcy? -zfV!X^)HOi^3trH;M#9yCU$b0J^6nE3>YwGdyEBHH;|DDDE&SukB`Km8bAyC&` -z|CfOJW?p?2+3{6swy>-2CaO@|F6ZKSz4C@$gZ;nJf2eEi#r1rZ)?UeTg#uS7@c%Le -zG`VuQG33#_qM|&>G_UNI$=_FzANF7-N%k!(y(|kI;?OjgC#zT^%zv_L}(dI!CMR+V*gA(naC(`x^j!-8(d)r?alPE#GwDP=o9*RJ4WaqqbxUUQX -z)!;~XAes=|n}B;0aL3eVL}B_pjC-x#mQ%1{{>oT6A*)_mdF%14!ExQS1HY9=6{wd6 -z_ZXguR#Y$98b>}t|CSNP;?m%r#3PlLtELlN1Y7ZU^nNP>^|y9?3OHKV(=M&Ne?tQ5 -s^l0g+M{!=6_JEkmqU*N^+C4ol1YG}mDV<=b4cc`(;QpjNAlAzGKWE~kv;Y7A - -literal 0 -HcmV?d00001 - -diff --git a/recovery/root/sbin/libdrmfs.so b/recovery/root/sbin/libdrmfs.so -new file mode 100755 -index 0000000000000000000000000000000000000000..cd643db7b697032e3b0d8d9ad3de2be88285fc22 -GIT binary patch -literal 13488 -zcmeHOeRNdSwLdc%h6$O#fQSe|ZUVsxgd_-Ph*Sr>Ttk8c5iI&xFEhzZG6R#DVP+B& -zpe73K!vRX&3DqD9eX}CenmVK22i6ToJkNx9`l2mr=Xk -zTm9p$w-$%BXMdc1_St8jea^i(_fWfFk)Y9Nm{Jm$nJL^X2rV<@njy0o#|)?&!|r5y -zh^S5hxd9sKAR|biI`9hI0iJ;B$ToqxypYNm!4MLfqVi#dI0fAyaJ5Un{Ix4bD -zT%K&V%d^_yN29m`^}#X<6x<#x#H0JcLj2@Gjxpk=#qsyW@p*ClBXN9w9KSM-55(~` -z;Qu(BF^csl%=B|{^_$}OAII@OiQ^B(@vp`4Z^rSzkK_Lo$Nw#kzYxb?j^kV6_-iVD -zBxuSPrBJ*l#_==bcuO4rXdM4k9A6yAJL34&al9{%uZrW>$MMg{@jr~?Uy9@R#qmFj -z<6nv6--zQ+#_?~*@$bg*e+BlDoTAd -z%@Ghmb$bI2BFg*@YG?D<{a%;7*zGMZ_W50&AjurI5?67h=NXsBUR>()p(2M> -ztfp4}3j7v3$!fqsx>57RrOwsN@37fP2mO~;_*lRr+be@o)FWAm$Wj|QiJwXjZ8%Y* -zP;>bG9xpWq;q}YyY^AHIS#g=o<-SEwUTO2&A^93#XRybgSg_y`Z$+`+QR;A2Ie^zN -zU(iVo7Rw>>J3O`u$Dm#Sv4K*+$I1dVo>JzPy(^P{We?o}hhud#cI+9yD@c)(tS*a)Jj*T!j-m-ukBO0Mcj*z_ZqE7_K<_`|K<9C$1uqFG8-Gn^Y -zkQL|Ut{l`tp2xu!m7Z^Iv&!r8uwsYZ7PP_1l7P}%F$T@tu98@=<}F#674VXvRKb-& -zmpc$+>@Hh*j6|x$sEQa41ns5Mrp1_BTKOx=WD7{`bO7!1*?=4X2QUL>1I7bp0_eG5 -z1So}`$*QHohJw!k(DUU102O+++z+@5Kx<1WV`9W~;Clgg1Lgpd0kkfu&~uWW<^M`i -zp2PH>pi>#boAWs+p&nJulEh3CTEg=ji -zml4K*R}jWztR#%VSP8>9J7GBMB#c122_q0b!f-lB7|vD`#=zGT#-!B|#zbr+42L%n -z#(*{x#zbx*49B+V?y^5M!*gbM!*gdMt}|xp2*k{!W?4_gb}dggb|z*gb|Rp -z2qT$(M;O6=hcE(thA@)mEMX*Rh%gfG0$~LGB4H%nWx`0NCc;RxX2J-1m@pE(lQ5FK -zhcJ@6pD+?#B#gwrK^V!aYntAoYuev3yy?XzL(khSZc6-jU%Zm=m(5q){cp7>v|UB7 -zRME>+^dc3_tLV8ZdX|dLRMC@Fbc%`|t)h)8TBo9KeEOxI{VKXsMK`PH%PRVUiax8N -z-%-(Tsp#V>`iP1?sG|3(=z*AySMx2%L(u6&N)Up -zL?7%n3*xDw9%*)@Rku*j=?aLh;n(t{-_!a%>@8aW)7yF;)d|e}?NCBBo3<<@MV#G| -zxlSm$Nc}mxhoWv_C{>sbo6c^QK2$U;$*s;d>rX$MqDg;9Sg;`XbWu-sV*2?R)!7+i -zPqPdzr0>-jSyQEOMR>Qvs7(1-+=*vtYsdf6qm4^Sc>$D%|rQ-xpa9@oOb!zIyISK|32-g&nOJPY%_y -z)2>36ig6UJ)ZI)#MhDsCf4X+oB8)YWfmTEYIgorTt7>SOzkEaOU;M9$#R_f -zy5^_6F~DkT&Zm-oz>J!E5IZSytxJ!wSA>=oHHu4~101X6@%ysKKe6z0{)znSd=0PN -zTFobH$$|E;Zf0Hw4` -zaY2)7#@uvvS&o^7$7SEi2hv*s-^?*dw=5|-uRCHEQqi)r%lX?hms!yE`xd=5P**ey -zGZ^lYwby8O7eeEV+~UaJ&By|CK{Nw)cahJVp(jP&>(cD`P+UKHf|KQrJ?-sb?3MZV -zo=Zj?5#1N1$k{IDlp>+7aSO-EtrG-2huP@b(26;dqCF+ZJ#CkJlKP)HdZyKc-b}IH -z>|K9??(r@=_VpXcYd4;6t75PX*bcA)HsbmB20#Fu0nqc%2cWrqZD8VKjbg*9tqu6i -zOCI>?qtEg~do3(<#IR-PcFcGFrz`5`9_U>%q*2_y7O=|DJ2!E>lcn<4@=G`&dEmg> -zXZc!w*p9@Vul9;be@0eGku*dgsv$*Ex*A36s%QBeXR1JLq)17Z3DLh6>N%O}e7R4X -zhUZw{-5VOiqk3wz9_@SDziA!XLhVd#rZ!DGPJ4&8Ra38-ubH74VE_zOKLV) -zgc;zbbUCe!;@LlE2!^y9{AH0b^8a9~6|*xLz8{~1{I^o=SV+cn?QCrn55AH-@N!{N -zZ%~&ZT<2N3AuZkdf!tExb*lA(IC}C0QMdJiXz*VUjinbv(?$&WMKFkze}OMFIjrXb{JUU&P@uJSeGTnxOFJ6|uGiM} -zJpDY`@B6}OrP!u)B5Tg5Blo?|p{?8mDWW59XRfvyuyg95wZ%YM)jZ{Vuyf!lW+;(7 -zBx_SUYcWHwJYR?YFL%(+$a>~(s7qt1SkWDd)|k$^Nei(v)1D;`N{yW?RS((8#1zvdk>d`7 -zn+(ok%_vz_a!KSN&F2o6d{T0$&G^D4G1qrVT$IyYdbBjdzRLbb$PU{tiA$ihjJqVR -zgmtU04U!eGVK+^6taiNa_{5P>)+nyn`5Esl%MhGt@5{c1I+k9wI?30MI_5`x9S&b% -z!Q^AyKKSafdg0AjEBQ(untkN&t)6z&Fcyv*rn82GG~^}YKX%`fHBl#Y3nZGrhIloN&y`hEKbtxc!?%iMXg7epASBRGRwF(JQS<=-yzF|Y$D<$MOK2#1UL4oZeZ_X{u)=J>osVs -z&W{k6o%8EY=b^tP&@tXmz0sPd^?pys{+6FQq3yCd3l^}x^K}^$5_=~nND)iNkb%AP -z@=F@UrtfB8ROS+qk7kjsIU%fJJ*^6sYU$IAqJ65aoz`C+p5yiHl6k0*cyXbSBjgFFze9>twX^IyE{{Fe -zD7x>o^l2v{PU%>4_t)^>4d=79Jgw%X?RPiPdg=^S-!pS%_B8PvOY2)swvT?!%pael -zi2rCQH{o}ECan}{Z-<@K46KGmk^3V>LD>&?x2M4Wml2PT+8ad!Jg>ZEJQpGDpS6x( -zg>gss9ZUNcX7=fS)-iM9hsk}1Gm{6VJ)44+G#sGG{p{QUA)9*&dyZ}d&HdZ$%xvk| -zS9eL&Arr?US5r)3>(4&dPtt#`d0>_GC_Jj)o*|ghKI5a=zqI}D&5h!wW*TvZ;IZE1 -z4QbK+kZ*stxj@K3j_hv749#CsG95d%eKhU1*2&T5#Jg>BuWkEVPGDDlxIg!`lh`5W -zUHlDxAG-K!{62W`1b%Zb>gz4$*%uRgHJT)O@7&yG+(P?Pe_iT?0>N0{c{uqcDe}EG -z+!U!QF=)?;UE8`08NsOS0$zI-b9+Vs1J>?#!4PCb{ft+PP0Bl=8`BKEd{X4>iY -zwmGd2w6rdKL})EwTWEwd_siPstJ{Fzbz!y-z#JamFQd7mW+6;4<+rU-Fiyf(2hiQ -zri1BICnVS3Ck)?;y*i8>_DPZMaFQIkeRWa(YB>4~+FWO>XOsR=a5vs1maPAM(T3$~ -z`J{T|z?)U3ZP4_O*nwww*tDmXH|`oypC@Qudb3cw6*X(vmUYl1A0+e4_kRs9e@$=W -z4@BqqLYN|YHk^##GvTCtV~&yTJK^Yz|JxDDfVaX=HouB?uf|6AW_U;QA@GM{{2SrR -z&A$Nuix~fEcy2RUsczE<)yJr>v#keEe?Zl5z1;7Xa7HtEPrd97n|2%bS%jU1Me@SNUF1iOpb-;&^t4|VUSIf~{FB0WkYm-n3GW`m -zw~XAT-}S;@xL}J&;%{45V0OU}_O{zvdnZg@VhKJ^*B!>+7 -zEY(nuBvi|P-wq2af5{k5G0t!*e-h3+0p~uIBtxO;S9rEMZ$@r>GCxHp3<(WETYBHS -z8M*!mCzwvL(?;mt#F^K|9;x=Q;aJ^e;D(0R>*{-@+Q|r$?^6jcg20kgi)mp;fEyYP -z)rEj@7Qha?p?R*M;V6+T6r~pvZ8%19wvlMwU$MwlA_RzDK!^8vT=eq;M+f%~dny+_ -zi_Ai9q(f`L(xpX9^EhsyrwSi1?3}kU=&KBJWqxl3r+hb{HrZ@Y_iI(79}`G(P%k}@ -zm6b&TZtyEWX%&3|h`Ex-`5i$H-BvpCxODq4#osdcDIei0F3UD)EL_m(;P6GIJm}=S -zWt`6j>{v?S8UL-k)Q+T;Vys7P9}%rewU~GmL{@)w+71P;cjV-9%8YB -z{jXQ`J1V?Y4l=B0#^U<5v5I|;Nu|Ek?$QUHQm6MBPjQ9Uo~Mk&>v7OvT^^d3Qm4(& -zeT!SXe9@x8wiJe9MCDuQZhI#8jMtBEND2pI^z}kvVfRbM?Wl6NsS(`x-}*rzFL9NB -zQ@c_pdiqM@{gbhh*AzaFH;9qSGn@L&K7GY9<#O~NjYW+{Qb_)2zjsZd25 -z@)&uJy-u-3>qE|j=trtN&g-_zslm}VD|H&h>3JN_e4}0<52N!3T|t-E^A$U{j=9_s -zEFRP?rq6`M0eoZ3NDoj}+k$0E=5hFpNb9Q7?{V0%sxY+M<#q&aN8ok@Zb#sD -z1a3#*b_8xm;C2LVN8ok@{?8*|#F-S1XV@&A9U6Q=i2FE!pAMJ3=CEvZmagKb(Gz|C{6m-CQadre1wh%nwr(?JzhRG1g -z*T(S17~UMiyMTwI{^!7SFO2SP(cLhzjVn}gp}Szz=jZT?Z2ha{1dRQE24+D79)0AI -zJkI>+;^i6KtgKu)UYJT5L&(bM@97y?Gw4p-Jh~7lUm;~0I%^s-Z|P%P)dNgFZ0J0L -zCQ&;q!KfLj9i#F9Cul2SS-3^( -z@cUSny~Y!$sfgmBpJh310Vm7yJKR(gC4BB6%fhu?{G#hDTu!xDE2M18@0BlZX5p%@ -ztJvoE+iGNcwhC7%%PRMxU9=weI$2h!x1z#d+{{LyAyr+CaYTokyB9!(@F4DRoUDBiVLT~_!kJcaQ -zD7j4cKS@Sqsezy-5(zTB9mjUj!Rbsi=}Y0vr#^cO^+q>zH6HXtf@#XSxPO -zxj}MT{{(e0doV5AB0aiaN)Xj<6Cds#*)ZKg4thDSH16HLH8* - -literal 0 -HcmV?d00001 - -diff --git a/recovery/root/sbin/libdrmtime.so b/recovery/root/sbin/libdrmtime.so -new file mode 100755 -index 0000000000000000000000000000000000000000..fb3888ef2b964e9eafeb8da7ea237fae68e49a72 -GIT binary patch -literal 5300 -zcmeHLeQ;D)6~DXLY+gPn3k@_jvA*!-^0jO%qZm6*(!9I|NJtuR3JmSC*?lCh?3Zs} -zA^}PwWh#HP1#60Y6Di|lP{y@VwKE`fWHf4-$shcIrZxeINmVup1Kn3)c>d1rdpobI -zj?Q%auV?bxbIv{Io_p@ydvDI&p87`7X0tJq@|c^M+DbGEv(lFQm5gT`Y;)Nh=0p?O -zOr$%YlLKvpJhDMI@i24(*(f%_O7$g-5%Q_gm9d|Bh_N$|Wv~?;Ish7%>~^pL*au)I -zaIg``PGdYhrUt?Oh0^`e3fGuc#Fz;lZ3OB|XhnbP_*>9{V8&k&?~bcdctx8WSrL*W -z+a(2^atQ8OnhgnQXNmOBW;Mo0Uy`F&<>>V}`ZGDYb;1-+$+36m=zDYYZ{_I6EIMt0 -za~7TAUk2*2h8w|WV`mKI*#DZNe+2ym`~|~5-?BgyuQEsX)E!r6bYgs9%C`JLy`PJUph=66b)?mwM(ihhb0#FhoH0eFlj!8ZBrx~)*lHf -zQ90-fMcaKbMUK$uan+BGfev);^ee$^KAn+o$QUUQi@~*u`O}f$tXR`)m$CU2Ux-)) -zThB}>fW%bE=!DebQa1n2h$8)`ZqG;M$iGj(%Y0JMuliwai^nNxh -zy0d6}#%FlqbFd@HcfjYO^JU@~Y>+rQyh|Jt86u8>t`bKA*N9_6?-55bqr@?}o5YdK -z1aVCA@5GVF6mcYRhd2_{h-2dSiDPjbqszw}qo>9m8a*(|P5ol*0xjyV58SZ*?&TX7 -zKDsbw%I7We4=wT;i+tQ7_gUnZE%H8#yxStH7CB^*gBE#Mcu9En$M -zlz2~#<#`W`=CS_kzt#1>vHce(yfi<<&J8u);8^h(=Pe&&Z2h0{H58HjxW3}LV`%LS -z^3U~kTVisq^05k2=lie!gvRjpU#IcR{y*1s{atLhvuj!9@(-q(&)uzP8fg4kVwW(` -zG-LW&(Tuwl4KE1X>*bryP9HAhrmq&ivF?p#;lqZu@{R`abmJc3bW@K|cxboa{O$`v -zL0{49zt@;oPgPIOxO<}J_&PSd(atJQPq%Q?XOB>Ps7BONOC}FB_Xw*xR*TfCr`(gS -zyR7HKA?B``8tMIm#$4aKZGYmzblyyM`%>@7M9I|2CuZ44H1`cQzgFbtJrD*phxdJr -zF+Js)WW1g#ojg0;?_dkv;u@`gOQk4nOPBKh%6@=dP_C!tI*McW%$L72k8F -z_CI;;(kjvZCp~4KTqTTXL%*yQ5tVWC?hEgwBi~H^U>s5Nm+@=?qBe#Q^LFw@5#_|x -z_j?zMJZAEK(s`uds8e+E%u_S!9Xpah%FKX+L2*MmY~^r7>EKL9Gn7ik3l*_YP_cYV_3J$%^r%tDXGPHQmBaK~Hrh$!qhtdv%`ZUgP95t)b+KaqfsiEIjJuZG8(xd*324 -zukZ7sqc6WtPi>(-RWFS@#G)fkzWC@B&5?LkyrOZ5=kQsQ@Zr;yxT2LN^pr@xk9Ur< -zOD$!%AFyu+aKE^57wreX3G@Q50bhmP4xGV-Rstk&0q-Z^0R06}fZc#ibTx2qHQ(uf -za)-d?>#2(5-io53x{8N~iW^vE@tR_BM|x&+lib^k=Pnjtwgtv)S$ekI#W!(@o&?5_ -z&`})S7~+0R0hj>#fJ9=TcL*Han4p9k<+csQn>kr9d`-rE|TaM3rj3j*102($4#NqkiD!2yZDkcsXvQTgi+*8Ed+-;N@sQ -z4P_l@K|iHWSK$A&0vAvh;W}dHQOi)B)(cRL)q%Q+>OQK+2rba59>bNDuKB1Q{D-bb -zsSnj~4LI0T7gDVTS9T2sI*h+TJFY*5|9kW{WY6M*c*Njc27l4uuNwTY!TSw<4xH-K -zx4|C;r&_QAoMO|ML}*Hnc@KHP?Gw`kCh|$Zc%<-DU0pTrerny<7V|4TtJ3*W9Zh+o -zk+nxdLB7gURRz8F%lJsYo|tU~#QfUUCcf)S%vn@W%h?L;MR_H*S@zkEQrjHcBY9=E -zNA2Z#k2&Yr1RLH6K}%uJBqhc?!R|=BJDlOF!aN=Rcn9++ -zQiv=WAr?}Z2TwVCVt5Y(3Xl=y;0`!N(+?L9o`15>uPFZRbUc4p4lqx96#X)Gyla>z -z5DkYVyvsb1s498dBc1RF1($b8N?eX&M2hQIRYh*=R3-Ss!xxm=I@{^(k0tn@iS{0S -z=d>TKzm1py%>6*`74juN+Ovd%0G$EyG51qBWNITn+RFsm%O;uPd^FI0C%=AlCL|0U -zEFF(xE(Yj(CqFt%1UgHk6Oj*{sV@MgADux$FWShD-cF|97a>y)boR_WdKI!sA!;i)p#la;|ekPfIjc7o;*j{k!Z#HB`QX`1`@RudB5nci4do-yOPIQl% -wWR80V4Hz?KwtL}MZ7Sdti|9OH%A`LJKf1R~GHt}owIbUd`2EUs0yq8s3CC$zbpQYW - -literal 0 -HcmV?d00001 - -diff --git a/recovery/root/sbin/librpmb.so b/recovery/root/sbin/librpmb.so -new file mode 100755 -index 0000000000000000000000000000000000000000..78c8367816b9a9b9abd9983cf521d14cc086eede -GIT binary patch -literal 9912 -zcmeHNeQ;CPmA{hZ4~zkYI$#1zA2wj|C7Z;sgb>yr;$hi1Hcr?=%T$u3ho3-SeNP4( -zk|GFgnO#~8HXkKya1$ouQqrp1(j_SbZzkAtJoYu51wgMsNSgISo)m7%k`NFB*6V;sxD*fjPa -z%R(28>7Xh=$%HpKk!{@*g&=}b!NNtt}86(J~PIGd6|7^zgTa)lK40Zy@FO3_4 -z&SLy5#t9PO322;rtRDz_fc~JV`sjuKPyy`dP>wzV(j{nweyaagC=if-4xmJClf#0) -zq{$m7@p%K=1PPsKEp?7lF$Q;IjrhL;_+hLJ^O_2)#bcwyGqyO5Uz)}*Pvcjm@l|R3 -z7t(k~8XrpG9{{~Kg{OGF4fxJP#`1wF-WP$-f#0X`F9Yk1t2F**8c*wMn8MgPVA9WpojUNX8vkHQ!pUDr8owI+&meEpg*lg0$W17LxW5trQ;9m4s$5o*2pDBNV{%qT6u8 -z5*(`uN+v^(p(XIYYi$jB1I!_KTwxcc-6YGD9r$w~M&|Q2X*Mbv>{dBQ9c~RHu^Q#q -zupIWd7cJ75max|+Ycz#KBpN*roQCPSeF%^Zm=2f*z_!MY#C`x^i>Y-C1DNs!{FHYt)1kVQjTOXn6G0hVr4-L#nUTCIcn`=sBg93zz{Y08kC0no4mW&~Uqk -zJ2iYW?$$6XP1-qKg83lNZw__ -zNLn9ZO!ghZ2=)qLOzu6x2)Lgx7T`Y#W0E%rV{$`;k=PN!nA~l`m}r79l6{9T7R1!Q -zWWdyaYG88z!Ty|)*9Oj8F!`S!yl#B!!1eQq3j;bGO`*F}=&ls{cnaN~LhnzZBPn!i -z3LQ$J#T43^LT^l=8&c@%6uLZxUXenVrqC9mtC#%76#eG)ywXzx8KnpNGg#OAJ&JOZ -z?Z0>a!O|oF!tmJSi)SQA5lu)H}%zCC;4<)ONz}L^UQ%+I?r{z -ze};UNcD+yjbp7*+qD1ipceeKBnq9UfzZt3jZuI$$+5DNh{roewN5mnqxWo5DQDk$! -zC$4Z#bQYiB_~qh1R+f)EzGp%7;*F7m*An{J$7A@n(4*u;NoYe3($4>Nd@d?_*mdPN=c&&=(Z*D=4t*pYcyiBJB}_*`_9 -z<@MZpDKcsFz(jLlZz8W}6L0KL;#nUWzkL-PvzXd@ZuP-x-r=lnQ@a!1jE9u?omkcx -zJHHV=?!>Mp3VMvsT^MCk%71$(QvcuU3TN;uoelg}=PwehH0e=^|643`cF(PYkxjh0 -zkhrAhe~MUO-p*&8q5iCYU`xt>`;Ew(3D#iZ9uu!6j(=xMJwEq*YTIoSY7#bf -zWIeyrcG0QC--sFKltaHe#w;tGr!N`ieB!+HvEv6y{I%HTn)Q4YWmME#GFN@x9vk^Rag^{x=wZK2~pU(8e>9`bU)bw^aQSjDIU;x7XA> -zsp@Bo5z;@V#J?K50{zbqQWll?)3Hi>Eniua^pT9fhg{|LtgdtOtL<6b>Y8V4ZJ5nY -zTm6Vqro_J-Gr+bp_NaZOX4@nt^%`Q=5?A^c@ynsLyyh;ndK0W)*Q<;T{Ff59#Y*i< -zwV1O>4-u8A{+!6rTu|nof7W8N#)|Dv^2KUwy6o&2t%R90+UxkABa*@xyHr+;T7vx> -zS-{v!*{D|lGwRlSKo9C!Bc7!ffcw$^9v}ev4ZstCrvO&KK0q$uEP!g@5bEI-;9mlV -zfy)3t0eu1Z1h5l008ITEwYzNZipEz$YYRj+viQ|6&u0uzP{mK8+59v=^KfBTV&%eSr=cG=9w>PKcwHWU|#^|x6|;nAr@%jUCVxyNR8_9k-rbB;cA -zbi$FDNAj`PUmecotAD7(PY>tVbJUz=NVgl{U^2ro_h;c -zv8&P`D)Adb=8xF!kNcQq$J-0V@>_-n^2H+Y?<*Vne)Lgfck$I9eYAJ?+;DR^qP@G0R(h%P@;& -z>Kv4K=g{kekJLO$&-YxK>4Blrn)(rQ9-i0LJ8i*{EQ48W;xohf@kq-cb(1`2B+FH_^D%g=Z6@^eM1d=)~MN_#Q*iqLebd% -z?}OXtGWIZ@9S?w>zXI?VuxDd{yMTAG7PEmZ0Q0$hQR8<-tbO#33I5i-l4~#GbG7;B -z4{^LHYQC6_zHF^8SLqMDV;`4|0&NA`2eO0q^`^?pB -zj=5$c->UAI*+Uy&VVwEmB-ouaHlJVL -z@3YpmJv{3snyJ6^G0fITQc&V>T=IAW&D=bh -zv*4hEob8Xd^o?j!$C=g -z+=hUw$tQ5(AV(*)`viB744sAUFEg)|F?(P;4ul?#g5@lj8Mg(qoF`L2V`GAwa|c@j -z;WUB9hPq0w4in@aM@|-Vjman-Zb(uO*+}M*;=FGj)p;jn=m1AD>Zva+-MOsJ)yk=d -zz+@zX#3Ak$fy3PyTWb}u`cG+L6^_n;!EmirWUX&$`_*4 -zIyj4(KtYo4F~E5PDYh4n&CMIY!P8H%AR%KmD?Ay^ZQ=|IKar&8Ba&MhPV!O41{z8c}=7PngvJaCmRqwZhLmU__F_An*oKH|FXDr8PwU>B#oZlLXuEFJW^ -zfb%AoTAf^~5A{XFy*_9=kGJs*jAvjx1LGMO&%k&F#xpRUfxln|*5T4_Gr$Kp56Hv2 -z{&j!|APTsGcWXGRvTnTBHv%6A&^<;q&i8cJL3cC+BRI=Kooxg_O}&@-R8fL-K!GT$ -z#^IFiPUtQKqO2N5Y3x_%$8nm?MJJtK{|+C7pVRP*8h%;B=QR8}@MOsS3ozXa(ftVB -z1CcHAL5=Q$$j9#x2gLr*tsfKlO99>EjJN;S8OUU7tEyIVmbFi8SiqH8SEzfJ?jLCn -zqmwlUeI9P9b?H*@6_4UWy=Z0zJc=x{qOp$K{?{xkH@hOoFu|Cck!N_oIMtMIc+fCC -zqrmWxac0KstU`m$fNNMfd#QJ-ixvkyU{+a_!&2DQ#H_gL7NiifdfEbVn?H%e60?df -zS!7m8@X<(;2;qH?71!$cglj7#XBai!zD?sHr1}n -z?{zb4a}fGT6i=VO1A2X++C{P?M>UIp7^;Cp>h*>0m8nma13~qSYMI`2 -zvIrei??{en9KmIc2U6{kObCT1r5*lz3_+gR2krFhG~18caYnndDHa$K>dL -zDij0NUcF`|K{ZEAKQJfo5hza_1 -zBj_WN#-GwK3~6(_BeT{eKeVXuiZ#)8l&@ -zH2J4~x2luyO|g?@0 -z_DK$@8EZ5~a0GxQ7;E{Eqwh7n>GsZ|13p7~e<|cv>I^X1qILnG)5LGRk6-F189i6T -O?}Xehh|rpD<9`6ZVsx4S - -literal 0 -HcmV?d00001 - -diff --git a/recovery/root/sbin/libssd.so b/recovery/root/sbin/libssd.so -new file mode 100755 -index 0000000000000000000000000000000000000000..ee9dce6892d9aef23e47dff8dc3e1760ca01bff9 -GIT binary patch -literal 5296 -zcmeHLYitzP6~6nxEcOB$0>K5Bj)AI+64pzCQsPtB!qGuRXM)tRxe -z4XPc&kNhB^k@9HLrceo0w0YEtibPXLP!mOnqG}tpRa&aV5G*HZve*c;n@5>`-|UPT -zZQ80;epTw#o;mMx&%JZ+-E(JfZF|z^^9i>FL{zxkatK%6U~8r<7m^4;caxYS>L8-d -z1=|5mLC6RJ>cG2jBX|OJj7{*i_rgLDrcfBE>JQHl;_!khC~znM*e~^dpd-*9fu0b8 -zjzB&8*gR?~K%Z;2Kco!T)F6ZlQOF4NC2WDexBne*Ah_{cjDEvZvn`!kt|g=8cBwj? -zY8uQZ+bmE>d$N)L@+2n&`NcK-iW>f#HGHCmzqf{epoY)a@Ox|c{T`mL{7Dbb{9XY3 -zahebc@GPu^S8MdI*YJMD -zK_ghAS1BTqrv#XY8$F&swG{V@ufQ0+%C>B)fU{I?ps5 -zHTL<(b2r&kCkr-?$wt={&y=EAB!gY -z+P|0R>-adaH}Ttwi2EKNO!%L&%F8dA>-rLb@5j5BBx!4vZ@m<`Dh7ket3?rAIsWWW -zOZUpl{^oH4-{KU{b$#*OF -zo|lv1g=Z_FmDdvQ*wOu$UK*QzRcu~;IqdgMtZ48hpPPu(-<`C|ZKM0f+nkJdhZn*-Zk1my$zvRmGm@1*9D{r% -zqrWw_Xni2LsI5+_j{FBDAz9_0maOv6OAFcpPY)yl-F1*0C~c@j_68*Q39;z-m{oqJ -zG<5LPQ&POglFNZ*7L1gH>)t=7Hh(Nvpi6 -zRKLEyZIS&hryzUrgjK$Ua}qC&MG$u$&W3ix-2|F7T|KZb8Ce%P)^X+V>b`_nWR+Kx -z_BGWP*EHQ&Y*;6n8`>I@efG+@wG{f5kU}S?qUWhj&(}U;?9j>I;Ou!3u;lNS^%jP8 -z1+nLBh#cFKXvF)PR|+P5@tMV0Sjhr>V`)`WFc~S%Y!l4`i3lV&m84|kWEhddPUPZ8 -zluUzUnj<-FOT=p#^s@u71<;4Seuutx0*?Sc`m*oA;o)E4^ut`fL|W`8o%zffyl7d2 -z!`A>m^ACkVj{vq&HhgsGG%(!7)~yL4x&N7Zx|fB5v{TkHs?sXyswwr#nI5%O`l?bd -z*6Mm*m+UGcxhr2s!!(Q;kVPCcKMAe9REchyWSpOb8-W;>j1 -zZ&xD{pL8(u|HfRjC~9v@XC|NC)l$gF=FYsHZOIzhl%b^4v1Kit{Y!IlR&7Ct!pW7j -z2IIOpAXVe@i8F6+i6R+2>9ndUs?yA1Rb#bEYglkFnk+drh@|Bhx>`L*n&C`b^K~D) -zCYkKMItA6)g^@jixQ?tDm|mK6JEK3oB?&snz%@odM)TOww38>Vi`og#*tld2a) -zOzF=V{n;uubrI{9jcyUs)eJRNqL48~4A(R~(RB<215`;(>4Q<;zLUgowbN3vuFL&) -zJUOeSMXW0izp5VDh*&zG&8oPz#d3L5jdkUEV3ARl_NuypleQXHHcegY>@ii?!y=`q -zojqN=_hTUcapT(KJLh`zeiv~Axa)!6NoY$uu35q`fO~*8?t0?Ahceo6Efctw-R6>u -zAmDnZ9oIPFxWfb4@fdRnfbX1k+)D)RCGu>v;hwq`;M#Ey61XR6$9s`$cROh2z`f_L -z(Gk#YqaE9w0N0Ltoe*)A(7EI)$Bz93F+l|8=Qh`_9RkEF>;v|G-(l`-v?Kj(0Q=>5 -z5{N}OM1j+2M>YlEy^(Wme~-c@cl&~9lHLWHW2K$_T?%&mCPkjj?U&y-7?*P1`<_Se -zdqBI*jolA{YbPWyI7D0>ZC!d0G{?huK?wjm-h18V+UIjbj-1{w+ -zvth(@%x!MGBM_j^f-8^1uGM9L8H??g0GB5J0POIaY_5*johvE_VD$Q=)%6(v0PGM> -A>Hq)$ - -literal 0 -HcmV?d00001 - -diff --git a/recovery/root/sbin/qseecomd b/recovery/root/sbin/qseecomd -new file mode 100755 -index 0000000000000000000000000000000000000000..1301c69b95f826f55ec5a2fa83847175f88e1628 -GIT binary patch -literal 9644 -zcmeHNeQ;FO6~CL!CQC>mDk>jQZ}_kq2+Ib84Tze+vLs8sOhA!ZH!r&{*;n?f@4Y~h -zqDE~yYHh)xGB~v(6{eF~ok^og&cw0Pp{=b;AO&l~MhChekWH^##Tb!;G-a9mtv52Z)t#Z50>)}V6qoYB -zvIO!I$R~2aDG}vUjJwA55a3hEEDtSA6PrsJv&aP<5tSusNBP|NLnuIG`Cp-RDX|q1 -zCAM8wVSdE~^K7~r+?TQvV-Nj^)X{dGfA2 -z`QbeIJ9+YV^W^<`@(X$LaGw0zJo!z?PkJ)SGWLP-cAoq$9LV-xUCy-E;n9f3xctVZ=wEifpC0XiH0===FN-PuzCK9mnupU`Y -zB$N<~%27?$Swao!5eBXYIzTTVC?zPXJFaeLW~`kO0wz>ASM~k?<=xe>VZ-`(G@$8{ -zst2S*f+eJ0O}?ZL_v)ee&R8akD%Z^da!Ar8)T>L=G6kWEg%}zr+|{==y0thdf)@7b -zN<`5F)(ET>SSQdcut8v(z|8{h6WA#*BrqZ{A+S&2E`fsr -z9~1Zr+H)N`>o6fUz}E>e07nVYnZF@KM;#+X$Gu62P8=n~!2N*`9ebP*o%{|VIyFg% -z0X{{D4n0FS8~Z+C8Do=#m=Na(u`x{%Vh}zi#K0FOmyZ`FpBtZ*+?{kz{&IY4B|7_e -zyT=ONcyes(h1bU|zAcAu$l>d9_}U!alf%1mc%H-0&Ed;(cxMjJa`>sKOZAz|;m_po -z$sGQ84nLa19|NCw^@(A&WP6kS>B6Ut^r6%)ui~%p4S4N7J2%o#q$+(bADi59!RF&5 -zL4OgaJZI9z*<=Jd&qzS%jI^HmX|e$N&I_)Qulnt#rIG%6s`w>#bG5H@q08skSG3Pa -z_oZwVD}A^4*ghvB^rc$Q4J3^8K&sH^8fj@P;w}Du?|`=?nbGUehe!O-`%S%(u1kGu -zqych+DgXL((Vj}*>W0;uX8fRdk8_V>$g$T*-=8wlT`A_8@#i~Xd8a73IAue``%)#N -zYa8u+tXybD -zKlk-}Th9#!2cT(4c}6_`YF`m2>BF;yNw=`ANmapLmH$DsrrKwuPn|W=x27s#Yd3A* -zIm@A~NjcEIC8mdE=vyN_dUj#MqQ<3&*AHoFs&&%vlnf`1uwOC0ka_I;=dHr}cmSKn -zUeGTN#*?kzu^=xf$!!FpP7cDbU9tE3Ol9oowc~ -z(}VJ?<0Q6_65?+$R-7mt-89A?J8~x9)+Op`X9rF=%NC56TQXvnARa?p%CpKJM!fq_ -zhvo03*E@XMT9)~?`5*H==w(k0c#C+ouY9qQE;xJlCRXuHZ{bBp&4I9yW@kGk9J(f- -z8oUd0zS?&%Ok;R}z;=9cIir%$S2pX3o3;KZiHof!Q(OE%vcJc771HM<)WW1;ci} -z8hW;Oz@lT)~&rdjfbuTYP{H2J060M*)`vl?-ZM-=r{z=#lPTcdFg!mPH>X~Zay;Dxa -z*C&dSH=5C@w2_V=`mE%9M4xX)wF -zcx3R90sZjM;4vWSqmmNK9E4h%y=ypYQZ!wT$?6)8bC}%6Z|6%wRXnW7s-yj*lH+cgst@l)Ntv48y<&b8YtXU%ral&);1biJ0I0Z&zzC_D2godlK -zo^ifJqu2=Gvg*Pcy=GRW75H+0Ri?vkNr|v-B_f;0Pae*MBCQ-^3y}h-44R3F2UKeO=Y1}MgR&gyXMIt;F*M=zba=mL$&L-{16vwD -zzmz5idsUhDD%r+}(>Iq@HLi*?xDZ6ULmVgXsG?~~Jcd!l0X*BBY(tb-Pqz1%&m1G_ -z#GoqUgMnKe7?R{@JXTS`S(~Jy&+;<3)t%;PK16m_$^3redKj)lTBaKjy@IT@e$8!J -zYHn5Tp@CH~U39fqW-GcCHM$dlS13`bM`qjQ{-^{4))bdQ)BsDNa(q&lZB$T}oMv;} -z5!ga$eloN+b8r2I=GGS8zNMw5v1Q|D*H_E7jXr6t`gVx#lx#fA=ADWjzI^TcXDga# -z9QD-Y=%rD>cZ`~dcF~szq4?%8*w!Q(uh%#(CP4~cb4@~#KbPr7Tz;q8x_rP=yO!vTa4@~#K|4$F#O3udM*IdKy+={PRV-`3B@(?C -z;hDmGBRU4B^mgQjp6;dQ;1At1odOY_7x;<55-3T3jli1(RtluMGW=tA;137Vdvpbm -z>N5}233-8#={+|Lxm?J2o;K|+qTb}=izbRi{>dlZIp?N2H2!}@3F;}+s8aSleflVM9muNC#0G1U?L+G1>=w -z9`rL1CCXzP*RNm0T^n1rRPq{ktvQDD=15}+CF_YtLcH2tT@AT@HU60Iw#$v%x>rSY$dH*1(s?<-haGfFeZU`2S2vSrDGIviLelkVz5X{`T*Nd9I -z&3HYrURXpz%Xi2sU3Xk*^)mZdSaw` -zLH>?HK}356$&|>3*62!*Wk-7q5$!o-M@!1GyA?duf%X(@T}^?v64_Cr-(XmFwQxXG -zNEH^zva5$ob`)nV-dKsO_jEF~?6!c1UE&d7?r%}3?v$+hb%MA2?Se0&+MKwQM-&E8 -ze^XzZzn#G*Wch+B8+Rx8Ss=2bJ*M+B>>fq_Y+*lhrRjf@Imz{=+za3u0Pi{#bSgAyWIuAN^M3Nq(t~P-WXY -z1fKknD@tTX{bVJ|BN_qaZne+y%zh5FnXI_SAR%T#sM%r8*cwX!k}pcfK^9N)hy2rV -UNl!M^1}ha*Fm~D!fR>Mc1H|$E`v3p{ - -literal 0 -HcmV?d00001 - -diff --git a/recovery/root/vendor/lib/hw/keystore.msm8974.so b/recovery/root/vendor/lib/hw/keystore.msm8974.so -new file mode 100755 -index 0000000000000000000000000000000000000000..33fbf58f1e94373d6a95203a25ae8c7fbe7a382e -GIT binary patch -literal 13532 -zcmeHOdw5jUcHfiCBtr-i0k0HdI0>K=kV$w5h_3{~$s`04o<^^A=49rCIWRA0CLy6J -zY0IsAUQ`6c0N%<~s%TM@tNkwV`k-EFt)*?Sv?6--$Suu-BnB_u8Idymt@D^127I*r -zzWYbN?C)Fo?X~yXd#}CL-fN%ib7s@xD&Ax=F+HU-8`HTtD12k4Qe&CJIA%rNI5w7L -zpor>pQW~I<8D&K2R0m$CvEYfQj`}7trl&Z@h%8i?qtC8a$|(N&215o0>lqKt^z60JacfDAkzCUiZn-}qQ9t4 -z3KaRIzKR<=XG?R(s%aWYh{>Lf2D}@(R_;o4# -zeJOlX3co3Z|BDpOE>!pC;lQxPPD@4U6Da!l}0lyGJ -znGo=VgObPT3$AsB!crj0+`eE$WKz%_^-;Yj)Je{Uzy>Mcak@hx2oH=)>ni^-#lErr^#YskpM5MI=Ce89VYgR8r^^lyR5A~yD(7T}aF05mY -zr4`I6dW5Ke$<#$6&PY@UM^O~;FrQTCwnu^rhMPmtpvHK7S_VeZa()dXQIC82bYj+v -z*n+{ZX!l3_^KYIvhsxk5#_~b5xAH)g#)GZ}<$^|m$hX&kDAAsr1VSia9Ejq|1km>- -zxcah0af8wbP$uXqkQGFU;s(XGY!K;4X&i{+WEN;7=#M}YBS(WMO$1T=Bi&hvie?RS -zG#sblcnxzk+<6D)1SMMuF{!5rG1xvrD7v2z3LPMXat8^aY#Sja@ERc$J46WO-XMhX -zhY4ZCBZQdXdxTKO -z;fOdP3~_-F4m8U%PMhVYPhTZJCR+#JI(?Lap#^s=&RcQBX(2SnJ -z($W0GZD!uqu?QnCQgqCg7dooXwJdLfwjT^w@-k1}fx0_1{eLka%9)rWn~Yfszjfsg -zj?RGeit0foWNgoT-14H^HKW3^%eo^GJ21d(mB&W3GFy3P){BJ|3*)(?Y|!JWffl~z -zSLVIx1(w~9bX!fP$%)whfkn9){K#XU#aml4xa%w9uvRH#Hx9^NN5@!ss%ykv^Uq{g -z3ID81blo6KkuAFuG0#A8dv0Y0SIW=k$+~p|Bc677)1I`pQ{Kjpsz`g0q{s_nF^jR< -zES3#i(@vVyD0a$fd$W7+Pubh7V%*`h3hQCAGsTTvpcg>r5li*~w*qT`^FVWu=YgVv -zmwEa2HQ?7&&er|k-_tc|_ah4}ohwkjLXrElYt-3XtHeHxvu!1O=B^RD60wO1X0x1J -z0+}U>%u&b`XV2uhf`5u4o^T=w>l;;h8{)loO+GM~+6C*v$f -zaNWh9jGMV|Qzdw+uw+s?A9tS1XAB77lyqprwZ{Zr+Vf_(mwZgY-LM(?$hd3BhmWzhk0SnC;g>_e3BY~8DZod8MZhK?`EM2Q4&XaDH;%xUJAoenn}DZ* -z@N0Ps|5<$h&#nC9{Q0uw7{}9}!82RQ;A1Vh9M)IAnV;VwKsQ0tdP@I;a)xUr&%5q* -z(C(@2ce$8tN#~C%n!&BSWZdM%`+qu25d3)h$3B -zC)hfcqi(rUH&L$9>TX1x3w29Tw^XScC0A*6c{HBDY_}hCpw^+(Vn_E;-1$+z=(5XY -zC@<5>-|f3zURc5L2R$pW`l`>dmCt(*mAhWO9c8yy65m|*ymw>Sq4JzpZ$Z0Tw01A{ -zQDiyPN4x3EKCFqkGv(mmH5qo9$`AH^)#Zh)diyM}+&>@V_~78kj6`f-U!Ht*rD^hX -zM_T^$Dt5z9y0ckRndG^@tlMp?v@I!gY%D9R_>;1~i(6Zo%6dJ`WjBiJ#aF~HL|eU7 -z{||9iQ_REP42A%>%k^c<%U!Yp#)3FAo -zffgW7SOB~YSOr=R`eRTpo;7NLv%g6sVt5|uz%$5S;h1?I&niz|NF-+T{H`>c|4p20 -znZ%E6KXjIjwj6W8MlQuhH_3&Dm|&MnzASU^S!nrSC?-sit=^TD+py1v*2V<+SUh`N -zVTT$KXysomACFsC%;;E!o>wV7TjfNo43>2m)&_R!8F*p-M%jGU%FtpAD@erV_SvvX -zD$ue*X*o(Zf0Z6OjuEKV*5?%*9mdu0meR*+^w0HW;B*)|0S3D=@~6SG6Z%ZH%ueG< -z*ng&2F6LQ2&aysBp7oQt71Q~-L;L>>hu+>hV}`afp~uWh(o&5LTh2_B(_SdWnOID# -z=*)qIS9MN<%(Uc5*m#Ck(>rI_RBC0B--|Pb6UTb1i%q3ApPo_UxqPOCPgA1#!X-=HgfEULybUE4C@?qxC3RUwMlb=dEPz;$P#m -znBGy3ntDZcn#}FVYR_-Ab+}RHR?0Z#)EJ66a@SJtP3`K5qdql!*p>P6&HM?R4#j-t -z6C<8T#Ii3iTjt53lO_@C?0vT@`(Po?hxDCf*S=osZk!SBQ9IHLvL9DZht72cu8(15 -z%O00LTWmNj<~ne4Y;H2; -zpNNkyZY@vWtDXl7a2_m3u7^i^=gZaSa>8^XWHSde9v7lBVI|H2wBri-Oq>hba4y&} -zd%H6GL@eCPis)R}Qp;v!;e^TH3M<)@>bbCGK4Nn3DD0BWwG@rE_h#}n9R-jn&|0tR -zrL{8coAR!#vt|>m;%G0V9r>-?ZnLYHAML_f`pwW;@;d(Kp!M?{Pyjv(Yy@ruJ^)+? -z9Dwg@fnNjX0`swEet{VAZ#ZA>2c7`BfZf2`fnNjZnT>hJ;~C}AUN(8Mi{o?Nq_wk$ -z|8w6CJdOR7zm}igaW6E#SJB)eS6uQ0G1x=v<$3vaL>g0P?w)BKcS80~MfQs>%S)MO -zOHBELcbM4qHr}!;6Hf?P-?S~XoUDdawIcNio)B!>6M_{_2#C-<8Lh|Tj&0`2BX^_~ -zWNpJLXu&EfF`q3-FK{j3t-I+N!P=URr-PF{&$|%CT+m`3e4cS6zO}K0{|MfuXMl7( -z16Z|ZfScg+o02}?*>eMY-dU$U1yGA|p^}0_G{SktceV))@wG-~+%~;C;YZ!0X`Sw-EQg#&g0}pb6z6 -z;22;fkOR)>NtBP~f8yJXGoiR;Mn@&|sZ{jIl}&|No$7g<-2I9-AC#vVBCu6f&ymby -zrD$8K&E;HoPnX?GzK8YK&hf%GS@|x(HP-vA>w})O$?!u)G4|e;#v?uE$$u@u7kQSG -zv(dwBrHA*rV0{5G`tg#2A}ODzz4nrXCCeA{2e8wOmVc{z$nseyuSXx(Ut;-}yPs8T -zZhj>Zo7Gc}*j>|+2dO+w*T3wZ56?V&aht*JZ*`})vZ?7$;QVIu70V-zmn32vF4}lA -z*&gTl>-Z<_m$2;t;J*O31CIe81a<;%1-1dl03X6x{d=6l&w>8{cmRCUmx)a;WVW|- -z1KZjTwB-H{cyL5Z?K$8p<63OLr}CFus^W=F2h-bIs?MwBz6(@-prwiMl`$>1UQBFy -zd31YATOzRuL$T$Hs+TSio0kf>Ne#2b;czg#V8Lp-77Iy%wOmE@GHzi*eZ3gw>IKOs -zdbkZz)XRm%D0dq-)uT5cv8AFv7;fhH6^j>h%Dvf@TPz9&aQPPHxZ7^ymaVR;(!1aS -z4L%>|#Z8<~ME`D4Y7{-J$RjouNkQC(shTYk0)b$ZquVq^H&jb*QLk0hSXx@6jjR{* -zs^-xkr`-2(xS}IX>w{s=7Zg04)^(y`Jhg(6eUuAHAqtyvx|!A}+N)h~n2{e&(4A*%2ncoX2#hDH -zIk#_pq);^$l)F;f1)QOkM~WyND9tVrPZ=pJMnW@g$Hio{0fxcElVjkL(XXygtT9D@ -z#dpbKebuNdlrA!tuUx!%QP5vnQ$ZJ!8mC@*I|xGJmxvgqYv$r5iv -z)Dzqg_yKK=lF8<{W_7y#p6?k}m%5~xKj@L_CGm&0zeIefqo}hEKHVUBqTcUQ!YHb3 -zdH7!0C-+4}5l-V^;II&GW<`xqIT$Xgm%{!HLRc(HdV~#?DVvM#i4_+z-Pn3Tn1es` -zg;?DX4K+l$P(z(ha&r*THcE1ztZWE{e6WUE=L^Rg}QBK=pKcESG)ZoJ!*IFzJHuyXoX`yXRk;5fEhZhJ9ZVDD`D11o)DJm)NF*r`^ -z<;u011$E`v6~@rtC|q$M^(_MzjtCqV62gLC#OV;>vRD=3ZZZ(UR=0A+G!HczUSSkN -zs5N+%f|b(MtZ(m353Lm6zAdm;1ZcS^p-=U;77U?SG)RjUyBcw%t~n}3m~@FSNhX(- -zw(h9R7@w2%D@j-xCM9MW;@lOZ<7ExMBQ#zntB2rk4~#=iG&>uDyA}*}GfMtYFdTJa -zZHELYe1$_wwI%A4v(~IaMam|i<5E3f^rO2%=~UT_|3kxE-ts#vbGh*Mo5p?lt}?7e -zeNId_&ss4ch7l$%H;_Kp)qx0t4{WGKAN~AAS59S%D5p6+#IT?m#`Hnx=ua_Rxi;MY -z#&qA+_S=^Vlu=&Pu_bzR~6 -z*aE{A7`DK$1%@p!Y=L153|nB>0>c&U`7`aYDt%cSo~sW1A5loEY!N@L)Yh9JcLPw61u -zeg2_{l`tmZ-Rr8QcRFBulZyinx*udl-5)HKFIt4FnDS+-3%NP=`HF4v`bj|)vb8~6 -zR?f7~oQbm1oAF2aG@6-;khPSqSjsidV;NbQrB>63w5;@O)75EX%;QYgn66D9Z<>%c -zF+DG%z*J_^ZzGJK4Nv{-#EZ-x@#5k$D%3GMzQPv6A!he92k5J51*2hR_X-g&vxh|= -zm8hAJFUsunR*Bi6f*s#>dzw%aRPGt=`1V_J3gNKOtaKvyB{#FL4MJG0r>iU6;4(Yz -zU`6}dKm#g$o*8(j6QMUxN|!=38kXuB=pK&>o)!(&Z>75K)XEIokWW++5^I2W+F{KC0D~(&PZ_7LYDSv4<#^ -zHoBImKT4$_$c6q4X#C9x=|o8%w+eackMwN9_sv98C@5%&>WEf>=sRz+q4FCSyV?g> -zCF$e3z|kB?PWi11& -zP_3jb$mD2w0;(f=07Q1zQ!C^sF6v3|Zzl?%TSzZ|4RQ-~21tET+7Ht6#1BAjJY}?` -T*AdcO^^}32@T$%Lb-DirT-=_v - -literal 0 -HcmV?d00001 - --- -2.6.4 - - -From dbf5fe10fdeb2c12bd7223a3bf25875deae17565 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Wed, 30 Dec 2015 12:47:00 -0500 -Subject: [PATCH 2/3] Fix TWRP - -Change-Id: I1ee4bf2b3d74e6eb5fb4c64929c7ce61cc57a370 ---- - BoardConfig.mk | 1 - - rootdir/etc/twrp.fstab | 29 +++++++++++++++++++++++++++++ - 2 files changed, 29 insertions(+), 1 deletion(-) - create mode 100644 rootdir/etc/twrp.fstab - -diff --git a/BoardConfig.mk b/BoardConfig.mk -index 6bfb764..48a2d67 100644 ---- a/BoardConfig.mk -+++ b/BoardConfig.mk -@@ -221,5 +221,4 @@ TW_INCLUDE_CRYPTO := true - BOARD_SUPPRESS_SECURE_ERASE := true - RECOVERY_SDCARD_ON_DATA := true - BOARD_HAS_NO_REAL_SDCARD := true --RECOVERY_VARIANT := twrp - TW_UNMOUNT_FIRMWARE_ON_BOOT := true -diff --git a/rootdir/etc/twrp.fstab b/rootdir/etc/twrp.fstab -new file mode 100644 -index 0000000..af4036b ---- /dev/null -+++ b/rootdir/etc/twrp.fstab -@@ -0,0 +1,29 @@ -+# mount point fstype device [device2] -+ -+# firmware -+/aboot emmc /dev/block/platform/msm_sdcc.1/by-name/aboot flags=backup=1;subpartitionof=/firmware -+/rpm emmc /dev/block/platform/msm_sdcc.1/by-name/rpm flags=backup=1;subpartitionof=/firmware -+/logo emmc /dev/block/platform/msm_sdcc.1/by-name/LOGO flags=backup=1;subpartitionof=/firmware -+/dbi emmc /dev/block/platform/msm_sdcc.1/by-name/dbi flags=backup=1;subpartitionof=/firmware -+/tz emmc /dev/block/platform/msm_sdcc.1/by-name/tz flags=backup=1;subpartitionof=/firmware -+/firmware vfat /dev/block/platform/msm_sdcc.1/by-name/modem flags=mounttodecrypt;backup=1;display=Firmware -+/static_nv_bk emmc /dev/block/platform/msm_sdcc.1/by-name/oppostanvbk flags=backup=1;subpartitionof=/firmware -+/sbl1 emmc /dev/block/platform/msm_sdcc.1/by-name/sbl1 flags=backup=1;subpartitionof=/firmware -+ -+# efs -+/modem_st1 emmc /dev/block/platform/msm_sdcc.1/by-name/modemst1 flags=backup=1;display=EFS -+/modem_st2 emmc /dev/block/platform/msm_sdcc.1/by-name/modemst2 flags=backup=1;subpartitionof=/modem_st1 -+ -+/oppodycnvbk emmc /dev/block/platform/msm_sdcc.1/by-name/oppodycnvbk -+/reserve4 emmc /dev/block/platform/msm_sdcc.1/by-name/reserve4 -+ -+/system ext4 /dev/block/platform/msm_sdcc.1/by-name/system flags=fsflags="barrier=1" -+/data ext4 /dev/block/platform/msm_sdcc.1/by-name/userdata flags=encryptable=/dev/block/platform/msm_sdcc.1/by-name/reserve4;fsflags="noatime,nosuid,nodev,barrier=1,data=ordered,noauto_da_alloc" -+/cache ext4 /dev/block/platform/msm_sdcc.1/by-name/cache flags=fsflags="noatime,nosuid,nodev,barrier=1,data=ordered,noauto_da_alloc" -+/persist ext4 /dev/block/platform/msm_sdcc.1/by-name/persist flags=backup=1;display=Persist;fsflags="nosuid,nodev,barrier=1,data=ordered,nodelalloc,nomblk_io_submit" -+/boot emmc /dev/block/platform/msm_sdcc.1/by-name/boot -+/recovery emmc /dev/block/platform/msm_sdcc.1/by-name/recovery -+/misc emmc /dev/block/platform/msm_sdcc.1/by-name/misc -+ -+/usb_otg vfat /dev/block/sda1 /dev/block/sda flags=display="USB-OTG";storage;wipeingui;removable -+ --- -2.6.4 - - -From c746b729a2092715fd5c6c5b24f455ea4eceae65 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Wed, 30 Dec 2015 14:19:08 -0500 -Subject: [PATCH 3/3] Enable ZIP file signature verification by default - -Change-Id: I9a62794b299b63dc5c010205cbfe5afcbc2a632b ---- - BoardConfig.mk | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/BoardConfig.mk b/BoardConfig.mk -index 48a2d67..8624c93 100644 ---- a/BoardConfig.mk -+++ b/BoardConfig.mk -@@ -222,3 +222,4 @@ BOARD_SUPPRESS_SECURE_ERASE := true - RECOVERY_SDCARD_ON_DATA := true - BOARD_HAS_NO_REAL_SDCARD := true - TW_UNMOUNT_FIRMWARE_ON_BOOT := true -+TW_SIGNED_ZIP_VERIFY := true --- -2.6.4 - diff --git a/Patches/OLD/Battery-Power-Saver-Tweak.patch b/Patches/OLD/Battery-Power-Saver-Tweak.patch deleted file mode 100644 index 86be4d8c..00000000 --- a/Patches/OLD/Battery-Power-Saver-Tweak.patch +++ /dev/null @@ -1,31 +0,0 @@ -From ba175c7252b77fc25384bf76957434193800a8f6 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Wed, 4 Nov 2015 23:14:54 -0500 -Subject: [PATCH] Dont enable battery saver when switching to power save perf - profile - -Change-Id: If011b0ad5b8aeb825b741671908ef548ec95d951 ---- - .../core/java/com/android/server/power/PowerManagerService.java | 6 +----- - 1 file changed, 1 insertion(+), 5 deletions(-) - -diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java -index 4b2ce36..a4bd55b 100644 ---- a/services/core/java/com/android/server/power/PowerManagerService.java -+++ b/services/core/java/com/android/server/power/PowerManagerService.java -@@ -3421,11 +3421,7 @@ public final class PowerManagerService extends SystemService - public boolean setPowerProfile(String profile) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); - final long ident = Binder.clearCallingIdentity(); -- try { -- setLowPowerModeInternal(PowerManager.PROFILE_POWER_SAVE.equals(profile)); -- } finally { -- Binder.restoreCallingIdentity(ident); -- } -+ Binder.restoreCallingIdentity(ident); - return mPerformanceManager.setPowerProfile(profile); - } - --- -2.6.2 - diff --git a/Patches/OLD/Change_Toolchain.patch b/Patches/OLD/Change_Toolchain.patch deleted file mode 100644 index dd4c629c..00000000 --- a/Patches/OLD/Change_Toolchain.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 216cc9fe474a16a0105e51d97f7bc49c2e52a0da Mon Sep 17 00:00:00 2001 -From: Tad -Date: Wed, 4 Nov 2015 23:11:47 -0500 -Subject: [PATCH] Change toolchain - -Change-Id: I135e9cdfaec3a70684ee3b3789fe0588d1237712 ---- - core/combo/TARGET_linux-arm.mk | 4 ++-- - envsetup.sh | 6 +++--- - 2 files changed, 5 insertions(+), 5 deletions(-) - -diff --git a/core/combo/TARGET_linux-arm.mk b/core/combo/TARGET_linux-arm.mk -index 95b1804..177948b 100644 ---- a/core/combo/TARGET_linux-arm.mk -+++ b/core/combo/TARGET_linux-arm.mk -@@ -35,10 +35,10 @@ TARGET_$(combo_2nd_arch_prefix)ARCH_VARIANT := armv5te - endif - - # Decouple NDK library selection with platform compiler version --$(combo_2nd_arch_prefix)TARGET_NDK_GCC_VERSION := 4.8 -+$(combo_2nd_arch_prefix)TARGET_NDK_GCC_VERSION := 4.9 - - ifeq ($(strip $(TARGET_GCC_VERSION_EXP)),) --$(combo_2nd_arch_prefix)TARGET_GCC_VERSION := 4.8 -+$(combo_2nd_arch_prefix)TARGET_GCC_VERSION := 4.9-cortex-a15 - else - $(combo_2nd_arch_prefix)TARGET_GCC_VERSION := $(TARGET_GCC_VERSION_EXP) - endif -diff --git a/envsetup.sh b/envsetup.sh -index 51f3253..b5009ed 100644 ---- a/envsetup.sh -+++ b/envsetup.sh -@@ -142,7 +142,7 @@ function setpaths() - gccprebuiltdir=$(get_abs_build_var ANDROID_GCC_PREBUILTS) - - # defined in core/config.mk -- targetgccversion=$(get_build_var TARGET_GCC_VERSION) -+ targetgccversion=4.9-cortex-a15 - targetgccversion2=$(get_build_var 2ND_TARGET_GCC_VERSION) - export TARGET_GCC_VERSION=$targetgccversion - -@@ -155,7 +155,7 @@ function setpaths() - ;; - x86_64) toolchaindir=x86/x86_64-linux-android-$targetgccversion/bin - ;; -- arm) toolchaindir=arm/arm-linux-androideabi-$targetgccversion/bin -+ arm) toolchaindir=arm/arm-linux-androideabi-4.9-cortex-a15/bin - ;; - arm64) toolchaindir=aarch64/aarch64-linux-android-$targetgccversion/bin; - toolchaindir2=arm/arm-linux-androideabi-$targetgccversion2/bin -@@ -179,7 +179,7 @@ function setpaths() - case $ARCH in - arm) - # Legacy toolchain configuration used for ARM kernel compilation -- toolchaindir=arm/arm-eabi-$targetgccversion/bin -+ toolchaindir=arm/arm-eabi-4.8-cortex-a15/bin - if [ -d "$gccprebuiltdir/$toolchaindir" ]; then - export ARM_EABI_TOOLCHAIN="$gccprebuiltdir/$toolchaindir" - ANDROID_KERNEL_TOOLCHAIN_PATH="$ARM_EABI_TOOLCHAIN": --- -2.6.2 - diff --git a/Patches/OLD/Defconfig_Hardening.patch b/Patches/OLD/Defconfig_Hardening.patch deleted file mode 100644 index baff4294..00000000 --- a/Patches/OLD/Defconfig_Hardening.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 1e69f23b5f6f31406240bf61d66db3ac6a19484f Mon Sep 17 00:00:00 2001 -From: Tad -Date: Wed, 11 Nov 2015 21:01:29 -0500 -Subject: [PATCH] Harden misc options - -Change-Id: I4c82dffb19a5448b01df9942e59642ce96cf8416 ---- - arch/arm/configs/cyanogenmod_bacon_defconfig | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/arch/arm/configs/cyanogenmod_bacon_defconfig b/arch/arm/configs/cyanogenmod_bacon_defconfig -index 19cbbdb..16ffbdd 100644 ---- a/arch/arm/configs/cyanogenmod_bacon_defconfig -+++ b/arch/arm/configs/cyanogenmod_bacon_defconfig -@@ -3431,13 +3431,13 @@ CONFIG_ARM_UNWIND=y - CONFIG_KEYS=y - # CONFIG_ENCRYPTED_KEYS is not set - # CONFIG_KEYS_DEBUG_PROC_KEYS is not set --# CONFIG_SECURITY_DMESG_RESTRICT is not set -+CONFIG_SECURITY_DMESG_RESTRICT=y - CONFIG_SECURITY=y - # CONFIG_SECURITYFS is not set - CONFIG_SECURITY_NETWORK=y - # CONFIG_SECURITY_NETWORK_XFRM is not set - # CONFIG_SECURITY_PATH is not set --CONFIG_LSM_MMAP_MIN_ADDR=4096 -+CONFIG_LSM_MMAP_MIN_ADDR=32768 - CONFIG_SECURITY_SELINUX=y - # CONFIG_SECURITY_SELINUX_BOOTPARAM is not set - # CONFIG_SECURITY_SELINUX_DISABLE is not set --- -2.6.2 - diff --git a/Patches/OLD/Mako-TWRP.patch b/Patches/OLD/Mako-TWRP.patch deleted file mode 100644 index 68f284b9..00000000 --- a/Patches/OLD/Mako-TWRP.patch +++ /dev/null @@ -1,67 +0,0 @@ -From f245b2d23f649928cb16e0e3ecf66891511f705d Mon Sep 17 00:00:00 2001 -From: Tad -Date: Wed, 30 Dec 2015 14:20:30 -0500 -Subject: [PATCH] Add TWRP - -Change-Id: I9e6ff0717b0a5df908b771f50c62e21193c20ab4 ---- - BoardConfig.mk | 16 ++++++++++++++++ - device.mk | 1 + - twrp.fstab | 6 ++++++ - 3 files changed, 23 insertions(+) - create mode 100644 twrp.fstab - -diff --git a/BoardConfig.mk b/BoardConfig.mk -index d8d9f5c..753f7e8 100644 ---- a/BoardConfig.mk -+++ b/BoardConfig.mk -@@ -129,6 +129,22 @@ MALLOC_IMPL := dlmalloc - - -include vendor/lge/mako/BoardConfigVendor.mk - -+#TWRP config -+DEVICE_RESOLUTION := 720x1280 -+RECOVERY_SDCARD_ON_DATA := true -+RECOVERY_GRAPHICS_USE_LINELENGTH := true -+BOARD_HAS_NO_REAL_SDCARD := true -+PRODUCT_BUILD_PROP_OVERRIDES += BUILD_UTC_DATE=0 -+#TW_INCLUDE_CRYPTO := true -+TW_INCLUDE_JB_CRYPTO := true -+TW_FLASH_FROM_STORAGE := true -+TW_NO_USB_STORAGE := true -+TW_INTERNAL_STORAGE_PATH := "/data/media" -+TW_INTERNAL_STORAGE_MOUNT_POINT := "data" -+TW_EXTERNAL_STORAGE_PATH := "/usb-otg" -+TW_EXTERNAL_STORAGE_MOUNT_POINT := "usb-otg" -+TW_SIGNED_ZIP_VERIFY := true -+ - BOARD_HAS_NO_SELECT_BUTTON := true - - BOARD_HARDWARE_CLASS := device/lge/mako/cmhw/ -diff --git a/device.mk b/device.mk -index 8b300f2..b2dc8ac 100644 ---- a/device.mk -+++ b/device.mk -@@ -62,6 +62,7 @@ PRODUCT_COPY_FILES += \ - device/lge/mako/init.mako.rc:root/init.mako.rc \ - device/lge/mako/init.mako.usb.rc:root/init.mako.usb.rc \ - device/lge/mako/fstab.mako:root/fstab.mako \ -+ device/lge/mako/twrp.fstab:root/etc/twrp.fstab \ - device/lge/mako/ueventd.mako.rc:root/ueventd.mako.rc \ - device/lge/mako/media_profiles.xml:system/etc/media_profiles.xml \ - frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:system/etc/media_codecs_google_audio.xml \ -diff --git a/twrp.fstab b/twrp.fstab -new file mode 100644 -index 0000000..4c95eba ---- /dev/null -+++ b/twrp.fstab -@@ -0,0 +1,6 @@ -+/boot emmc /dev/block/platform/msm_sdcc.1/by-name/boot -+/recovery emmc /dev/block/platform/msm_sdcc.1/by-name/recovery -+/system ext4 /dev/block/platform/msm_sdcc.1/by-name/system -+/data ext4 /dev/block/platform/msm_sdcc.1/by-name/userdata length=-16384 -+/cache ext4 /dev/block/platform/msm_sdcc.1/by-name/cache -+ --- -2.6.4 - diff --git a/Patches/OLD/Per-App-Performance-Profiles.patch b/Patches/OLD/Per-App-Performance-Profiles.patch deleted file mode 100644 index 53782203..00000000 --- a/Patches/OLD/Per-App-Performance-Profiles.patch +++ /dev/null @@ -1,209 +0,0 @@ -From a3788d9279bbe01ba2a23d4230ec1c064c523680 Mon Sep 17 00:00:00 2001 -From: Tad -Date: Wed, 18 Nov 2015 07:22:21 -0500 -Subject: [PATCH] Take advantage of per-app performance profiles - -Change-Id: Ib383403739de7fee8efa46790d70caf4b75fb097 ---- - .../frameworks/base/core/res/res/values/config.xml | 185 ++++++++++++++++++++- - 1 file changed, 182 insertions(+), 3 deletions(-) - -diff --git a/overlay/common/frameworks/base/core/res/res/values/config.xml b/overlay/common/frameworks/base/core/res/res/values/config.xml -index b33887a..973bdba 100644 ---- a/overlay/common/frameworks/base/core/res/res/values/config.xml -+++ b/overlay/common/frameworks/base/core/res/res/values/config.xml -@@ -48,9 +48,188 @@ - Each item should list the fully-qualified activity - name and the power profile id, separated by a comma. --> - -- com.aurorasoftworks.quadrant.*BenchmarkExecutionActivity,2 -- com.antutu.ABenchMark.*,2 -- .*com.antutu.benchmark.*,2 -+ au.com.shiftyjelly.pocketcasts.*,0 -+ be.uhasselt.privacypolice.*,0 -+ com.accuweather.android.*,0 -+ com.adobe.reader.*,0 -+ com.alensw.PicFolder.*,0 -+ com.amaze.filemanager.*,0 -+ com.amazon.kindle.*,0 -+ com.amazon.mShop.android.shopping.*,0 -+ com.amazon.windowshop.*,0 -+ com.andrewshu.android.reddit.*,0 -+ com.andrewshu.android.redditdonation.*,0 -+ com.android.browser.*,1 -+ com.android.calculator2.*,0 -+ com.android.calendar.*,0 -+ com.android.camera2.*,1 -+ com.android.chrome.*,1 -+ com.android.contacts.*,0 -+ com.android.deskclock.*,0 -+ com.android.dialer.*,0 -+ com.android.email.*,0 -+ com.android.gallery3d.*,0 -+ com.android.incallui.*,0 -+ com.android.keepass.*,1 -+ com.android.mms.*,0 -+ com.android.providers.downloads.ui.*,0 -+ com.android.settings.*,0 -+ com.android.soundrecorder.*,0 -+ com.antutu.ABenchMark.*,2 -+ .*com.antutu.benchmark.*,2 -+ com.asksven.betterbatterystats.*,0 -+ com.aurorasoftworks.quadrant.*BenchmarkExecutionActivity,2 -+ com.authy.authy.*,0 -+ com.bethsoft.falloutshelter.*,1 -+ com.coffeestainstudios.goatsimulator.*,1 -+ com.cyanogenmod.trebuchet.*,0 -+ com.danvelazco.fbwrapper.*,0 -+ com.distractionware.superhexagon.*,1 -+ com.dropbox.android.*,0 -+ com.eamobile.monopoly_na_wf.*,1 -+ com.ebay.mobile.*,0 -+ com.facebook.katana.*,1 -+ com.facebook.orca.*,1 -+ com.farproc.wifi.analyzer.*,0 -+ com.fifthelement.trimmer.*,1 -+ com.flightradar24pro.*,1 -+ com.flyersoft.moonreader.*,0 -+ com.flyersoft.moonreaderp.*,0 -+ com.gh4a.*,0 -+ com.google.android.apps.chromecast.app.*,0 -+ com.google.android.apps.docs.editors.docs.*,1 -+ com.google.android.apps.docs.editors.sheets.*,1 -+ com.google.android.apps.docs.editors.slides.*,1 -+ com.google.android.apps.gmoney.*,0 -+ com.google.android.apps.hangoutsdialer.*,1 -+ com.google.android.apps.inbox.*,0 -+ com.google.android.apps.messaging.*,0 -+ com.google.android.apps.pdfviewer.*,0 -+ com.google.android.apps.photos.*,0 -+ com.google.android.apps.translate.*,1 -+ com.google.android.calendar.*,0 -+ com.google.android.gms.*,0 -+ com.google.android.googlequicksearchbox.*,1 -+ com.google.android.keep.*,0 -+ com.google.android.play.games.*,0 -+ com.google.android.youtube.*,1 -+ com.google.earth.*,1 -+ com.google.xzing.client.android.*,0 -+ com.grarak.kerneladiutor.*,0 -+ com.hulu.plus.*,1 -+ com.instagram.android.*,1 -+ com.ironhidegames.android.kingdomrushfrontiers.*,1 -+ com.ironhidegames.android.kingdomrushorigins.*,1 -+ com.jeremysteckling.facerrel.*,0 -+ com.koushikdutta.backup.*,1 -+ com.koushikdutta.backup.license.*,1 -+ com.laurencedawson.reddit_sync.*,0 -+ com.laurencedawson.reddit_sync.pro.*,0 -+ com.leosfortune.*,0 -+ com.lightricks.facetune.*,1 -+ com.mb.android.*,1 -+ com.melodis.midomiMusicIdentifier.freemium.*,0 -+ com.mgaetan89.showsrage.*,0 -+ com.microblink.photomath.*,1 -+ com.microsoft.office.excel.*,1 -+ com.microsoft.office.outlook.*,0 -+ com.microsoft.office.powerpoint.*,1 -+ com.microsoft.office.word.*,1 -+ com.microsoft.skydrive.*,0 -+ com.miniclip.plagueinc.*,0 -+ com.mitzuli.*,0 -+ com.mojang.minecraftpe.*,1 -+ com.morlunk.mumbleclient.*,0 -+ com.mxtech.videoplayer.ad.*,1 -+ com.mxtech.videoplayer.pro.*,1 -+ com.netflix.mediaclient.*,1 -+ com.ngmoco.pocketgod.*,0 -+ com.ninjakiwi.bloonstd5.*,1 -+ com.nutomic.syncthingandroid.*,1 -+ com.oasisfeng.greenify.*,0 -+ com.oasisfeng.greenify.pro.*,0 -+ com.pandora.android.*,0 -+ com.paypal.android.p2pmobile.*,0 -+ com.pinterest.*,0 -+ com.plexapp.android.*,1 -+ com.primatelabs.geekbench.*,2 -+ com.quizup.core.*,0 -+ com.redbox.android.activity.*,0 -+ com.roku.remote.*,0 -+ com.rovio.angrybirds.*,0 -+ com.samruston.weather.*,0 -+ com.SecUpwN.AIMSICD.*,0 -+ com.shazam.android.*,0 -+ com.shazam.encore.android.*,0 -+ com.skype.radar.*,1 -+ com.snapchat.android.*,1 -+ com.soundcloud.android.*,0 -+ com.spotify.music.*,0 -+ com.target.ui.*,0 -+ com.tassadar.multirommgr.*,1 -+ com.teamspeak.ts3client.*,0 -+ com.tinder.*,0 -+ com.tobykurien.google_news.*,0 -+ com.tumblr.*,0 -+ com.twitter.android.*,0 -+ com.ubercab.*,1 -+ com.ubercab.driver.*,1 -+ com.urbandroid.sleep.*,0 -+ com.ustwo.monumentvalley.*,0 -+ com.uzumapps.wakelockdetector.*,0 -+ com.valvesoftware.android.steam.community.*,0 -+ com.walmart.android.*,0 -+ com.waze.*,1 -+ com.weather.Weather.*,0 -+ com.whatsapp.*,0 -+ com.xzbber.androiddev.*,0 -+ com.yelp.android.*,0 -+ com.yodo1.crossroad.*,0 -+ com.yubico.yubiclip.*,0 -+ com.yubico.yubioath.*,0 -+ com.zillow.android.zillowmap.*,1 -+ co.vine.android.*,1 -+ de.srlabs.snoopsnitch.*,0 -+ de.tap.easy_xkcd.*,0 -+ dev.ukanth.ufirewall.*, 1 -+ dk.jens.backup.*,1 -+ eu.chainfire.supersu.*,0 -+ eu.chainfire.supersu.pro.*,0 -+ eu.thedarken.sdm.*,1 -+ fr.kwiatkowski.ApkTrack.*,1 -+ io.github.droidapps.pdfreader.*,0 -+ it.mvilla.android.fenix.*,0 -+ kik.android.*,1 -+ me.ccrama.redditslide.*,0 -+ me.ccrama.slideforreddit.*,0 -+ me.ccrama.slideforreddittabletuiunlock.*,0 -+ net.dinglisch.android.taskerm.*,0 -+ net.etuldan.sparss.floss.*,0 -+ net.i2p.android.router.*,0 -+ net.minetest.minetest.*,1 -+ net.nightwhistler.pageturner.*,0 -+ net.osmand.plus.*,1 -+ org.adaway.*,1 -+ org.chromium.chrome.*,1 -+ org.connectbot.*,0 -+ org.csploit.android.*,1 -+ org.cyanogenmod.audiofx.*,0 -+ org.documentfoundation.libreoffice.*,0 -+ org.fdroid.fdroid.*,1 -+ org.ligi.blexplorer.*,0 -+ org.mozilla.firefox.*,1 -+ org.ppsspp.ppsspp.*,1 -+ org.ppsspp.ppssppgold.*,1 -+ org.quantumbadger.redreader.*,0 -+ org.schabi.newpipe.*,1 -+ org.torproject.android.*,0 -+ org.videolan.vlc.*,1 -+ org.wikipedia.*,0 -+ org.yaaic.*,0 -+ org.zwanoo.android.speedtest.*,2 -+ reddit.news.*,0 -+ rs.pedajaapps.alogcatroot.app.*,0 -+ tw.twitch.android.app.*,1 - - - 96MB). - * The page copy blockops can use 0x6000000 to 0x8000000. -- * The TSB is mapped in the 0x8000000 to 0xa000000 range. -+ * The 8K TSB is mapped in the 0x8000000 to 0x8400000 range. -+ * The 4M TSB is mapped in the 0x8400000 to 0x8800000 range. - * The PROM resides in an area spanning 0xf0000000 to 0x100000000. - * The vmalloc area spans 0x100000000 to 0x200000000. - * Since modules need to be in the lowest 32-bits of the address space, -@@ -33,7 +34,8 @@ - * 0x400000000. - */ - #define TLBTEMP_BASE _AC(0x0000000006000000,UL) --#define TSBMAP_BASE _AC(0x0000000008000000,UL) -+#define TSBMAP_8K_BASE _AC(0x0000000008000000,UL) -+#define TSBMAP_4M_BASE _AC(0x0000000008400000,UL) - #define MODULES_VADDR _AC(0x0000000010000000,UL) - #define MODULES_LEN _AC(0x00000000e0000000,UL) - #define MODULES_END _AC(0x00000000f0000000,UL) -diff --git a/arch/sparc/include/asm/tlbflush_64.h b/arch/sparc/include/asm/tlbflush_64.h -index f0d6a97..1a4bb97 100644 ---- a/arch/sparc/include/asm/tlbflush_64.h -+++ b/arch/sparc/include/asm/tlbflush_64.h -@@ -35,6 +35,8 @@ static inline void flush_tlb_range(struct vm_area_struct *vma, - { - } - -+void flush_tlb_kernel_range(unsigned long start, unsigned long end); -+ - #define __HAVE_ARCH_ENTER_LAZY_MMU_MODE - - extern void flush_tlb_pending(void); -@@ -49,11 +51,6 @@ extern void __flush_tlb_kernel_range(unsigned long start, unsigned long end); - - #ifndef CONFIG_SMP - --#define flush_tlb_kernel_range(start,end) \ --do { flush_tsb_kernel_range(start,end); \ -- __flush_tlb_kernel_range(start,end); \ --} while (0) -- - static inline void global_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr) - { - __flush_tlb_page(CTX_HWBITS(mm->context), vaddr); -@@ -64,11 +61,6 @@ static inline void global_flush_tlb_page(struct mm_struct *mm, unsigned long vad - extern void smp_flush_tlb_kernel_range(unsigned long start, unsigned long end); - extern void smp_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr); - --#define flush_tlb_kernel_range(start, end) \ --do { flush_tsb_kernel_range(start,end); \ -- smp_flush_tlb_kernel_range(start, end); \ --} while (0) -- - #define global_flush_tlb_page(mm, vaddr) \ - smp_flush_tlb_page(mm, vaddr) - -diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h -index a1091afb..8bc9afd 100644 ---- a/arch/sparc/include/asm/uaccess_64.h -+++ b/arch/sparc/include/asm/uaccess_64.h -@@ -266,8 +266,8 @@ extern long __strnlen_user(const char __user *, long len); - - #define strlen_user __strlen_user - #define strnlen_user __strnlen_user --#define __copy_to_user_inatomic ___copy_to_user --#define __copy_from_user_inatomic ___copy_from_user -+#define __copy_to_user_inatomic __copy_to_user -+#define __copy_from_user_inatomic __copy_from_user - - #endif /* __ASSEMBLY__ */ - -diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c -index 435e406..1beaf60 100644 ---- a/arch/sparc/kernel/ldc.c -+++ b/arch/sparc/kernel/ldc.c -@@ -1339,7 +1339,7 @@ int ldc_connect(struct ldc_channel *lp) - if (!(lp->flags & LDC_FLAG_ALLOCED_QUEUES) || - !(lp->flags & LDC_FLAG_REGISTERED_QUEUES) || - lp->hs_state != LDC_HS_OPEN) -- err = -EINVAL; -+ err = ((lp->hs_state > LDC_HS_OPEN) ? 0 : -EINVAL); - else - err = start_handshake(lp); - -diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c -index fdaf218..8c5c9a5 100644 ---- a/arch/sparc/kernel/pci.c -+++ b/arch/sparc/kernel/pci.c -@@ -486,8 +486,8 @@ static void __devinit apb_fake_ranges(struct pci_dev *dev, - apb_calc_first_last(map, &first, &last); - res = bus->resource[1]; - res->flags = IORESOURCE_MEM; -- region.start = (first << 21); -- region.end = (last << 21) + ((1 << 21) - 1); -+ region.start = (first << 29); -+ region.end = (last << 29) + ((1 << 29) - 1); - pcibios_bus_to_resource(dev, res, ®ion); - } - -diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c -index b2d0568..3baecb9 100644 ---- a/arch/sparc/kernel/smp_64.c -+++ b/arch/sparc/kernel/smp_64.c -@@ -151,7 +151,7 @@ void cpu_panic(void) - #define NUM_ROUNDS 64 /* magic value */ - #define NUM_ITERS 5 /* likewise */ - --static DEFINE_SPINLOCK(itc_sync_lock); -+static DEFINE_RAW_SPINLOCK(itc_sync_lock); - static unsigned long go[SLAVE + 1]; - - #define DEBUG_TICK_SYNC 0 -@@ -259,7 +259,7 @@ static void smp_synchronize_one_tick(int cpu) - go[MASTER] = 0; - membar_safe("#StoreLoad"); - -- spin_lock_irqsave(&itc_sync_lock, flags); -+ raw_spin_lock_irqsave(&itc_sync_lock, flags); - { - for (i = 0; i < NUM_ROUNDS*NUM_ITERS; i++) { - while (!go[MASTER]) -@@ -270,7 +270,7 @@ static void smp_synchronize_one_tick(int cpu) - membar_safe("#StoreLoad"); - } - } -- spin_unlock_irqrestore(&itc_sync_lock, flags); -+ raw_spin_unlock_irqrestore(&itc_sync_lock, flags); - } - - #if defined(CONFIG_SUN_LDOMS) && defined(CONFIG_HOTPLUG_CPU) -diff --git a/arch/sparc/kernel/sys32.S b/arch/sparc/kernel/sys32.S -index d97f3eb..085c60f 100644 ---- a/arch/sparc/kernel/sys32.S -+++ b/arch/sparc/kernel/sys32.S -@@ -87,7 +87,7 @@ SIGN1(sys32_io_submit, compat_sys_io_submit, %o1) - SIGN1(sys32_mq_open, compat_sys_mq_open, %o1) - SIGN1(sys32_select, compat_sys_select, %o0) - SIGN1(sys32_mkdir, sys_mkdir, %o1) --SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5) -+SIGN1(sys32_futex, compat_sys_futex, %o1) - SIGN1(sys32_sysfs, compat_sys_sysfs, %o0) - SIGN2(sys32_sendfile, compat_sys_sendfile, %o0, %o1) - SIGN2(sys32_sendfile64, compat_sys_sendfile64, %o0, %o1) -diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S -index 817187d4..557212c 100644 ---- a/arch/sparc/kernel/syscalls.S -+++ b/arch/sparc/kernel/syscalls.S -@@ -184,7 +184,8 @@ linux_sparc_syscall32: - mov %i0, %l5 ! IEU1 - 5: call %l7 ! CTI Group brk forced - srl %i5, 0, %o5 ! IEU1 -- ba,a,pt %xcc, 3f -+ ba,pt %xcc, 3f -+ sra %o0, 0, %o0 - - /* Linux native system calls enter here... */ - .align 32 -@@ -212,7 +213,6 @@ linux_sparc_syscall: - 3: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] - ret_sys_call: - ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3 -- sra %o0, 0, %o0 - mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2 - sllx %g2, 32, %g2 - -diff --git a/arch/sparc/kernel/unaligned_64.c b/arch/sparc/kernel/unaligned_64.c -index dae85bc..a3c3a5b 100644 ---- a/arch/sparc/kernel/unaligned_64.c -+++ b/arch/sparc/kernel/unaligned_64.c -@@ -156,17 +156,23 @@ static unsigned long *fetch_reg_addr(unsigned int reg, struct pt_regs *regs) - unsigned long compute_effective_address(struct pt_regs *regs, - unsigned int insn, unsigned int rd) - { -+ int from_kernel = (regs->tstate & TSTATE_PRIV) != 0; - unsigned int rs1 = (insn >> 14) & 0x1f; - unsigned int rs2 = insn & 0x1f; -- int from_kernel = (regs->tstate & TSTATE_PRIV) != 0; -+ unsigned long addr; - - if (insn & 0x2000) { - maybe_flush_windows(rs1, 0, rd, from_kernel); -- return (fetch_reg(rs1, regs) + sign_extend_imm13(insn)); -+ addr = (fetch_reg(rs1, regs) + sign_extend_imm13(insn)); - } else { - maybe_flush_windows(rs1, rs2, rd, from_kernel); -- return (fetch_reg(rs1, regs) + fetch_reg(rs2, regs)); -+ addr = (fetch_reg(rs1, regs) + fetch_reg(rs2, regs)); - } -+ -+ if (!from_kernel && test_thread_flag(TIF_32BIT)) -+ addr &= 0xffffffff; -+ -+ return addr; - } - - /* This is just to make gcc think die_if_kernel does return... */ -diff --git a/arch/sparc/lib/NG2memcpy.S b/arch/sparc/lib/NG2memcpy.S -index 0aed756..e993fc8 100644 ---- a/arch/sparc/lib/NG2memcpy.S -+++ b/arch/sparc/lib/NG2memcpy.S -@@ -236,6 +236,7 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ - */ - VISEntryHalf - -+ membar #Sync - alignaddr %o1, %g0, %g0 - - add %o1, (64 - 1), %o4 -diff --git a/arch/sparc/math-emu/math_32.c b/arch/sparc/math-emu/math_32.c -index aa4d55b..5ce8f2f 100644 ---- a/arch/sparc/math-emu/math_32.c -+++ b/arch/sparc/math-emu/math_32.c -@@ -499,7 +499,7 @@ static int do_one_mathemu(u32 insn, unsigned long *pfsr, unsigned long *fregs) - case 0: fsr = *pfsr; - if (IR == -1) IR = 2; - /* fcc is always fcc0 */ -- fsr &= ~0xc00; fsr |= (IR << 10); break; -+ fsr &= ~0xc00; fsr |= (IR << 10); - *pfsr = fsr; - break; - case 1: rd->s = IR; break; -diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c -index 1fe0429..1387aca 100644 ---- a/arch/sparc/mm/fault_64.c -+++ b/arch/sparc/mm/fault_64.c -@@ -95,38 +95,51 @@ static unsigned int get_user_insn(unsigned long tpc) - pte_t *ptep, pte; - unsigned long pa; - u32 insn = 0; -- unsigned long pstate; - -- if (pgd_none(*pgdp)) -- goto outret; -+ if (pgd_none(*pgdp) || unlikely(pgd_bad(*pgdp))) -+ goto out; - pudp = pud_offset(pgdp, tpc); -- if (pud_none(*pudp)) -- goto outret; -- pmdp = pmd_offset(pudp, tpc); -- if (pmd_none(*pmdp)) -- goto outret; -- -- /* This disables preemption for us as well. */ -- __asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate)); -- __asm__ __volatile__("wrpr %0, %1, %%pstate" -- : : "r" (pstate), "i" (PSTATE_IE)); -- ptep = pte_offset_map(pmdp, tpc); -- pte = *ptep; -- if (!pte_present(pte)) -+ if (pud_none(*pudp) || unlikely(pud_bad(*pudp))) - goto out; - -- pa = (pte_pfn(pte) << PAGE_SHIFT); -- pa += (tpc & ~PAGE_MASK); -- -- /* Use phys bypass so we don't pollute dtlb/dcache. */ -- __asm__ __volatile__("lduwa [%1] %2, %0" -- : "=r" (insn) -- : "r" (pa), "i" (ASI_PHYS_USE_EC)); -+ /* This disables preemption for us as well. */ -+ local_irq_disable(); - -+ pmdp = pmd_offset(pudp, tpc); -+ if (pmd_none(*pmdp) || unlikely(pmd_bad(*pmdp))) -+ goto out_irq_enable; -+ -+#ifdef CONFIG_TRANSPARENT_HUGEPAGE -+ if (pmd_trans_huge(*pmdp)) { -+ if (pmd_trans_splitting(*pmdp)) -+ goto out_irq_enable; -+ -+ pa = pmd_pfn(*pmdp) << PAGE_SHIFT; -+ pa += tpc & ~HPAGE_MASK; -+ -+ /* Use phys bypass so we don't pollute dtlb/dcache. */ -+ __asm__ __volatile__("lduwa [%1] %2, %0" -+ : "=r" (insn) -+ : "r" (pa), "i" (ASI_PHYS_USE_EC)); -+ } else -+#endif -+ { -+ ptep = pte_offset_map(pmdp, tpc); -+ pte = *ptep; -+ if (pte_present(pte)) { -+ pa = (pte_pfn(pte) << PAGE_SHIFT); -+ pa += (tpc & ~PAGE_MASK); -+ -+ /* Use phys bypass so we don't pollute dtlb/dcache. */ -+ __asm__ __volatile__("lduwa [%1] %2, %0" -+ : "=r" (insn) -+ : "r" (pa), "i" (ASI_PHYS_USE_EC)); -+ } -+ pte_unmap(ptep); -+ } -+out_irq_enable: -+ local_irq_enable(); - out: -- pte_unmap(ptep); -- __asm__ __volatile__("wrpr %0, 0x0, %%pstate" : : "r" (pstate)); --outret: - return insn; - } - -@@ -154,7 +167,8 @@ show_signal_msg(struct pt_regs *regs, int sig, int code, - extern unsigned long compute_effective_address(struct pt_regs *, unsigned int, unsigned int); - - static void do_fault_siginfo(int code, int sig, struct pt_regs *regs, -- unsigned int insn, int fault_code) -+ unsigned long fault_addr, unsigned int insn, -+ int fault_code) - { - unsigned long addr; - siginfo_t info; -@@ -162,10 +176,18 @@ static void do_fault_siginfo(int code, int sig, struct pt_regs *regs, - info.si_code = code; - info.si_signo = sig; - info.si_errno = 0; -- if (fault_code & FAULT_CODE_ITLB) -+ if (fault_code & FAULT_CODE_ITLB) { - addr = regs->tpc; -- else -- addr = compute_effective_address(regs, insn, 0); -+ } else { -+ /* If we were able to probe the faulting instruction, use it -+ * to compute a precise fault address. Otherwise use the fault -+ * time provided address which may only have page granularity. -+ */ -+ if (insn) -+ addr = compute_effective_address(regs, insn, 0); -+ else -+ addr = fault_addr; -+ } - info.si_addr = (void __user *) addr; - info.si_trapno = 0; - -@@ -240,7 +262,7 @@ static void __kprobes do_kernel_fault(struct pt_regs *regs, int si_code, - /* The si_code was set to make clear whether - * this was a SEGV_MAPERR or SEGV_ACCERR fault. - */ -- do_fault_siginfo(si_code, SIGSEGV, regs, insn, fault_code); -+ do_fault_siginfo(si_code, SIGSEGV, regs, address, insn, fault_code); - return; - } - -@@ -260,18 +282,6 @@ static void noinline __kprobes bogus_32bit_fault_tpc(struct pt_regs *regs) - show_regs(regs); - } - --static void noinline __kprobes bogus_32bit_fault_address(struct pt_regs *regs, -- unsigned long addr) --{ -- static int times; -- -- if (times++ < 10) -- printk(KERN_ERR "FAULT[%s:%d]: 32-bit process " -- "reports 64-bit fault address [%lx]\n", -- current->comm, current->pid, addr); -- show_regs(regs); --} -- - asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) - { - struct mm_struct *mm = current->mm; -@@ -300,10 +310,8 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) - goto intr_or_no_mm; - } - } -- if (unlikely((address >> 32) != 0)) { -- bogus_32bit_fault_address(regs, address); -+ if (unlikely((address >> 32) != 0)) - goto intr_or_no_mm; -- } - } - - if (regs->tstate & TSTATE_PRIV) { -@@ -515,7 +523,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) - * Send a sigbus, regardless of whether we were in kernel - * or user mode. - */ -- do_fault_siginfo(BUS_ADRERR, SIGBUS, regs, insn, fault_code); -+ do_fault_siginfo(BUS_ADRERR, SIGBUS, regs, address, insn, fault_code); - - /* Kernel mode? Handle exceptions or die */ - if (regs->tstate & TSTATE_PRIV) -diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c -index 7f8238f..7eb24bd 100644 ---- a/arch/sparc/mm/init_64.c -+++ b/arch/sparc/mm/init_64.c -@@ -308,6 +308,10 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t * - tsb_index = MM_TSB_BASE; - tsb_hash_shift = PAGE_SHIFT; - -+ /* Don't insert a non-valid PTE into the TSB, we'll deadlock. */ -+ if (!(pte_val(pte) & _PAGE_VALID)) -+ return; -+ - spin_lock_irqsave(&mm->context.lock, flags); - - #ifdef CONFIG_HUGETLB_PAGE -@@ -2417,3 +2421,26 @@ void __flush_tlb_all(void) - __asm__ __volatile__("wrpr %0, 0, %%pstate" - : : "r" (pstate)); - } -+ -+#ifdef CONFIG_SMP -+#define do_flush_tlb_kernel_range smp_flush_tlb_kernel_range -+#else -+#define do_flush_tlb_kernel_range __flush_tlb_kernel_range -+#endif -+ -+void flush_tlb_kernel_range(unsigned long start, unsigned long end) -+{ -+ if (start < HI_OBP_ADDRESS && end > LOW_OBP_ADDRESS) { -+ if (start < LOW_OBP_ADDRESS) { -+ flush_tsb_kernel_range(start, LOW_OBP_ADDRESS); -+ do_flush_tlb_kernel_range(start, LOW_OBP_ADDRESS); -+ } -+ if (end > HI_OBP_ADDRESS) { -+ flush_tsb_kernel_range(end, HI_OBP_ADDRESS); -+ do_flush_tlb_kernel_range(end, HI_OBP_ADDRESS); -+ } -+ } else { -+ flush_tsb_kernel_range(start, end); -+ do_flush_tlb_kernel_range(start, end); -+ } -+} -diff --git a/arch/sparc/mm/tsb.c b/arch/sparc/mm/tsb.c -index f4e84f3..4153019 100644 ---- a/arch/sparc/mm/tsb.c -+++ b/arch/sparc/mm/tsb.c -@@ -150,7 +150,19 @@ static void setup_tsb_params(struct mm_struct *mm, unsigned long tsb_idx, unsign - mm->context.tsb_block[tsb_idx].tsb_nentries = - tsb_bytes / sizeof(struct tsb); - -- base = TSBMAP_BASE; -+ switch (tsb_idx) { -+ case MM_TSB_BASE: -+ base = TSBMAP_8K_BASE; -+ break; -+#if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE) -+ case MM_TSB_HUGE: -+ base = TSBMAP_4M_BASE; -+ break; -+#endif -+ default: -+ BUG(); -+ } -+ - tte = pgprot_val(PAGE_KERNEL_LOCKED); - tsb_paddr = __pa(mm->context.tsb_block[tsb_idx].tsb); - BUG_ON(tsb_paddr & (tsb_bytes - 1UL)); -diff --git a/arch/um/kernel/exitcode.c b/arch/um/kernel/exitcode.c -index 829df49..41ebbfe 100644 ---- a/arch/um/kernel/exitcode.c -+++ b/arch/um/kernel/exitcode.c -@@ -40,9 +40,11 @@ static ssize_t exitcode_proc_write(struct file *file, - const char __user *buffer, size_t count, loff_t *pos) - { - char *end, buf[sizeof("nnnnn\0")]; -+ size_t size; - int tmp; - -- if (copy_from_user(buf, buffer, count)) -+ size = min(count, sizeof(buf)); -+ if (copy_from_user(buf, buffer, size)) - return -EFAULT; - - tmp = simple_strtol(buf, &end, 0); -diff --git a/arch/unicore32/Kconfig b/arch/unicore32/Kconfig -index eeb8054..1f3e9ea 100644 ---- a/arch/unicore32/Kconfig -+++ b/arch/unicore32/Kconfig -@@ -6,6 +6,7 @@ config UNICORE32 - select HAVE_DMA_ATTRS - select HAVE_KERNEL_GZIP - select HAVE_KERNEL_BZIP2 -+ select GENERIC_ATOMIC64 - select HAVE_KERNEL_LZO - select HAVE_KERNEL_LZMA - select GENERIC_FIND_FIRST_BIT -diff --git a/arch/unicore32/include/asm/bug.h b/arch/unicore32/include/asm/bug.h -index b1ff8ca..93a56f3 100644 ---- a/arch/unicore32/include/asm/bug.h -+++ b/arch/unicore32/include/asm/bug.h -@@ -19,9 +19,4 @@ extern void die(const char *msg, struct pt_regs *regs, int err); - extern void uc32_notify_die(const char *str, struct pt_regs *regs, - struct siginfo *info, unsigned long err, unsigned long trap); - --extern asmlinkage void __backtrace(void); --extern asmlinkage void c_backtrace(unsigned long fp, int pmode); -- --extern void __show_regs(struct pt_regs *); -- - #endif /* __UNICORE_BUG_H__ */ -diff --git a/arch/unicore32/include/asm/cmpxchg.h b/arch/unicore32/include/asm/cmpxchg.h -index df4d5ac..8e797ad 100644 ---- a/arch/unicore32/include/asm/cmpxchg.h -+++ b/arch/unicore32/include/asm/cmpxchg.h -@@ -35,7 +35,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, - : "memory", "cc"); - break; - default: -- ret = __xchg_bad_pointer(); -+ __xchg_bad_pointer(); - } - - return ret; -diff --git a/arch/unicore32/kernel/setup.h b/arch/unicore32/kernel/setup.h -index f239550..30f749d 100644 ---- a/arch/unicore32/kernel/setup.h -+++ b/arch/unicore32/kernel/setup.h -@@ -30,4 +30,10 @@ extern char __vectors_start[], __vectors_end[]; - extern void kernel_thread_helper(void); - - extern void __init early_signal_init(void); -+ -+extern asmlinkage void __backtrace(void); -+extern asmlinkage void c_backtrace(unsigned long fp, int pmode); -+ -+extern void __show_regs(struct pt_regs *); -+ - #endif -diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig -index bf57545..38994ee 100644 ---- a/arch/x86/Kconfig -+++ b/arch/x86/Kconfig -@@ -917,10 +917,27 @@ config VM86 - default y - depends on X86_32 - ---help--- -- This option is required by programs like DOSEMU to run 16-bit legacy -- code on X86 processors. It also may be needed by software like -- XFree86 to initialize some video cards via BIOS. Disabling this -- option saves about 6k. -+ This option is required by programs like DOSEMU to run -+ 16-bit real mode legacy code on x86 processors. It also may -+ be needed by software like XFree86 to initialize some video -+ cards via BIOS. Disabling this option saves about 6K. -+ -+config X86_16BIT -+ bool "Enable support for 16-bit segments" if EXPERT -+ default y -+ ---help--- -+ This option is required by programs like Wine to run 16-bit -+ protected mode legacy code on x86 processors. Disabling -+ this option saves about 300 bytes on i386, or around 6K text -+ plus 16K runtime memory on x86-64, -+ -+config X86_ESPFIX32 -+ def_bool y -+ depends on X86_16BIT && X86_32 -+ -+config X86_ESPFIX64 -+ def_bool y -+ depends on X86_16BIT && X86_64 - - config TOSHIBA - tristate "Toshiba Laptop support" -@@ -2159,6 +2176,7 @@ source "fs/Kconfig.binfmt" - config IA32_EMULATION - bool "IA32 Emulation" - depends on X86_64 -+ select BINFMT_ELF - select COMPAT_BINFMT_ELF - ---help--- - Include code to run legacy 32-bit programs under a -diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile -index 5a747dd..8dfb1ff 100644 ---- a/arch/x86/boot/Makefile -+++ b/arch/x86/boot/Makefile -@@ -52,18 +52,18 @@ $(obj)/cpustr.h: $(obj)/mkcpustr FORCE - - # How to compile the 16-bit code. Note we always compile for -march=i386, - # that way we can complain to the user if the CPU is insufficient. --KBUILD_CFLAGS := $(LINUXINCLUDE) -g -Os -D_SETUP -D__KERNEL__ \ -+KBUILD_CFLAGS := $(LINUXINCLUDE) -m32 -g -Os -D_SETUP -D__KERNEL__ \ - -DDISABLE_BRANCH_PROFILING \ - -Wall -Wstrict-prototypes \ - -march=i386 -mregparm=3 \ - -include $(srctree)/$(src)/code16gcc.h \ - -fno-strict-aliasing -fomit-frame-pointer \ -+ -mno-mmx -mno-sse \ - $(call cc-option, -ffreestanding) \ - $(call cc-option, -fno-toplevel-reorder,\ -- $(call cc-option, -fno-unit-at-a-time)) \ -+ $(call cc-option, -fno-unit-at-a-time)) \ - $(call cc-option, -fno-stack-protector) \ - $(call cc-option, -mpreferred-stack-boundary=2) --KBUILD_CFLAGS += $(call cc-option, -m32) - KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__ - GCOV_PROFILE := n - -diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile -index 5ef205c..7194d9f 100644 ---- a/arch/x86/boot/compressed/Makefile -+++ b/arch/x86/boot/compressed/Makefile -@@ -12,6 +12,7 @@ KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING - cflags-$(CONFIG_X86_32) := -march=i386 - cflags-$(CONFIG_X86_64) := -mcmodel=small - KBUILD_CFLAGS += $(cflags-y) -+KBUILD_CFLAGS += -mno-mmx -mno-sse - KBUILD_CFLAGS += $(call cc-option,-ffreestanding) - KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector) - -diff --git a/arch/x86/crypto/ghash-clmulni-intel_asm.S b/arch/x86/crypto/ghash-clmulni-intel_asm.S -index 1eb7f90..eb4d2a2 100644 ---- a/arch/x86/crypto/ghash-clmulni-intel_asm.S -+++ b/arch/x86/crypto/ghash-clmulni-intel_asm.S -@@ -24,10 +24,6 @@ - .align 16 - .Lbswap_mask: - .octa 0x000102030405060708090a0b0c0d0e0f --.Lpoly: -- .octa 0xc2000000000000000000000000000001 --.Ltwo_one: -- .octa 0x00000001000000000000000000000001 - - #define DATA %xmm0 - #define SHASH %xmm1 -@@ -131,27 +127,3 @@ ENTRY(clmul_ghash_update) - movups DATA, (%rdi) - .Lupdate_just_ret: - ret -- --/* -- * void clmul_ghash_setkey(be128 *shash, const u8 *key); -- * -- * Calculate hash_key << 1 mod poly -- */ --ENTRY(clmul_ghash_setkey) -- movaps .Lbswap_mask, BSWAP -- movups (%rsi), %xmm0 -- PSHUFB_XMM BSWAP %xmm0 -- movaps %xmm0, %xmm1 -- psllq $1, %xmm0 -- psrlq $63, %xmm1 -- movaps %xmm1, %xmm2 -- pslldq $8, %xmm1 -- psrldq $8, %xmm2 -- por %xmm1, %xmm0 -- # reduction -- pshufd $0b00100100, %xmm2, %xmm1 -- pcmpeqd .Ltwo_one, %xmm1 -- pand .Lpoly, %xmm1 -- pxor %xmm1, %xmm0 -- movups %xmm0, (%rdi) -- ret -diff --git a/arch/x86/crypto/ghash-clmulni-intel_glue.c b/arch/x86/crypto/ghash-clmulni-intel_glue.c -index b4bf0a6..c07446d 100644 ---- a/arch/x86/crypto/ghash-clmulni-intel_glue.c -+++ b/arch/x86/crypto/ghash-clmulni-intel_glue.c -@@ -30,8 +30,6 @@ void clmul_ghash_mul(char *dst, const be128 *shash); - void clmul_ghash_update(char *dst, const char *src, unsigned int srclen, - const be128 *shash); - --void clmul_ghash_setkey(be128 *shash, const u8 *key); -- - struct ghash_async_ctx { - struct cryptd_ahash *cryptd_tfm; - }; -@@ -58,13 +56,23 @@ static int ghash_setkey(struct crypto_shash *tfm, - const u8 *key, unsigned int keylen) - { - struct ghash_ctx *ctx = crypto_shash_ctx(tfm); -+ be128 *x = (be128 *)key; -+ u64 a, b; - - if (keylen != GHASH_BLOCK_SIZE) { - crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); - return -EINVAL; - } - -- clmul_ghash_setkey(&ctx->shash, key); -+ /* perform multiplication by 'x' in GF(2^128) */ -+ a = be64_to_cpu(x->a); -+ b = be64_to_cpu(x->b); -+ -+ ctx->shash.a = (__be64)((b << 1) | (a >> 63)); -+ ctx->shash.b = (__be64)((a << 1) | (b >> 63)); -+ -+ if (a >> 63) -+ ctx->shash.b ^= cpu_to_be64(0xc2); - - return 0; - } -diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h -index f91e80f..5bd3f9f 100644 ---- a/arch/x86/include/asm/cpufeature.h -+++ b/arch/x86/include/asm/cpufeature.h -@@ -342,7 +342,7 @@ extern const char * const x86_power_flags[32]; - static __always_inline __pure bool __static_cpu_has(u16 bit) - { - #if __GNUC__ > 4 || __GNUC_MINOR__ >= 5 -- asm goto("1: jmp %l[t_no]\n" -+ asm_volatile_goto("1: jmp %l[t_no]\n" - "2:\n" - ".section .altinstructions,\"a\"\n" - " .long 1b - .\n" -diff --git a/arch/x86/include/asm/espfix.h b/arch/x86/include/asm/espfix.h -new file mode 100644 -index 0000000..99efebb ---- /dev/null -+++ b/arch/x86/include/asm/espfix.h -@@ -0,0 +1,16 @@ -+#ifndef _ASM_X86_ESPFIX_H -+#define _ASM_X86_ESPFIX_H -+ -+#ifdef CONFIG_X86_64 -+ -+#include -+ -+DECLARE_PER_CPU_READ_MOSTLY(unsigned long, espfix_stack); -+DECLARE_PER_CPU_READ_MOSTLY(unsigned long, espfix_waddr); -+ -+extern void init_espfix_bsp(void); -+extern void init_espfix_ap(void); -+ -+#endif /* CONFIG_X86_64 */ -+ -+#endif /* _ASM_X86_ESPFIX_H */ -diff --git a/arch/x86/include/asm/fpu-internal.h b/arch/x86/include/asm/fpu-internal.h -index 92e05b6..a65708f 100644 ---- a/arch/x86/include/asm/fpu-internal.h -+++ b/arch/x86/include/asm/fpu-internal.h -@@ -266,12 +266,13 @@ static inline int restore_fpu_checking(struct task_struct *tsk) - /* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception - is pending. Clear the x87 state here by setting it to fixed - values. "m" is a random variable that should be in L1 */ -- alternative_input( -- ASM_NOP8 ASM_NOP2, -- "emms\n\t" /* clear stack tags */ -- "fildl %P[addr]", /* set F?P to defined value */ -- X86_FEATURE_FXSAVE_LEAK, -- [addr] "m" (tsk->thread.fpu.has_fpu)); -+ if (unlikely(static_cpu_has(X86_FEATURE_FXSAVE_LEAK))) { -+ asm volatile( -+ "fnclex\n\t" -+ "emms\n\t" -+ "fildl %P[addr]" /* set F?P to defined value */ -+ : : [addr] "m" (tsk->thread.fpu.has_fpu)); -+ } - - return fpu_restore_checking(&tsk->thread.fpu); - } -diff --git a/arch/x86/include/asm/hugetlb.h b/arch/x86/include/asm/hugetlb.h -index 439a9ac..48fa391 100644 ---- a/arch/x86/include/asm/hugetlb.h -+++ b/arch/x86/include/asm/hugetlb.h -@@ -51,6 +51,7 @@ static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm, - static inline void huge_ptep_clear_flush(struct vm_area_struct *vma, - unsigned long addr, pte_t *ptep) - { -+ ptep_clear_flush(vma, addr, ptep); - } - - static inline int huge_pte_none(pte_t pte) -diff --git a/arch/x86/include/asm/irqflags.h b/arch/x86/include/asm/irqflags.h -index bba3cf8..0a8b519 100644 ---- a/arch/x86/include/asm/irqflags.h -+++ b/arch/x86/include/asm/irqflags.h -@@ -129,7 +129,7 @@ static inline notrace unsigned long arch_local_irq_save(void) - - #define PARAVIRT_ADJUST_EXCEPTION_FRAME /* */ - --#define INTERRUPT_RETURN iretq -+#define INTERRUPT_RETURN jmp native_iret - #define USERGS_SYSRET64 \ - swapgs; \ - sysretq; -diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h -index 3a16c14..0297669 100644 ---- a/arch/x86/include/asm/jump_label.h -+++ b/arch/x86/include/asm/jump_label.h -@@ -13,7 +13,7 @@ - - static __always_inline bool arch_static_branch(struct static_key *key) - { -- asm goto("1:" -+ asm_volatile_goto("1:" - STATIC_KEY_INITIAL_NOP - ".pushsection __jump_table, \"aw\" \n\t" - _ASM_ALIGN "\n\t" -diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h -index d57eacb..944471f 100644 ---- a/arch/x86/include/asm/kvm_host.h -+++ b/arch/x86/include/asm/kvm_host.h -@@ -102,7 +102,7 @@ - #define KVM_REFILL_PAGES 25 - #define KVM_MAX_CPUID_ENTRIES 80 - #define KVM_NR_FIXED_MTRR_REGION 88 --#define KVM_NR_VAR_MTRR 8 -+#define KVM_NR_VAR_MTRR 10 - - #define ASYNC_PF_PER_VCPU 64 - -@@ -436,7 +436,7 @@ struct kvm_vcpu_arch { - bool nmi_injected; /* Trying to inject an NMI this entry */ - - struct mtrr_state_type mtrr_state; -- u32 pat; -+ u64 pat; - - int switch_db_regs; - unsigned long db[KVM_NR_DB_REGS]; -diff --git a/arch/x86/include/asm/pgtable_64_types.h b/arch/x86/include/asm/pgtable_64_types.h -index 766ea16..51817fa 100644 ---- a/arch/x86/include/asm/pgtable_64_types.h -+++ b/arch/x86/include/asm/pgtable_64_types.h -@@ -59,5 +59,7 @@ typedef struct { pteval_t pte; } pte_t; - #define MODULES_VADDR _AC(0xffffffffa0000000, UL) - #define MODULES_END _AC(0xffffffffff000000, UL) - #define MODULES_LEN (MODULES_END - MODULES_VADDR) -+#define ESPFIX_PGD_ENTRY _AC(-2, UL) -+#define ESPFIX_BASE_ADDR (ESPFIX_PGD_ENTRY << PGDIR_SHIFT) - - #endif /* _ASM_X86_PGTABLE_64_DEFS_H */ -diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h -index 19f16eb..0b60cd9 100644 ---- a/arch/x86/include/asm/ptrace.h -+++ b/arch/x86/include/asm/ptrace.h -@@ -286,6 +286,22 @@ static inline unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, - - #define ARCH_HAS_USER_SINGLE_STEP_INFO - -+/* -+ * When hitting ptrace_stop(), we cannot return using SYSRET because -+ * that does not restore the full CPU state, only a minimal set. The -+ * ptracer can change arbitrary register values, which is usually okay -+ * because the usual ptrace stops run off the signal delivery path which -+ * forces IRET; however, ptrace_event() stops happen in arbitrary places -+ * in the kernel and don't force IRET path. -+ * -+ * So force IRET path after a ptrace stop. -+ */ -+#define arch_ptrace_stop_needed(code, info) \ -+({ \ -+ set_thread_flag(TIF_NOTIFY_RESUME); \ -+ false; \ -+}) -+ - struct user_desc; - extern int do_get_thread_area(struct task_struct *p, int idx, - struct user_desc __user *info); -diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h -index d0f19f9..16c7971 100644 ---- a/arch/x86/include/asm/setup.h -+++ b/arch/x86/include/asm/setup.h -@@ -61,6 +61,8 @@ static inline void x86_ce4100_early_setup(void) { } - - #ifndef _SETUP - -+#include -+ - /* - * This is set up by the setup-routine at boot-time - */ -diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h -index b9676ae..ddaf130 100644 ---- a/arch/x86/include/asm/topology.h -+++ b/arch/x86/include/asm/topology.h -@@ -157,9 +157,10 @@ static inline void setup_node_to_cpumask_map(void) { } - - extern const struct cpumask *cpu_coregroup_mask(int cpu); - --#ifdef ENABLE_TOPO_DEFINES - #define topology_physical_package_id(cpu) (cpu_data(cpu).phys_proc_id) - #define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id) -+ -+#ifdef ENABLE_TOPO_DEFINES - #define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu)) - #define topology_thread_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu)) - -diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile -index 532d2e0..9f15a46 100644 ---- a/arch/x86/kernel/Makefile -+++ b/arch/x86/kernel/Makefile -@@ -28,6 +28,7 @@ obj-$(CONFIG_X86_64) += sys_x86_64.o x8664_ksyms_64.o - obj-y += syscall_$(BITS).o - obj-$(CONFIG_X86_64) += vsyscall_64.o - obj-$(CONFIG_X86_64) += vsyscall_emu_64.o -+obj-$(CONFIG_X86_ESPFIX64) += espfix_64.o - obj-y += bootflag.o e820.o - obj-y += pci-dma.o quirks.o topology.o kdebugfs.o - obj-y += alternative.o i8253.o pci-nommu.o hw_breakpoint.o -diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c -index bb8e034..87477a1 100644 ---- a/arch/x86/kernel/cpu/perf_event.c -+++ b/arch/x86/kernel/cpu/perf_event.c -@@ -1165,6 +1165,9 @@ static void x86_pmu_del(struct perf_event *event, int flags) - for (i = 0; i < cpuc->n_events; i++) { - if (event == cpuc->event_list[i]) { - -+ if (i >= cpuc->n_events - cpuc->n_added) -+ --cpuc->n_added; -+ - if (x86_pmu.put_event_constraints) - x86_pmu.put_event_constraints(cpuc, event); - -diff --git a/arch/x86/kernel/cpu/perf_event_amd_ibs.c b/arch/x86/kernel/cpu/perf_event_amd_ibs.c -index 3b8a2d3..ea34253 100644 ---- a/arch/x86/kernel/cpu/perf_event_amd_ibs.c -+++ b/arch/x86/kernel/cpu/perf_event_amd_ibs.c -@@ -9,6 +9,7 @@ - #include - #include - #include -+#include - - #include - -@@ -209,6 +210,18 @@ static int force_ibs_eilvt_setup(void) - return ret; - } - -+static void ibs_eilvt_setup(void) -+{ -+ /* -+ * Force LVT offset assignment for family 10h: The offsets are -+ * not assigned by the BIOS for this family, so the OS is -+ * responsible for doing it. If the OS assignment fails, fall -+ * back to BIOS settings and try to setup this. -+ */ -+ if (boot_cpu_data.x86 == 0x10) -+ force_ibs_eilvt_setup(); -+} -+ - static inline int get_ibs_lvt_offset(void) - { - u64 val; -@@ -244,6 +257,36 @@ static void clear_APIC_ibs(void *dummy) - setup_APIC_eilvt(offset, 0, APIC_EILVT_MSG_FIX, 1); - } - -+#ifdef CONFIG_PM -+ -+static int perf_ibs_suspend(void) -+{ -+ clear_APIC_ibs(NULL); -+ return 0; -+} -+ -+static void perf_ibs_resume(void) -+{ -+ ibs_eilvt_setup(); -+ setup_APIC_ibs(NULL); -+} -+ -+static struct syscore_ops perf_ibs_syscore_ops = { -+ .resume = perf_ibs_resume, -+ .suspend = perf_ibs_suspend, -+}; -+ -+static void perf_ibs_pm_init(void) -+{ -+ register_syscore_ops(&perf_ibs_syscore_ops); -+} -+ -+#else -+ -+static inline void perf_ibs_pm_init(void) { } -+ -+#endif -+ - static int __cpuinit - perf_ibs_cpu_notifier(struct notifier_block *self, unsigned long action, void *hcpu) - { -@@ -270,18 +313,12 @@ static __init int amd_ibs_init(void) - if (!caps) - return -ENODEV; /* ibs not supported by the cpu */ - -- /* -- * Force LVT offset assignment for family 10h: The offsets are -- * not assigned by the BIOS for this family, so the OS is -- * responsible for doing it. If the OS assignment fails, fall -- * back to BIOS settings and try to setup this. -- */ -- if (boot_cpu_data.x86 == 0x10) -- force_ibs_eilvt_setup(); -+ ibs_eilvt_setup(); - - if (!ibs_eilvt_valid()) - goto out; - -+ perf_ibs_pm_init(); - get_online_cpus(); - ibs_caps = caps; - /* make ibs_caps visible to other cpus: */ -diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c -index 268b245..b1cbcff 100644 ---- a/arch/x86/kernel/cpu/perf_event_intel.c -+++ b/arch/x86/kernel/cpu/perf_event_intel.c -@@ -1070,6 +1070,15 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) - intel_pmu_lbr_read(); - - /* -+ * CondChgd bit 63 doesn't mean any overflow status. Ignore -+ * and clear the bit. -+ */ -+ if (__test_and_clear_bit(63, (unsigned long *)&status)) { -+ if (!status) -+ goto done; -+ } -+ -+ /* - * PEBS overflow sets bit 62 in the global status register - */ - if (__test_and_clear_bit(62, (unsigned long *)&status)) { -diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c -index 13ad899..69e231b 100644 ---- a/arch/x86/kernel/crash.c -+++ b/arch/x86/kernel/crash.c -@@ -95,10 +95,10 @@ void native_machine_crash_shutdown(struct pt_regs *regs) - cpu_emergency_vmxoff(); - cpu_emergency_svm_disable(); - -- lapic_shutdown(); - #if defined(CONFIG_X86_IO_APIC) - disable_IO_APIC(); - #endif -+ lapic_shutdown(); - #ifdef CONFIG_HPET_TIMER - hpet_disable(); - #endif -diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S -index 2af4ccd..a075124 100644 ---- a/arch/x86/kernel/entry_32.S -+++ b/arch/x86/kernel/entry_32.S -@@ -426,8 +426,9 @@ sysenter_past_esp: - jnz sysenter_audit - sysenter_do_call: - cmpl $(NR_syscalls), %eax -- jae syscall_badsys -+ jae sysenter_badsys - call *sys_call_table(,%eax,4) -+sysenter_after_call: - movl %eax,PT_EAX(%esp) - LOCKDEP_SYS_EXIT - DISABLE_INTERRUPTS(CLBR_ANY) -@@ -509,6 +510,7 @@ ENTRY(system_call) - jae syscall_badsys - syscall_call: - call *sys_call_table(,%eax,4) -+syscall_after_call: - movl %eax,PT_EAX(%esp) # store the return value - syscall_exit: - LOCKDEP_SYS_EXIT -@@ -523,6 +525,7 @@ syscall_exit: - restore_all: - TRACE_IRQS_IRET - restore_all_notrace: -+#ifdef CONFIG_X86_ESPFIX32 - movl PT_EFLAGS(%esp), %eax # mix EFLAGS, SS and CS - # Warning: PT_OLDSS(%esp) contains the wrong/random values if we - # are returning to the kernel. -@@ -533,6 +536,7 @@ restore_all_notrace: - cmpl $((SEGMENT_LDT << 8) | USER_RPL), %eax - CFI_REMEMBER_STATE - je ldt_ss # returning to user-space with LDT SS -+#endif - restore_nocheck: - RESTORE_REGS 4 # skip orig_eax/error_code - irq_return: -@@ -548,13 +552,9 @@ ENTRY(iret_exc) - .long irq_return,iret_exc - .previous - -+#ifdef CONFIG_X86_ESPFIX32 - CFI_RESTORE_STATE - ldt_ss: -- larl PT_OLDSS(%esp), %eax -- jnz restore_nocheck -- testl $0x00400000, %eax # returning to 32bit stack? -- jnz restore_nocheck # allright, normal return -- - #ifdef CONFIG_PARAVIRT - /* - * The kernel can't run on a non-flat stack if paravirt mode -@@ -596,6 +596,7 @@ ldt_ss: - lss (%esp), %esp /* switch to espfix segment */ - CFI_ADJUST_CFA_OFFSET -8 - jmp restore_nocheck -+#endif - CFI_ENDPROC - ENDPROC(system_call) - -@@ -682,8 +683,13 @@ syscall_fault: - END(syscall_fault) - - syscall_badsys: -- movl $-ENOSYS,PT_EAX(%esp) -- jmp resume_userspace -+ movl $-ENOSYS,%eax -+ jmp syscall_after_call -+END(syscall_badsys) -+ -+sysenter_badsys: -+ movl $-ENOSYS,%eax -+ jmp sysenter_after_call - END(syscall_badsys) - CFI_ENDPROC - /* -@@ -764,6 +770,7 @@ ENDPROC(ptregs_clone) - * the high word of the segment base from the GDT and swiches to the - * normal stack and adjusts ESP with the matching offset. - */ -+#ifdef CONFIG_X86_ESPFIX32 - /* fixup the stack */ - mov GDT_ESPFIX_SS + 4, %al /* bits 16..23 */ - mov GDT_ESPFIX_SS + 7, %ah /* bits 24..31 */ -@@ -773,8 +780,10 @@ ENDPROC(ptregs_clone) - pushl_cfi %eax - lss (%esp), %esp /* switch to the normal stack segment */ - CFI_ADJUST_CFA_OFFSET -8 -+#endif - .endm - .macro UNWIND_ESPFIX_STACK -+#ifdef CONFIG_X86_ESPFIX32 - movl %ss, %eax - /* see if on espfix stack */ - cmpw $__ESPFIX_SS, %ax -@@ -785,6 +794,7 @@ ENDPROC(ptregs_clone) - /* switch to normal stack */ - FIXUP_ESPFIX_STACK - 27: -+#endif - .endm - - /* -@@ -1316,11 +1326,13 @@ END(debug) - */ - ENTRY(nmi) - RING0_INT_FRAME -+#ifdef CONFIG_X86_ESPFIX32 - pushl_cfi %eax - movl %ss, %eax - cmpw $__ESPFIX_SS, %ax - popl_cfi %eax - je nmi_espfix_stack -+#endif - cmpl $ia32_sysenter_target,(%esp) - je nmi_stack_fixup - pushl_cfi %eax -@@ -1360,6 +1372,7 @@ nmi_debug_stack_check: - FIX_STACK 24, nmi_stack_correct, 1 - jmp nmi_stack_correct - -+#ifdef CONFIG_X86_ESPFIX32 - nmi_espfix_stack: - /* We have a RING0_INT_FRAME here. - * -@@ -1381,6 +1394,7 @@ nmi_espfix_stack: - lss 12+4(%esp), %esp # back to espfix stack - CFI_ADJUST_CFA_OFFSET -24 - jmp irq_return -+#endif - CFI_ENDPROC - END(nmi) - -diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S -index bd6f592..42b055e 100644 ---- a/arch/x86/kernel/entry_64.S -+++ b/arch/x86/kernel/entry_64.S -@@ -55,6 +55,7 @@ - #include - #include - #include -+#include - #include - - /* Avoid __ASSEMBLER__'ifying just for this. */ -@@ -901,17 +902,47 @@ restore_args: - irq_return: - INTERRUPT_RETURN - -- .section __ex_table, "a" -- .quad irq_return, bad_iret -- .previous -- --#ifdef CONFIG_PARAVIRT - ENTRY(native_iret) -+ /* -+ * Are we returning to a stack segment from the LDT? Note: in -+ * 64-bit mode SS:RSP on the exception stack is always valid. -+ */ -+#ifdef CONFIG_X86_ESPFIX64 -+ testb $4,(SS-RIP)(%rsp) -+ jnz native_irq_return_ldt -+#endif -+ -+native_irq_return_iret: - iretq - - .section __ex_table,"a" -- .quad native_iret, bad_iret -+ .quad native_irq_return_iret, bad_iret - .previous -+ -+#ifdef CONFIG_X86_ESPFIX64 -+native_irq_return_ldt: -+ pushq_cfi %rax -+ pushq_cfi %rdi -+ SWAPGS -+ movq PER_CPU_VAR(espfix_waddr),%rdi -+ movq %rax,(0*8)(%rdi) /* RAX */ -+ movq (2*8)(%rsp),%rax /* RIP */ -+ movq %rax,(1*8)(%rdi) -+ movq (3*8)(%rsp),%rax /* CS */ -+ movq %rax,(2*8)(%rdi) -+ movq (4*8)(%rsp),%rax /* RFLAGS */ -+ movq %rax,(3*8)(%rdi) -+ movq (6*8)(%rsp),%rax /* SS */ -+ movq %rax,(5*8)(%rdi) -+ movq (5*8)(%rsp),%rax /* RSP */ -+ movq %rax,(4*8)(%rdi) -+ andl $0xffff0000,%eax -+ popq_cfi %rdi -+ orq PER_CPU_VAR(espfix_stack),%rax -+ SWAPGS -+ movq %rax,%rsp -+ popq_cfi %rax -+ jmp native_irq_return_iret - #endif - - .section .fixup,"ax" -@@ -977,9 +1008,40 @@ ENTRY(retint_kernel) - call preempt_schedule_irq - jmp exit_intr - #endif -- - CFI_ENDPROC - END(common_interrupt) -+ -+ /* -+ * If IRET takes a fault on the espfix stack, then we -+ * end up promoting it to a doublefault. In that case, -+ * modify the stack to make it look like we just entered -+ * the #GP handler from user space, similar to bad_iret. -+ */ -+#ifdef CONFIG_X86_ESPFIX64 -+ ALIGN -+__do_double_fault: -+ XCPT_FRAME 1 RDI+8 -+ movq RSP(%rdi),%rax /* Trap on the espfix stack? */ -+ sarq $PGDIR_SHIFT,%rax -+ cmpl $ESPFIX_PGD_ENTRY,%eax -+ jne do_double_fault /* No, just deliver the fault */ -+ cmpl $__KERNEL_CS,CS(%rdi) -+ jne do_double_fault -+ movq RIP(%rdi),%rax -+ cmpq $native_irq_return_iret,%rax -+ jne do_double_fault /* This shouldn't happen... */ -+ movq PER_CPU_VAR(kernel_stack),%rax -+ subq $(6*8-KERNEL_STACK_OFFSET),%rax /* Reset to original stack */ -+ movq %rax,RSP(%rdi) -+ movq $0,(%rax) /* Missing (lost) #GP error code */ -+ movq $general_protection,RIP(%rdi) -+ retq -+ CFI_ENDPROC -+END(__do_double_fault) -+#else -+# define __do_double_fault do_double_fault -+#endif -+ - /* - * End of kprobes section - */ -@@ -1155,7 +1217,7 @@ zeroentry overflow do_overflow - zeroentry bounds do_bounds - zeroentry invalid_op do_invalid_op - zeroentry device_not_available do_device_not_available --paranoiderrorentry double_fault do_double_fault -+paranoiderrorentry double_fault __do_double_fault - zeroentry coprocessor_segment_overrun do_coprocessor_segment_overrun - errorentry invalid_TSS do_invalid_TSS - errorentry segment_not_present do_segment_not_present -@@ -1486,7 +1548,7 @@ error_sti: - */ - error_kernelspace: - incl %ebx -- leaq irq_return(%rip),%rcx -+ leaq native_irq_return_iret(%rip),%rcx - cmpq %rcx,RIP+8(%rsp) - je error_swapgs - movl %ecx,%eax /* zero extend */ -diff --git a/arch/x86/kernel/espfix_64.c b/arch/x86/kernel/espfix_64.c -new file mode 100644 -index 0000000..94d857f ---- /dev/null -+++ b/arch/x86/kernel/espfix_64.c -@@ -0,0 +1,208 @@ -+/* ----------------------------------------------------------------------- * -+ * -+ * Copyright 2014 Intel Corporation; author: H. Peter Anvin -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms and conditions of the GNU General Public License, -+ * version 2, as published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope it will be useful, but WITHOUT -+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -+ * more details. -+ * -+ * ----------------------------------------------------------------------- */ -+ -+/* -+ * The IRET instruction, when returning to a 16-bit segment, only -+ * restores the bottom 16 bits of the user space stack pointer. This -+ * causes some 16-bit software to break, but it also leaks kernel state -+ * to user space. -+ * -+ * This works around this by creating percpu "ministacks", each of which -+ * is mapped 2^16 times 64K apart. When we detect that the return SS is -+ * on the LDT, we copy the IRET frame to the ministack and use the -+ * relevant alias to return to userspace. The ministacks are mapped -+ * readonly, so if the IRET fault we promote #GP to #DF which is an IST -+ * vector and thus has its own stack; we then do the fixup in the #DF -+ * handler. -+ * -+ * This file sets up the ministacks and the related page tables. The -+ * actual ministack invocation is in entry_64.S. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* -+ * Note: we only need 6*8 = 48 bytes for the espfix stack, but round -+ * it up to a cache line to avoid unnecessary sharing. -+ */ -+#define ESPFIX_STACK_SIZE (8*8UL) -+#define ESPFIX_STACKS_PER_PAGE (PAGE_SIZE/ESPFIX_STACK_SIZE) -+ -+/* There is address space for how many espfix pages? */ -+#define ESPFIX_PAGE_SPACE (1UL << (PGDIR_SHIFT-PAGE_SHIFT-16)) -+ -+#define ESPFIX_MAX_CPUS (ESPFIX_STACKS_PER_PAGE * ESPFIX_PAGE_SPACE) -+#if CONFIG_NR_CPUS > ESPFIX_MAX_CPUS -+# error "Need more than one PGD for the ESPFIX hack" -+#endif -+ -+#define PGALLOC_GFP (GFP_KERNEL | __GFP_NOTRACK | __GFP_REPEAT | __GFP_ZERO) -+ -+/* This contains the *bottom* address of the espfix stack */ -+DEFINE_PER_CPU_READ_MOSTLY(unsigned long, espfix_stack); -+DEFINE_PER_CPU_READ_MOSTLY(unsigned long, espfix_waddr); -+ -+/* Initialization mutex - should this be a spinlock? */ -+static DEFINE_MUTEX(espfix_init_mutex); -+ -+/* Page allocation bitmap - each page serves ESPFIX_STACKS_PER_PAGE CPUs */ -+#define ESPFIX_MAX_PAGES DIV_ROUND_UP(CONFIG_NR_CPUS, ESPFIX_STACKS_PER_PAGE) -+static void *espfix_pages[ESPFIX_MAX_PAGES]; -+ -+static __page_aligned_bss pud_t espfix_pud_page[PTRS_PER_PUD] -+ __aligned(PAGE_SIZE); -+ -+static unsigned int page_random, slot_random; -+ -+/* -+ * This returns the bottom address of the espfix stack for a specific CPU. -+ * The math allows for a non-power-of-two ESPFIX_STACK_SIZE, in which case -+ * we have to account for some amount of padding at the end of each page. -+ */ -+static inline unsigned long espfix_base_addr(unsigned int cpu) -+{ -+ unsigned long page, slot; -+ unsigned long addr; -+ -+ page = (cpu / ESPFIX_STACKS_PER_PAGE) ^ page_random; -+ slot = (cpu + slot_random) % ESPFIX_STACKS_PER_PAGE; -+ addr = (page << PAGE_SHIFT) + (slot * ESPFIX_STACK_SIZE); -+ addr = (addr & 0xffffUL) | ((addr & ~0xffffUL) << 16); -+ addr += ESPFIX_BASE_ADDR; -+ return addr; -+} -+ -+#define PTE_STRIDE (65536/PAGE_SIZE) -+#define ESPFIX_PTE_CLONES (PTRS_PER_PTE/PTE_STRIDE) -+#define ESPFIX_PMD_CLONES PTRS_PER_PMD -+#define ESPFIX_PUD_CLONES (65536/(ESPFIX_PTE_CLONES*ESPFIX_PMD_CLONES)) -+ -+#define PGTABLE_PROT ((_KERNPG_TABLE & ~_PAGE_RW) | _PAGE_NX) -+ -+static void init_espfix_random(void) -+{ -+ unsigned long rand; -+ -+ /* -+ * This is run before the entropy pools are initialized, -+ * but this is hopefully better than nothing. -+ */ -+ if (!arch_get_random_long(&rand)) { -+ /* The constant is an arbitrary large prime */ -+ rdtscll(rand); -+ rand *= 0xc345c6b72fd16123UL; -+ } -+ -+ slot_random = rand % ESPFIX_STACKS_PER_PAGE; -+ page_random = (rand / ESPFIX_STACKS_PER_PAGE) -+ & (ESPFIX_PAGE_SPACE - 1); -+} -+ -+void __init init_espfix_bsp(void) -+{ -+ pgd_t *pgd_p; -+ pteval_t ptemask; -+ -+ ptemask = __supported_pte_mask; -+ -+ /* Install the espfix pud into the kernel page directory */ -+ pgd_p = &init_level4_pgt[pgd_index(ESPFIX_BASE_ADDR)]; -+ pgd_populate(&init_mm, pgd_p, (pud_t *)espfix_pud_page); -+ -+ /* Randomize the locations */ -+ init_espfix_random(); -+ -+ /* The rest is the same as for any other processor */ -+ init_espfix_ap(); -+} -+ -+void init_espfix_ap(void) -+{ -+ unsigned int cpu, page; -+ unsigned long addr; -+ pud_t pud, *pud_p; -+ pmd_t pmd, *pmd_p; -+ pte_t pte, *pte_p; -+ int n; -+ void *stack_page; -+ pteval_t ptemask; -+ -+ /* We only have to do this once... */ -+ if (likely(this_cpu_read(espfix_stack))) -+ return; /* Already initialized */ -+ -+ cpu = smp_processor_id(); -+ addr = espfix_base_addr(cpu); -+ page = cpu/ESPFIX_STACKS_PER_PAGE; -+ -+ /* Did another CPU already set this up? */ -+ stack_page = ACCESS_ONCE(espfix_pages[page]); -+ if (likely(stack_page)) -+ goto done; -+ -+ mutex_lock(&espfix_init_mutex); -+ -+ /* Did we race on the lock? */ -+ stack_page = ACCESS_ONCE(espfix_pages[page]); -+ if (stack_page) -+ goto unlock_done; -+ -+ ptemask = __supported_pte_mask; -+ -+ pud_p = &espfix_pud_page[pud_index(addr)]; -+ pud = *pud_p; -+ if (!pud_present(pud)) { -+ pmd_p = (pmd_t *)__get_free_page(PGALLOC_GFP); -+ pud = __pud(__pa(pmd_p) | (PGTABLE_PROT & ptemask)); -+ paravirt_alloc_pmd(&init_mm, __pa(pmd_p) >> PAGE_SHIFT); -+ for (n = 0; n < ESPFIX_PUD_CLONES; n++) -+ set_pud(&pud_p[n], pud); -+ } -+ -+ pmd_p = pmd_offset(&pud, addr); -+ pmd = *pmd_p; -+ if (!pmd_present(pmd)) { -+ pte_p = (pte_t *)__get_free_page(PGALLOC_GFP); -+ pmd = __pmd(__pa(pte_p) | (PGTABLE_PROT & ptemask)); -+ paravirt_alloc_pte(&init_mm, __pa(pte_p) >> PAGE_SHIFT); -+ for (n = 0; n < ESPFIX_PMD_CLONES; n++) -+ set_pmd(&pmd_p[n], pmd); -+ } -+ -+ pte_p = pte_offset_kernel(&pmd, addr); -+ stack_page = (void *)__get_free_page(GFP_KERNEL); -+ pte = __pte(__pa(stack_page) | (__PAGE_KERNEL_RO & ptemask)); -+ for (n = 0; n < ESPFIX_PTE_CLONES; n++) -+ set_pte(&pte_p[n*PTE_STRIDE], pte); -+ -+ /* Job is done for this CPU and any CPU which shares this page */ -+ ACCESS_ONCE(espfix_pages[page]) = stack_page; -+ -+unlock_done: -+ mutex_unlock(&espfix_init_mutex); -+done: -+ this_cpu_write(espfix_stack, addr); -+ this_cpu_write(espfix_waddr, (unsigned long)stack_page -+ + (addr & ~PAGE_MASK)); -+} -diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c -index ebc9873..c37886d 100644 ---- a/arch/x86/kernel/ldt.c -+++ b/arch/x86/kernel/ldt.c -@@ -229,6 +229,11 @@ static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode) - } - } - -+ if (!IS_ENABLED(CONFIG_X86_16BIT) && !ldt_info.seg_32bit) { -+ error = -EINVAL; -+ goto out_unlock; -+ } -+ - fill_ldt(&ldt, &ldt_info); - if (oldmode) - ldt.avl = 0; -diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c -index 5d8cf0d..b316ffe 100644 ---- a/arch/x86/kernel/microcode_amd.c -+++ b/arch/x86/kernel/microcode_amd.c -@@ -338,7 +338,7 @@ static enum ucode_state request_microcode_amd(int cpu, struct device *device) - snprintf(fw_name, sizeof(fw_name), "amd-ucode/microcode_amd_fam%.2xh.bin", c->x86); - - if (request_firmware(&fw, (const char *)fw_name, device)) { -- pr_err("failed to load file %s\n", fw_name); -+ pr_debug("failed to load file %s\n", fw_name); - goto out; - } - -diff --git a/arch/x86/kernel/paravirt_patch_64.c b/arch/x86/kernel/paravirt_patch_64.c -index 3f08f34..a1da673 100644 ---- a/arch/x86/kernel/paravirt_patch_64.c -+++ b/arch/x86/kernel/paravirt_patch_64.c -@@ -6,7 +6,6 @@ DEF_NATIVE(pv_irq_ops, irq_disable, "cli"); - DEF_NATIVE(pv_irq_ops, irq_enable, "sti"); - DEF_NATIVE(pv_irq_ops, restore_fl, "pushq %rdi; popfq"); - DEF_NATIVE(pv_irq_ops, save_fl, "pushfq; popq %rax"); --DEF_NATIVE(pv_cpu_ops, iret, "iretq"); - DEF_NATIVE(pv_mmu_ops, read_cr2, "movq %cr2, %rax"); - DEF_NATIVE(pv_mmu_ops, read_cr3, "movq %cr3, %rax"); - DEF_NATIVE(pv_mmu_ops, write_cr3, "movq %rdi, %cr3"); -@@ -50,7 +49,6 @@ unsigned native_patch(u8 type, u16 clobbers, void *ibuf, - PATCH_SITE(pv_irq_ops, save_fl); - PATCH_SITE(pv_irq_ops, irq_enable); - PATCH_SITE(pv_irq_ops, irq_disable); -- PATCH_SITE(pv_cpu_ops, iret); - PATCH_SITE(pv_cpu_ops, irq_enable_sysexit); - PATCH_SITE(pv_cpu_ops, usergs_sysret32); - PATCH_SITE(pv_cpu_ops, usergs_sysret64); -diff --git a/arch/x86/kernel/quirks.c b/arch/x86/kernel/quirks.c -index 03920a1..28a3e62 100644 ---- a/arch/x86/kernel/quirks.c -+++ b/arch/x86/kernel/quirks.c -@@ -525,7 +525,7 @@ static void __init quirk_amd_nb_node(struct pci_dev *dev) - return; - - pci_read_config_dword(nb_ht, 0x60, &val); -- node = val & 7; -+ node = pcibus_to_node(dev->bus) | (val & 7); - /* - * Some hardware may return an invalid node ID, - * so check it first: -diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c -index bd70df6..d398f31 100644 ---- a/arch/x86/kernel/reboot.c -+++ b/arch/x86/kernel/reboot.c -@@ -668,6 +668,13 @@ void native_machine_shutdown(void) - - /* The boot cpu is always logical cpu 0 */ - int reboot_cpu_id = 0; -+#endif -+ -+#ifdef CONFIG_X86_IO_APIC -+ disable_IO_APIC(); -+#endif -+ -+#ifdef CONFIG_SMP - - #ifdef CONFIG_X86_32 - /* See if there has been given a command line override */ -@@ -691,10 +698,6 @@ void native_machine_shutdown(void) - - lapic_shutdown(); - --#ifdef CONFIG_X86_IO_APIC -- disable_IO_APIC(); --#endif -- - #ifdef CONFIG_HPET_TIMER - hpet_disable(); - #endif -diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c -index dc29333..436aa6d 100644 ---- a/arch/x86/kernel/setup.c -+++ b/arch/x86/kernel/setup.c -@@ -626,7 +626,7 @@ static bool __init snb_gfx_workaround_needed(void) - #ifdef CONFIG_PCI - int i; - u16 vendor, devid; -- static const u16 snb_ids[] = { -+ static const __initconst u16 snb_ids[] = { - 0x0102, - 0x0112, - 0x0122, -@@ -659,7 +659,7 @@ static bool __init snb_gfx_workaround_needed(void) - */ - static void __init trim_snb_memory(void) - { -- static const unsigned long bad_pages[] = { -+ static const __initconst unsigned long bad_pages[] = { - 0x20050000, - 0x20110000, - 0x20130000, -diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c -index 849cdcf..c7dbf02 100644 ---- a/arch/x86/kernel/smpboot.c -+++ b/arch/x86/kernel/smpboot.c -@@ -271,6 +271,13 @@ notrace static void __cpuinit start_secondary(void *unused) - check_tsc_sync_target(); - - /* -+ * Enable the espfix hack for this CPU -+ */ -+#ifdef CONFIG_X86_ESPFIX64 -+ init_espfix_ap(); -+#endif -+ -+ /* - * We need to hold call_lock, so there is no inconsistency - * between the time smp_call_function() determines number of - * IPI recipients, and the time when the determination is made -@@ -1241,6 +1248,9 @@ static void remove_siblinginfo(int cpu) - - for_each_cpu(sibling, cpu_sibling_mask(cpu)) - cpumask_clear_cpu(cpu, cpu_sibling_mask(sibling)); -+ for_each_cpu(sibling, cpu_llc_shared_mask(cpu)) -+ cpumask_clear_cpu(cpu, cpu_llc_shared_mask(sibling)); -+ cpumask_clear(cpu_llc_shared_mask(cpu)); - cpumask_clear(cpu_sibling_mask(cpu)); - cpumask_clear(cpu_core_mask(cpu)); - c->phys_proc_id = 0; -diff --git a/arch/x86/kernel/step.c b/arch/x86/kernel/step.c -index c346d11..f89cdc6 100644 ---- a/arch/x86/kernel/step.c -+++ b/arch/x86/kernel/step.c -@@ -157,6 +157,33 @@ static int enable_single_step(struct task_struct *child) - return 1; - } - -+static void set_task_blockstep(struct task_struct *task, bool on) -+{ -+ unsigned long debugctl; -+ -+ /* -+ * Ensure irq/preemption can't change debugctl in between. -+ * Note also that both TIF_BLOCKSTEP and debugctl should -+ * be changed atomically wrt preemption. -+ * FIXME: this means that set/clear TIF_BLOCKSTEP is simply -+ * wrong if task != current, SIGKILL can wakeup the stopped -+ * tracee and set/clear can play with the running task, this -+ * can confuse the next __switch_to_xtra(). -+ */ -+ local_irq_disable(); -+ debugctl = get_debugctlmsr(); -+ if (on) { -+ debugctl |= DEBUGCTLMSR_BTF; -+ set_tsk_thread_flag(task, TIF_BLOCKSTEP); -+ } else { -+ debugctl &= ~DEBUGCTLMSR_BTF; -+ clear_tsk_thread_flag(task, TIF_BLOCKSTEP); -+ } -+ if (task == current) -+ update_debugctlmsr(debugctl); -+ local_irq_enable(); -+} -+ - /* - * Enable single or block step. - */ -@@ -169,19 +196,10 @@ static void enable_step(struct task_struct *child, bool block) - * So no one should try to use debugger block stepping in a program - * that uses user-mode single stepping itself. - */ -- if (enable_single_step(child) && block) { -- unsigned long debugctl = get_debugctlmsr(); -- -- debugctl |= DEBUGCTLMSR_BTF; -- update_debugctlmsr(debugctl); -- set_tsk_thread_flag(child, TIF_BLOCKSTEP); -- } else if (test_tsk_thread_flag(child, TIF_BLOCKSTEP)) { -- unsigned long debugctl = get_debugctlmsr(); -- -- debugctl &= ~DEBUGCTLMSR_BTF; -- update_debugctlmsr(debugctl); -- clear_tsk_thread_flag(child, TIF_BLOCKSTEP); -- } -+ if (enable_single_step(child) && block) -+ set_task_blockstep(child, true); -+ else if (test_tsk_thread_flag(child, TIF_BLOCKSTEP)) -+ set_task_blockstep(child, false); - } - - void user_enable_single_step(struct task_struct *child) -@@ -199,13 +217,8 @@ void user_disable_single_step(struct task_struct *child) - /* - * Make sure block stepping (BTF) is disabled. - */ -- if (test_tsk_thread_flag(child, TIF_BLOCKSTEP)) { -- unsigned long debugctl = get_debugctlmsr(); -- -- debugctl &= ~DEBUGCTLMSR_BTF; -- update_debugctlmsr(debugctl); -- clear_tsk_thread_flag(child, TIF_BLOCKSTEP); -- } -+ if (test_tsk_thread_flag(child, TIF_BLOCKSTEP)) -+ set_task_blockstep(child, false); - - /* Always clear TIF_SINGLESTEP... */ - clear_tsk_thread_flag(child, TIF_SINGLESTEP); -diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c -index b4d3c39..51534ef 100644 ---- a/arch/x86/kernel/sys_x86_64.c -+++ b/arch/x86/kernel/sys_x86_64.c -@@ -115,7 +115,7 @@ static void find_start_end(unsigned long flags, unsigned long *begin, - *begin = new_begin; - } - } else { -- *begin = TASK_UNMAPPED_BASE; -+ *begin = current->mm->mmap_legacy_base; - *end = TASK_SIZE; - } - } -diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c -index 8584322..578613d 100644 ---- a/arch/x86/kvm/lapic.c -+++ b/arch/x86/kvm/lapic.c -@@ -538,7 +538,8 @@ static u32 apic_get_tmcct(struct kvm_lapic *apic) - ASSERT(apic != NULL); - - /* if initial count is 0, current count should also be 0 */ -- if (apic_get_reg(apic, APIC_TMICT) == 0) -+ if (apic_get_reg(apic, APIC_TMICT) == 0 || -+ apic->lapic_timer.period == 0) - return 0; - - remaining = hrtimer_get_remaining(&apic->lapic_timer.timer); -@@ -1278,14 +1279,12 @@ void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu) - void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu) - { - u32 data; -- void *vapic; - - if (!irqchip_in_kernel(vcpu->kvm) || !vcpu->arch.apic->vapic_addr) - return; - -- vapic = kmap_atomic(vcpu->arch.apic->vapic_page); -- data = *(u32 *)(vapic + offset_in_page(vcpu->arch.apic->vapic_addr)); -- kunmap_atomic(vapic); -+ kvm_read_guest_cached(vcpu->kvm, &vcpu->arch.apic->vapic_cache, &data, -+ sizeof(u32)); - - apic_set_tpr(vcpu->arch.apic, data & 0xff); - } -@@ -1295,7 +1294,6 @@ void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu) - u32 data, tpr; - int max_irr, max_isr; - struct kvm_lapic *apic; -- void *vapic; - - if (!irqchip_in_kernel(vcpu->kvm) || !vcpu->arch.apic->vapic_addr) - return; -@@ -1310,17 +1308,24 @@ void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu) - max_isr = 0; - data = (tpr & 0xff) | ((max_isr & 0xf0) << 8) | (max_irr << 24); - -- vapic = kmap_atomic(vcpu->arch.apic->vapic_page); -- *(u32 *)(vapic + offset_in_page(vcpu->arch.apic->vapic_addr)) = data; -- kunmap_atomic(vapic); -+ kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.apic->vapic_cache, &data, -+ sizeof(u32)); - } - --void kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr) -+int kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr) - { - if (!irqchip_in_kernel(vcpu->kvm)) -- return; -+ return -EINVAL; -+ -+ if (vapic_addr) { -+ if (kvm_gfn_to_hva_cache_init(vcpu->kvm, -+ &vcpu->arch.apic->vapic_cache, -+ vapic_addr, sizeof(u32))) -+ return -EINVAL; -+ } - - vcpu->arch.apic->vapic_addr = vapic_addr; -+ return 0; - } - - int kvm_x2apic_msr_write(struct kvm_vcpu *vcpu, u32 msr, u64 data) -diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h -index 6f4ce25..6aec071 100644 ---- a/arch/x86/kvm/lapic.h -+++ b/arch/x86/kvm/lapic.h -@@ -15,7 +15,7 @@ struct kvm_lapic { - bool irr_pending; - void *regs; - gpa_t vapic_addr; -- struct page *vapic_page; -+ struct gfn_to_hva_cache vapic_cache; - }; - int kvm_create_lapic(struct kvm_vcpu *vcpu); - void kvm_free_lapic(struct kvm_vcpu *vcpu); -@@ -46,7 +46,7 @@ int kvm_lapic_find_highest_irr(struct kvm_vcpu *vcpu); - u64 kvm_get_lapic_tscdeadline_msr(struct kvm_vcpu *vcpu); - void kvm_set_lapic_tscdeadline_msr(struct kvm_vcpu *vcpu, u64 data); - --void kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr); -+int kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr); - void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu); - void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu); - -diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c -index 4cb1642..fd6dec6 100644 ---- a/arch/x86/kvm/mmu.c -+++ b/arch/x86/kvm/mmu.c -@@ -2451,6 +2451,9 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write, - int emulate = 0; - gfn_t pseudo_gfn; - -+ if (!VALID_PAGE(vcpu->arch.mmu.root_hpa)) -+ return 0; -+ - for_each_shadow_entry(vcpu, (u64)gfn << PAGE_SHIFT, iterator) { - if (iterator.level == level) { - unsigned pte_access = ACC_ALL; -diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c -index e334389..b567285 100644 ---- a/arch/x86/kvm/svm.c -+++ b/arch/x86/kvm/svm.c -@@ -3007,10 +3007,8 @@ static int cr8_write_interception(struct vcpu_svm *svm) - u8 cr8_prev = kvm_get_cr8(&svm->vcpu); - /* instruction emulation calls kvm_set_cr8() */ - r = cr_interception(svm); -- if (irqchip_in_kernel(svm->vcpu.kvm)) { -- clr_cr_intercept(svm, INTERCEPT_CR8_WRITE); -+ if (irqchip_in_kernel(svm->vcpu.kvm)) - return r; -- } - if (cr8_prev <= kvm_get_cr8(&svm->vcpu)) - return r; - kvm_run->exit_reason = KVM_EXIT_SET_TPR; -@@ -3566,6 +3564,8 @@ static void update_cr8_intercept(struct kvm_vcpu *vcpu, int tpr, int irr) - if (is_guest_mode(vcpu) && (vcpu->arch.hflags & HF_VINTR_MASK)) - return; - -+ clr_cr_intercept(svm, INTERCEPT_CR8_WRITE); -+ - if (irr == -1) - return; - -diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c -index 90f5c0e..617b00b 100644 ---- a/arch/x86/kvm/vmx.c -+++ b/arch/x86/kvm/vmx.c -@@ -6281,8 +6281,8 @@ static void vmx_free_vcpu(struct kvm_vcpu *vcpu) - struct vcpu_vmx *vmx = to_vmx(vcpu); - - free_vpid(vmx); -- free_nested(vmx); - free_loaded_vmcs(vmx->loaded_vmcs); -+ free_nested(vmx); - kfree(vmx->guest_msrs); - kvm_vcpu_uninit(vcpu); - kmem_cache_free(kvm_vcpu_cache, vmx); -diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c -index 3663e0b..4b1be29 100644 ---- a/arch/x86/kvm/x86.c -+++ b/arch/x86/kvm/x86.c -@@ -2728,8 +2728,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp, - r = -EFAULT; - if (copy_from_user(&va, argp, sizeof va)) - goto out; -- r = 0; -- kvm_lapic_set_vapic_addr(vcpu, va.vapic_addr); -+ r = kvm_lapic_set_vapic_addr(vcpu, va.vapic_addr); - break; - } - case KVM_X86_SETUP_MCE: { -@@ -5075,33 +5074,6 @@ static void post_kvm_run_save(struct kvm_vcpu *vcpu) - !kvm_event_needs_reinjection(vcpu); - } - --static void vapic_enter(struct kvm_vcpu *vcpu) --{ -- struct kvm_lapic *apic = vcpu->arch.apic; -- struct page *page; -- -- if (!apic || !apic->vapic_addr) -- return; -- -- page = gfn_to_page(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT); -- -- vcpu->arch.apic->vapic_page = page; --} -- --static void vapic_exit(struct kvm_vcpu *vcpu) --{ -- struct kvm_lapic *apic = vcpu->arch.apic; -- int idx; -- -- if (!apic || !apic->vapic_addr) -- return; -- -- idx = srcu_read_lock(&vcpu->kvm->srcu); -- kvm_release_page_dirty(apic->vapic_page); -- mark_page_dirty(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT); -- srcu_read_unlock(&vcpu->kvm->srcu, idx); --} -- - static void update_cr8_intercept(struct kvm_vcpu *vcpu) - { - int max_irr, tpr; -@@ -5385,7 +5357,6 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) - } - - vcpu->srcu_idx = srcu_read_lock(&kvm->srcu); -- vapic_enter(vcpu); - - r = 1; - while (r > 0) { -@@ -5442,8 +5413,6 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) - - srcu_read_unlock(&kvm->srcu, vcpu->srcu_idx); - -- vapic_exit(vcpu); -- - return r; - } - -diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c -index 0002a3a..e04e677 100644 ---- a/arch/x86/mm/dump_pagetables.c -+++ b/arch/x86/mm/dump_pagetables.c -@@ -30,11 +30,13 @@ struct pg_state { - unsigned long start_address; - unsigned long current_address; - const struct addr_marker *marker; -+ unsigned long lines; - }; - - struct addr_marker { - unsigned long start_address; - const char *name; -+ unsigned long max_lines; - }; - - /* indices for address_markers; keep sync'd w/ address_markers below */ -@@ -45,6 +47,7 @@ enum address_markers_idx { - LOW_KERNEL_NR, - VMALLOC_START_NR, - VMEMMAP_START_NR, -+ ESPFIX_START_NR, - HIGH_KERNEL_NR, - MODULES_VADDR_NR, - MODULES_END_NR, -@@ -67,6 +70,7 @@ static struct addr_marker address_markers[] = { - { PAGE_OFFSET, "Low Kernel Mapping" }, - { VMALLOC_START, "vmalloc() Area" }, - { VMEMMAP_START, "Vmemmap" }, -+ { ESPFIX_BASE_ADDR, "ESPfix Area", 16 }, - { __START_KERNEL_map, "High Kernel Mapping" }, - { MODULES_VADDR, "Modules" }, - { MODULES_END, "End Modules" }, -@@ -163,7 +167,7 @@ static void note_page(struct seq_file *m, struct pg_state *st, - pgprot_t new_prot, int level) - { - pgprotval_t prot, cur; -- static const char units[] = "KMGTPE"; -+ static const char units[] = "BKMGTPE"; - - /* - * If we have a "break" in the series, we need to flush the state that -@@ -178,6 +182,7 @@ static void note_page(struct seq_file *m, struct pg_state *st, - st->current_prot = new_prot; - st->level = level; - st->marker = address_markers; -+ st->lines = 0; - seq_printf(m, "---[ %s ]---\n", st->marker->name); - } else if (prot != cur || level != st->level || - st->current_address >= st->marker[1].start_address) { -@@ -188,17 +193,21 @@ static void note_page(struct seq_file *m, struct pg_state *st, - /* - * Now print the actual finished series - */ -- seq_printf(m, "0x%0*lx-0x%0*lx ", -- width, st->start_address, -- width, st->current_address); -- -- delta = (st->current_address - st->start_address) >> 10; -- while (!(delta & 1023) && unit[1]) { -- delta >>= 10; -- unit++; -+ if (!st->marker->max_lines || -+ st->lines < st->marker->max_lines) { -+ seq_printf(m, "0x%0*lx-0x%0*lx ", -+ width, st->start_address, -+ width, st->current_address); -+ -+ delta = (st->current_address - st->start_address); -+ while (!(delta & 1023) && unit[1]) { -+ delta >>= 10; -+ unit++; -+ } -+ seq_printf(m, "%9lu%c ", delta, *unit); -+ printk_prot(m, st->current_prot, st->level); - } -- seq_printf(m, "%9lu%c ", delta, *unit); -- printk_prot(m, st->current_prot, st->level); -+ st->lines++; - - /* - * We print markers for special areas of address space, -@@ -206,7 +215,15 @@ static void note_page(struct seq_file *m, struct pg_state *st, - * This helps in the interpretation. - */ - if (st->current_address >= st->marker[1].start_address) { -+ if (st->marker->max_lines && -+ st->lines > st->marker->max_lines) { -+ unsigned long nskip = -+ st->lines - st->marker->max_lines; -+ seq_printf(m, "... %lu entr%s skipped ... \n", -+ nskip, nskip == 1 ? "y" : "ies"); -+ } - st->marker++; -+ st->lines = 0; - seq_printf(m, "---[ %s ]---\n", st->marker->name); - } - -diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c -index be1ef57..dec49d3 100644 ---- a/arch/x86/mm/ioremap.c -+++ b/arch/x86/mm/ioremap.c -@@ -50,6 +50,21 @@ int ioremap_change_attr(unsigned long vaddr, unsigned long size, - return err; - } - -+static int __ioremap_check_ram(unsigned long start_pfn, unsigned long nr_pages, -+ void *arg) -+{ -+ unsigned long i; -+ -+ for (i = 0; i < nr_pages; ++i) -+ if (pfn_valid(start_pfn + i) && -+ !PageReserved(pfn_to_page(start_pfn + i))) -+ return 1; -+ -+ WARN_ONCE(1, "ioremap on RAM pfn 0x%lx\n", start_pfn); -+ -+ return 0; -+} -+ - /* - * Remap an arbitrary physical address space into the kernel virtual - * address space. Needed when the kernel wants to access high addresses -@@ -93,14 +108,11 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr, - /* - * Don't allow anybody to remap normal RAM that we're using.. - */ -+ pfn = phys_addr >> PAGE_SHIFT; - last_pfn = last_addr >> PAGE_SHIFT; -- for (pfn = phys_addr >> PAGE_SHIFT; pfn <= last_pfn; pfn++) { -- int is_ram = page_is_ram(pfn); -- -- if (is_ram && pfn_valid(pfn) && !PageReserved(pfn_to_page(pfn))) -- return NULL; -- WARN_ON_ONCE(is_ram); -- } -+ if (walk_system_ram_range(pfn, last_pfn - pfn + 1, NULL, -+ __ioremap_check_ram) == 1) -+ return NULL; - - /* - * Mappings have to be page-aligned -diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c -index 845df68..5c1ae28 100644 ---- a/arch/x86/mm/mmap.c -+++ b/arch/x86/mm/mmap.c -@@ -112,12 +112,14 @@ static unsigned long mmap_legacy_base(void) - */ - void arch_pick_mmap_layout(struct mm_struct *mm) - { -+ mm->mmap_legacy_base = mmap_legacy_base(); -+ mm->mmap_base = mmap_base(); -+ - if (mmap_is_legacy()) { -- mm->mmap_base = mmap_legacy_base(); -+ mm->mmap_base = mm->mmap_legacy_base; - mm->get_unmapped_area = arch_get_unmapped_area; - mm->unmap_area = arch_unmap_area; - } else { -- mm->mmap_base = mmap_base(); - mm->get_unmapped_area = arch_get_unmapped_area_topdown; - mm->unmap_area = arch_unmap_area_topdown; - } -diff --git a/arch/x86/net/bpf_jit.S b/arch/x86/net/bpf_jit.S -index 877b9a1..0149575 100644 ---- a/arch/x86/net/bpf_jit.S -+++ b/arch/x86/net/bpf_jit.S -@@ -140,7 +140,7 @@ bpf_slow_path_byte_msh: - push %r9; \ - push SKBDATA; \ - /* rsi already has offset */ \ -- mov $SIZE,%ecx; /* size */ \ -+ mov $SIZE,%edx; /* size */ \ - call bpf_internal_load_pointer_neg_helper; \ - test %rax,%rax; \ - pop SKBDATA; \ -diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c -index 454548c..46e5387 100644 ---- a/arch/x86/platform/efi/efi.c -+++ b/arch/x86/platform/efi/efi.c -@@ -50,6 +50,13 @@ - - #define EFI_DEBUG 1 - -+#define EFI_MIN_RESERVE 5120 -+ -+#define EFI_DUMMY_GUID \ -+ EFI_GUID(0x4424ac57, 0xbe4b, 0x47dd, 0x9e, 0x97, 0xed, 0x50, 0xf0, 0x9f, 0x92, 0xa9) -+ -+static efi_char16_t efi_dummy_name[6] = { 'D', 'U', 'M', 'M', 'Y', 0 }; -+ - struct efi __read_mostly efi = { - .mps = EFI_INVALID_TABLE_ADDR, - .acpi = EFI_INVALID_TABLE_ADDR, -@@ -102,6 +109,15 @@ static int __init setup_add_efi_memmap(char *arg) - } - early_param("add_efi_memmap", setup_add_efi_memmap); - -+static bool efi_no_storage_paranoia; -+ -+static int __init setup_storage_paranoia(char *arg) -+{ -+ efi_no_storage_paranoia = true; -+ return 0; -+} -+early_param("efi_no_storage_paranoia", setup_storage_paranoia); -+ - - static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc) - { -@@ -744,13 +760,6 @@ void __init efi_init(void) - - set_bit(EFI_MEMMAP, &x86_efi_facility); - --#ifdef CONFIG_X86_32 -- if (efi_is_native()) { -- x86_platform.get_wallclock = efi_get_time; -- x86_platform.set_wallclock = efi_set_rtc_mmss; -- } --#endif -- - #if EFI_DEBUG - print_efi_memmap(); - #endif -@@ -930,6 +939,13 @@ void __init efi_enter_virtual_mode(void) - runtime_code_page_mkexec(); - - kfree(new_memmap); -+ -+ /* clean DUMMY object */ -+ efi.set_variable(efi_dummy_name, &EFI_DUMMY_GUID, -+ EFI_VARIABLE_NON_VOLATILE | -+ EFI_VARIABLE_BOOTSERVICE_ACCESS | -+ EFI_VARIABLE_RUNTIME_ACCESS, -+ 0, NULL); - } - - /* -@@ -967,3 +983,85 @@ u64 efi_mem_attributes(unsigned long phys_addr) - } - return 0; - } -+ -+/* -+ * Some firmware has serious problems when using more than 50% of the EFI -+ * variable store, i.e. it triggers bugs that can brick machines. Ensure that -+ * we never use more than this safe limit. -+ * -+ * Return EFI_SUCCESS if it is safe to write 'size' bytes to the variable -+ * store. -+ */ -+efi_status_t efi_query_variable_store(u32 attributes, unsigned long size) -+{ -+ efi_status_t status; -+ u64 storage_size, remaining_size, max_size; -+ -+ if (!(attributes & EFI_VARIABLE_NON_VOLATILE)) -+ return 0; -+ -+ status = efi.query_variable_info(attributes, &storage_size, -+ &remaining_size, &max_size); -+ if (status != EFI_SUCCESS) -+ return status; -+ -+ /* -+ * Some firmware implementations refuse to boot if there's insufficient -+ * space in the variable store. We account for that by refusing the -+ * write if permitting it would reduce the available space to under -+ * 5KB. This figure was provided by Samsung, so should be safe. -+ */ -+ if ((remaining_size - size < EFI_MIN_RESERVE) && -+ !efi_no_storage_paranoia) { -+ -+ /* -+ * Triggering garbage collection may require that the firmware -+ * generate a real EFI_OUT_OF_RESOURCES error. We can force -+ * that by attempting to use more space than is available. -+ */ -+ unsigned long dummy_size = remaining_size + 1024; -+ void *dummy = kzalloc(dummy_size, GFP_ATOMIC); -+ -+ if (!dummy) -+ return EFI_OUT_OF_RESOURCES; -+ -+ status = efi.set_variable(efi_dummy_name, &EFI_DUMMY_GUID, -+ EFI_VARIABLE_NON_VOLATILE | -+ EFI_VARIABLE_BOOTSERVICE_ACCESS | -+ EFI_VARIABLE_RUNTIME_ACCESS, -+ dummy_size, dummy); -+ -+ if (status == EFI_SUCCESS) { -+ /* -+ * This should have failed, so if it didn't make sure -+ * that we delete it... -+ */ -+ efi.set_variable(efi_dummy_name, &EFI_DUMMY_GUID, -+ EFI_VARIABLE_NON_VOLATILE | -+ EFI_VARIABLE_BOOTSERVICE_ACCESS | -+ EFI_VARIABLE_RUNTIME_ACCESS, -+ 0, dummy); -+ } -+ -+ kfree(dummy); -+ -+ /* -+ * The runtime code may now have triggered a garbage collection -+ * run, so check the variable info again -+ */ -+ status = efi.query_variable_info(attributes, &storage_size, -+ &remaining_size, &max_size); -+ -+ if (status != EFI_SUCCESS) -+ return status; -+ -+ /* -+ * There still isn't enough room, so return an error -+ */ -+ if (remaining_size - size < EFI_MIN_RESERVE) -+ return EFI_OUT_OF_RESOURCES; -+ } -+ -+ return EFI_SUCCESS; -+} -+EXPORT_SYMBOL_GPL(efi_query_variable_store); -diff --git a/arch/x86/syscalls/syscall_64.tbl b/arch/x86/syscalls/syscall_64.tbl -index 7b6b2fb..33335d1 100644 ---- a/arch/x86/syscalls/syscall_64.tbl -+++ b/arch/x86/syscalls/syscall_64.tbl -@@ -212,10 +212,10 @@ - 203 common sched_setaffinity sys_sched_setaffinity - 204 common sched_getaffinity sys_sched_getaffinity - 205 64 set_thread_area --206 common io_setup sys_io_setup -+206 64 io_setup sys_io_setup - 207 common io_destroy sys_io_destroy - 208 common io_getevents sys_io_getevents --209 common io_submit sys_io_submit -+209 64 io_submit sys_io_submit - 210 common io_cancel sys_io_cancel - 211 64 get_thread_area - 212 common lookup_dcookie sys_lookup_dcookie -@@ -355,3 +355,5 @@ - 540 x32 process_vm_writev compat_sys_process_vm_writev - 541 x32 setsockopt compat_sys_setsockopt - 542 x32 getsockopt compat_sys_getsockopt -+543 x32 io_setup compat_sys_io_setup -+544 x32 io_submit compat_sys_io_submit -diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c -index a7678fa..9598038 100644 ---- a/arch/x86/xen/enlighten.c -+++ b/arch/x86/xen/enlighten.c -@@ -1448,6 +1448,10 @@ asmlinkage void __init xen_start_kernel(void) - - /* Make sure ACS will be enabled */ - pci_request_acs(); -+ -+ /* Avoid searching for BIOS MP tables */ -+ x86_init.mpparse.find_smp_config = x86_init_noop; -+ x86_init.mpparse.get_smp_config = x86_init_uint_noop; - } - #ifdef CONFIG_PCI - /* PCI BIOS service won't work from a PV guest. */ -diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c -index 0503c0c..a7f5806 100644 ---- a/arch/x86/xen/smp.c -+++ b/arch/x86/xen/smp.c -@@ -576,6 +576,8 @@ static void xen_hvm_cpu_die(unsigned int cpu) - unbind_from_irqhandler(per_cpu(xen_callfunc_irq, cpu), NULL); - unbind_from_irqhandler(per_cpu(xen_debug_irq, cpu), NULL); - unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu), NULL); -+ xen_uninit_lock_cpu(cpu); -+ xen_teardown_timer(cpu); - native_cpu_die(cpu); - } - -diff --git a/arch/xtensa/include/asm/ioctls.h b/arch/xtensa/include/asm/ioctls.h -index fd1d136..96341aa 100644 ---- a/arch/xtensa/include/asm/ioctls.h -+++ b/arch/xtensa/include/asm/ioctls.h -@@ -28,17 +28,17 @@ - #define TCSETSW 0x5403 - #define TCSETSF 0x5404 - --#define TCGETA _IOR('t', 23, struct termio) --#define TCSETA _IOW('t', 24, struct termio) --#define TCSETAW _IOW('t', 25, struct termio) --#define TCSETAF _IOW('t', 28, struct termio) -+#define TCGETA 0x80127417 /* _IOR('t', 23, struct termio) */ -+#define TCSETA 0x40127418 /* _IOW('t', 24, struct termio) */ -+#define TCSETAW 0x40127419 /* _IOW('t', 25, struct termio) */ -+#define TCSETAF 0x4012741C /* _IOW('t', 28, struct termio) */ - - #define TCSBRK _IO('t', 29) - #define TCXONC _IO('t', 30) - #define TCFLSH _IO('t', 31) - --#define TIOCSWINSZ _IOW('t', 103, struct winsize) --#define TIOCGWINSZ _IOR('t', 104, struct winsize) -+#define TIOCSWINSZ 0x40087467 /* _IOW('t', 103, struct winsize) */ -+#define TIOCGWINSZ 0x80087468 /* _IOR('t', 104, struct winsize) */ - #define TIOCSTART _IO('t', 110) /* start output, like ^Q */ - #define TIOCSTOP _IO('t', 111) /* stop output, like ^S */ - #define TIOCOUTQ _IOR('t', 115, int) /* output queue size */ -@@ -88,7 +88,6 @@ - #define TIOCSETD _IOW('T', 35, int) - #define TIOCGETD _IOR('T', 36, int) - #define TCSBRKP _IOW('T', 37, int) /* Needed for POSIX tcsendbreak()*/ --#define TIOCTTYGSTRUCT _IOR('T', 38, struct tty_struct) /* For debugging only*/ - #define TIOCSBRK _IO('T', 39) /* BSD compatibility */ - #define TIOCCBRK _IO('T', 40) /* BSD compatibility */ - #define TIOCGSID _IOR('T', 41, pid_t) /* Return the session ID of FD*/ -@@ -111,8 +110,10 @@ - #define TIOCSERGETLSR _IOR('T', 89, unsigned int) /* Get line status reg. */ - /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ - # define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ --#define TIOCSERGETMULTI _IOR('T', 90, struct serial_multiport_struct) /* Get multiport config */ --#define TIOCSERSETMULTI _IOW('T', 91, struct serial_multiport_struct) /* Set multiport config */ -+#define TIOCSERGETMULTI 0x80a8545a /* Get multiport config */ -+ /* _IOR('T', 90, struct serial_multiport_struct) */ -+#define TIOCSERSETMULTI 0x40a8545b /* Set multiport config */ -+ /* _IOW('T', 91, struct serial_multiport_struct) */ - - #define TIOCMIWAIT _IO('T', 92) /* wait for a change on serial input line(s) */ - #define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ -diff --git a/arch/xtensa/include/asm/pgtable.h b/arch/xtensa/include/asm/pgtable.h -index b03c043..7eeaf22 100644 ---- a/arch/xtensa/include/asm/pgtable.h -+++ b/arch/xtensa/include/asm/pgtable.h -@@ -68,7 +68,12 @@ - #define VMALLOC_START 0xC0000000 - #define VMALLOC_END 0xC7FEFFFF - #define TLBTEMP_BASE_1 0xC7FF0000 --#define TLBTEMP_BASE_2 0xC7FF8000 -+#define TLBTEMP_BASE_2 (TLBTEMP_BASE_1 + DCACHE_WAY_SIZE) -+#if 2 * DCACHE_WAY_SIZE > ICACHE_WAY_SIZE -+#define TLBTEMP_SIZE (2 * DCACHE_WAY_SIZE) -+#else -+#define TLBTEMP_SIZE ICACHE_WAY_SIZE -+#endif - - /* - * Xtensa Linux config PTE layout (when present): -diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S -index 6223f33..e01cffc 100644 ---- a/arch/xtensa/kernel/entry.S -+++ b/arch/xtensa/kernel/entry.S -@@ -1053,9 +1053,8 @@ ENTRY(fast_syscall_xtensa) - movi a7, 4 # sizeof(unsigned int) - access_ok a3, a7, a0, a2, .Leac # a0: scratch reg, a2: sp - -- addi a6, a6, -1 # assuming SYS_XTENSA_ATOMIC_SET = 1 -- _bgeui a6, SYS_XTENSA_COUNT - 1, .Lill -- _bnei a6, SYS_XTENSA_ATOMIC_CMP_SWP - 1, .Lnswp -+ _bgeui a6, SYS_XTENSA_COUNT, .Lill -+ _bnei a6, SYS_XTENSA_ATOMIC_CMP_SWP, .Lnswp - - /* Fall through for ATOMIC_CMP_SWP. */ - -@@ -1067,27 +1066,26 @@ TRY s32i a5, a3, 0 # different, modify value - l32i a7, a2, PT_AREG7 # restore a7 - l32i a0, a2, PT_AREG0 # restore a0 - movi a2, 1 # and return 1 -- addi a6, a6, 1 # restore a6 (really necessary?) - rfe - - 1: l32i a7, a2, PT_AREG7 # restore a7 - l32i a0, a2, PT_AREG0 # restore a0 - movi a2, 0 # return 0 (note that we cannot set -- addi a6, a6, 1 # restore a6 (really necessary?) - rfe - - .Lnswp: /* Atomic set, add, and exg_add. */ - - TRY l32i a7, a3, 0 # orig -+ addi a6, a6, -SYS_XTENSA_ATOMIC_SET - add a0, a4, a7 # + arg - moveqz a0, a4, a6 # set -+ addi a6, a6, SYS_XTENSA_ATOMIC_SET - TRY s32i a0, a3, 0 # write new value - - mov a0, a2 - mov a2, a7 - l32i a7, a0, PT_AREG7 # restore a7 - l32i a0, a0, PT_AREG0 # restore a0 -- addi a6, a6, 1 # restore a6 (really necessary?) - rfe - - CATCH -@@ -1096,7 +1094,7 @@ CATCH - movi a2, -EFAULT - rfe - --.Lill: l32i a7, a2, PT_AREG0 # restore a7 -+.Lill: l32i a7, a2, PT_AREG7 # restore a7 - l32i a0, a2, PT_AREG0 # restore a0 - movi a2, -EINVAL - rfe -@@ -1629,7 +1627,7 @@ ENTRY(fast_second_level_miss) - rsr a0, EXCVADDR - bltu a0, a3, 2f - -- addi a1, a0, -(2 << (DCACHE_ALIAS_ORDER + PAGE_SHIFT)) -+ addi a1, a0, -TLBTEMP_SIZE - bgeu a1, a3, 2f - - /* Check if we have to restore an ITLB mapping. */ -diff --git a/arch/xtensa/kernel/pci-dma.c b/arch/xtensa/kernel/pci-dma.c -index 2783fda..c055c91 100644 ---- a/arch/xtensa/kernel/pci-dma.c -+++ b/arch/xtensa/kernel/pci-dma.c -@@ -48,9 +48,8 @@ dma_alloc_coherent(struct device *dev,size_t size,dma_addr_t *handle,gfp_t flag) - - /* We currently don't support coherent memory outside KSEG */ - -- if (ret < XCHAL_KSEG_CACHED_VADDR -- || ret >= XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_SIZE) -- BUG(); -+ BUG_ON(ret < XCHAL_KSEG_CACHED_VADDR || -+ ret > XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_SIZE - 1); - - - if (ret != 0) { -@@ -66,10 +65,11 @@ dma_alloc_coherent(struct device *dev,size_t size,dma_addr_t *handle,gfp_t flag) - void dma_free_coherent(struct device *hwdev, size_t size, - void *vaddr, dma_addr_t dma_handle) - { -- long addr=(long)vaddr+XCHAL_KSEG_CACHED_VADDR-XCHAL_KSEG_BYPASS_VADDR; -+ unsigned long addr = (unsigned long)vaddr + -+ XCHAL_KSEG_CACHED_VADDR - XCHAL_KSEG_BYPASS_VADDR; - -- if (addr < 0 || addr >= XCHAL_KSEG_SIZE) -- BUG(); -+ BUG_ON(addr < XCHAL_KSEG_CACHED_VADDR || -+ addr > XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_SIZE - 1); - - free_pages(addr, get_order(size)); - } -diff --git a/arch/xtensa/kernel/signal.c b/arch/xtensa/kernel/signal.c -index d78869a..b08caaa 100644 ---- a/arch/xtensa/kernel/signal.c -+++ b/arch/xtensa/kernel/signal.c -@@ -343,7 +343,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info, - - sp = regs->areg[1]; - -- if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! on_sig_stack(sp)) { -+ if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && sas_ss_flags(sp) == 0) { - sp = current->sas_ss_sp + current->sas_ss_size; - } - -diff --git a/block/blk-core.c b/block/blk-core.c -index e264d3f..8509a8b5 100644 ---- a/block/blk-core.c -+++ b/block/blk-core.c -@@ -515,7 +515,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id) - goto fail_id; - - if (blk_throtl_init(q)) -- goto fail_id; -+ goto fail_bdi; - - setup_timer(&q->backing_dev_info.laptop_mode_wb_timer, - laptop_mode_timer_fn, (unsigned long) q); -@@ -540,6 +540,8 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id) - - return q; - -+fail_bdi: -+ bdi_destroy(&q->backing_dev_info); - fail_id: - ida_simple_remove(&blk_queue_ida, q->id); - fail_q: -@@ -2172,6 +2174,7 @@ void blk_start_request(struct request *req) - if (unlikely(blk_bidi_rq(req))) - req->next_rq->resid_len = blk_rq_bytes(req->next_rq); - -+ BUG_ON(test_bit(REQ_ATOM_COMPLETE, &req->atomic_flags)); - blk_add_timer(req); - } - EXPORT_SYMBOL(blk_start_request); -@@ -2232,7 +2235,7 @@ bool blk_update_request(struct request *req, int error, unsigned int nr_bytes) - if (!req->bio) - return false; - -- trace_block_rq_complete(req->q, req); -+ trace_block_rq_complete(req->q, req, nr_bytes); - - /* - * For fs requests, rq is just carrier of independent bio's -diff --git a/block/blk-exec.c b/block/blk-exec.c -index fb2cbd5..1b5cb66 100644 ---- a/block/blk-exec.c -+++ b/block/blk-exec.c -@@ -49,8 +49,18 @@ void blk_execute_rq_nowait(struct request_queue *q, struct gendisk *bd_disk, - rq_end_io_fn *done) - { - int where = at_head ? ELEVATOR_INSERT_FRONT : ELEVATOR_INSERT_BACK; -+ bool is_pm_resume; - - WARN_ON(irqs_disabled()); -+ -+ rq->rq_disk = bd_disk; -+ rq->end_io = done; -+ /* -+ * need to check this before __blk_run_queue(), because rq can -+ * be freed before that returns. -+ */ -+ is_pm_resume = rq->cmd_type == REQ_TYPE_PM_RESUME; -+ - spin_lock_irq(q->queue_lock); - - if (unlikely(blk_queue_dead(q))) { -@@ -66,7 +76,7 @@ void blk_execute_rq_nowait(struct request_queue *q, struct gendisk *bd_disk, - __elv_add_request(q, rq, where); - __blk_run_queue(q); - /* the queue is stopped so it won't be run */ -- if (rq->cmd_type == REQ_TYPE_PM_RESUME) -+ if (is_pm_resume) - q->request_fn(q); - spin_unlock_irq(q->queue_lock); - } -diff --git a/block/blk-settings.c b/block/blk-settings.c -index 579328c..0be72a0 100644 ---- a/block/blk-settings.c -+++ b/block/blk-settings.c -@@ -155,6 +155,7 @@ void blk_set_stacking_limits(struct queue_limits *lim) - lim->discard_zeroes_data = 1; - lim->max_segments = USHRT_MAX; - lim->max_hw_sectors = UINT_MAX; -+ lim->max_segment_size = UINT_MAX; - - lim->max_sectors = BLK_DEF_MAX_SECTORS; - } -diff --git a/block/blk-tag.c b/block/blk-tag.c -index 4af6f5c..f606487 100644 ---- a/block/blk-tag.c -+++ b/block/blk-tag.c -@@ -27,18 +27,15 @@ struct request *blk_queue_find_tag(struct request_queue *q, int tag) - EXPORT_SYMBOL(blk_queue_find_tag); - - /** -- * __blk_free_tags - release a given set of tag maintenance info -+ * blk_free_tags - release a given set of tag maintenance info - * @bqt: the tag map to free - * -- * Tries to free the specified @bqt. Returns true if it was -- * actually freed and false if there are still references using it -+ * Drop the reference count on @bqt and frees it when the last reference -+ * is dropped. - */ --static int __blk_free_tags(struct blk_queue_tag *bqt) -+void blk_free_tags(struct blk_queue_tag *bqt) - { -- int retval; -- -- retval = atomic_dec_and_test(&bqt->refcnt); -- if (retval) { -+ if (atomic_dec_and_test(&bqt->refcnt)) { - BUG_ON(find_first_bit(bqt->tag_map, bqt->max_depth) < - bqt->max_depth); - -@@ -50,9 +47,8 @@ static int __blk_free_tags(struct blk_queue_tag *bqt) - - kfree(bqt); - } -- -- return retval; - } -+EXPORT_SYMBOL(blk_free_tags); - - /** - * __blk_queue_free_tags - release tag maintenance info -@@ -69,28 +65,13 @@ void __blk_queue_free_tags(struct request_queue *q) - if (!bqt) - return; - -- __blk_free_tags(bqt); -+ blk_free_tags(bqt); - - q->queue_tags = NULL; - queue_flag_clear_unlocked(QUEUE_FLAG_QUEUED, q); - } - - /** -- * blk_free_tags - release a given set of tag maintenance info -- * @bqt: the tag map to free -- * -- * For externally managed @bqt frees the map. Callers of this -- * function must guarantee to have released all the queues that -- * might have been using this tag map. -- */ --void blk_free_tags(struct blk_queue_tag *bqt) --{ -- if (unlikely(!__blk_free_tags(bqt))) -- BUG(); --} --EXPORT_SYMBOL(blk_free_tags); -- --/** - * blk_queue_free_tags - release tag maintenance info - * @q: the request queue for the device - * -diff --git a/block/blk-timeout.c b/block/blk-timeout.c -index 7803548..b1182ea 100644 ---- a/block/blk-timeout.c -+++ b/block/blk-timeout.c -@@ -90,8 +90,8 @@ static void blk_rq_timed_out(struct request *req) - __blk_complete_request(req); - break; - case BLK_EH_RESET_TIMER: -- blk_clear_rq_complete(req); - blk_add_timer(req); -+ blk_clear_rq_complete(req); - break; - case BLK_EH_NOT_HANDLED: - /* -@@ -173,7 +173,6 @@ void blk_add_timer(struct request *req) - return; - - BUG_ON(!list_empty(&req->timeout_list)); -- BUG_ON(test_bit(REQ_ATOM_COMPLETE, &req->atomic_flags)); - - /* - * Some LLDs, like scsi, peek at the timeout to prevent a -diff --git a/block/elevator.c b/block/elevator.c -index 44193a8..6d351a0 100644 ---- a/block/elevator.c -+++ b/block/elevator.c -@@ -1063,7 +1063,7 @@ static int elevator_switch(struct request_queue *q, struct elevator_type *new_e) - /* - * Switch this queue to the given IO scheduler. - */ --int elevator_change(struct request_queue *q, const char *name) -+static int __elevator_change(struct request_queue *q, const char *name) - { - char elevator_name[ELV_NAME_MAX]; - struct elevator_type *e; -@@ -1085,6 +1085,18 @@ int elevator_change(struct request_queue *q, const char *name) - - return elevator_switch(q, e); - } -+ -+int elevator_change(struct request_queue *q, const char *name) -+{ -+ int ret; -+ -+ /* Protect q->elevator from elevator_init() */ -+ mutex_lock(&q->sysfs_lock); -+ ret = __elevator_change(q, name); -+ mutex_unlock(&q->sysfs_lock); -+ -+ return ret; -+} - EXPORT_SYMBOL(elevator_change); - - ssize_t elv_iosched_store(struct request_queue *q, const char *name, -@@ -1095,7 +1107,7 @@ ssize_t elv_iosched_store(struct request_queue *q, const char *name, - if (!q->elevator) - return count; - -- ret = elevator_change(q, name); -+ ret = __elevator_change(q, name); - if (!ret) - return count; - -diff --git a/block/genhd.c b/block/genhd.c -index dd44885..da61520 100644 ---- a/block/genhd.c -+++ b/block/genhd.c -@@ -27,10 +27,10 @@ struct kobject *block_depr; - /* for extended dynamic devt allocation, currently only one major is used */ - #define NR_EXT_DEVT (1 << MINORBITS) - --/* For extended devt allocation. ext_devt_mutex prevents look up -+/* For extended devt allocation. ext_devt_lock prevents look up - * results from going away underneath its user. - */ --static DEFINE_MUTEX(ext_devt_mutex); -+static DEFINE_SPINLOCK(ext_devt_lock); - static DEFINE_IDR(ext_devt_idr); - - static struct device_type disk_type; -@@ -420,13 +420,13 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt) - do { - if (!idr_pre_get(&ext_devt_idr, GFP_KERNEL)) - return -ENOMEM; -- mutex_lock(&ext_devt_mutex); -+ spin_lock(&ext_devt_lock); - rc = idr_get_new(&ext_devt_idr, part, &idx); - if (!rc && idx >= NR_EXT_DEVT) { - idr_remove(&ext_devt_idr, idx); - rc = -EBUSY; - } -- mutex_unlock(&ext_devt_mutex); -+ spin_unlock(&ext_devt_lock); - } while (rc == -EAGAIN); - - if (rc) -@@ -447,15 +447,13 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt) - */ - void blk_free_devt(dev_t devt) - { -- might_sleep(); -- - if (devt == MKDEV(0, 0)) - return; - - if (MAJOR(devt) == BLOCK_EXT_MAJOR) { -- mutex_lock(&ext_devt_mutex); -+ spin_lock(&ext_devt_lock); - idr_remove(&ext_devt_idr, blk_mangle_minor(MINOR(devt))); -- mutex_unlock(&ext_devt_mutex); -+ spin_unlock(&ext_devt_lock); - } - } - -@@ -662,7 +660,6 @@ void del_gendisk(struct gendisk *disk) - if (!sysfs_deprecated) - sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk))); - device_del(disk_to_dev(disk)); -- blk_free_devt(disk_to_dev(disk)->devt); - } - EXPORT_SYMBOL(del_gendisk); - -@@ -687,13 +684,13 @@ struct gendisk *get_gendisk(dev_t devt, int *partno) - } else { - struct hd_struct *part; - -- mutex_lock(&ext_devt_mutex); -+ spin_lock(&ext_devt_lock); - part = idr_find(&ext_devt_idr, blk_mangle_minor(MINOR(devt))); - if (part && get_disk(part_to_disk(part))) { - *partno = part->partno; - disk = part_to_disk(part); - } -- mutex_unlock(&ext_devt_mutex); -+ spin_unlock(&ext_devt_lock); - } - - return disk; -@@ -1101,6 +1098,7 @@ static void disk_release(struct device *dev) - { - struct gendisk *disk = dev_to_disk(dev); - -+ blk_free_devt(dev->devt); - disk_release_events(disk); - kfree(disk->random); - disk_replace_part_tbl(disk, NULL); -diff --git a/block/partition-generic.c b/block/partition-generic.c -index 264028c..63487c6 100644 ---- a/block/partition-generic.c -+++ b/block/partition-generic.c -@@ -211,6 +211,7 @@ static const struct attribute_group *part_attr_groups[] = { - static void part_release(struct device *dev) - { - struct hd_struct *p = dev_to_part(dev); -+ blk_free_devt(dev->devt); - free_part_stats(p); - free_part_info(p); - kfree(p); -@@ -264,7 +265,6 @@ void delete_partition(struct gendisk *disk, int partno) - rcu_assign_pointer(ptbl->last_lookup, NULL); - kobject_put(part->holder_dir); - device_del(part_to_dev(part)); -- blk_free_devt(part_devt(part)); - - hd_struct_put(part); - } -diff --git a/crypto/af_alg.c b/crypto/af_alg.c -index ac33d5f..bf948e1 100644 ---- a/crypto/af_alg.c -+++ b/crypto/af_alg.c -@@ -21,6 +21,7 @@ - #include - #include - #include -+#include - - struct alg_type_list { - const struct af_alg_type *type; -@@ -243,6 +244,7 @@ int af_alg_accept(struct sock *sk, struct socket *newsock) - - sock_init_data(newsock, sk2); - sock_graft(sk2, newsock); -+ security_sk_clone(sk, sk2); - - err = type->accept(ask->private, sk2); - if (err) { -diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c -index 0262210..8502462 100644 ---- a/crypto/algif_hash.c -+++ b/crypto/algif_hash.c -@@ -114,6 +114,9 @@ static ssize_t hash_sendpage(struct socket *sock, struct page *page, - struct hash_ctx *ctx = ask->private; - int err; - -+ if (flags & MSG_SENDPAGE_NOTLAST) -+ flags |= MSG_MORE; -+ - lock_sock(sk); - sg_init_table(ctx->sgl.sg, 1); - sg_set_page(ctx->sgl.sg, page, size, offset); -@@ -161,8 +164,6 @@ static int hash_recvmsg(struct kiocb *unused, struct socket *sock, - else if (len < ds) - msg->msg_flags |= MSG_TRUNC; - -- msg->msg_namelen = 0; -- - lock_sock(sk); - if (ctx->more) { - ctx->more = 0; -diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c -index a1c4f0a..a19c027 100644 ---- a/crypto/algif_skcipher.c -+++ b/crypto/algif_skcipher.c -@@ -378,6 +378,9 @@ static ssize_t skcipher_sendpage(struct socket *sock, struct page *page, - struct skcipher_sg_list *sgl; - int err = -EINVAL; - -+ if (flags & MSG_SENDPAGE_NOTLAST) -+ flags |= MSG_MORE; -+ - lock_sock(sk); - if (!ctx->more && ctx->used) - goto unlock; -@@ -432,7 +435,6 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock, - long copied = 0; - - lock_sock(sk); -- msg->msg_namelen = 0; - for (iov = msg->msg_iov, iovlen = msg->msg_iovlen; iovlen > 0; - iovlen--, iov++) { - unsigned long seglen = iov->iov_len; -diff --git a/crypto/ansi_cprng.c b/crypto/ansi_cprng.c -index 6ddd99e..c21f761 100644 ---- a/crypto/ansi_cprng.c -+++ b/crypto/ansi_cprng.c -@@ -230,11 +230,11 @@ static int get_prng_bytes(char *buf, size_t nbytes, struct prng_context *ctx, - */ - if (byte_count < DEFAULT_BLK_SZ) { - empty_rbuf: -- for (; ctx->rand_data_valid < DEFAULT_BLK_SZ; -- ctx->rand_data_valid++) { -+ while (ctx->rand_data_valid < DEFAULT_BLK_SZ) { - *ptr = ctx->rand_data[ctx->rand_data_valid]; - ptr++; - byte_count--; -+ ctx->rand_data_valid++; - if (byte_count == 0) - goto done; - } -diff --git a/crypto/authenc.c b/crypto/authenc.c -index 5ef7ba6..d21da2f 100644 ---- a/crypto/authenc.c -+++ b/crypto/authenc.c -@@ -368,9 +368,10 @@ static void crypto_authenc_encrypt_done(struct crypto_async_request *req, - if (!err) { - struct crypto_aead *authenc = crypto_aead_reqtfm(areq); - struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); -- struct ablkcipher_request *abreq = aead_request_ctx(areq); -- u8 *iv = (u8 *)(abreq + 1) + -- crypto_ablkcipher_reqsize(ctx->enc); -+ struct authenc_request_ctx *areq_ctx = aead_request_ctx(areq); -+ struct ablkcipher_request *abreq = (void *)(areq_ctx->tail -+ + ctx->reqoff); -+ u8 *iv = (u8 *)abreq - crypto_ablkcipher_ivsize(ctx->enc); - - err = crypto_authenc_genicv(areq, iv, 0); - } -diff --git a/crypto/ccm.c b/crypto/ccm.c -index 32fe1bb..18d64ad 100644 ---- a/crypto/ccm.c -+++ b/crypto/ccm.c -@@ -271,7 +271,8 @@ static int crypto_ccm_auth(struct aead_request *req, struct scatterlist *plain, - } - - /* compute plaintext into mac */ -- get_data_to_compute(cipher, pctx, plain, cryptlen); -+ if (cryptlen) -+ get_data_to_compute(cipher, pctx, plain, cryptlen); - - out: - return err; -diff --git a/crypto/crypto_wq.c b/crypto/crypto_wq.c -index adad92a..2f1b8d1 100644 ---- a/crypto/crypto_wq.c -+++ b/crypto/crypto_wq.c -@@ -33,7 +33,7 @@ static void __exit crypto_wq_exit(void) - destroy_workqueue(kcrypto_wq); - } - --module_init(crypto_wq_init); -+subsys_initcall(crypto_wq_init); - module_exit(crypto_wq_exit); - - MODULE_LICENSE("GPL"); -diff --git a/crypto/testmgr.h b/crypto/testmgr.h -index 36e5a8e..1ae2e0e 100644 ---- a/crypto/testmgr.h -+++ b/crypto/testmgr.h -@@ -14558,38 +14558,40 @@ static struct pcomp_testvec zlib_decomp_tv_template[] = { - static struct comp_testvec lzo_comp_tv_template[] = { - { - .inlen = 70, -- .outlen = 46, -+ .outlen = 57, - .input = "Join us now and share the software " - "Join us now and share the software ", - .output = "\x00\x0d\x4a\x6f\x69\x6e\x20\x75" -- "\x73\x20\x6e\x6f\x77\x20\x61\x6e" -- "\x64\x20\x73\x68\x61\x72\x65\x20" -- "\x74\x68\x65\x20\x73\x6f\x66\x74" -- "\x77\x70\x01\x01\x4a\x6f\x69\x6e" -- "\x3d\x88\x00\x11\x00\x00", -+ "\x73\x20\x6e\x6f\x77\x20\x61\x6e" -+ "\x64\x20\x73\x68\x61\x72\x65\x20" -+ "\x74\x68\x65\x20\x73\x6f\x66\x74" -+ "\x77\x70\x01\x32\x88\x00\x0c\x65" -+ "\x20\x74\x68\x65\x20\x73\x6f\x66" -+ "\x74\x77\x61\x72\x65\x20\x11\x00" -+ "\x00", - }, { - .inlen = 159, -- .outlen = 133, -+ .outlen = 131, - .input = "This document describes a compression method based on the LZO " - "compression algorithm. This document defines the application of " - "the LZO algorithm used in UBIFS.", -- .output = "\x00\x2b\x54\x68\x69\x73\x20\x64" -+ .output = "\x00\x2c\x54\x68\x69\x73\x20\x64" - "\x6f\x63\x75\x6d\x65\x6e\x74\x20" - "\x64\x65\x73\x63\x72\x69\x62\x65" - "\x73\x20\x61\x20\x63\x6f\x6d\x70" - "\x72\x65\x73\x73\x69\x6f\x6e\x20" - "\x6d\x65\x74\x68\x6f\x64\x20\x62" - "\x61\x73\x65\x64\x20\x6f\x6e\x20" -- "\x74\x68\x65\x20\x4c\x5a\x4f\x2b" -- "\x8c\x00\x0d\x61\x6c\x67\x6f\x72" -- "\x69\x74\x68\x6d\x2e\x20\x20\x54" -- "\x68\x69\x73\x2a\x54\x01\x02\x66" -- "\x69\x6e\x65\x73\x94\x06\x05\x61" -- "\x70\x70\x6c\x69\x63\x61\x74\x76" -- "\x0a\x6f\x66\x88\x02\x60\x09\x27" -- "\xf0\x00\x0c\x20\x75\x73\x65\x64" -- "\x20\x69\x6e\x20\x55\x42\x49\x46" -- "\x53\x2e\x11\x00\x00", -+ "\x74\x68\x65\x20\x4c\x5a\x4f\x20" -+ "\x2a\x8c\x00\x09\x61\x6c\x67\x6f" -+ "\x72\x69\x74\x68\x6d\x2e\x20\x20" -+ "\x2e\x54\x01\x03\x66\x69\x6e\x65" -+ "\x73\x20\x74\x06\x05\x61\x70\x70" -+ "\x6c\x69\x63\x61\x74\x76\x0a\x6f" -+ "\x66\x88\x02\x60\x09\x27\xf0\x00" -+ "\x0c\x20\x75\x73\x65\x64\x20\x69" -+ "\x6e\x20\x55\x42\x49\x46\x53\x2e" -+ "\x11\x00\x00", - }, - }; - -diff --git a/drivers/acpi/acpica/exoparg1.c b/drivers/acpi/acpica/exoparg1.c -index 9ba8c73..fe2f9d9 100644 ---- a/drivers/acpi/acpica/exoparg1.c -+++ b/drivers/acpi/acpica/exoparg1.c -@@ -970,10 +970,17 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) - */ - return_desc = - *(operand[0]->reference.where); -- if (return_desc) { -- acpi_ut_add_reference -- (return_desc); -+ if (!return_desc) { -+ /* -+ * Element is NULL, do not allow the dereference. -+ * This provides compatibility with other ACPI -+ * implementations. -+ */ -+ return_ACPI_STATUS -+ (AE_AML_UNINITIALIZED_ELEMENT); - } -+ -+ acpi_ut_add_reference(return_desc); - break; - - default: -@@ -998,11 +1005,40 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) - acpi_namespace_node - *) - return_desc); -- } -+ if (!return_desc) { -+ break; -+ } - -- /* Add another reference to the object! */ -+ /* -+ * June 2013: -+ * buffer_fields/field_units require additional resolution -+ */ -+ switch (return_desc->common.type) { -+ case ACPI_TYPE_BUFFER_FIELD: -+ case ACPI_TYPE_LOCAL_REGION_FIELD: -+ case ACPI_TYPE_LOCAL_BANK_FIELD: -+ case ACPI_TYPE_LOCAL_INDEX_FIELD: - -- acpi_ut_add_reference(return_desc); -+ status = -+ acpi_ex_read_data_from_field -+ (walk_state, return_desc, -+ &temp_desc); -+ if (ACPI_FAILURE(status)) { -+ goto cleanup; -+ } -+ -+ return_desc = temp_desc; -+ break; -+ -+ default: -+ -+ /* Add another reference to the object */ -+ -+ acpi_ut_add_reference -+ (return_desc); -+ break; -+ } -+ } - break; - - default: -diff --git a/drivers/acpi/acpica/exstore.c b/drivers/acpi/acpica/exstore.c -index c6cf843..9806f4b 100644 ---- a/drivers/acpi/acpica/exstore.c -+++ b/drivers/acpi/acpica/exstore.c -@@ -57,6 +57,11 @@ acpi_ex_store_object_to_index(union acpi_operand_object *val_desc, - union acpi_operand_object *dest_desc, - struct acpi_walk_state *walk_state); - -+static acpi_status -+acpi_ex_store_direct_to_node(union acpi_operand_object *source_desc, -+ struct acpi_namespace_node *node, -+ struct acpi_walk_state *walk_state); -+ - /******************************************************************************* - * - * FUNCTION: acpi_ex_store -@@ -376,7 +381,11 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc, - * When storing into an object the data is converted to the - * target object type then stored in the object. This means - * that the target object type (for an initialized target) will -- * not be changed by a store operation. -+ * not be changed by a store operation. A copy_object can change -+ * the target type, however. -+ * -+ * The implicit_conversion flag is set to NO/FALSE only when -+ * storing to an arg_x -- as per the rules of the ACPI spec. - * - * Assumes parameters are already validated. - * -@@ -400,7 +409,7 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, - target_type = acpi_ns_get_type(node); - target_desc = acpi_ns_get_attached_object(node); - -- ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Storing %p(%s) into node %p(%s)\n", -+ ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Storing %p (%s) to node %p (%s)\n", - source_desc, - acpi_ut_get_object_type_name(source_desc), node, - acpi_ut_get_type_name(target_type))); -@@ -414,46 +423,31 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, - return_ACPI_STATUS(status); - } - -- /* If no implicit conversion, drop into the default case below */ -- -- if ((!implicit_conversion) || -- ((walk_state->opcode == AML_COPY_OP) && -- (target_type != ACPI_TYPE_LOCAL_REGION_FIELD) && -- (target_type != ACPI_TYPE_LOCAL_BANK_FIELD) && -- (target_type != ACPI_TYPE_LOCAL_INDEX_FIELD))) { -- /* -- * Force execution of default (no implicit conversion). Note: -- * copy_object does not perform an implicit conversion, as per the ACPI -- * spec -- except in case of region/bank/index fields -- because these -- * objects must retain their original type permanently. -- */ -- target_type = ACPI_TYPE_ANY; -- } -- - /* Do the actual store operation */ - - switch (target_type) { -- case ACPI_TYPE_BUFFER_FIELD: -- case ACPI_TYPE_LOCAL_REGION_FIELD: -- case ACPI_TYPE_LOCAL_BANK_FIELD: -- case ACPI_TYPE_LOCAL_INDEX_FIELD: -- -- /* For fields, copy the source data to the target field. */ -- -- status = acpi_ex_write_data_to_field(source_desc, target_desc, -- &walk_state->result_obj); -- break; -- - case ACPI_TYPE_INTEGER: - case ACPI_TYPE_STRING: - case ACPI_TYPE_BUFFER: - - /* -- * These target types are all of type Integer/String/Buffer, and -- * therefore support implicit conversion before the store. -- * -- * Copy and/or convert the source object to a new target object -+ * The simple data types all support implicit source operand -+ * conversion before the store. - */ -+ -+ if ((walk_state->opcode == AML_COPY_OP) || !implicit_conversion) { -+ /* -+ * However, copy_object and Stores to arg_x do not perform -+ * an implicit conversion, as per the ACPI specification. -+ * A direct store is performed instead. -+ */ -+ status = acpi_ex_store_direct_to_node(source_desc, node, -+ walk_state); -+ break; -+ } -+ -+ /* Store with implicit source operand conversion support */ -+ - status = - acpi_ex_store_object_to_object(source_desc, target_desc, - &new_desc, walk_state); -@@ -467,13 +461,12 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, - * the Name's type to that of the value being stored in it. - * source_desc reference count is incremented by attach_object. - * -- * Note: This may change the type of the node if an explicit store -- * has been performed such that the node/object type has been -- * changed. -+ * Note: This may change the type of the node if an explicit -+ * store has been performed such that the node/object type -+ * has been changed. - */ -- status = -- acpi_ns_attach_object(node, new_desc, -- new_desc->common.type); -+ status = acpi_ns_attach_object(node, new_desc, -+ new_desc->common.type); - - ACPI_DEBUG_PRINT((ACPI_DB_EXEC, - "Store %s into %s via Convert/Attach\n", -@@ -484,19 +477,83 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, - } - break; - -+ case ACPI_TYPE_BUFFER_FIELD: -+ case ACPI_TYPE_LOCAL_REGION_FIELD: -+ case ACPI_TYPE_LOCAL_BANK_FIELD: -+ case ACPI_TYPE_LOCAL_INDEX_FIELD: -+ /* -+ * For all fields, always write the source data to the target -+ * field. Any required implicit source operand conversion is -+ * performed in the function below as necessary. Note, field -+ * objects must retain their original type permanently. -+ */ -+ status = acpi_ex_write_data_to_field(source_desc, target_desc, -+ &walk_state->result_obj); -+ break; -+ - default: -+ /* -+ * No conversions for all other types. Directly store a copy of -+ * the source object. This is the ACPI spec-defined behavior for -+ * the copy_object operator. -+ * -+ * NOTE: For the Store operator, this is a departure from the -+ * ACPI spec, which states "If conversion is impossible, abort -+ * the running control method". Instead, this code implements -+ * "If conversion is impossible, treat the Store operation as -+ * a CopyObject". -+ */ -+ status = acpi_ex_store_direct_to_node(source_desc, node, -+ walk_state); -+ break; -+ } - -- ACPI_DEBUG_PRINT((ACPI_DB_EXEC, -- "Storing %s (%p) directly into node (%p) with no implicit conversion\n", -- acpi_ut_get_object_type_name(source_desc), -- source_desc, node)); -+ return_ACPI_STATUS(status); -+} - -- /* No conversions for all other types. Just attach the source object */ -+/******************************************************************************* -+ * -+ * FUNCTION: acpi_ex_store_direct_to_node -+ * -+ * PARAMETERS: source_desc - Value to be stored -+ * node - Named object to receive the value -+ * walk_state - Current walk state -+ * -+ * RETURN: Status -+ * -+ * DESCRIPTION: "Store" an object directly to a node. This involves a copy -+ * and an attach. -+ * -+ ******************************************************************************/ - -- status = acpi_ns_attach_object(node, source_desc, -- source_desc->common.type); -- break; -+static acpi_status -+acpi_ex_store_direct_to_node(union acpi_operand_object *source_desc, -+ struct acpi_namespace_node *node, -+ struct acpi_walk_state *walk_state) -+{ -+ acpi_status status; -+ union acpi_operand_object *new_desc; -+ -+ ACPI_FUNCTION_TRACE(ex_store_direct_to_node); -+ -+ ACPI_DEBUG_PRINT((ACPI_DB_EXEC, -+ "Storing [%s] (%p) directly into node [%s] (%p)" -+ " with no implicit conversion\n", -+ acpi_ut_get_object_type_name(source_desc), -+ source_desc, acpi_ut_get_type_name(node->type), -+ node)); -+ -+ /* Copy the source object to a new object */ -+ -+ status = -+ acpi_ut_copy_iobject_to_iobject(source_desc, &new_desc, walk_state); -+ if (ACPI_FAILURE(status)) { -+ return_ACPI_STATUS(status); - } - -+ /* Attach the new object to the node */ -+ -+ status = acpi_ns_attach_object(node, new_desc, new_desc->common.type); -+ acpi_ut_remove_reference(new_desc); - return_ACPI_STATUS(status); - } -diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c -index 9bdfcf5..93f3034 100644 ---- a/drivers/acpi/battery.c -+++ b/drivers/acpi/battery.c -@@ -34,6 +34,7 @@ - #include - #include - #include -+#include - #include - - #ifdef CONFIG_ACPI_PROCFS_POWER -@@ -1055,6 +1056,28 @@ static int battery_notify(struct notifier_block *nb, - return 0; - } - -+/* -+ * Some machines'(E,G Lenovo Z480) ECs are not stable -+ * during boot up and this causes battery driver fails to be -+ * probed due to failure of getting battery information -+ * from EC sometimes. After several retries, the operation -+ * may work. So add retry code here and 20ms sleep between -+ * every retries. -+ */ -+static int acpi_battery_update_retry(struct acpi_battery *battery) -+{ -+ int retry, ret; -+ -+ for (retry = 5; retry; retry--) { -+ ret = acpi_battery_update(battery); -+ if (!ret) -+ break; -+ -+ msleep(20); -+ } -+ return ret; -+} -+ - static int acpi_battery_add(struct acpi_device *device) - { - int result = 0; -@@ -1074,9 +1097,11 @@ static int acpi_battery_add(struct acpi_device *device) - if (ACPI_SUCCESS(acpi_get_handle(battery->device->handle, - "_BIX", &handle))) - set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags); -- result = acpi_battery_update(battery); -+ -+ result = acpi_battery_update_retry(battery); - if (result) - goto fail; -+ - #ifdef CONFIG_ACPI_PROCFS_POWER - result = acpi_battery_add_fs(device); - #endif -diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c -index cb96296..76da257 100644 ---- a/drivers/acpi/blacklist.c -+++ b/drivers/acpi/blacklist.c -@@ -327,6 +327,19 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T500"), - }, - }, -+ /* -+ * Without this this EEEpc exports a non working WMI interface, with -+ * this it exports a working "good old" eeepc_laptop interface, fixing -+ * both brightness control, and rfkill not working. -+ */ -+ { -+ .callback = dmi_enable_osi_linux, -+ .ident = "Asus EEE PC 1015PX", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer INC."), -+ DMI_MATCH(DMI_PRODUCT_NAME, "1015PX"), -+ }, -+ }, - {} - }; - -diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c -index cf02e97..06d2d22 100644 ---- a/drivers/acpi/bus.c -+++ b/drivers/acpi/bus.c -@@ -33,6 +33,7 @@ - #include - #include - #include -+#include - #ifdef CONFIG_X86 - #include - #endif -@@ -56,6 +57,12 @@ EXPORT_SYMBOL(acpi_root_dir); - - - #ifdef CONFIG_X86 -+#ifdef CONFIG_ACPI_CUSTOM_DSDT -+static inline int set_copy_dsdt(const struct dmi_system_id *id) -+{ -+ return 0; -+} -+#else - static int set_copy_dsdt(const struct dmi_system_id *id) - { - printk(KERN_NOTICE "%s detected - " -@@ -63,6 +70,7 @@ static int set_copy_dsdt(const struct dmi_system_id *id) - acpi_gbl_copy_dsdt_locally = 1; - return 0; - } -+#endif - - static struct dmi_system_id dsdt_dmi_table[] __initdata = { - /* -@@ -921,6 +929,14 @@ void __init acpi_early_init(void) - goto error0; - } - -+ /* -+ * If the system is using ACPI then we can be reasonably -+ * confident that any regulators are managed by the firmware -+ * so tell the regulator core it has everything it needs to -+ * know. -+ */ -+ regulator_has_full_constraints(); -+ - return; - - error0: -diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c -index 6cba428..e1180ce 100644 ---- a/drivers/acpi/processor_idle.c -+++ b/drivers/acpi/processor_idle.c -@@ -1195,9 +1195,9 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr) - - if (pr->id == 0 && cpuidle_get_driver() == &acpi_idle_driver) { - -- cpuidle_pause_and_lock(); - /* Protect against cpu-hotplug */ - get_online_cpus(); -+ cpuidle_pause_and_lock(); - - /* Disable all cpuidle devices */ - for_each_online_cpu(cpu) { -@@ -1222,8 +1222,8 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr) - cpuidle_enable_device(&_pr->power.dev); - } - } -- put_online_cpus(); - cpuidle_resume_and_unlock(); -+ put_online_cpus(); - } - - return 0; -diff --git a/drivers/acpi/processor_throttling.c b/drivers/acpi/processor_throttling.c -index 1d02b7b..c653cc2 100644 ---- a/drivers/acpi/processor_throttling.c -+++ b/drivers/acpi/processor_throttling.c -@@ -59,6 +59,12 @@ struct throttling_tstate { - int target_state; /* target T-state */ - }; - -+struct acpi_processor_throttling_arg { -+ struct acpi_processor *pr; -+ int target_state; -+ bool force; -+}; -+ - #define THROTTLING_PRECHANGE (1) - #define THROTTLING_POSTCHANGE (2) - -@@ -1062,16 +1068,24 @@ static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr, - return 0; - } - -+static long acpi_processor_throttling_fn(void *data) -+{ -+ struct acpi_processor_throttling_arg *arg = data; -+ struct acpi_processor *pr = arg->pr; -+ -+ return pr->throttling.acpi_processor_set_throttling(pr, -+ arg->target_state, arg->force); -+} -+ - int acpi_processor_set_throttling(struct acpi_processor *pr, - int state, bool force) - { -- cpumask_var_t saved_mask; - int ret = 0; - unsigned int i; - struct acpi_processor *match_pr; - struct acpi_processor_throttling *p_throttling; -+ struct acpi_processor_throttling_arg arg; - struct throttling_tstate t_state; -- cpumask_var_t online_throttling_cpus; - - if (!pr) - return -EINVAL; -@@ -1082,14 +1096,6 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, - if ((state < 0) || (state > (pr->throttling.state_count - 1))) - return -EINVAL; - -- if (!alloc_cpumask_var(&saved_mask, GFP_KERNEL)) -- return -ENOMEM; -- -- if (!alloc_cpumask_var(&online_throttling_cpus, GFP_KERNEL)) { -- free_cpumask_var(saved_mask); -- return -ENOMEM; -- } -- - if (cpu_is_offline(pr->id)) { - /* - * the cpu pointed by pr->id is offline. Unnecessary to change -@@ -1098,17 +1104,15 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, - return -ENODEV; - } - -- cpumask_copy(saved_mask, ¤t->cpus_allowed); - t_state.target_state = state; - p_throttling = &(pr->throttling); -- cpumask_and(online_throttling_cpus, cpu_online_mask, -- p_throttling->shared_cpu_map); -+ - /* - * The throttling notifier will be called for every - * affected cpu in order to get one proper T-state. - * The notifier event is THROTTLING_PRECHANGE. - */ -- for_each_cpu(i, online_throttling_cpus) { -+ for_each_cpu_and(i, cpu_online_mask, p_throttling->shared_cpu_map) { - t_state.cpu = i; - acpi_processor_throttling_notifier(THROTTLING_PRECHANGE, - &t_state); -@@ -1120,21 +1124,18 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, - * it can be called only for the cpu pointed by pr. - */ - if (p_throttling->shared_type == DOMAIN_COORD_TYPE_SW_ANY) { -- /* FIXME: use work_on_cpu() */ -- if (set_cpus_allowed_ptr(current, cpumask_of(pr->id))) { -- /* Can't migrate to the pr->id CPU. Exit */ -- ret = -ENODEV; -- goto exit; -- } -- ret = p_throttling->acpi_processor_set_throttling(pr, -- t_state.target_state, force); -+ arg.pr = pr; -+ arg.target_state = state; -+ arg.force = force; -+ ret = work_on_cpu(pr->id, acpi_processor_throttling_fn, &arg); - } else { - /* - * When the T-state coordination is SW_ALL or HW_ALL, - * it is necessary to set T-state for every affected - * cpus. - */ -- for_each_cpu(i, online_throttling_cpus) { -+ for_each_cpu_and(i, cpu_online_mask, -+ p_throttling->shared_cpu_map) { - match_pr = per_cpu(processors, i); - /* - * If the pointer is invalid, we will report the -@@ -1155,13 +1156,12 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, - "on CPU %d\n", i)); - continue; - } -- t_state.cpu = i; -- /* FIXME: use work_on_cpu() */ -- if (set_cpus_allowed_ptr(current, cpumask_of(i))) -- continue; -- ret = match_pr->throttling. -- acpi_processor_set_throttling( -- match_pr, t_state.target_state, force); -+ -+ arg.pr = match_pr; -+ arg.target_state = state; -+ arg.force = force; -+ ret = work_on_cpu(pr->id, acpi_processor_throttling_fn, -+ &arg); - } - } - /* -@@ -1170,17 +1170,12 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, - * affected cpu to update the T-states. - * The notifier event is THROTTLING_POSTCHANGE - */ -- for_each_cpu(i, online_throttling_cpus) { -+ for_each_cpu_and(i, cpu_online_mask, p_throttling->shared_cpu_map) { - t_state.cpu = i; - acpi_processor_throttling_notifier(THROTTLING_POSTCHANGE, - &t_state); - } -- /* restore the previous state */ -- /* FIXME: use work_on_cpu() */ -- set_cpus_allowed_ptr(current, saved_mask); --exit: -- free_cpumask_var(online_throttling_cpus); -- free_cpumask_var(saved_mask); -+ - return ret; - } - -diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c -index 6d2c49ba..8c5ad89 100644 ---- a/drivers/acpi/video.c -+++ b/drivers/acpi/video.c -@@ -463,6 +463,22 @@ static struct dmi_system_id video_dmi_table[] __initdata = { - DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion m4 Notebook PC"), - }, - }, -+ { -+ .callback = video_ignore_initial_backlight, -+ .ident = "HP 1000 Notebook PC", -+ .matches = { -+ DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), -+ DMI_MATCH(DMI_PRODUCT_NAME, "HP 1000 Notebook PC"), -+ }, -+ }, -+ { -+ .callback = video_ignore_initial_backlight, -+ .ident = "HP Pavilion dm4", -+ .matches = { -+ DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), -+ DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dm4 Notebook PC"), -+ }, -+ }, - {} - }; - -@@ -632,6 +648,7 @@ acpi_video_init_brightness(struct acpi_video_device *device) - union acpi_object *o; - struct acpi_video_device_brightness *br = NULL; - int result = -EINVAL; -+ u32 value; - - if (!ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device, &obj))) { - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not query available " -@@ -662,7 +679,12 @@ acpi_video_init_brightness(struct acpi_video_device *device) - printk(KERN_ERR PREFIX "Invalid data\n"); - continue; - } -- br->levels[count] = (u32) o->integer.value; -+ value = (u32) o->integer.value; -+ /* Skip duplicate entries */ -+ if (count > 2 && br->levels[count - 1] == value) -+ continue; -+ -+ br->levels[count] = value; - - if (br->levels[count] > max_level) - max_level = br->levels[count]; -diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c -index 45d8097..1440887 100644 ---- a/drivers/acpi/video_detect.c -+++ b/drivers/acpi/video_detect.c -@@ -132,6 +132,49 @@ find_video(acpi_handle handle, u32 lvl, void *context, void **rv) - return AE_OK; - } - -+/* Force to use vendor driver when the ACPI device is known to be -+ * buggy */ -+static int video_detect_force_vendor(const struct dmi_system_id *d) -+{ -+ acpi_video_support |= ACPI_VIDEO_BACKLIGHT_DMI_VENDOR; -+ return 0; -+} -+ -+static struct dmi_system_id video_detect_dmi_table[] = { -+ /* On Samsung X360, the BIOS will set a flag (VDRV) if generic -+ * ACPI backlight device is used. This flag will definitively break -+ * the backlight interface (even the vendor interface) untill next -+ * reboot. It's why we should prevent video.ko from being used here -+ * and we can't rely on a later call to acpi_video_unregister(). -+ */ -+ { -+ .callback = video_detect_force_vendor, -+ .ident = "X360", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), -+ DMI_MATCH(DMI_PRODUCT_NAME, "X360"), -+ DMI_MATCH(DMI_BOARD_NAME, "X360"), -+ }, -+ }, -+ { -+ .callback = video_detect_force_vendor, -+ .ident = "Asus UL30VT", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."), -+ DMI_MATCH(DMI_PRODUCT_NAME, "UL30VT"), -+ }, -+ }, -+ { -+ .callback = video_detect_force_vendor, -+ .ident = "Asus UL30A", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."), -+ DMI_MATCH(DMI_PRODUCT_NAME, "UL30A"), -+ }, -+ }, -+ { }, -+}; -+ - /* - * Returns the video capabilities of a specific ACPI graphics device - * -@@ -164,6 +207,8 @@ long acpi_video_get_capabilities(acpi_handle graphics_handle) - * ACPI_VIDEO_BACKLIGHT_DMI_VENDOR; - *} - */ -+ -+ dmi_check_system(video_detect_dmi_table); - } else { - status = acpi_bus_get_device(graphics_handle, &tmp_dev); - if (ACPI_FAILURE(status)) { -diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c -index aeb8220..d366a75 100644 ---- a/drivers/ata/ahci.c -+++ b/drivers/ata/ahci.c -@@ -268,6 +268,51 @@ static const struct pci_device_id ahci_pci_tbl[] = { - { PCI_VDEVICE(INTEL, 0x8c07), board_ahci }, /* Lynx Point RAID */ - { PCI_VDEVICE(INTEL, 0x8c0e), board_ahci }, /* Lynx Point RAID */ - { PCI_VDEVICE(INTEL, 0x8c0f), board_ahci }, /* Lynx Point RAID */ -+ { PCI_VDEVICE(INTEL, 0x9c02), board_ahci }, /* Lynx Point-LP AHCI */ -+ { PCI_VDEVICE(INTEL, 0x9c03), board_ahci }, /* Lynx Point-LP AHCI */ -+ { PCI_VDEVICE(INTEL, 0x9c04), board_ahci }, /* Lynx Point-LP RAID */ -+ { PCI_VDEVICE(INTEL, 0x9c05), board_ahci }, /* Lynx Point-LP RAID */ -+ { PCI_VDEVICE(INTEL, 0x9c06), board_ahci }, /* Lynx Point-LP RAID */ -+ { PCI_VDEVICE(INTEL, 0x9c07), board_ahci }, /* Lynx Point-LP RAID */ -+ { PCI_VDEVICE(INTEL, 0x9c0e), board_ahci }, /* Lynx Point-LP RAID */ -+ { PCI_VDEVICE(INTEL, 0x9c0f), board_ahci }, /* Lynx Point-LP RAID */ -+ { PCI_VDEVICE(INTEL, 0x1f22), board_ahci }, /* Avoton AHCI */ -+ { PCI_VDEVICE(INTEL, 0x1f23), board_ahci }, /* Avoton AHCI */ -+ { PCI_VDEVICE(INTEL, 0x1f24), board_ahci }, /* Avoton RAID */ -+ { PCI_VDEVICE(INTEL, 0x1f25), board_ahci }, /* Avoton RAID */ -+ { PCI_VDEVICE(INTEL, 0x1f26), board_ahci }, /* Avoton RAID */ -+ { PCI_VDEVICE(INTEL, 0x1f27), board_ahci }, /* Avoton RAID */ -+ { PCI_VDEVICE(INTEL, 0x1f2e), board_ahci }, /* Avoton RAID */ -+ { PCI_VDEVICE(INTEL, 0x1f2f), board_ahci }, /* Avoton RAID */ -+ { PCI_VDEVICE(INTEL, 0x1f32), board_ahci }, /* Avoton AHCI */ -+ { PCI_VDEVICE(INTEL, 0x1f33), board_ahci }, /* Avoton AHCI */ -+ { PCI_VDEVICE(INTEL, 0x1f34), board_ahci }, /* Avoton RAID */ -+ { PCI_VDEVICE(INTEL, 0x1f35), board_ahci }, /* Avoton RAID */ -+ { PCI_VDEVICE(INTEL, 0x1f36), board_ahci }, /* Avoton RAID */ -+ { PCI_VDEVICE(INTEL, 0x1f37), board_ahci }, /* Avoton RAID */ -+ { PCI_VDEVICE(INTEL, 0x1f3e), board_ahci }, /* Avoton RAID */ -+ { PCI_VDEVICE(INTEL, 0x1f3f), board_ahci }, /* Avoton RAID */ -+ { PCI_VDEVICE(INTEL, 0x8d02), board_ahci }, /* Wellsburg AHCI */ -+ { PCI_VDEVICE(INTEL, 0x8d04), board_ahci }, /* Wellsburg RAID */ -+ { PCI_VDEVICE(INTEL, 0x8d06), board_ahci }, /* Wellsburg RAID */ -+ { PCI_VDEVICE(INTEL, 0x8d0e), board_ahci }, /* Wellsburg RAID */ -+ { PCI_VDEVICE(INTEL, 0x8d62), board_ahci }, /* Wellsburg AHCI */ -+ { PCI_VDEVICE(INTEL, 0x8d64), board_ahci }, /* Wellsburg RAID */ -+ { PCI_VDEVICE(INTEL, 0x8d66), board_ahci }, /* Wellsburg RAID */ -+ { PCI_VDEVICE(INTEL, 0x8d6e), board_ahci }, /* Wellsburg RAID */ -+ { PCI_VDEVICE(INTEL, 0x23a3), board_ahci }, /* Coleto Creek AHCI */ -+ { PCI_VDEVICE(INTEL, 0x9c83), board_ahci }, /* Wildcat Point-LP AHCI */ -+ { PCI_VDEVICE(INTEL, 0x9c85), board_ahci }, /* Wildcat Point-LP RAID */ -+ { PCI_VDEVICE(INTEL, 0x9c87), board_ahci }, /* Wildcat Point-LP RAID */ -+ { PCI_VDEVICE(INTEL, 0x9c8f), board_ahci }, /* Wildcat Point-LP RAID */ -+ { PCI_VDEVICE(INTEL, 0x8c82), board_ahci }, /* 9 Series AHCI */ -+ { PCI_VDEVICE(INTEL, 0x8c83), board_ahci }, /* 9 Series AHCI */ -+ { PCI_VDEVICE(INTEL, 0x8c84), board_ahci }, /* 9 Series RAID */ -+ { PCI_VDEVICE(INTEL, 0x8c85), board_ahci }, /* 9 Series RAID */ -+ { PCI_VDEVICE(INTEL, 0x8c86), board_ahci }, /* 9 Series RAID */ -+ { PCI_VDEVICE(INTEL, 0x8c87), board_ahci }, /* 9 Series RAID */ -+ { PCI_VDEVICE(INTEL, 0x8c8e), board_ahci }, /* 9 Series RAID */ -+ { PCI_VDEVICE(INTEL, 0x8c8f), board_ahci }, /* 9 Series RAID */ - - /* JMicron 360/1/3/5/6, match class to avoid IDE function */ - { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, -@@ -398,13 +443,20 @@ static const struct pci_device_id ahci_pci_tbl[] = { - .driver_data = board_ahci_yes_fbs }, /* 88se9125 */ - { PCI_DEVICE(0x1b4b, 0x917a), - .driver_data = board_ahci_yes_fbs }, /* 88se9172 */ -+ { PCI_DEVICE(0x1b4b, 0x9182), -+ .driver_data = board_ahci_yes_fbs }, /* 88se9182 */ - { PCI_DEVICE(0x1b4b, 0x9192), - .driver_data = board_ahci_yes_fbs }, /* 88se9172 on some Gigabyte */ - { PCI_DEVICE(0x1b4b, 0x91a3), - .driver_data = board_ahci_yes_fbs }, -+ { PCI_DEVICE(0x1b4b, 0x9230), -+ .driver_data = board_ahci_yes_fbs }, -+ { PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0642), -+ .driver_data = board_ahci_yes_fbs }, - - /* Promise */ - { PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */ -+ { PCI_VDEVICE(PROMISE, 0x3781), board_ahci }, /* FastTrak TX8660 ahci-mode */ - - /* Asmedia */ - { PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci }, /* ASM1060 */ -diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c -index 9dbd3ae..2f081a3 100644 ---- a/drivers/ata/ata_piix.c -+++ b/drivers/ata/ata_piix.c -@@ -331,6 +331,14 @@ static const struct pci_device_id piix_pci_tbl[] = { - { 0x8086, 0x8c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb }, - /* SATA Controller IDE (Lynx Point) */ - { 0x8086, 0x8c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, -+ /* SATA Controller IDE (Lynx Point-LP) */ -+ { 0x8086, 0x9c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, -+ /* SATA Controller IDE (Lynx Point-LP) */ -+ { 0x8086, 0x9c01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, -+ /* SATA Controller IDE (Lynx Point-LP) */ -+ { 0x8086, 0x9c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, -+ /* SATA Controller IDE (Lynx Point-LP) */ -+ { 0x8086, 0x9c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, - /* SATA Controller IDE (DH89xxCC) */ - { 0x8086, 0x2326, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, - /* SATA Controller IDE (Avoton) */ -@@ -354,6 +362,14 @@ static const struct pci_device_id piix_pci_tbl[] = { - { 0x8086, 0x0F21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt }, - /* SATA Controller IDE (Coleto Creek) */ - { 0x8086, 0x23a6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, -+ /* SATA Controller IDE (9 Series) */ -+ { 0x8086, 0x8c88, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb }, -+ /* SATA Controller IDE (9 Series) */ -+ { 0x8086, 0x8c89, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb }, -+ /* SATA Controller IDE (9 Series) */ -+ { 0x8086, 0x8c80, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, -+ /* SATA Controller IDE (9 Series) */ -+ { 0x8086, 0x8c81, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, - - { } /* terminate list */ - }; -diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c -index 47a1fb8..60f41cd 100644 ---- a/drivers/ata/libahci.c -+++ b/drivers/ata/libahci.c -@@ -1249,9 +1249,11 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class, - { - struct ata_port *ap = link->ap; - struct ahci_host_priv *hpriv = ap->host->private_data; -+ struct ahci_port_priv *pp = ap->private_data; - const char *reason = NULL; - unsigned long now, msecs; - struct ata_taskfile tf; -+ bool fbs_disabled = false; - int rc; - - DPRINTK("ENTER\n"); -@@ -1261,6 +1263,16 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class, - if (rc && rc != -EOPNOTSUPP) - ata_link_warn(link, "failed to reset engine (errno=%d)\n", rc); - -+ /* -+ * According to AHCI-1.2 9.3.9: if FBS is enable, software shall -+ * clear PxFBS.EN to '0' prior to issuing software reset to devices -+ * that is attached to port multiplier. -+ */ -+ if (!ata_is_host_link(link) && pp->fbs_enabled) { -+ ahci_disable_fbs(ap); -+ fbs_disabled = true; -+ } -+ - ata_tf_init(link->device, &tf); - - /* issue the first D2H Register FIS */ -@@ -1301,6 +1313,10 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class, - } else - *class = ahci_dev_classify(ap); - -+ /* re-enable FBS if disabled before */ -+ if (fbs_disabled) -+ ahci_enable_fbs(ap); -+ - DPRINTK("EXIT, class=%u\n", *class); - return 0; - -diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c -index 9cf09ae..6b92236 100644 ---- a/drivers/ata/libata-core.c -+++ b/drivers/ata/libata-core.c -@@ -4074,6 +4074,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { - { "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 }, - { "QUANTUM DAT DAT72-000", NULL, ATA_HORKAGE_ATAPI_MOD16_DMA }, - { "Slimtype DVD A DS8A8SH", NULL, ATA_HORKAGE_MAX_SEC_LBA48 }, -+ { "Slimtype DVD A DS8A9SH", NULL, ATA_HORKAGE_MAX_SEC_LBA48 }, - - /* Devices we expect to fail diagnostics */ - -@@ -4103,6 +4104,10 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { - { "ST3320[68]13AS", "SD1[5-9]", ATA_HORKAGE_NONCQ | - ATA_HORKAGE_FIRMWARE_WARN }, - -+ /* Seagate Momentus SpinPoint M8 seem to have FPMDA_AA issues */ -+ { "ST1000LM024 HN-M101MBB", "2AR10001", ATA_HORKAGE_BROKEN_FPDMA_AA }, -+ { "ST1000LM024 HN-M101MBB", "2BA30001", ATA_HORKAGE_BROKEN_FPDMA_AA }, -+ - /* Blacklist entries taken from Silicon Image 3124/3132 - Windows driver .inf file - also several Linux problem reports */ - { "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, }, -@@ -4688,6 +4693,10 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) - * ata_qc_new - Request an available ATA command, for queueing - * @ap: target port - * -+ * Some ATA host controllers may implement a queue depth which is less -+ * than ATA_MAX_QUEUE. So we shouldn't allocate a tag which is beyond -+ * the hardware limitation. -+ * - * LOCKING: - * None. - */ -@@ -4695,21 +4704,27 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) - static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap) - { - struct ata_queued_cmd *qc = NULL; -- unsigned int i; -+ unsigned int max_queue = ap->host->n_tags; -+ unsigned int i, tag; - - /* no command while frozen */ - if (unlikely(ap->pflags & ATA_PFLAG_FROZEN)) - return NULL; - -- /* the last tag is reserved for internal command. */ -- for (i = 0; i < ATA_MAX_QUEUE - 1; i++) -- if (!test_and_set_bit(i, &ap->qc_allocated)) { -- qc = __ata_qc_from_tag(ap, i); -+ for (i = 0, tag = ap->last_tag + 1; i < max_queue; i++, tag++) { -+ tag = tag < max_queue ? tag : 0; -+ -+ /* the last tag is reserved for internal command. */ -+ if (tag == ATA_TAG_INTERNAL) -+ continue; -+ -+ if (!test_and_set_bit(tag, &ap->qc_allocated)) { -+ qc = __ata_qc_from_tag(ap, tag); -+ qc->tag = tag; -+ ap->last_tag = tag; - break; - } -- -- if (qc) -- qc->tag = i; -+ } - - return qc; - } -@@ -5949,6 +5964,7 @@ void ata_host_init(struct ata_host *host, struct device *dev, - { - spin_lock_init(&host->lock); - mutex_init(&host->eh_mutex); -+ host->n_tags = ATA_MAX_QUEUE - 1; - host->dev = dev; - host->flags = flags; - host->ops = ops; -@@ -6031,6 +6047,8 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) - { - int i, rc; - -+ host->n_tags = clamp(sht->can_queue, 1, ATA_MAX_QUEUE - 1); -+ - /* host must have been started */ - if (!(host->flags & ATA_HOST_STARTED)) { - dev_err(host->dev, "BUG: trying to register unstarted host\n"); -diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c -index e47c224..37fb4d6 100644 ---- a/drivers/ata/libata-eh.c -+++ b/drivers/ata/libata-eh.c -@@ -1287,14 +1287,14 @@ void ata_eh_qc_complete(struct ata_queued_cmd *qc) - * should be retried. To be used from EH. - * - * SCSI midlayer limits the number of retries to scmd->allowed. -- * scmd->retries is decremented for commands which get retried -+ * scmd->allowed is incremented for commands which get retried - * due to unrelated failures (qc->err_mask is zero). - */ - void ata_eh_qc_retry(struct ata_queued_cmd *qc) - { - struct scsi_cmnd *scmd = qc->scsicmd; -- if (!qc->err_mask && scmd->retries) -- scmd->retries--; -+ if (!qc->err_mask) -+ scmd->allowed++; - __ata_eh_qc_complete(qc); - } - -diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c -index f5c35be..0ba32fe 100644 ---- a/drivers/ata/libata-pmp.c -+++ b/drivers/ata/libata-pmp.c -@@ -447,8 +447,11 @@ static void sata_pmp_quirks(struct ata_port *ap) - * otherwise. Don't try hard to recover it. - */ - ap->pmp_link[ap->nr_pmp_links - 1].flags |= ATA_LFLAG_NO_RETRY; -- } else if (vendor == 0x197b && devid == 0x2352) { -- /* chip found in Thermaltake BlackX Duet, jmicron JMB350? */ -+ } else if (vendor == 0x197b && (devid == 0x2352 || devid == 0x0325)) { -+ /* -+ * 0x2352: found in Thermaltake BlackX Duet, jmicron JMB350? -+ * 0x0325: jmicron JMB394. -+ */ - ata_for_each_link(link, ap, EDGE) { - /* SRST breaks detection and disks get misclassified - * LPM disabled to avoid potential problems -diff --git a/drivers/ata/libata-transport.c b/drivers/ata/libata-transport.c -index c341904..9215677 100644 ---- a/drivers/ata/libata-transport.c -+++ b/drivers/ata/libata-transport.c -@@ -319,25 +319,25 @@ int ata_tport_add(struct device *parent, - /* - * ATA link attributes - */ -+static int noop(int x) { return x; } - -- --#define ata_link_show_linkspeed(field) \ -+#define ata_link_show_linkspeed(field, format) \ - static ssize_t \ - show_ata_link_##field(struct device *dev, \ - struct device_attribute *attr, char *buf) \ - { \ - struct ata_link *link = transport_class_to_link(dev); \ - \ -- return sprintf(buf,"%s\n", sata_spd_string(fls(link->field))); \ -+ return sprintf(buf, "%s\n", sata_spd_string(format(link->field))); \ - } - --#define ata_link_linkspeed_attr(field) \ -- ata_link_show_linkspeed(field) \ -+#define ata_link_linkspeed_attr(field, format) \ -+ ata_link_show_linkspeed(field, format) \ - static DEVICE_ATTR(field, S_IRUGO, show_ata_link_##field, NULL) - --ata_link_linkspeed_attr(hw_sata_spd_limit); --ata_link_linkspeed_attr(sata_spd_limit); --ata_link_linkspeed_attr(sata_spd); -+ata_link_linkspeed_attr(hw_sata_spd_limit, fls); -+ata_link_linkspeed_attr(sata_spd_limit, fls); -+ata_link_linkspeed_attr(sata_spd, noop); - - - static DECLARE_TRANSPORT_CLASS(ata_link_class, -diff --git a/drivers/ata/pata_at91.c b/drivers/ata/pata_at91.c -index 53d3770..47d5d58 100644 ---- a/drivers/ata/pata_at91.c -+++ b/drivers/ata/pata_at91.c -@@ -408,12 +408,13 @@ static int __devinit pata_at91_probe(struct platform_device *pdev) - - host->private_data = info; - -- return ata_host_activate(host, gpio_is_valid(irq) ? gpio_to_irq(irq) : 0, -- gpio_is_valid(irq) ? ata_sff_interrupt : NULL, -- irq_flags, &pata_at91_sht); -+ ret = ata_host_activate(host, gpio_is_valid(irq) ? gpio_to_irq(irq) : 0, -+ gpio_is_valid(irq) ? ata_sff_interrupt : NULL, -+ irq_flags, &pata_at91_sht); -+ if (ret) -+ goto err_put; - -- if (!ret) -- return 0; -+ return 0; - - err_put: - clk_put(info->mck); -diff --git a/drivers/ata/pata_scc.c b/drivers/ata/pata_scc.c -index e265f83..19759d3 100644 ---- a/drivers/ata/pata_scc.c -+++ b/drivers/ata/pata_scc.c -@@ -586,7 +586,7 @@ static int scc_wait_after_reset(struct ata_link *link, unsigned int devmask, - * Note: Original code is ata_bus_softreset(). - */ - --static unsigned int scc_bus_softreset(struct ata_port *ap, unsigned int devmask, -+static int scc_bus_softreset(struct ata_port *ap, unsigned int devmask, - unsigned long deadline) - { - struct ata_ioports *ioaddr = &ap->ioaddr; -@@ -600,9 +600,7 @@ static unsigned int scc_bus_softreset(struct ata_port *ap, unsigned int devmask, - udelay(20); - out_be32(ioaddr->ctl_addr, ap->ctl); - -- scc_wait_after_reset(&ap->link, devmask, deadline); -- -- return 0; -+ return scc_wait_after_reset(&ap->link, devmask, deadline); - } - - /** -@@ -619,7 +617,8 @@ static int scc_softreset(struct ata_link *link, unsigned int *classes, - { - struct ata_port *ap = link->ap; - unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS; -- unsigned int devmask = 0, err_mask; -+ unsigned int devmask = 0; -+ int rc; - u8 err; - - DPRINTK("ENTER\n"); -@@ -635,9 +634,9 @@ static int scc_softreset(struct ata_link *link, unsigned int *classes, - - /* issue bus reset */ - DPRINTK("about to softreset, devmask=%x\n", devmask); -- err_mask = scc_bus_softreset(ap, devmask, deadline); -- if (err_mask) { -- ata_port_err(ap, "SRST failed (err_mask=0x%x)\n", err_mask); -+ rc = scc_bus_softreset(ap, devmask, deadline); -+ if (rc) { -+ ata_port_err(ap, "SRST failed (err_mask=0x%x)\n", rc); - return -EIO; - } - -diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c -index 9dfb40b..0c4ed89 100644 ---- a/drivers/ata/sata_sil.c -+++ b/drivers/ata/sata_sil.c -@@ -157,6 +157,7 @@ static const struct sil_drivelist { - { "ST380011ASL", SIL_QUIRK_MOD15WRITE }, - { "ST3120022ASL", SIL_QUIRK_MOD15WRITE }, - { "ST3160021ASL", SIL_QUIRK_MOD15WRITE }, -+ { "TOSHIBA MK2561GSYN", SIL_QUIRK_MOD15WRITE }, - { "Maxtor 4D060H3", SIL_QUIRK_UDMA5MAX }, - { } - }; -diff --git a/drivers/atm/ambassador.c b/drivers/atm/ambassador.c -index f8f41e0..89b30f3 100644 ---- a/drivers/atm/ambassador.c -+++ b/drivers/atm/ambassador.c -@@ -802,7 +802,7 @@ static void fill_rx_pool (amb_dev * dev, unsigned char pool, - } - // cast needed as there is no %? for pointer differences - PRINTD (DBG_SKB, "allocated skb at %p, head %p, area %li", -- skb, skb->head, (long) (skb_end_pointer(skb) - skb->head)); -+ skb, skb->head, (long) skb_end_offset(skb)); - rx.handle = virt_to_bus (skb); - rx.host_address = cpu_to_be32 (virt_to_bus (skb->data)); - if (rx_give (dev, &rx, pool)) -diff --git a/drivers/atm/idt77252.c b/drivers/atm/idt77252.c -index 1c05212..81845fa 100644 ---- a/drivers/atm/idt77252.c -+++ b/drivers/atm/idt77252.c -@@ -1258,7 +1258,7 @@ idt77252_rx_raw(struct idt77252_dev *card) - tail = readl(SAR_REG_RAWCT); - - pci_dma_sync_single_for_cpu(card->pcidev, IDT77252_PRV_PADDR(queue), -- skb_end_pointer(queue) - queue->head - 16, -+ skb_end_offset(queue) - 16, - PCI_DMA_FROMDEVICE); - - while (head != tail) { -@@ -3513,7 +3513,7 @@ init_card(struct atm_dev *dev) - tmp = dev_get_by_name(&init_net, tname); /* jhs: was "tmp = dev_get(tname);" */ - if (tmp) { - memcpy(card->atmdev->esi, tmp->dev_addr, 6); -- -+ dev_put(tmp); - printk("%s: ESI %pM\n", card->name, card->atmdev->esi); - } - /* -diff --git a/drivers/base/dd.c b/drivers/base/dd.c -index 4900e90..62a6942 100644 ---- a/drivers/base/dd.c -+++ b/drivers/base/dd.c -@@ -52,6 +52,7 @@ static DEFINE_MUTEX(deferred_probe_mutex); - static LIST_HEAD(deferred_probe_pending_list); - static LIST_HEAD(deferred_probe_active_list); - static struct workqueue_struct *deferred_wq; -+static atomic_t deferred_trigger_count = ATOMIC_INIT(0); - - /** - * deferred_probe_work_func() - Retry probing devices in the active list. -@@ -123,6 +124,17 @@ static bool driver_deferred_probe_enable = false; - * This functions moves all devices from the pending list to the active - * list and schedules the deferred probe workqueue to process them. It - * should be called anytime a driver is successfully bound to a device. -+ * -+ * Note, there is a race condition in multi-threaded probe. In the case where -+ * more than one device is probing at the same time, it is possible for one -+ * probe to complete successfully while another is about to defer. If the second -+ * depends on the first, then it will get put on the pending list after the -+ * trigger event has already occured and will be stuck there. -+ * -+ * The atomic 'deferred_trigger_count' is used to determine if a successful -+ * trigger has occurred in the midst of probing a driver. If the trigger count -+ * changes in the midst of a probe, then deferred processing should be triggered -+ * again. - */ - static void driver_deferred_probe_trigger(void) - { -@@ -135,6 +147,7 @@ static void driver_deferred_probe_trigger(void) - * into the active list so they can be retried by the workqueue - */ - mutex_lock(&deferred_probe_mutex); -+ atomic_inc(&deferred_trigger_count); - list_splice_tail_init(&deferred_probe_pending_list, - &deferred_probe_active_list); - mutex_unlock(&deferred_probe_mutex); -@@ -253,6 +266,7 @@ static DECLARE_WAIT_QUEUE_HEAD(probe_waitqueue); - static int really_probe(struct device *dev, struct device_driver *drv) - { - int ret = 0; -+ int local_trigger_count = atomic_read(&deferred_trigger_count); - - atomic_inc(&probe_count); - pr_debug("bus: '%s': %s: probing driver %s with device %s\n", -@@ -297,6 +311,9 @@ static int really_probe(struct device *dev, struct device_driver *drv) - /* Driver requested deferred probing */ - dev_info(dev, "Driver %s requests probe deferral\n", drv->name); - driver_deferred_probe_add(dev); -+ /* Did a trigger occur while probing? Need to re-trigger if yes */ -+ if (local_trigger_count != atomic_read(&deferred_trigger_count)) -+ driver_deferred_probe_trigger(); - } else if (ret != -ENODEV && ret != -ENXIO) { - /* driver matched but the probe failed */ - printk(KERN_WARNING -diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c -index ca72d1f..e554542 100644 ---- a/drivers/base/regmap/regmap.c -+++ b/drivers/base/regmap/regmap.c -@@ -48,7 +48,7 @@ bool regmap_readable(struct regmap *map, unsigned int reg) - - bool regmap_volatile(struct regmap *map, unsigned int reg) - { -- if (!regmap_readable(map, reg)) -+ if (!map->format.format_write && !regmap_readable(map, reg)) - return false; - - if (map->volatile_reg) -diff --git a/drivers/block/brd.c b/drivers/block/brd.c -index 4e8213a..a7d70e2 100644 ---- a/drivers/block/brd.c -+++ b/drivers/block/brd.c -@@ -546,7 +546,7 @@ static struct kobject *brd_probe(dev_t dev, int *part, void *data) - - mutex_lock(&brd_devices_mutex); - brd = brd_init_one(MINOR(dev) >> part_shift); -- kobj = brd ? get_disk(brd->brd_disk) : ERR_PTR(-ENOMEM); -+ kobj = brd ? get_disk(brd->brd_disk) : NULL; - mutex_unlock(&brd_devices_mutex); - - *part = 0; -diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c -index c82f06e..bc99e5c 100644 ---- a/drivers/block/floppy.c -+++ b/drivers/block/floppy.c -@@ -3058,7 +3058,10 @@ static int raw_cmd_copyout(int cmd, void __user *param, - int ret; - - while (ptr) { -- ret = copy_to_user(param, ptr, sizeof(*ptr)); -+ struct floppy_raw_cmd cmd = *ptr; -+ cmd.next = NULL; -+ cmd.kernel_data = NULL; -+ ret = copy_to_user(param, &cmd, sizeof(cmd)); - if (ret) - return -EFAULT; - param += sizeof(struct floppy_raw_cmd); -@@ -3112,10 +3115,11 @@ static int raw_cmd_copyin(int cmd, void __user *param, - return -ENOMEM; - *rcmd = ptr; - ret = copy_from_user(ptr, param, sizeof(*ptr)); -- if (ret) -- return -EFAULT; - ptr->next = NULL; - ptr->buffer_length = 0; -+ ptr->kernel_data = NULL; -+ if (ret) -+ return -EFAULT; - param += sizeof(struct floppy_raw_cmd); - if (ptr->cmd_count > 33) - /* the command may now also take up the space -@@ -3131,7 +3135,6 @@ static int raw_cmd_copyin(int cmd, void __user *param, - for (i = 0; i < 16; i++) - ptr->reply[i] = 0; - ptr->resultcode = 0; -- ptr->kernel_data = NULL; - - if (ptr->flags & (FD_RAW_READ | FD_RAW_WRITE)) { - if (ptr->length <= 0) -@@ -4303,7 +4306,7 @@ static int __init floppy_init(void) - - err = platform_device_register(&floppy_device[drive]); - if (err) -- goto out_flush_work; -+ goto out_remove_drives; - - err = device_create_file(&floppy_device[drive].dev, - &dev_attr_cmos); -@@ -4321,6 +4324,15 @@ static int __init floppy_init(void) - - out_unreg_platform_dev: - platform_device_unregister(&floppy_device[drive]); -+out_remove_drives: -+ while (drive--) { -+ if ((allowed_drive_mask & (1 << drive)) && -+ fdc_state[FDC(drive)].version != FDC_NONE) { -+ del_gendisk(disks[drive]); -+ device_remove_file(&floppy_device[drive].dev, &dev_attr_cmos); -+ platform_device_unregister(&floppy_device[drive]); -+ } -+ } - out_flush_work: - flush_work_sync(&floppy_work); - if (atomic_read(&usage_count)) -diff --git a/drivers/block/loop.c b/drivers/block/loop.c -index 179b5b4..462fd18 100644 ---- a/drivers/block/loop.c -+++ b/drivers/block/loop.c -@@ -1636,7 +1636,7 @@ static int loop_add(struct loop_device **l, int i) - - lo->lo_queue = blk_alloc_queue(GFP_KERNEL); - if (!lo->lo_queue) -- goto out_free_dev; -+ goto out_free_idr; - - disk = lo->lo_disk = alloc_disk(1 << part_shift); - if (!disk) -@@ -1680,6 +1680,8 @@ static int loop_add(struct loop_device **l, int i) - - out_free_queue: - blk_cleanup_queue(lo->lo_queue); -+out_free_idr: -+ idr_remove(&loop_index_idr, i); - out_free_dev: - kfree(lo); - out: -@@ -1743,7 +1745,7 @@ static struct kobject *loop_probe(dev_t dev, int *part, void *data) - if (err < 0) - err = loop_add(&lo, MINOR(dev) >> part_shift); - if (err < 0) -- kobj = ERR_PTR(err); -+ kobj = NULL; - else - kobj = get_disk(lo->lo_disk); - mutex_unlock(&loop_index_mutex); -diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c -index 386d40e..35fc569 100644 ---- a/drivers/block/nbd.c -+++ b/drivers/block/nbd.c -@@ -584,14 +584,24 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, - struct request sreq; - - dev_info(disk_to_dev(nbd->disk), "NBD_DISCONNECT\n"); -+ if (!nbd->sock) -+ return -EINVAL; - -+ mutex_unlock(&nbd->tx_lock); -+ fsync_bdev(bdev); -+ mutex_lock(&nbd->tx_lock); - blk_rq_init(NULL, &sreq); - sreq.cmd_type = REQ_TYPE_SPECIAL; - nbd_cmd(&sreq) = NBD_CMD_DISC; -+ -+ /* Check again after getting mutex back. */ - if (!nbd->sock) - return -EINVAL; -+ -+ nbd->disconnect = 1; -+ - nbd_send_req(nbd, &sreq); -- return 0; -+ return 0; - } - - case NBD_CLEAR_SOCK: { -@@ -603,6 +613,7 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, - nbd_clear_que(nbd); - BUG_ON(!list_empty(&nbd->queue_head)); - BUG_ON(!list_empty(&nbd->waiting_queue)); -+ kill_bdev(bdev); - if (file) - fput(file); - return 0; -@@ -620,6 +631,7 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, - nbd->sock = SOCKET_I(inode); - if (max_part > 0) - bdev->bd_invalidated = 1; -+ nbd->disconnect = 0; /* we're connected now */ - return 0; - } else { - fput(file); -@@ -684,6 +696,7 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, - nbd->file = NULL; - nbd_clear_que(nbd); - dev_warn(disk_to_dev(nbd->disk), "queue cleared\n"); -+ kill_bdev(bdev); - if (file) - fput(file); - nbd->bytesize = 0; -@@ -691,6 +704,8 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, - set_capacity(nbd->disk, 0); - if (max_part > 0) - ioctl_by_bdev(bdev, BLKRRPART, 0); -+ if (nbd->disconnect) /* user requested, ignore socket errors */ -+ return 0; - return nbd->harderror; - } - -diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c -index 0d39f2f..98bb43f 100644 ---- a/drivers/block/virtio_blk.c -+++ b/drivers/block/virtio_blk.c -@@ -21,17 +21,12 @@ struct workqueue_struct *virtblk_wq; - - struct virtio_blk - { -- spinlock_t lock; -- - struct virtio_device *vdev; - struct virtqueue *vq; - - /* The disk structure for the kernel. */ - struct gendisk *disk; - -- /* Request tracking. */ -- struct list_head reqs; -- - mempool_t *pool; - - /* Process context for config space updates */ -@@ -55,7 +50,6 @@ struct virtio_blk - - struct virtblk_req - { -- struct list_head list; - struct request *req; - struct virtio_blk_outhdr out_hdr; - struct virtio_scsi_inhdr in_hdr; -@@ -69,7 +63,7 @@ static void blk_done(struct virtqueue *vq) - unsigned int len; - unsigned long flags; - -- spin_lock_irqsave(&vblk->lock, flags); -+ spin_lock_irqsave(vblk->disk->queue->queue_lock, flags); - while ((vbr = virtqueue_get_buf(vblk->vq, &len)) != NULL) { - int error; - -@@ -99,12 +93,11 @@ static void blk_done(struct virtqueue *vq) - } - - __blk_end_request_all(vbr->req, error); -- list_del(&vbr->list); - mempool_free(vbr, vblk->pool); - } - /* In case queue is stopped waiting for more buffers. */ - blk_start_queue(vblk->disk->queue); -- spin_unlock_irqrestore(&vblk->lock, flags); -+ spin_unlock_irqrestore(vblk->disk->queue->queue_lock, flags); - } - - static bool do_req(struct request_queue *q, struct virtio_blk *vblk, -@@ -184,7 +177,6 @@ static bool do_req(struct request_queue *q, struct virtio_blk *vblk, - return false; - } - -- list_add_tail(&vbr->list, &vblk->reqs); - return true; - } - -@@ -437,8 +429,6 @@ static int __devinit virtblk_probe(struct virtio_device *vdev) - goto out_free_index; - } - -- INIT_LIST_HEAD(&vblk->reqs); -- spin_lock_init(&vblk->lock); - vblk->vdev = vdev; - vblk->sg_elems = sg_elems; - sg_init_table(vblk->sg, vblk->sg_elems); -@@ -463,7 +453,7 @@ static int __devinit virtblk_probe(struct virtio_device *vdev) - goto out_mempool; - } - -- q = vblk->disk->queue = blk_init_queue(do_virtblk_request, &vblk->lock); -+ q = vblk->disk->queue = blk_init_queue(do_virtblk_request, NULL); - if (!q) { - err = -ENOMEM; - goto out_put_disk; -@@ -583,27 +573,30 @@ static void __devexit virtblk_remove(struct virtio_device *vdev) - { - struct virtio_blk *vblk = vdev->priv; - int index = vblk->index; -+ int refc; - - /* Prevent config work handler from accessing the device. */ - mutex_lock(&vblk->config_lock); - vblk->config_enable = false; - mutex_unlock(&vblk->config_lock); - -- /* Nothing should be pending. */ -- BUG_ON(!list_empty(&vblk->reqs)); -+ del_gendisk(vblk->disk); -+ blk_cleanup_queue(vblk->disk->queue); - - /* Stop all the virtqueues. */ - vdev->config->reset(vdev); - - flush_work(&vblk->config_work); - -- del_gendisk(vblk->disk); -- blk_cleanup_queue(vblk->disk->queue); -+ refc = atomic_read(&disk_to_dev(vblk->disk)->kobj.kref.refcount); - put_disk(vblk->disk); - mempool_destroy(vblk->pool); - vdev->config->del_vqs(vdev); - kfree(vblk); -- ida_simple_remove(&vd_index_ida, index); -+ -+ /* Only free device id if we don't have any users */ -+ if (refc == 1) -+ ida_simple_remove(&vd_index_ida, index); - } - - #ifdef CONFIG_PM -diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c -index 4ed7bf9..ae1b0c4 100644 ---- a/drivers/block/xen-blkback/blkback.c -+++ b/drivers/block/xen-blkback/blkback.c -@@ -274,6 +274,7 @@ int xen_blkif_schedule(void *arg) - { - struct xen_blkif *blkif = arg; - struct xen_vbd *vbd = &blkif->vbd; -+ int ret; - - xen_blkif_get(blkif); - -@@ -294,8 +295,12 @@ int xen_blkif_schedule(void *arg) - blkif->waiting_reqs = 0; - smp_mb(); /* clear flag *before* checking for work */ - -- if (do_block_io_op(blkif)) -+ ret = do_block_io_op(blkif); -+ if (ret > 0) - blkif->waiting_reqs = 1; -+ if (ret == -EACCES) -+ wait_event_interruptible(blkif->shutdown_wq, -+ kthread_should_stop()); - - if (log_stats && time_after(jiffies, blkif->st_print)) - print_stats(blkif); -@@ -401,6 +406,8 @@ static int dispatch_discard_io(struct xen_blkif *blkif, - unsigned long secure; - struct phys_req preq; - -+ xen_blkif_get(blkif); -+ - preq.sector_number = req->u.discard.sector_number; - preq.nr_sects = req->u.discard.nr_sectors; - -@@ -413,7 +420,6 @@ static int dispatch_discard_io(struct xen_blkif *blkif, - } - blkif->st_ds_req++; - -- xen_blkif_get(blkif); - secure = (blkif->vbd.discard_secure && - (req->u.discard.flag & BLKIF_DISCARD_SECURE)) ? - BLKDEV_DISCARD_SECURE : 0; -@@ -530,6 +536,12 @@ __do_block_io_op(struct xen_blkif *blkif) - rp = blk_rings->common.sring->req_prod; - rmb(); /* Ensure we see queued requests up to 'rp'. */ - -+ if (RING_REQUEST_PROD_OVERFLOW(&blk_rings->common, rp)) { -+ rc = blk_rings->common.rsp_prod_pvt; -+ pr_warn(DRV_PFX "Frontend provided bogus ring requests (%d - %d = %d). Halting ring processing on dev=%04x\n", -+ rp, rc, rp - rc, blkif->vbd.pdevice); -+ return -EACCES; -+ } - while (rc != rp) { - - if (RING_REQUEST_CONS_OVERFLOW(&blk_rings->common, rc)) -diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h -index fc2a486..933adc5 100644 ---- a/drivers/block/xen-blkback/common.h -+++ b/drivers/block/xen-blkback/common.h -@@ -216,6 +216,8 @@ struct xen_blkif { - int st_wr_sect; - - wait_queue_head_t waiting_to_free; -+ /* Thread shutdown wait queue. */ -+ wait_queue_head_t shutdown_wq; - }; - - -diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c -index a155254..5a0062f 100644 ---- a/drivers/block/xen-blkback/xenbus.c -+++ b/drivers/block/xen-blkback/xenbus.c -@@ -118,6 +118,7 @@ static struct xen_blkif *xen_blkif_alloc(domid_t domid) - atomic_set(&blkif->drain, 0); - blkif->st_print = jiffies; - init_waitqueue_head(&blkif->waiting_to_free); -+ init_waitqueue_head(&blkif->shutdown_wq); - - return blkif; - } -@@ -178,6 +179,7 @@ static void xen_blkif_disconnect(struct xen_blkif *blkif) - { - if (blkif->xenblkd) { - kthread_stop(blkif->xenblkd); -+ wake_up(&blkif->shutdown_wq); - blkif->xenblkd = NULL; - } - -diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c -index 4e86393..a81cdd7 100644 ---- a/drivers/block/xen-blkfront.c -+++ b/drivers/block/xen-blkfront.c -@@ -1303,13 +1303,16 @@ static void blkback_changed(struct xenbus_device *dev, - case XenbusStateReconfiguring: - case XenbusStateReconfigured: - case XenbusStateUnknown: -- case XenbusStateClosed: - break; - - case XenbusStateConnected: - blkfront_connect(info); - break; - -+ case XenbusStateClosed: -+ if (dev->state == XenbusStateClosed) -+ break; -+ /* Missed the backend's Closing state -- fallthrough */ - case XenbusStateClosing: - blkfront_closing(info); - break; -diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c -index 72c773d..2f70e80 100644 ---- a/drivers/bluetooth/ath3k.c -+++ b/drivers/bluetooth/ath3k.c -@@ -83,6 +83,10 @@ static struct usb_device_id ath3k_table[] = { - /* Atheros AR5BBU12 with sflash firmware */ - { USB_DEVICE(0x0489, 0xE02C) }, - -+ /* Atheros AR5BBU22 with sflash firmware */ -+ { USB_DEVICE(0x0489, 0xE03C) }, -+ { USB_DEVICE(0x0489, 0xE036) }, -+ - { } /* Terminating entry */ - }; - -@@ -103,6 +107,10 @@ static struct usb_device_id ath3k_blist_tbl[] = { - { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 }, - -+ /* Atheros AR5BBU22 with sflash firmware */ -+ { USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x0489, 0xE036), .driver_info = BTUSB_ATH3012 }, -+ - { } /* Terminating entry */ - }; - -diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c -index a0a48ca..95060f4 100644 ---- a/drivers/bluetooth/btusb.c -+++ b/drivers/bluetooth/btusb.c -@@ -63,6 +63,9 @@ static struct usb_device_id btusb_table[] = { - /* Apple-specific (Broadcom) devices */ - { USB_VENDOR_AND_INTERFACE_INFO(0x05ac, 0xff, 0x01, 0x01) }, - -+ /* MediaTek MT76x0E */ -+ { USB_DEVICE(0x0e8d, 0x763f) }, -+ - /* Broadcom SoftSailing reporting vendor specific */ - { USB_DEVICE(0x05ac, 0x21e1) }, - -@@ -149,6 +152,10 @@ static struct usb_device_id blacklist_table[] = { - /* Atheros AR5BBU12 with sflash firmware */ - { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, - -+ /* Atheros AR5BBU12 with sflash firmware */ -+ { USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x0489, 0xe036), .driver_info = BTUSB_ATH3012 }, -+ - /* Broadcom BCM2035 */ - { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU }, - { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU }, -diff --git a/drivers/char/applicom.c b/drivers/char/applicom.c -index 25373df..5d069c7 100644 ---- a/drivers/char/applicom.c -+++ b/drivers/char/applicom.c -@@ -345,7 +345,6 @@ static int __init applicom_init(void) - free_irq(apbs[i].irq, &dummy); - iounmap(apbs[i].RamIO); - } -- pci_disable_device(dev); - return ret; - } - -diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c -index 40cc0cf2..e6939e1 100644 ---- a/drivers/char/i8k.c -+++ b/drivers/char/i8k.c -@@ -664,6 +664,13 @@ static struct dmi_system_id __initdata i8k_dmi_table[] = { - DMI_MATCH(DMI_PRODUCT_NAME, "Vostro"), - }, - }, -+ { -+ .ident = "Dell XPS421", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), -+ DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"), -+ }, -+ }, - { } - }; - -diff --git a/drivers/char/ipmi/ipmi_bt_sm.c b/drivers/char/ipmi/ipmi_bt_sm.c -index a22a7a5..8156caf 100644 ---- a/drivers/char/ipmi/ipmi_bt_sm.c -+++ b/drivers/char/ipmi/ipmi_bt_sm.c -@@ -352,7 +352,7 @@ static inline void write_all_bytes(struct si_sm_data *bt) - - static inline int read_all_bytes(struct si_sm_data *bt) - { -- unsigned char i; -+ unsigned int i; - - /* - * length is "framing info", minimum = 4: NetFn, Seq, Cmd, cCode. -diff --git a/drivers/char/ipmi/ipmi_kcs_sm.c b/drivers/char/ipmi/ipmi_kcs_sm.c -index e53fc24..e1ddcf9 100644 ---- a/drivers/char/ipmi/ipmi_kcs_sm.c -+++ b/drivers/char/ipmi/ipmi_kcs_sm.c -@@ -251,8 +251,9 @@ static inline int check_obf(struct si_sm_data *kcs, unsigned char status, - if (!GET_STATUS_OBF(status)) { - kcs->obf_timeout -= time; - if (kcs->obf_timeout < 0) { -- start_error_recovery(kcs, "OBF not ready in time"); -- return 1; -+ kcs->obf_timeout = OBF_RETRY_TIMEOUT; -+ start_error_recovery(kcs, "OBF not ready in time"); -+ return 1; - } - return 0; - } -diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c -index 1e638ff..bdecba5 100644 ---- a/drivers/char/ipmi/ipmi_si_intf.c -+++ b/drivers/char/ipmi/ipmi_si_intf.c -@@ -244,6 +244,9 @@ struct smi_info { - /* The timer for this si. */ - struct timer_list si_timer; - -+ /* This flag is set, if the timer is running (timer_pending() isn't enough) */ -+ bool timer_running; -+ - /* The time (in jiffies) the last timeout occurred at. */ - unsigned long last_timeout_jiffies; - -@@ -427,6 +430,13 @@ static void start_clear_flags(struct smi_info *smi_info) - smi_info->si_state = SI_CLEARING_FLAGS; - } - -+static void smi_mod_timer(struct smi_info *smi_info, unsigned long new_val) -+{ -+ smi_info->last_timeout_jiffies = jiffies; -+ mod_timer(&smi_info->si_timer, new_val); -+ smi_info->timer_running = true; -+} -+ - /* - * When we have a situtaion where we run out of memory and cannot - * allocate messages, we just leave them in the BMC and run the system -@@ -439,8 +449,7 @@ static inline void disable_si_irq(struct smi_info *smi_info) - start_disable_irq(smi_info); - smi_info->interrupt_disabled = 1; - if (!atomic_read(&smi_info->stop_operation)) -- mod_timer(&smi_info->si_timer, -- jiffies + SI_TIMEOUT_JIFFIES); -+ smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES); - } - } - -@@ -896,15 +905,7 @@ static void sender(void *send_info, - list_add_tail(&msg->link, &smi_info->xmit_msgs); - - if (smi_info->si_state == SI_NORMAL && smi_info->curr_msg == NULL) { -- /* -- * last_timeout_jiffies is updated here to avoid -- * smi_timeout() handler passing very large time_diff -- * value to smi_event_handler() that causes -- * the send command to abort. -- */ -- smi_info->last_timeout_jiffies = jiffies; -- -- mod_timer(&smi_info->si_timer, jiffies + SI_TIMEOUT_JIFFIES); -+ smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES); - - if (smi_info->thread) - wake_up_process(smi_info->thread); -@@ -993,6 +994,17 @@ static int ipmi_thread(void *data) - - spin_lock_irqsave(&(smi_info->si_lock), flags); - smi_result = smi_event_handler(smi_info, 0); -+ -+ /* -+ * If the driver is doing something, there is a possible -+ * race with the timer. If the timer handler see idle, -+ * and the thread here sees something else, the timer -+ * handler won't restart the timer even though it is -+ * required. So start it here if necessary. -+ */ -+ if (smi_result != SI_SM_IDLE && !smi_info->timer_running) -+ smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES); -+ - spin_unlock_irqrestore(&(smi_info->si_lock), flags); - busy_wait = ipmi_thread_busy_wait(smi_result, smi_info, - &busy_until); -@@ -1062,10 +1074,6 @@ static void smi_timeout(unsigned long data) - * SI_USEC_PER_JIFFY); - smi_result = smi_event_handler(smi_info, time_diff); - -- spin_unlock_irqrestore(&(smi_info->si_lock), flags); -- -- smi_info->last_timeout_jiffies = jiffies_now; -- - if ((smi_info->irq) && (!smi_info->interrupt_disabled)) { - /* Running with interrupts, only do long timeouts. */ - timeout = jiffies + SI_TIMEOUT_JIFFIES; -@@ -1087,7 +1095,10 @@ static void smi_timeout(unsigned long data) - - do_mod_timer: - if (smi_result != SI_SM_IDLE) -- mod_timer(&(smi_info->si_timer), timeout); -+ smi_mod_timer(smi_info, timeout); -+ else -+ smi_info->timer_running = false; -+ spin_unlock_irqrestore(&(smi_info->si_lock), flags); - } - - static irqreturn_t si_irq_handler(int irq, void *data) -@@ -1135,8 +1146,7 @@ static int smi_start_processing(void *send_info, - - /* Set up the timer that drives the interface. */ - setup_timer(&new_smi->si_timer, smi_timeout, (long)new_smi); -- new_smi->last_timeout_jiffies = jiffies; -- mod_timer(&new_smi->si_timer, jiffies + SI_TIMEOUT_JIFFIES); -+ smi_mod_timer(new_smi, jiffies + SI_TIMEOUT_JIFFIES); - - /* - * Check if the user forcefully enabled the daemon. -diff --git a/drivers/char/raw.c b/drivers/char/raw.c -index 54a3a6d..5959669 100644 ---- a/drivers/char/raw.c -+++ b/drivers/char/raw.c -@@ -190,7 +190,7 @@ static int bind_get(int number, dev_t *dev) - struct raw_device_data *rawdev; - struct block_device *bdev; - -- if (number <= 0 || number >= MAX_RAW_MINORS) -+ if (number <= 0 || number >= max_raw_minors) - return -EINVAL; - - rawdev = &raw_devices[number]; -diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c -index 0cd2d50..a81f469 100644 ---- a/drivers/char/virtio_console.c -+++ b/drivers/char/virtio_console.c -@@ -131,7 +131,8 @@ struct ports_device { - spinlock_t ports_lock; - - /* To protect the vq operations for the control channel */ -- spinlock_t cvq_lock; -+ spinlock_t c_ivq_lock; -+ spinlock_t c_ovq_lock; - - /* The current config space is stored here */ - struct virtio_console_config config; -@@ -460,11 +461,14 @@ static ssize_t __send_control_msg(struct ports_device *portdev, u32 port_id, - vq = portdev->c_ovq; - - sg_init_one(sg, &cpkt, sizeof(cpkt)); -+ -+ spin_lock(&portdev->c_ovq_lock); - if (virtqueue_add_buf(vq, sg, 1, 0, &cpkt, GFP_ATOMIC) >= 0) { - virtqueue_kick(vq); - while (!virtqueue_get_buf(vq, &len)) - cpu_relax(); - } -+ spin_unlock(&portdev->c_ovq_lock); - return 0; - } - -@@ -1474,23 +1478,23 @@ static void control_work_handler(struct work_struct *work) - portdev = container_of(work, struct ports_device, control_work); - vq = portdev->c_ivq; - -- spin_lock(&portdev->cvq_lock); -+ spin_lock(&portdev->c_ivq_lock); - while ((buf = virtqueue_get_buf(vq, &len))) { -- spin_unlock(&portdev->cvq_lock); -+ spin_unlock(&portdev->c_ivq_lock); - - buf->len = len; - buf->offset = 0; - - handle_control_message(portdev, buf); - -- spin_lock(&portdev->cvq_lock); -+ spin_lock(&portdev->c_ivq_lock); - if (add_inbuf(portdev->c_ivq, buf) < 0) { - dev_warn(&portdev->vdev->dev, - "Error adding buffer to queue\n"); - free_buf(buf); - } - } -- spin_unlock(&portdev->cvq_lock); -+ spin_unlock(&portdev->c_ivq_lock); - } - - static void out_intr(struct virtqueue *vq) -@@ -1751,10 +1755,12 @@ static int __devinit virtcons_probe(struct virtio_device *vdev) - if (multiport) { - unsigned int nr_added_bufs; - -- spin_lock_init(&portdev->cvq_lock); -+ spin_lock_init(&portdev->c_ivq_lock); -+ spin_lock_init(&portdev->c_ovq_lock); - INIT_WORK(&portdev->control_work, &control_work_handler); - -- nr_added_bufs = fill_queue(portdev->c_ivq, &portdev->cvq_lock); -+ nr_added_bufs = fill_queue(portdev->c_ivq, -+ &portdev->c_ivq_lock); - if (!nr_added_bufs) { - dev_err(&vdev->dev, - "Error allocating buffers for control queue\n"); -@@ -1895,7 +1901,7 @@ static int virtcons_restore(struct virtio_device *vdev) - return ret; - - if (use_multiport(portdev)) -- fill_queue(portdev->c_ivq, &portdev->cvq_lock); -+ fill_queue(portdev->c_ivq, &portdev->c_ivq_lock); - - list_for_each_entry(port, &portdev->ports, list) { - port->in_vq = portdev->in_vqs[port->id]; -diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c -index 77e1e6c..094a710 100644 ---- a/drivers/connector/cn_proc.c -+++ b/drivers/connector/cn_proc.c -@@ -31,11 +31,23 @@ - #include - #include - --#include -- - #include - --#define CN_PROC_MSG_SIZE (sizeof(struct cn_msg) + sizeof(struct proc_event)) -+/* -+ * Size of a cn_msg followed by a proc_event structure. Since the -+ * sizeof struct cn_msg is a multiple of 4 bytes, but not 8 bytes, we -+ * add one 4-byte word to the size here, and then start the actual -+ * cn_msg structure 4 bytes into the stack buffer. The result is that -+ * the immediately following proc_event structure is aligned to 8 bytes. -+ */ -+#define CN_PROC_MSG_SIZE (sizeof(struct cn_msg) + sizeof(struct proc_event) + 4) -+ -+/* See comment above; we test our assumption about sizeof struct cn_msg here. */ -+static inline struct cn_msg *buffer_to_cn_msg(__u8 *buffer) -+{ -+ BUILD_BUG_ON(sizeof(struct cn_msg) != 20); -+ return (struct cn_msg *)(buffer + 4); -+} - - static atomic_t proc_event_num_listeners = ATOMIC_INIT(0); - static struct cb_id cn_proc_event_id = { CN_IDX_PROC, CN_VAL_PROC }; -@@ -55,18 +67,19 @@ void proc_fork_connector(struct task_struct *task) - { - struct cn_msg *msg; - struct proc_event *ev; -- __u8 buffer[CN_PROC_MSG_SIZE]; -+ __u8 buffer[CN_PROC_MSG_SIZE] __aligned(8); - struct timespec ts; - struct task_struct *parent; - - if (atomic_read(&proc_event_num_listeners) < 1) - return; - -- msg = (struct cn_msg*)buffer; -+ msg = buffer_to_cn_msg(buffer); - ev = (struct proc_event*)msg->data; -+ memset(&ev->event_data, 0, sizeof(ev->event_data)); - get_seq(&msg->seq, &ev->cpu); - ktime_get_ts(&ts); /* get high res monotonic timestamp */ -- put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); -+ ev->timestamp_ns = timespec_to_ns(&ts); - ev->what = PROC_EVENT_FORK; - rcu_read_lock(); - parent = rcu_dereference(task->real_parent); -@@ -79,6 +92,7 @@ void proc_fork_connector(struct task_struct *task) - memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); - msg->ack = 0; /* not used */ - msg->len = sizeof(*ev); -+ msg->flags = 0; /* not used */ - /* If cn_netlink_send() failed, the data is not sent */ - cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); - } -@@ -88,16 +102,17 @@ void proc_exec_connector(struct task_struct *task) - struct cn_msg *msg; - struct proc_event *ev; - struct timespec ts; -- __u8 buffer[CN_PROC_MSG_SIZE]; -+ __u8 buffer[CN_PROC_MSG_SIZE] __aligned(8); - - if (atomic_read(&proc_event_num_listeners) < 1) - return; - -- msg = (struct cn_msg*)buffer; -+ msg = buffer_to_cn_msg(buffer); - ev = (struct proc_event*)msg->data; -+ memset(&ev->event_data, 0, sizeof(ev->event_data)); - get_seq(&msg->seq, &ev->cpu); - ktime_get_ts(&ts); /* get high res monotonic timestamp */ -- put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); -+ ev->timestamp_ns = timespec_to_ns(&ts); - ev->what = PROC_EVENT_EXEC; - ev->event_data.exec.process_pid = task->pid; - ev->event_data.exec.process_tgid = task->tgid; -@@ -105,6 +120,7 @@ void proc_exec_connector(struct task_struct *task) - memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); - msg->ack = 0; /* not used */ - msg->len = sizeof(*ev); -+ msg->flags = 0; /* not used */ - cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); - } - -@@ -112,15 +128,16 @@ void proc_id_connector(struct task_struct *task, int which_id) - { - struct cn_msg *msg; - struct proc_event *ev; -- __u8 buffer[CN_PROC_MSG_SIZE]; -+ __u8 buffer[CN_PROC_MSG_SIZE] __aligned(8); - struct timespec ts; - const struct cred *cred; - - if (atomic_read(&proc_event_num_listeners) < 1) - return; - -- msg = (struct cn_msg*)buffer; -+ msg = buffer_to_cn_msg(buffer); - ev = (struct proc_event*)msg->data; -+ memset(&ev->event_data, 0, sizeof(ev->event_data)); - ev->what = which_id; - ev->event_data.id.process_pid = task->pid; - ev->event_data.id.process_tgid = task->tgid; -@@ -139,11 +156,12 @@ void proc_id_connector(struct task_struct *task, int which_id) - rcu_read_unlock(); - get_seq(&msg->seq, &ev->cpu); - ktime_get_ts(&ts); /* get high res monotonic timestamp */ -- put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); -+ ev->timestamp_ns = timespec_to_ns(&ts); - - memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); - msg->ack = 0; /* not used */ - msg->len = sizeof(*ev); -+ msg->flags = 0; /* not used */ - cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); - } - -@@ -152,16 +170,17 @@ void proc_sid_connector(struct task_struct *task) - struct cn_msg *msg; - struct proc_event *ev; - struct timespec ts; -- __u8 buffer[CN_PROC_MSG_SIZE]; -+ __u8 buffer[CN_PROC_MSG_SIZE] __aligned(8); - - if (atomic_read(&proc_event_num_listeners) < 1) - return; - -- msg = (struct cn_msg *)buffer; -+ msg = buffer_to_cn_msg(buffer); - ev = (struct proc_event *)msg->data; -+ memset(&ev->event_data, 0, sizeof(ev->event_data)); - get_seq(&msg->seq, &ev->cpu); - ktime_get_ts(&ts); /* get high res monotonic timestamp */ -- put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); -+ ev->timestamp_ns = timespec_to_ns(&ts); - ev->what = PROC_EVENT_SID; - ev->event_data.sid.process_pid = task->pid; - ev->event_data.sid.process_tgid = task->tgid; -@@ -169,6 +188,7 @@ void proc_sid_connector(struct task_struct *task) - memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); - msg->ack = 0; /* not used */ - msg->len = sizeof(*ev); -+ msg->flags = 0; /* not used */ - cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); - } - -@@ -177,16 +197,17 @@ void proc_ptrace_connector(struct task_struct *task, int ptrace_id) - struct cn_msg *msg; - struct proc_event *ev; - struct timespec ts; -- __u8 buffer[CN_PROC_MSG_SIZE]; -+ __u8 buffer[CN_PROC_MSG_SIZE] __aligned(8); - - if (atomic_read(&proc_event_num_listeners) < 1) - return; - -- msg = (struct cn_msg *)buffer; -+ msg = buffer_to_cn_msg(buffer); - ev = (struct proc_event *)msg->data; -+ memset(&ev->event_data, 0, sizeof(ev->event_data)); - get_seq(&msg->seq, &ev->cpu); - ktime_get_ts(&ts); /* get high res monotonic timestamp */ -- put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); -+ ev->timestamp_ns = timespec_to_ns(&ts); - ev->what = PROC_EVENT_PTRACE; - ev->event_data.ptrace.process_pid = task->pid; - ev->event_data.ptrace.process_tgid = task->tgid; -@@ -202,6 +223,7 @@ void proc_ptrace_connector(struct task_struct *task, int ptrace_id) - memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); - msg->ack = 0; /* not used */ - msg->len = sizeof(*ev); -+ msg->flags = 0; /* not used */ - cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); - } - -@@ -210,16 +232,17 @@ void proc_comm_connector(struct task_struct *task) - struct cn_msg *msg; - struct proc_event *ev; - struct timespec ts; -- __u8 buffer[CN_PROC_MSG_SIZE]; -+ __u8 buffer[CN_PROC_MSG_SIZE] __aligned(8); - - if (atomic_read(&proc_event_num_listeners) < 1) - return; - -- msg = (struct cn_msg *)buffer; -+ msg = buffer_to_cn_msg(buffer); - ev = (struct proc_event *)msg->data; -+ memset(&ev->event_data, 0, sizeof(ev->event_data)); - get_seq(&msg->seq, &ev->cpu); - ktime_get_ts(&ts); /* get high res monotonic timestamp */ -- put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); -+ ev->timestamp_ns = timespec_to_ns(&ts); - ev->what = PROC_EVENT_COMM; - ev->event_data.comm.process_pid = task->pid; - ev->event_data.comm.process_tgid = task->tgid; -@@ -228,6 +251,7 @@ void proc_comm_connector(struct task_struct *task) - memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); - msg->ack = 0; /* not used */ - msg->len = sizeof(*ev); -+ msg->flags = 0; /* not used */ - cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); - } - -@@ -235,17 +259,18 @@ void proc_exit_connector(struct task_struct *task) - { - struct cn_msg *msg; - struct proc_event *ev; -- __u8 buffer[CN_PROC_MSG_SIZE]; -+ __u8 buffer[CN_PROC_MSG_SIZE] __aligned(8); - struct timespec ts; - - if (atomic_read(&proc_event_num_listeners) < 1) - return; - -- msg = (struct cn_msg*)buffer; -+ msg = buffer_to_cn_msg(buffer); - ev = (struct proc_event*)msg->data; -+ memset(&ev->event_data, 0, sizeof(ev->event_data)); - get_seq(&msg->seq, &ev->cpu); - ktime_get_ts(&ts); /* get high res monotonic timestamp */ -- put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); -+ ev->timestamp_ns = timespec_to_ns(&ts); - ev->what = PROC_EVENT_EXIT; - ev->event_data.exit.process_pid = task->pid; - ev->event_data.exit.process_tgid = task->tgid; -@@ -255,6 +280,7 @@ void proc_exit_connector(struct task_struct *task) - memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); - msg->ack = 0; /* not used */ - msg->len = sizeof(*ev); -+ msg->flags = 0; /* not used */ - cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); - } - -@@ -270,23 +296,25 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack) - { - struct cn_msg *msg; - struct proc_event *ev; -- __u8 buffer[CN_PROC_MSG_SIZE]; -+ __u8 buffer[CN_PROC_MSG_SIZE] __aligned(8); - struct timespec ts; - - if (atomic_read(&proc_event_num_listeners) < 1) - return; - -- msg = (struct cn_msg*)buffer; -+ msg = buffer_to_cn_msg(buffer); - ev = (struct proc_event*)msg->data; -+ memset(&ev->event_data, 0, sizeof(ev->event_data)); - msg->seq = rcvd_seq; - ktime_get_ts(&ts); /* get high res monotonic timestamp */ -- put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); -+ ev->timestamp_ns = timespec_to_ns(&ts); - ev->cpu = -1; - ev->what = PROC_EVENT_NONE; - ev->event_data.ack.err = err; - memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); - msg->ack = rcvd_ack + 1; - msg->len = sizeof(*ev); -+ msg->flags = 0; /* not used */ - cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); - } - -@@ -303,6 +331,12 @@ static void cn_proc_mcast_ctl(struct cn_msg *msg, - if (msg->len != sizeof(*mc_op)) - return; - -+ /* Can only change if privileged. */ -+ if (!capable(CAP_NET_ADMIN)) { -+ err = EPERM; -+ goto out; -+ } -+ - mc_op = (enum proc_cn_mcast_op*)msg->data; - switch (*mc_op) { - case PROC_CN_MCAST_LISTEN: -@@ -315,6 +349,8 @@ static void cn_proc_mcast_ctl(struct cn_msg *msg, - err = EINVAL; - break; - } -+ -+out: - cn_proc_ack(err, msg->seq, msg->ack); - } - -diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c -index dde6a0f..ea6efe8 100644 ---- a/drivers/connector/connector.c -+++ b/drivers/connector/connector.c -@@ -157,17 +157,18 @@ static int cn_call_callback(struct sk_buff *skb) - static void cn_rx_skb(struct sk_buff *__skb) - { - struct nlmsghdr *nlh; -- int err; - struct sk_buff *skb; -+ int len, err; - - skb = skb_get(__skb); - - if (skb->len >= NLMSG_SPACE(0)) { - nlh = nlmsg_hdr(skb); -+ len = nlmsg_len(nlh); - -- if (nlh->nlmsg_len < sizeof(struct cn_msg) || -+ if (len < (int)sizeof(struct cn_msg) || - skb->len < nlh->nlmsg_len || -- nlh->nlmsg_len > CONNECTOR_MAX_MSG_SIZE) { -+ len > CONNECTOR_MAX_MSG_SIZE) { - kfree_skb(skb); - return; - } -diff --git a/drivers/cpufreq/powernow-k6.c b/drivers/cpufreq/powernow-k6.c -index ea0222a..b07ca0d 100644 ---- a/drivers/cpufreq/powernow-k6.c -+++ b/drivers/cpufreq/powernow-k6.c -@@ -26,41 +26,108 @@ - static unsigned int busfreq; /* FSB, in 10 kHz */ - static unsigned int max_multiplier; - -+static unsigned int param_busfreq = 0; -+static unsigned int param_max_multiplier = 0; -+ -+module_param_named(max_multiplier, param_max_multiplier, uint, S_IRUGO); -+MODULE_PARM_DESC(max_multiplier, "Maximum multiplier (allowed values: 20 30 35 40 45 50 55 60)"); -+ -+module_param_named(bus_frequency, param_busfreq, uint, S_IRUGO); -+MODULE_PARM_DESC(bus_frequency, "Bus frequency in kHz"); - - /* Clock ratio multiplied by 10 - see table 27 in AMD#23446 */ - static struct cpufreq_frequency_table clock_ratio[] = { -- {45, /* 000 -> 4.5x */ 0}, -+ {60, /* 110 -> 6.0x */ 0}, -+ {55, /* 011 -> 5.5x */ 0}, - {50, /* 001 -> 5.0x */ 0}, -+ {45, /* 000 -> 4.5x */ 0}, - {40, /* 010 -> 4.0x */ 0}, -- {55, /* 011 -> 5.5x */ 0}, -- {20, /* 100 -> 2.0x */ 0}, -- {30, /* 101 -> 3.0x */ 0}, -- {60, /* 110 -> 6.0x */ 0}, - {35, /* 111 -> 3.5x */ 0}, -+ {30, /* 101 -> 3.0x */ 0}, -+ {20, /* 100 -> 2.0x */ 0}, - {0, CPUFREQ_TABLE_END} - }; - -+static const u8 index_to_register[8] = { 6, 3, 1, 0, 2, 7, 5, 4 }; -+static const u8 register_to_index[8] = { 3, 2, 4, 1, 7, 6, 0, 5 }; -+ -+static const struct { -+ unsigned freq; -+ unsigned mult; -+} usual_frequency_table[] = { -+ { 400000, 40 }, // 100 * 4 -+ { 450000, 45 }, // 100 * 4.5 -+ { 475000, 50 }, // 95 * 5 -+ { 500000, 50 }, // 100 * 5 -+ { 506250, 45 }, // 112.5 * 4.5 -+ { 533500, 55 }, // 97 * 5.5 -+ { 550000, 55 }, // 100 * 5.5 -+ { 562500, 50 }, // 112.5 * 5 -+ { 570000, 60 }, // 95 * 6 -+ { 600000, 60 }, // 100 * 6 -+ { 618750, 55 }, // 112.5 * 5.5 -+ { 660000, 55 }, // 120 * 5.5 -+ { 675000, 60 }, // 112.5 * 6 -+ { 720000, 60 }, // 120 * 6 -+}; -+ -+#define FREQ_RANGE 3000 - - /** - * powernow_k6_get_cpu_multiplier - returns the current FSB multiplier - * -- * Returns the current setting of the frequency multiplier. Core clock -+ * Returns the current setting of the frequency multiplier. Core clock - * speed is frequency of the Front-Side Bus multiplied with this value. - */ - static int powernow_k6_get_cpu_multiplier(void) - { -- u64 invalue = 0; -+ unsigned long invalue = 0; - u32 msrval; - -+ local_irq_disable(); -+ - msrval = POWERNOW_IOPORT + 0x1; - wrmsr(MSR_K6_EPMR, msrval, 0); /* enable the PowerNow port */ - invalue = inl(POWERNOW_IOPORT + 0x8); - msrval = POWERNOW_IOPORT + 0x0; - wrmsr(MSR_K6_EPMR, msrval, 0); /* disable it again */ - -- return clock_ratio[(invalue >> 5)&7].index; -+ local_irq_enable(); -+ -+ return clock_ratio[register_to_index[(invalue >> 5)&7]].index; - } - -+static void powernow_k6_set_cpu_multiplier(unsigned int best_i) -+{ -+ unsigned long outvalue, invalue; -+ unsigned long msrval; -+ unsigned long cr0; -+ -+ /* we now need to transform best_i to the BVC format, see AMD#23446 */ -+ -+ /* -+ * The processor doesn't respond to inquiry cycles while changing the -+ * frequency, so we must disable cache. -+ */ -+ local_irq_disable(); -+ cr0 = read_cr0(); -+ write_cr0(cr0 | X86_CR0_CD); -+ wbinvd(); -+ -+ outvalue = (1<<12) | (1<<10) | (1<<9) | (index_to_register[best_i]<<5); -+ -+ msrval = POWERNOW_IOPORT + 0x1; -+ wrmsr(MSR_K6_EPMR, msrval, 0); /* enable the PowerNow port */ -+ invalue = inl(POWERNOW_IOPORT + 0x8); -+ invalue = invalue & 0x1f; -+ outvalue = outvalue | invalue; -+ outl(outvalue, (POWERNOW_IOPORT + 0x8)); -+ msrval = POWERNOW_IOPORT + 0x0; -+ wrmsr(MSR_K6_EPMR, msrval, 0); /* disable it again */ -+ -+ write_cr0(cr0); -+ local_irq_enable(); -+} - - /** - * powernow_k6_set_state - set the PowerNow! multiplier -@@ -71,8 +138,6 @@ static int powernow_k6_get_cpu_multiplier(void) - static void powernow_k6_set_state(struct cpufreq_policy *policy, - unsigned int best_i) - { -- unsigned long outvalue = 0, invalue = 0; -- unsigned long msrval; - struct cpufreq_freqs freqs; - - if (clock_ratio[best_i].index > max_multiplier) { -@@ -85,18 +150,7 @@ static void powernow_k6_set_state(struct cpufreq_policy *policy, - - cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE); - -- /* we now need to transform best_i to the BVC format, see AMD#23446 */ -- -- outvalue = (1<<12) | (1<<10) | (1<<9) | (best_i<<5); -- -- msrval = POWERNOW_IOPORT + 0x1; -- wrmsr(MSR_K6_EPMR, msrval, 0); /* enable the PowerNow port */ -- invalue = inl(POWERNOW_IOPORT + 0x8); -- invalue = invalue & 0xf; -- outvalue = outvalue | invalue; -- outl(outvalue , (POWERNOW_IOPORT + 0x8)); -- msrval = POWERNOW_IOPORT + 0x0; -- wrmsr(MSR_K6_EPMR, msrval, 0); /* disable it again */ -+ powernow_k6_set_cpu_multiplier(best_i); - - cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE); - -@@ -141,18 +195,57 @@ static int powernow_k6_target(struct cpufreq_policy *policy, - return 0; - } - -- - static int powernow_k6_cpu_init(struct cpufreq_policy *policy) - { - unsigned int i, f; - int result; -+ unsigned khz; - - if (policy->cpu != 0) - return -ENODEV; - -- /* get frequencies */ -- max_multiplier = powernow_k6_get_cpu_multiplier(); -- busfreq = cpu_khz / max_multiplier; -+ max_multiplier = 0; -+ khz = cpu_khz; -+ for (i = 0; i < ARRAY_SIZE(usual_frequency_table); i++) { -+ if (khz >= usual_frequency_table[i].freq - FREQ_RANGE && -+ khz <= usual_frequency_table[i].freq + FREQ_RANGE) { -+ khz = usual_frequency_table[i].freq; -+ max_multiplier = usual_frequency_table[i].mult; -+ break; -+ } -+ } -+ if (param_max_multiplier) { -+ for (i = 0; (clock_ratio[i].frequency != CPUFREQ_TABLE_END); i++) { -+ if (clock_ratio[i].index == param_max_multiplier) { -+ max_multiplier = param_max_multiplier; -+ goto have_max_multiplier; -+ } -+ } -+ printk(KERN_ERR "powernow-k6: invalid max_multiplier parameter, valid parameters 20, 30, 35, 40, 45, 50, 55, 60\n"); -+ return -EINVAL; -+ } -+ -+ if (!max_multiplier) { -+ printk(KERN_WARNING "powernow-k6: unknown frequency %u, cannot determine current multiplier\n", khz); -+ printk(KERN_WARNING "powernow-k6: use module parameters max_multiplier and bus_frequency\n"); -+ return -EOPNOTSUPP; -+ } -+ -+have_max_multiplier: -+ param_max_multiplier = max_multiplier; -+ -+ if (param_busfreq) { -+ if (param_busfreq >= 50000 && param_busfreq <= 150000) { -+ busfreq = param_busfreq / 10; -+ goto have_busfreq; -+ } -+ printk(KERN_ERR "powernow-k6: invalid bus_frequency parameter, allowed range 50000 - 150000 kHz\n"); -+ return -EINVAL; -+ } -+ -+ busfreq = khz / max_multiplier; -+have_busfreq: -+ param_busfreq = busfreq * 10; - - /* table init */ - for (i = 0; (clock_ratio[i].frequency != CPUFREQ_TABLE_END); i++) { -@@ -164,7 +257,7 @@ static int powernow_k6_cpu_init(struct cpufreq_policy *policy) - } - - /* cpuinfo and default policy values */ -- policy->cpuinfo.transition_latency = 200000; -+ policy->cpuinfo.transition_latency = 500000; - policy->cur = busfreq * max_multiplier; - - result = cpufreq_frequency_table_cpuinfo(policy, clock_ratio); -diff --git a/drivers/crypto/caam/error.c b/drivers/crypto/caam/error.c -index 7e2d54b..9b8d231 100644 ---- a/drivers/crypto/caam/error.c -+++ b/drivers/crypto/caam/error.c -@@ -16,9 +16,13 @@ - char *tmp; \ - \ - tmp = kmalloc(sizeof(format) + max_alloc, GFP_ATOMIC); \ -- sprintf(tmp, format, param); \ -- strcat(str, tmp); \ -- kfree(tmp); \ -+ if (likely(tmp)) { \ -+ sprintf(tmp, format, param); \ -+ strcat(str, tmp); \ -+ kfree(tmp); \ -+ } else { \ -+ strcat(str, "kmalloc failure in SPRINTFCAT"); \ -+ } \ - } - - static void report_jump_idx(u32 status, char *outstr) -diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig -index ef378b5..7de7a65 100644 ---- a/drivers/dma/Kconfig -+++ b/drivers/dma/Kconfig -@@ -269,6 +269,7 @@ config NET_DMA - bool "Network: TCP receive copy offload" - depends on DMA_ENGINE && NET - default (INTEL_IOATDMA || FSL_DMA) -+ depends on BROKEN - help - This enables the use of DMA engines in the network stack to - offload receive copy-to-user operations, freeing CPU cycles. -diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c -index 2ed1ac3..28a9614 100644 ---- a/drivers/dma/ste_dma40.c -+++ b/drivers/dma/ste_dma40.c -@@ -1409,6 +1409,7 @@ static void dma_tasklet(unsigned long data) - struct d40_chan *d40c = (struct d40_chan *) data; - struct d40_desc *d40d; - unsigned long flags; -+ bool callback_active; - dma_async_tx_callback callback; - void *callback_param; - -@@ -1432,6 +1433,7 @@ static void dma_tasklet(unsigned long data) - } - - /* Callback to client */ -+ callback_active = !!(d40d->txd.flags & DMA_PREP_INTERRUPT); - callback = d40d->txd.callback; - callback_param = d40d->txd.callback_param; - -@@ -1456,7 +1458,7 @@ static void dma_tasklet(unsigned long data) - - spin_unlock_irqrestore(&d40c->lock, flags); - -- if (callback && (d40d->txd.flags & DMA_PREP_INTERRUPT)) -+ if (callback_active && callback) - callback(callback_param); - - return; -diff --git a/drivers/edac/e752x_edac.c b/drivers/edac/e752x_edac.c -index 4122326..b73beba 100644 ---- a/drivers/edac/e752x_edac.c -+++ b/drivers/edac/e752x_edac.c -@@ -1145,9 +1145,11 @@ static int e752x_get_devs(struct pci_dev *pdev, int dev_idx, - pvt->bridge_ck = pci_get_device(PCI_VENDOR_ID_INTEL, - pvt->dev_info->err_dev, pvt->bridge_ck); - -- if (pvt->bridge_ck == NULL) -+ if (pvt->bridge_ck == NULL) { - pvt->bridge_ck = pci_scan_single_device(pdev->bus, - PCI_DEVFN(0, 1)); -+ pci_dev_get(pvt->bridge_ck); -+ } - - if (pvt->bridge_ck == NULL) { - e752x_printk(KERN_ERR, "error reporting device not found:" -diff --git a/drivers/edac/i7300_edac.c b/drivers/edac/i7300_edac.c -index f4059e9..8ba22eb 100644 ---- a/drivers/edac/i7300_edac.c -+++ b/drivers/edac/i7300_edac.c -@@ -962,33 +962,35 @@ static int __devinit i7300_get_devices(struct mem_ctl_info *mci) - - /* Attempt to 'get' the MCH register we want */ - pdev = NULL; -- while (!pvt->pci_dev_16_1_fsb_addr_map || -- !pvt->pci_dev_16_2_fsb_err_regs) { -- pdev = pci_get_device(PCI_VENDOR_ID_INTEL, -- PCI_DEVICE_ID_INTEL_I7300_MCH_ERR, pdev); -- if (!pdev) { -- /* End of list, leave */ -- i7300_printk(KERN_ERR, -- "'system address,Process Bus' " -- "device not found:" -- "vendor 0x%x device 0x%x ERR funcs " -- "(broken BIOS?)\n", -- PCI_VENDOR_ID_INTEL, -- PCI_DEVICE_ID_INTEL_I7300_MCH_ERR); -- goto error; -- } -- -+ while ((pdev = pci_get_device(PCI_VENDOR_ID_INTEL, -+ PCI_DEVICE_ID_INTEL_I7300_MCH_ERR, -+ pdev))) { - /* Store device 16 funcs 1 and 2 */ - switch (PCI_FUNC(pdev->devfn)) { - case 1: -- pvt->pci_dev_16_1_fsb_addr_map = pdev; -+ if (!pvt->pci_dev_16_1_fsb_addr_map) -+ pvt->pci_dev_16_1_fsb_addr_map = -+ pci_dev_get(pdev); - break; - case 2: -- pvt->pci_dev_16_2_fsb_err_regs = pdev; -+ if (!pvt->pci_dev_16_2_fsb_err_regs) -+ pvt->pci_dev_16_2_fsb_err_regs = -+ pci_dev_get(pdev); - break; - } - } - -+ if (!pvt->pci_dev_16_1_fsb_addr_map || -+ !pvt->pci_dev_16_2_fsb_err_regs) { -+ /* At least one device was not found */ -+ i7300_printk(KERN_ERR, -+ "'system address,Process Bus' device not found:" -+ "vendor 0x%x device 0x%x ERR funcs (broken BIOS?)\n", -+ PCI_VENDOR_ID_INTEL, -+ PCI_DEVICE_ID_INTEL_I7300_MCH_ERR); -+ goto error; -+ } -+ - debugf1("System Address, processor bus- PCI Bus ID: %s %x:%x\n", - pci_name(pvt->pci_dev_16_0_fsb_ctlr), - pvt->pci_dev_16_0_fsb_ctlr->vendor, -diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c -index 0fe2277..ddb725d 100644 ---- a/drivers/edac/i7core_edac.c -+++ b/drivers/edac/i7core_edac.c -@@ -1365,14 +1365,19 @@ static int i7core_get_onedevice(struct pci_dev **prev, - * is at addr 8086:2c40, instead of 8086:2c41. So, we need - * to probe for the alternate address in case of failure - */ -- if (dev_descr->dev_id == PCI_DEVICE_ID_INTEL_I7_NONCORE && !pdev) -+ if (dev_descr->dev_id == PCI_DEVICE_ID_INTEL_I7_NONCORE && !pdev) { -+ pci_dev_get(*prev); /* pci_get_device will put it */ - pdev = pci_get_device(PCI_VENDOR_ID_INTEL, - PCI_DEVICE_ID_INTEL_I7_NONCORE_ALT, *prev); -+ } - -- if (dev_descr->dev_id == PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE && !pdev) -+ if (dev_descr->dev_id == PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE && -+ !pdev) { -+ pci_dev_get(*prev); /* pci_get_device will put it */ - pdev = pci_get_device(PCI_VENDOR_ID_INTEL, - PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE_ALT, - *prev); -+ } - - if (!pdev) { - if (*prev) { -diff --git a/drivers/edac/i82975x_edac.c b/drivers/edac/i82975x_edac.c -index 0cd8368..182d82a 100644 ---- a/drivers/edac/i82975x_edac.c -+++ b/drivers/edac/i82975x_edac.c -@@ -363,10 +363,6 @@ static enum dev_type i82975x_dram_type(void __iomem *mch_window, int rank) - static void i82975x_init_csrows(struct mem_ctl_info *mci, - struct pci_dev *pdev, void __iomem *mch_window) - { -- static const char *labels[4] = { -- "DIMM A1", "DIMM A2", -- "DIMM B1", "DIMM B2" -- }; - struct csrow_info *csrow; - unsigned long last_cumul_size; - u8 value; -@@ -407,9 +403,10 @@ static void i82975x_init_csrows(struct mem_ctl_info *mci, - * [0-3] for dual-channel; i.e. csrow->nr_channels = 2 - */ - for (chan = 0; chan < csrow->nr_channels; chan++) -- strncpy(csrow->channels[chan].label, -- labels[(index >> 1) + (chan * 2)], -- EDAC_MC_LABEL_LEN); -+ -+ snprintf(csrow->channels[chan].label, EDAC_MC_LABEL_LEN, "DIMM %c%d", -+ (chan == 0) ? 'A' : 'B', -+ index); - - if (cumul_size == last_cumul_size) - continue; /* not populated */ -diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c -index 0f9552d..0924c30 100644 ---- a/drivers/edac/sb_edac.c -+++ b/drivers/edac/sb_edac.c -@@ -555,7 +555,8 @@ static int get_dimm_config(const struct mem_ctl_info *mci) - { - struct sbridge_pvt *pvt = mci->pvt_info; - struct csrow_info *csr; -- int i, j, banks, ranks, rows, cols, size, npages; -+ unsigned i, j, banks, ranks, rows, cols, npages; -+ u64 size; - int csrow = 0; - unsigned long last_page = 0; - u32 reg; -@@ -627,10 +628,10 @@ static int get_dimm_config(const struct mem_ctl_info *mci) - cols = numcol(mtr); - - /* DDR3 has 8 I/O banks */ -- size = (rows * cols * banks * ranks) >> (20 - 3); -+ size = ((u64)rows * cols * banks * ranks) >> (20 - 3); - npages = MiB_TO_PAGES(size); - -- debugf0("mc#%d: channel %d, dimm %d, %d Mb (%d pages) bank: %d, rank: %d, row: %#x, col: %#x\n", -+ debugf0("mc#%d: channel %d, dimm %d, %Ld Mb (%d pages) bank: %d, rank: %d, row: %#x, col: %#x\n", - pvt->sbridge_dev->mc, i, j, - size, npages, - banks, ranks, rows, cols); -diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c -index 04ebeaf..1026609 100644 ---- a/drivers/firewire/core-device.c -+++ b/drivers/firewire/core-device.c -@@ -878,7 +878,7 @@ static int lookup_existing_device(struct device *dev, void *data) - old->config_rom_retries = 0; - fw_notice(card, "rediscovered device %s\n", dev_name(dev)); - -- PREPARE_DELAYED_WORK(&old->work, fw_device_update); -+ old->workfn = fw_device_update; - fw_schedule_device_work(old, 0); - - if (current_node == card->root_node) -@@ -1040,7 +1040,7 @@ static void fw_device_init(struct work_struct *work) - if (atomic_cmpxchg(&device->state, - FW_DEVICE_INITIALIZING, - FW_DEVICE_RUNNING) == FW_DEVICE_GONE) { -- PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown); -+ device->workfn = fw_device_shutdown; - fw_schedule_device_work(device, SHUTDOWN_DELAY); - } else { - fw_notice(card, "created device %s: GUID %08x%08x, S%d00\n", -@@ -1172,13 +1172,20 @@ static void fw_device_refresh(struct work_struct *work) - dev_name(&device->device)); - gone: - atomic_set(&device->state, FW_DEVICE_GONE); -- PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown); -+ device->workfn = fw_device_shutdown; - fw_schedule_device_work(device, SHUTDOWN_DELAY); - out: - if (node_id == card->root_node->node_id) - fw_schedule_bm_work(card, 0); - } - -+static void fw_device_workfn(struct work_struct *work) -+{ -+ struct fw_device *device = container_of(to_delayed_work(work), -+ struct fw_device, work); -+ device->workfn(work); -+} -+ - void fw_node_event(struct fw_card *card, struct fw_node *node, int event) - { - struct fw_device *device; -@@ -1228,7 +1235,8 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) - * power-up after getting plugged in. We schedule the - * first config rom scan half a second after bus reset. - */ -- INIT_DELAYED_WORK(&device->work, fw_device_init); -+ device->workfn = fw_device_init; -+ INIT_DELAYED_WORK(&device->work, fw_device_workfn); - fw_schedule_device_work(device, INITIAL_DELAY); - break; - -@@ -1244,7 +1252,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) - if (atomic_cmpxchg(&device->state, - FW_DEVICE_RUNNING, - FW_DEVICE_INITIALIZING) == FW_DEVICE_RUNNING) { -- PREPARE_DELAYED_WORK(&device->work, fw_device_refresh); -+ device->workfn = fw_device_refresh; - fw_schedule_device_work(device, - device->is_local ? 0 : INITIAL_DELAY); - } -@@ -1259,7 +1267,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) - smp_wmb(); /* update node_id before generation */ - device->generation = card->generation; - if (atomic_read(&device->state) == FW_DEVICE_RUNNING) { -- PREPARE_DELAYED_WORK(&device->work, fw_device_update); -+ device->workfn = fw_device_update; - fw_schedule_device_work(device, 0); - } - break; -@@ -1284,7 +1292,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) - device = node->data; - if (atomic_xchg(&device->state, - FW_DEVICE_GONE) == FW_DEVICE_RUNNING) { -- PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown); -+ device->workfn = fw_device_shutdown; - fw_schedule_device_work(device, - list_empty(&card->link) ? 0 : SHUTDOWN_DELAY); - } -diff --git a/drivers/firewire/net.c b/drivers/firewire/net.c -index 638e1f7..7cff7f7 100644 ---- a/drivers/firewire/net.c -+++ b/drivers/firewire/net.c -@@ -1014,8 +1014,6 @@ static void fwnet_write_complete(struct fw_card *card, int rcode, - if (rcode == RCODE_COMPLETE) { - fwnet_transmit_packet_done(ptask); - } else { -- fwnet_transmit_packet_failed(ptask); -- - if (printk_timed_ratelimit(&j, 1000) || rcode != last_rcode) { - dev_err(&ptask->dev->netdev->dev, - "fwnet_write_complete failed: %x (skipped %d)\n", -@@ -1023,8 +1021,10 @@ static void fwnet_write_complete(struct fw_card *card, int rcode, - - errors_skipped = 0; - last_rcode = rcode; -- } else -+ } else { - errors_skipped++; -+ } -+ fwnet_transmit_packet_failed(ptask); - } - } - -diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c -index b7e65d7..23a9283 100644 ---- a/drivers/firewire/sbp2.c -+++ b/drivers/firewire/sbp2.c -@@ -146,6 +146,7 @@ struct sbp2_logical_unit { - */ - int generation; - int retries; -+ work_func_t workfn; - struct delayed_work work; - bool has_sdev; - bool blocked; -@@ -865,7 +866,7 @@ static void sbp2_login(struct work_struct *work) - /* set appropriate retry limit(s) in BUSY_TIMEOUT register */ - sbp2_set_busy_timeout(lu); - -- PREPARE_DELAYED_WORK(&lu->work, sbp2_reconnect); -+ lu->workfn = sbp2_reconnect; - sbp2_agent_reset(lu); - - /* This was a re-login. */ -@@ -919,7 +920,7 @@ static void sbp2_login(struct work_struct *work) - * If a bus reset happened, sbp2_update will have requeued - * lu->work already. Reset the work from reconnect to login. - */ -- PREPARE_DELAYED_WORK(&lu->work, sbp2_login); -+ lu->workfn = sbp2_login; - } - - static void sbp2_reconnect(struct work_struct *work) -@@ -953,7 +954,7 @@ static void sbp2_reconnect(struct work_struct *work) - lu->retries++ >= 5) { - dev_err(tgt_dev(tgt), "failed to reconnect\n"); - lu->retries = 0; -- PREPARE_DELAYED_WORK(&lu->work, sbp2_login); -+ lu->workfn = sbp2_login; - } - sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); - -@@ -973,6 +974,13 @@ static void sbp2_reconnect(struct work_struct *work) - sbp2_conditionally_unblock(lu); - } - -+static void sbp2_lu_workfn(struct work_struct *work) -+{ -+ struct sbp2_logical_unit *lu = container_of(to_delayed_work(work), -+ struct sbp2_logical_unit, work); -+ lu->workfn(work); -+} -+ - static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry) - { - struct sbp2_logical_unit *lu; -@@ -999,7 +1007,8 @@ static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry) - lu->blocked = false; - ++tgt->dont_block; - INIT_LIST_HEAD(&lu->orb_list); -- INIT_DELAYED_WORK(&lu->work, sbp2_login); -+ lu->workfn = sbp2_login; -+ INIT_DELAYED_WORK(&lu->work, sbp2_lu_workfn); - - list_add_tail(&lu->link, &tgt->lu_list); - return 0; -diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig -index 9b00072..42c759a 100644 ---- a/drivers/firmware/Kconfig -+++ b/drivers/firmware/Kconfig -@@ -53,6 +53,24 @@ config EFI_VARS - Subsequent efibootmgr releases may be found at: - - -+config EFI_VARS_PSTORE -+ bool "Register efivars backend for pstore" -+ depends on EFI_VARS && PSTORE -+ default y -+ help -+ Say Y here to enable use efivars as a backend to pstore. This -+ will allow writing console messages, crash dumps, or anything -+ else supported by pstore to EFI variables. -+ -+config EFI_VARS_PSTORE_DEFAULT_DISABLE -+ bool "Disable using efivars as a pstore backend by default" -+ depends on EFI_VARS_PSTORE -+ default n -+ help -+ Saying Y here will disable the use of efivars as a storage -+ backend for pstore by default. This setting can be overridden -+ using the efivars module's pstore_disable parameter. -+ - config EFI_PCDP - bool "Console device selection via EFI PCDP or HCDP table" - depends on ACPI && EFI && IA64 -diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c -index 2cbb675..80c6667 100644 ---- a/drivers/firmware/efivars.c -+++ b/drivers/firmware/efivars.c -@@ -92,6 +92,11 @@ MODULE_VERSION(EFIVARS_VERSION); - - #define DUMP_NAME_LEN 52 - -+static bool efivars_pstore_disable = -+ IS_ENABLED(CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE); -+ -+module_param_named(pstore_disable, efivars_pstore_disable, bool, 0644); -+ - /* - * The maximum size of VariableName + Data = 1024 - * Therefore, it's reasonable to save that much -@@ -149,6 +154,13 @@ efivar_create_sysfs_entry(struct efivars *efivars, - efi_char16_t *variable_name, - efi_guid_t *vendor_guid); - -+/* -+ * Prototype for workqueue functions updating sysfs entry -+ */ -+ -+static void efivar_update_sysfs_entries(struct work_struct *); -+static DECLARE_WORK(efivar_work, efivar_update_sysfs_entries); -+ - /* Return the number of unicode characters in data */ - static unsigned long - utf16_strnlen(efi_char16_t *s, size_t maxlength) -@@ -396,10 +408,11 @@ static efi_status_t - get_var_data(struct efivars *efivars, struct efi_variable *var) - { - efi_status_t status; -+ unsigned long flags; - -- spin_lock(&efivars->lock); -+ spin_lock_irqsave(&efivars->lock, flags); - status = get_var_data_locked(efivars, var); -- spin_unlock(&efivars->lock); -+ spin_unlock_irqrestore(&efivars->lock, flags); - - if (status != EFI_SUCCESS) { - printk(KERN_WARNING "efivars: get_variable() failed 0x%lx!\n", -@@ -408,6 +421,18 @@ get_var_data(struct efivars *efivars, struct efi_variable *var) - return status; - } - -+static efi_status_t -+check_var_size_locked(struct efivars *efivars, u32 attributes, -+ unsigned long size) -+{ -+ const struct efivar_operations *fops = efivars->ops; -+ -+ if (!efivars->ops->query_variable_store) -+ return EFI_UNSUPPORTED; -+ -+ return fops->query_variable_store(attributes, size); -+} -+ - static ssize_t - efivar_guid_read(struct efivar_entry *entry, char *buf) - { -@@ -528,14 +553,19 @@ efivar_store_raw(struct efivar_entry *entry, const char *buf, size_t count) - return -EINVAL; - } - -- spin_lock(&efivars->lock); -- status = efivars->ops->set_variable(new_var->VariableName, -- &new_var->VendorGuid, -- new_var->Attributes, -- new_var->DataSize, -- new_var->Data); -+ spin_lock_irq(&efivars->lock); -+ -+ status = check_var_size_locked(efivars, new_var->Attributes, -+ new_var->DataSize + utf16_strsize(new_var->VariableName, 1024)); - -- spin_unlock(&efivars->lock); -+ if (status == EFI_SUCCESS || status == EFI_UNSUPPORTED) -+ status = efivars->ops->set_variable(new_var->VariableName, -+ &new_var->VendorGuid, -+ new_var->Attributes, -+ new_var->DataSize, -+ new_var->Data); -+ -+ spin_unlock_irq(&efivars->lock); - - if (status != EFI_SUCCESS) { - printk(KERN_WARNING "efivars: set_variable() failed: status=%lx\n", -@@ -632,21 +662,49 @@ static struct kobj_type efivar_ktype = { - .default_attrs = def_attrs, - }; - --static struct pstore_info efi_pstore_info; -- - static inline void - efivar_unregister(struct efivar_entry *var) - { - kobject_put(&var->kobj); - } - --#ifdef CONFIG_PSTORE -+static int efi_status_to_err(efi_status_t status) -+{ -+ int err; -+ -+ switch (status) { -+ case EFI_INVALID_PARAMETER: -+ err = -EINVAL; -+ break; -+ case EFI_OUT_OF_RESOURCES: -+ err = -ENOSPC; -+ break; -+ case EFI_DEVICE_ERROR: -+ err = -EIO; -+ break; -+ case EFI_WRITE_PROTECTED: -+ err = -EROFS; -+ break; -+ case EFI_SECURITY_VIOLATION: -+ err = -EACCES; -+ break; -+ case EFI_NOT_FOUND: -+ err = -ENOENT; -+ break; -+ default: -+ err = -EINVAL; -+ } -+ -+ return err; -+} -+ -+#ifdef CONFIG_EFI_VARS_PSTORE - - static int efi_pstore_open(struct pstore_info *psi) - { - struct efivars *efivars = psi->data; - -- spin_lock(&efivars->lock); -+ spin_lock_irq(&efivars->lock); - efivars->walk_entry = list_first_entry(&efivars->list, - struct efivar_entry, list); - return 0; -@@ -656,7 +714,7 @@ static int efi_pstore_close(struct pstore_info *psi) - { - struct efivars *efivars = psi->data; - -- spin_unlock(&efivars->lock); -+ spin_unlock_irq(&efivars->lock); - return 0; - } - -@@ -710,11 +768,30 @@ static int efi_pstore_write(enum pstore_type_id type, - struct efivars *efivars = psi->data; - struct efivar_entry *entry, *found = NULL; - int i, ret = 0; -+ efi_status_t status = EFI_NOT_FOUND; -+ unsigned long flags; - - sprintf(stub_name, "dump-type%u-%u-", type, part); - sprintf(name, "%s%lu", stub_name, get_seconds()); - -- spin_lock(&efivars->lock); -+ spin_lock_irqsave(&efivars->lock, flags); -+ -+ if (size) { -+ /* -+ * Check if there is a space enough to log. -+ * size: a size of logging data -+ * DUMP_NAME_LEN * 2: a maximum size of variable name -+ */ -+ -+ status = check_var_size_locked(efivars, PSTORE_EFI_ATTRIBUTES, -+ size + DUMP_NAME_LEN * 2); -+ -+ if (status) { -+ spin_unlock_irqrestore(&efivars->lock, flags); -+ *id = part; -+ return -ENOSPC; -+ } -+ } - - for (i = 0; i < DUMP_NAME_LEN; i++) - efi_name[i] = stub_name[i]; -@@ -752,16 +829,13 @@ static int efi_pstore_write(enum pstore_type_id type, - efivars->ops->set_variable(efi_name, &vendor, PSTORE_EFI_ATTRIBUTES, - size, psi->buf); - -- spin_unlock(&efivars->lock); -+ spin_unlock_irqrestore(&efivars->lock, flags); - - if (found) - efivar_unregister(found); - -- if (size) -- ret = efivar_create_sysfs_entry(efivars, -- utf16_strsize(efi_name, -- DUMP_NAME_LEN * 2), -- efi_name, &vendor); -+ if (reason == KMSG_DUMP_OOPS) -+ schedule_work(&efivar_work); - - *id = part; - return ret; -@@ -774,37 +848,6 @@ static int efi_pstore_erase(enum pstore_type_id type, u64 id, - - return 0; - } --#else --static int efi_pstore_open(struct pstore_info *psi) --{ -- return 0; --} -- --static int efi_pstore_close(struct pstore_info *psi) --{ -- return 0; --} -- --static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type, -- struct timespec *timespec, -- char **buf, struct pstore_info *psi) --{ -- return -1; --} -- --static int efi_pstore_write(enum pstore_type_id type, -- enum kmsg_dump_reason reason, u64 *id, -- unsigned int part, size_t size, struct pstore_info *psi) --{ -- return 0; --} -- --static int efi_pstore_erase(enum pstore_type_id type, u64 id, -- struct pstore_info *psi) --{ -- return 0; --} --#endif - - static struct pstore_info efi_pstore_info = { - .owner = THIS_MODULE, -@@ -816,6 +859,24 @@ static struct pstore_info efi_pstore_info = { - .erase = efi_pstore_erase, - }; - -+static void efivar_pstore_register(struct efivars *efivars) -+{ -+ efivars->efi_pstore_info = efi_pstore_info; -+ efivars->efi_pstore_info.buf = kmalloc(4096, GFP_KERNEL); -+ if (efivars->efi_pstore_info.buf) { -+ efivars->efi_pstore_info.bufsize = 1024; -+ efivars->efi_pstore_info.data = efivars; -+ spin_lock_init(&efivars->efi_pstore_info.buf_lock); -+ pstore_register(&efivars->efi_pstore_info); -+ } -+} -+#else -+static void efivar_pstore_register(struct efivars *efivars) -+{ -+ return; -+} -+#endif -+ - static ssize_t efivar_create(struct file *filp, struct kobject *kobj, - struct bin_attribute *bin_attr, - char *buf, loff_t pos, size_t count) -@@ -836,7 +897,7 @@ static ssize_t efivar_create(struct file *filp, struct kobject *kobj, - return -EINVAL; - } - -- spin_lock(&efivars->lock); -+ spin_lock_irq(&efivars->lock); - - /* - * Does this variable already exist? -@@ -854,10 +915,18 @@ static ssize_t efivar_create(struct file *filp, struct kobject *kobj, - } - } - if (found) { -- spin_unlock(&efivars->lock); -+ spin_unlock_irq(&efivars->lock); - return -EINVAL; - } - -+ status = check_var_size_locked(efivars, new_var->Attributes, -+ new_var->DataSize + utf16_strsize(new_var->VariableName, 1024)); -+ -+ if (status && status != EFI_UNSUPPORTED) { -+ spin_unlock_irq(&efivars->lock); -+ return efi_status_to_err(status); -+ } -+ - /* now *really* create the variable via EFI */ - status = efivars->ops->set_variable(new_var->VariableName, - &new_var->VendorGuid, -@@ -868,10 +937,10 @@ static ssize_t efivar_create(struct file *filp, struct kobject *kobj, - if (status != EFI_SUCCESS) { - printk(KERN_WARNING "efivars: set_variable() failed: status=%lx\n", - status); -- spin_unlock(&efivars->lock); -+ spin_unlock_irq(&efivars->lock); - return -EIO; - } -- spin_unlock(&efivars->lock); -+ spin_unlock_irq(&efivars->lock); - - /* Create the entry in sysfs. Locking is not required here */ - status = efivar_create_sysfs_entry(efivars, -@@ -899,7 +968,7 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj, - if (!capable(CAP_SYS_ADMIN)) - return -EACCES; - -- spin_lock(&efivars->lock); -+ spin_lock_irq(&efivars->lock); - - /* - * Does this variable already exist? -@@ -917,7 +986,7 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj, - } - } - if (!found) { -- spin_unlock(&efivars->lock); -+ spin_unlock_irq(&efivars->lock); - return -EINVAL; - } - /* force the Attributes/DataSize to 0 to ensure deletion */ -@@ -933,12 +1002,12 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj, - if (status != EFI_SUCCESS) { - printk(KERN_WARNING "efivars: set_variable() failed: status=%lx\n", - status); -- spin_unlock(&efivars->lock); -+ spin_unlock_irq(&efivars->lock); - return -EIO; - } - list_del(&search_efivar->list); - /* We need to release this lock before unregistering. */ -- spin_unlock(&efivars->lock); -+ spin_unlock_irq(&efivars->lock); - efivar_unregister(search_efivar); - - /* It's dead Jim.... */ -@@ -967,6 +1036,53 @@ static bool variable_is_present(efi_char16_t *variable_name, efi_guid_t *vendor) - return found; - } - -+static void efivar_update_sysfs_entries(struct work_struct *work) -+{ -+ struct efivars *efivars = &__efivars; -+ efi_guid_t vendor; -+ efi_char16_t *variable_name; -+ unsigned long variable_name_size = 1024; -+ efi_status_t status = EFI_NOT_FOUND; -+ bool found; -+ -+ /* Add new sysfs entries */ -+ while (1) { -+ variable_name = kzalloc(variable_name_size, GFP_KERNEL); -+ if (!variable_name) { -+ pr_err("efivars: Memory allocation failed.\n"); -+ return; -+ } -+ -+ spin_lock_irq(&efivars->lock); -+ found = false; -+ while (1) { -+ variable_name_size = 1024; -+ status = efivars->ops->get_next_variable( -+ &variable_name_size, -+ variable_name, -+ &vendor); -+ if (status != EFI_SUCCESS) { -+ break; -+ } else { -+ if (!variable_is_present(variable_name, -+ &vendor)) { -+ found = true; -+ break; -+ } -+ } -+ } -+ spin_unlock_irq(&efivars->lock); -+ -+ if (!found) { -+ kfree(variable_name); -+ break; -+ } else -+ efivar_create_sysfs_entry(efivars, -+ variable_name_size, -+ variable_name, &vendor); -+ } -+} -+ - /* - * Returns the size of variable_name, in bytes, including the - * terminating NULL character, or variable_name_size if no NULL -@@ -1093,9 +1209,9 @@ efivar_create_sysfs_entry(struct efivars *efivars, - kfree(short_name); - short_name = NULL; - -- spin_lock(&efivars->lock); -+ spin_lock_irq(&efivars->lock); - list_add(&new_efivar->list, &efivars->list); -- spin_unlock(&efivars->lock); -+ spin_unlock_irq(&efivars->lock); - - return 0; - } -@@ -1164,9 +1280,9 @@ void unregister_efivars(struct efivars *efivars) - struct efivar_entry *entry, *n; - - list_for_each_entry_safe(entry, n, &efivars->list, list) { -- spin_lock(&efivars->lock); -+ spin_lock_irq(&efivars->lock); - list_del(&entry->list); -- spin_unlock(&efivars->lock); -+ spin_unlock_irq(&efivars->lock); - efivar_unregister(entry); - } - if (efivars->new_var) -@@ -1278,15 +1394,8 @@ int register_efivars(struct efivars *efivars, - if (error) - unregister_efivars(efivars); - -- efivars->efi_pstore_info = efi_pstore_info; -- -- efivars->efi_pstore_info.buf = kmalloc(4096, GFP_KERNEL); -- if (efivars->efi_pstore_info.buf) { -- efivars->efi_pstore_info.bufsize = 1024; -- efivars->efi_pstore_info.data = efivars; -- spin_lock_init(&efivars->efi_pstore_info.buf_lock); -- pstore_register(&efivars->efi_pstore_info); -- } -+ if (!efivars_pstore_disable) -+ efivar_pstore_register(efivars); - - out: - kfree(variable_name); -@@ -1324,6 +1433,7 @@ efivars_init(void) - ops.get_variable = efi.get_variable; - ops.set_variable = efi.set_variable; - ops.get_next_variable = efi.get_next_variable; -+ ops.query_variable_store = efi_query_variable_store; - error = register_efivars(&__efivars, &ops, efi_kobj); - if (error) - goto err_put; -diff --git a/drivers/gpio/gpio-mpc8xxx.c b/drivers/gpio/gpio-mpc8xxx.c -index 5a1817e..c81b8da 100644 ---- a/drivers/gpio/gpio-mpc8xxx.c -+++ b/drivers/gpio/gpio-mpc8xxx.c -@@ -69,10 +69,14 @@ static int mpc8572_gpio_get(struct gpio_chip *gc, unsigned int gpio) - u32 val; - struct of_mm_gpio_chip *mm = to_of_mm_gpio_chip(gc); - struct mpc8xxx_gpio_chip *mpc8xxx_gc = to_mpc8xxx_gpio_chip(mm); -+ u32 out_mask, out_shadow; - -- val = in_be32(mm->regs + GPIO_DAT) & ~in_be32(mm->regs + GPIO_DIR); -+ out_mask = in_be32(mm->regs + GPIO_DIR); - -- return (val | mpc8xxx_gc->data) & mpc8xxx_gpio2mask(gpio); -+ val = in_be32(mm->regs + GPIO_DAT) & ~out_mask; -+ out_shadow = mpc8xxx_gc->data & out_mask; -+ -+ return (val | out_shadow) & mpc8xxx_gpio2mask(gpio); - } - - static int mpc8xxx_gpio_get(struct gpio_chip *gc, unsigned int gpio) -diff --git a/drivers/gpio/gpio-mxs.c b/drivers/gpio/gpio-mxs.c -index 385c58e..0f8114d 100644 ---- a/drivers/gpio/gpio-mxs.c -+++ b/drivers/gpio/gpio-mxs.c -@@ -167,7 +167,8 @@ static void __init mxs_gpio_init_gc(struct mxs_gpio_port *port) - ct->regs.ack = PINCTRL_IRQSTAT(port->id) + MXS_CLR; - ct->regs.mask = PINCTRL_IRQEN(port->id); - -- irq_setup_generic_chip(gc, IRQ_MSK(32), 0, IRQ_NOREQUEST, 0); -+ irq_setup_generic_chip(gc, IRQ_MSK(32), IRQ_GC_INIT_NESTED_LOCK, -+ IRQ_NOREQUEST, 0); - } - - static int mxs_gpio_to_irq(struct gpio_chip *gc, unsigned offset) -diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c -index 8111889..b3abf70 100644 ---- a/drivers/gpu/drm/drm_crtc_helper.c -+++ b/drivers/gpu/drm/drm_crtc_helper.c -@@ -328,8 +328,8 @@ drm_crtc_prepare_encoders(struct drm_device *dev) - * drm_crtc_set_mode - set a mode - * @crtc: CRTC to program - * @mode: mode to use -- * @x: width of mode -- * @y: height of mode -+ * @x: horizontal offset into the surface -+ * @y: vertical offset into the surface - * - * LOCKING: - * Caller must hold mode config lock. -diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c -index 6116e3b..e9f1ef5 100644 ---- a/drivers/gpu/drm/drm_drv.c -+++ b/drivers/gpu/drm/drm_drv.c -@@ -420,9 +420,16 @@ long drm_ioctl(struct file *filp, - asize = drv_size; - } - else if ((nr >= DRM_COMMAND_END) || (nr < DRM_COMMAND_BASE)) { -+ u32 drv_size; -+ - ioctl = &drm_ioctls[nr]; -- cmd = ioctl->cmd; -+ -+ drv_size = _IOC_SIZE(ioctl->cmd); - usize = asize = _IOC_SIZE(cmd); -+ if (drv_size > asize) -+ asize = drv_size; -+ -+ cmd = ioctl->cmd; - } else - goto err_i1; - -diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c -index efe172f..d75dccb 100644 ---- a/drivers/gpu/drm/drm_edid.c -+++ b/drivers/gpu/drm/drm_edid.c -@@ -68,6 +68,8 @@ - #define EDID_QUIRK_DETAILED_SYNC_PP (1 << 6) - /* Force reduced-blanking timings for detailed modes */ - #define EDID_QUIRK_FORCE_REDUCED_BLANKING (1 << 7) -+/* Force 8bpc */ -+#define EDID_QUIRK_FORCE_8BPC (1 << 8) - - struct detailed_mode_closure { - struct drm_connector *connector; -@@ -128,6 +130,9 @@ static struct edid_quirk { - - /* Medion MD 30217 PG */ - { "MED", 0x7b8, EDID_QUIRK_PREFER_LARGE_75 }, -+ -+ /* Panel in Samsung NP700G7A-S01PL notebook reports 6bpc */ -+ { "SEC", 0xd033, EDID_QUIRK_FORCE_8BPC }, - }; - - /*** DDC fetch and block validation ***/ -@@ -1782,6 +1787,9 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) - - drm_add_display_info(edid, &connector->display_info); - -+ if (quirks & EDID_QUIRK_FORCE_8BPC) -+ connector->display_info.bpc = 8; -+ - return num_modes; - } - EXPORT_SYMBOL(drm_add_edid_modes); -diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c -index 34791fb..39f8111 100644 ---- a/drivers/gpu/drm/i915/i915_debugfs.c -+++ b/drivers/gpu/drm/i915/i915_debugfs.c -@@ -30,6 +30,7 @@ - #include - #include - #include -+#include - #include "drmP.h" - #include "drm.h" - #include "intel_drv.h" -@@ -340,7 +341,7 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data) - seq_printf(m, "No flip due on pipe %c (plane %c)\n", - pipe, plane); - } else { -- if (!work->pending) { -+ if (atomic_read(&work->pending) < INTEL_FLIP_COMPLETE) { - seq_printf(m, "Flip queued on pipe %c (plane %c)\n", - pipe, plane); - } else { -@@ -351,7 +352,7 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data) - seq_printf(m, "Stall check enabled, "); - else - seq_printf(m, "Stall check waiting for page flip ioctl, "); -- seq_printf(m, "%d prepares\n", work->pending); -+ seq_printf(m, "%d prepares\n", atomic_read(&work->pending)); - - if (work->old_fb_obj) { - struct drm_i915_gem_object *obj = work->old_fb_obj; -@@ -750,6 +751,7 @@ static int i915_error_state(struct seq_file *m, void *unused) - - seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec, - error->time.tv_usec); -+ seq_printf(m, "Kernel: " UTS_RELEASE "\n"); - seq_printf(m, "PCI ID: 0x%04x\n", dev->pci_device); - seq_printf(m, "EIR: 0x%08x\n", error->eir); - seq_printf(m, "PGTBL_ER: 0x%08x\n", error->pgtbl_er); -diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c -index ba60f3c..38c0a47 100644 ---- a/drivers/gpu/drm/i915/i915_dma.c -+++ b/drivers/gpu/drm/i915/i915_dma.c -@@ -1934,6 +1934,27 @@ ips_ping_for_i915_load(void) - } - } - -+static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) -+{ -+ struct apertures_struct *ap; -+ struct pci_dev *pdev = dev_priv->dev->pdev; -+ bool primary; -+ -+ ap = alloc_apertures(1); -+ if (!ap) -+ return; -+ -+ ap->ranges[0].base = dev_priv->dev->agp->base; -+ ap->ranges[0].size = -+ dev_priv->mm.gtt->gtt_mappable_entries << PAGE_SHIFT; -+ primary = -+ pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW; -+ -+ remove_conflicting_framebuffers(ap, "inteldrmfb", primary); -+ -+ kfree(ap); -+} -+ - /** - * i915_driver_load - setup chip and create an initial config - * @dev: DRM device -@@ -1971,6 +1992,15 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) - goto free_priv; - } - -+ dev_priv->mm.gtt = intel_gtt_get(); -+ if (!dev_priv->mm.gtt) { -+ DRM_ERROR("Failed to initialize GTT\n"); -+ ret = -ENODEV; -+ goto put_bridge; -+ } -+ -+ i915_kick_out_firmware_fb(dev_priv); -+ - pci_set_master(dev->pdev); - - /* overlay on gen2 is broken and can't address above 1G */ -@@ -1996,13 +2026,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) - goto put_bridge; - } - -- dev_priv->mm.gtt = intel_gtt_get(); -- if (!dev_priv->mm.gtt) { -- DRM_ERROR("Failed to initialize GTT\n"); -- ret = -ENODEV; -- goto out_rmmap; -- } -- - agp_size = dev_priv->mm.gtt->gtt_mappable_entries << PAGE_SHIFT; - - dev_priv->mm.gtt_mapping = -diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h -index 232119a..a8f00d0 100644 ---- a/drivers/gpu/drm/i915/i915_drv.h -+++ b/drivers/gpu/drm/i915/i915_drv.h -@@ -296,7 +296,8 @@ enum intel_pch { - - #define QUIRK_PIPEA_FORCE (1<<0) - #define QUIRK_LVDS_SSC_DISABLE (1<<1) --#define QUIRK_NO_PCH_PWM_ENABLE (1<<2) -+#define QUIRK_INVERT_BRIGHTNESS (1<<2) -+#define QUIRK_NO_PCH_PWM_ENABLE (1<<3) - - struct intel_fbdev; - struct intel_fbc_work; -@@ -1397,6 +1398,7 @@ static inline void intel_unregister_dsm_handler(void) { return; } - #endif /* CONFIG_ACPI */ - - /* modesetting */ -+extern void i915_redisable_vga(struct drm_device *dev); - extern void intel_modeset_init(struct drm_device *dev); - extern void intel_modeset_gem_init(struct drm_device *dev); - extern void intel_modeset_cleanup(struct drm_device *dev); -diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c -index eb33945..2ac4ded 100644 ---- a/drivers/gpu/drm/i915/i915_gem.c -+++ b/drivers/gpu/drm/i915/i915_gem.c -@@ -2468,6 +2468,11 @@ i915_find_fence_reg(struct drm_device *dev, - return avail; - } - -+static void i915_gem_write_fence__ipi(void *data) -+{ -+ wbinvd(); -+} -+ - /** - * i915_gem_object_get_fence - set up a fence reg for an object - * @obj: object to map through a fence reg -@@ -2589,6 +2594,17 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj, - switch (INTEL_INFO(dev)->gen) { - case 7: - case 6: -+ /* In order to fully serialize access to the fenced region and -+ * the update to the fence register we need to take extreme -+ * measures on SNB+. In theory, the write to the fence register -+ * flushes all memory transactions before, and coupled with the -+ * mb() placed around the register write we serialise all memory -+ * operations with respect to the changes in the tiler. Yet, on -+ * SNB+ we need to take a step further and emit an explicit wbinvd() -+ * on each processor in order to manually flush all memory -+ * transactions before updating the fence register. -+ */ -+ on_each_cpu(i915_gem_write_fence__ipi, NULL, 1); - ret = sandybridge_write_fence_reg(obj, pipelined); - break; - case 5: -@@ -3411,14 +3427,15 @@ i915_gem_pin_ioctl(struct drm_device *dev, void *data, - goto out; - } - -- obj->user_pin_count++; -- obj->pin_filp = file; -- if (obj->user_pin_count == 1) { -+ if (obj->user_pin_count == 0) { - ret = i915_gem_object_pin(obj, args->alignment, true); - if (ret) - goto out; - } - -+ obj->user_pin_count++; -+ obj->pin_filp = file; -+ - /* XXX - flush the CPU caches for pinned objects - * as the X server doesn't manage domains yet - */ -diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c -index 8bca2d2..fc6f32a 100644 ---- a/drivers/gpu/drm/i915/i915_irq.c -+++ b/drivers/gpu/drm/i915/i915_irq.c -@@ -1251,7 +1251,9 @@ static void i915_pageflip_stall_check(struct drm_device *dev, int pipe) - spin_lock_irqsave(&dev->event_lock, flags); - work = intel_crtc->unpin_work; - -- if (work == NULL || work->pending || !work->enable_stall_check) { -+ if (work == NULL || -+ atomic_read(&work->pending) >= INTEL_FLIP_COMPLETE || -+ !work->enable_stall_check) { - /* Either the pending flip IRQ arrived, or we're too early. Don't check */ - spin_unlock_irqrestore(&dev->event_lock, flags); - return; -diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c -index a2c9e56..d9e359a 100644 ---- a/drivers/gpu/drm/i915/intel_bios.c -+++ b/drivers/gpu/drm/i915/intel_bios.c -@@ -651,7 +651,7 @@ init_vbt_defaults(struct drm_i915_private *dev_priv) - DRM_DEBUG_KMS("Set default to SSC at %dMHz\n", dev_priv->lvds_ssc_freq); - } - --static int __init intel_no_opregion_vbt_callback(const struct dmi_system_id *id) -+static int intel_no_opregion_vbt_callback(const struct dmi_system_id *id) - { - DRM_DEBUG_KMS("Falling back to manually reading VBT from " - "VBIOS ROM for %s\n", -diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c -index 342ffb7..b4f71c2 100644 ---- a/drivers/gpu/drm/i915/intel_crt.c -+++ b/drivers/gpu/drm/i915/intel_crt.c -@@ -564,7 +564,7 @@ static const struct drm_encoder_funcs intel_crt_enc_funcs = { - .destroy = intel_encoder_destroy, - }; - --static int __init intel_no_crt_dmi_callback(const struct dmi_system_id *id) -+static int intel_no_crt_dmi_callback(const struct dmi_system_id *id) - { - DRM_DEBUG_KMS("Skipping CRT initialization for %s\n", id->ident); - return 1; -@@ -579,6 +579,14 @@ static const struct dmi_system_id intel_no_crt[] = { - DMI_MATCH(DMI_PRODUCT_NAME, "ZGB"), - }, - }, -+ { -+ .callback = intel_no_crt_dmi_callback, -+ .ident = "DELL XPS 8700", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), -+ DMI_MATCH(DMI_PRODUCT_NAME, "XPS 8700"), -+ }, -+ }, - { } - }; - -diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c -index 0e35922..c975c99 100644 ---- a/drivers/gpu/drm/i915/intel_display.c -+++ b/drivers/gpu/drm/i915/intel_display.c -@@ -25,6 +25,7 @@ - */ - - #include -+#include - #include - #include - #include -@@ -6377,7 +6378,9 @@ static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base) - intel_crtc->cursor_visible = visible; - } - /* and commit changes on next vblank */ -+ POSTING_READ(CURCNTR(pipe)); - I915_WRITE(CURBASE(pipe), base); -+ POSTING_READ(CURBASE(pipe)); - } - - static void ivb_update_cursor(struct drm_crtc *crtc, u32 base) -@@ -6402,7 +6405,9 @@ static void ivb_update_cursor(struct drm_crtc *crtc, u32 base) - intel_crtc->cursor_visible = visible; - } - /* and commit changes on next vblank */ -+ POSTING_READ(CURCNTR_IVB(pipe)); - I915_WRITE(CURBASE_IVB(pipe), base); -+ POSTING_READ(CURBASE_IVB(pipe)); - } - - /* If no-part of the cursor is visible on the framebuffer, then the GPU may hang... */ -@@ -7241,11 +7246,18 @@ static void do_intel_finish_page_flip(struct drm_device *dev, - - spin_lock_irqsave(&dev->event_lock, flags); - work = intel_crtc->unpin_work; -- if (work == NULL || !work->pending) { -+ -+ /* Ensure we don't miss a work->pending update ... */ -+ smp_rmb(); -+ -+ if (work == NULL || atomic_read(&work->pending) < INTEL_FLIP_COMPLETE) { - spin_unlock_irqrestore(&dev->event_lock, flags); - return; - } - -+ /* and that the unpin work is consistent wrt ->pending. */ -+ smp_rmb(); -+ - intel_crtc->unpin_work = NULL; - - if (work->event) { -@@ -7317,16 +7329,25 @@ void intel_prepare_page_flip(struct drm_device *dev, int plane) - to_intel_crtc(dev_priv->plane_to_crtc_mapping[plane]); - unsigned long flags; - -+ /* NB: An MMIO update of the plane base pointer will also -+ * generate a page-flip completion irq, i.e. every modeset -+ * is also accompanied by a spurious intel_prepare_page_flip(). -+ */ - spin_lock_irqsave(&dev->event_lock, flags); -- if (intel_crtc->unpin_work) { -- if ((++intel_crtc->unpin_work->pending) > 1) -- DRM_ERROR("Prepared flip multiple times\n"); -- } else { -- DRM_DEBUG_DRIVER("preparing flip with no unpin work?\n"); -- } -+ if (intel_crtc->unpin_work) -+ atomic_inc_not_zero(&intel_crtc->unpin_work->pending); - spin_unlock_irqrestore(&dev->event_lock, flags); - } - -+inline static void intel_mark_page_flip_active(struct intel_crtc *intel_crtc) -+{ -+ /* Ensure that the work item is consistent when activating it ... */ -+ smp_wmb(); -+ atomic_set(&intel_crtc->unpin_work->pending, INTEL_FLIP_PENDING); -+ /* and that it is marked active as soon as the irq could fire. */ -+ smp_wmb(); -+} -+ - static int intel_gen2_queue_flip(struct drm_device *dev, - struct drm_crtc *crtc, - struct drm_framebuffer *fb, -@@ -7363,6 +7384,8 @@ static int intel_gen2_queue_flip(struct drm_device *dev, - OUT_RING(fb->pitches[0]); - OUT_RING(obj->gtt_offset + offset); - OUT_RING(0); /* aux display base address, unused */ -+ -+ intel_mark_page_flip_active(intel_crtc); - ADVANCE_LP_RING(); - return 0; - -@@ -7406,6 +7429,7 @@ static int intel_gen3_queue_flip(struct drm_device *dev, - OUT_RING(obj->gtt_offset + offset); - OUT_RING(MI_NOOP); - -+ intel_mark_page_flip_active(intel_crtc); - ADVANCE_LP_RING(); - return 0; - -@@ -7449,6 +7473,8 @@ static int intel_gen4_queue_flip(struct drm_device *dev, - pf = 0; - pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff; - OUT_RING(pf | pipesrc); -+ -+ intel_mark_page_flip_active(intel_crtc); - ADVANCE_LP_RING(); - return 0; - -@@ -7490,6 +7516,8 @@ static int intel_gen6_queue_flip(struct drm_device *dev, - pf = 0; - pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff; - OUT_RING(pf | pipesrc); -+ -+ intel_mark_page_flip_active(intel_crtc); - ADVANCE_LP_RING(); - return 0; - -@@ -7544,6 +7572,8 @@ static int intel_gen7_queue_flip(struct drm_device *dev, - intel_ring_emit(ring, (fb->pitches[0] | obj->tiling_mode)); - intel_ring_emit(ring, (obj->gtt_offset)); - intel_ring_emit(ring, (MI_NOOP)); -+ -+ intel_mark_page_flip_active(intel_crtc); - intel_ring_advance(ring); - return 0; - -@@ -9171,6 +9201,16 @@ static void quirk_no_pcm_pwm_enable(struct drm_device *dev) - DRM_INFO("applying no-PCH_PWM_ENABLE quirk\n"); - } - -+/* -+ * A machine (e.g. Acer Aspire 5734Z) may need to invert the panel backlight -+ * brightness value -+ */ -+static void quirk_invert_brightness(struct drm_device *dev) -+{ -+ struct drm_i915_private *dev_priv = dev->dev_private; -+ dev_priv->quirks |= QUIRK_INVERT_BRIGHTNESS; -+} -+ - struct intel_quirk { - int device; - int subsystem_vendor; -@@ -9178,6 +9218,34 @@ struct intel_quirk { - void (*hook)(struct drm_device *dev); - }; - -+/* For systems that don't have a meaningful PCI subdevice/subvendor ID */ -+struct intel_dmi_quirk { -+ void (*hook)(struct drm_device *dev); -+ const struct dmi_system_id (*dmi_id_list)[]; -+}; -+ -+static int intel_dmi_reverse_brightness(const struct dmi_system_id *id) -+{ -+ DRM_INFO("Backlight polarity reversed on %s\n", id->ident); -+ return 1; -+} -+ -+static const struct intel_dmi_quirk intel_dmi_quirks[] = { -+ { -+ .dmi_id_list = &(const struct dmi_system_id[]) { -+ { -+ .callback = intel_dmi_reverse_brightness, -+ .ident = "NCR Corporation", -+ .matches = {DMI_MATCH(DMI_SYS_VENDOR, "NCR Corporation"), -+ DMI_MATCH(DMI_PRODUCT_NAME, ""), -+ }, -+ }, -+ { } /* terminating entry */ -+ }, -+ .hook = quirk_invert_brightness, -+ }, -+}; -+ - struct intel_quirk intel_quirks[] = { - /* HP Mini needs pipe A force quirk (LP: #322104) */ - { 0x27ae, 0x103c, 0x361a, quirk_pipea_force }, -@@ -9204,6 +9272,18 @@ struct intel_quirk intel_quirks[] = { - /* Sony Vaio Y cannot use SSC on LVDS */ - { 0x0046, 0x104d, 0x9076, quirk_ssc_force_disable }, - -+ /* Acer Aspire 5734Z must invert backlight brightness */ -+ { 0x2a42, 0x1025, 0x0459, quirk_invert_brightness }, -+ -+ /* Acer/eMachines G725 */ -+ { 0x2a42, 0x1025, 0x0210, quirk_invert_brightness }, -+ -+ /* Acer/eMachines e725 */ -+ { 0x2a42, 0x1025, 0x0212, quirk_invert_brightness }, -+ -+ /* Acer/Packard Bell NCL20 */ -+ { 0x2a42, 0x1025, 0x034b, quirk_invert_brightness }, -+ - /* Dell XPS13 HD Sandy Bridge */ - { 0x0116, 0x1028, 0x052e, quirk_no_pcm_pwm_enable }, - /* Dell XPS13 HD and XPS13 FHD Ivy Bridge */ -@@ -9225,6 +9305,10 @@ static void intel_init_quirks(struct drm_device *dev) - q->subsystem_device == PCI_ANY_ID)) - q->hook(dev); - } -+ for (i = 0; i < ARRAY_SIZE(intel_dmi_quirks); i++) { -+ if (dmi_check_system(*intel_dmi_quirks[i].dmi_id_list) != 0) -+ intel_dmi_quirks[i].hook(dev); -+ } - } - - /* Disable the VGA plane that we never use */ -@@ -9250,6 +9334,23 @@ static void i915_disable_vga(struct drm_device *dev) - POSTING_READ(vga_reg); - } - -+void i915_redisable_vga(struct drm_device *dev) -+{ -+ struct drm_i915_private *dev_priv = dev->dev_private; -+ u32 vga_reg; -+ -+ if (HAS_PCH_SPLIT(dev)) -+ vga_reg = CPU_VGACNTRL; -+ else -+ vga_reg = VGACNTRL; -+ -+ if (I915_READ(vga_reg) != VGA_DISP_DISABLE) { -+ DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n"); -+ I915_WRITE(vga_reg, VGA_DISP_DISABLE); -+ POSTING_READ(vga_reg); -+ } -+} -+ - void intel_modeset_init(struct drm_device *dev) - { - struct drm_i915_private *dev_priv = dev->dev_private; -@@ -9370,6 +9471,9 @@ void intel_modeset_cleanup(struct drm_device *dev) - del_timer_sync(&dev_priv->idle_timer); - cancel_work_sync(&dev_priv->idle_work); - -+ /* destroy backlight, if any, before the connectors */ -+ intel_panel_destroy_backlight(dev); -+ - drm_mode_config_cleanup(dev); - } - -diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c -index eee6cd3..9a3ecd6 100644 ---- a/drivers/gpu/drm/i915/intel_dp.c -+++ b/drivers/gpu/drm/i915/intel_dp.c -@@ -2289,11 +2289,6 @@ intel_dp_set_property(struct drm_connector *connector, - static void - intel_dp_destroy(struct drm_connector *connector) - { -- struct drm_device *dev = connector->dev; -- -- if (intel_dpd_is_edp(dev)) -- intel_panel_destroy_backlight(dev); -- - drm_sysfs_connector_remove(connector); - drm_connector_cleanup(connector); - kfree(connector); -diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h -index cd623e8..018dfbd 100644 ---- a/drivers/gpu/drm/i915/intel_drv.h -+++ b/drivers/gpu/drm/i915/intel_drv.h -@@ -277,7 +277,10 @@ struct intel_unpin_work { - struct drm_i915_gem_object *old_fb_obj; - struct drm_i915_gem_object *pending_flip_obj; - struct drm_pending_vblank_event *event; -- int pending; -+ atomic_t pending; -+#define INTEL_FLIP_INACTIVE 0 -+#define INTEL_FLIP_PENDING 1 -+#define INTEL_FLIP_COMPLETE 2 - bool enable_stall_check; - }; - -diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c -index dc7c5f6..77190cc 100644 ---- a/drivers/gpu/drm/i915/intel_lvds.c -+++ b/drivers/gpu/drm/i915/intel_lvds.c -@@ -535,6 +535,7 @@ static int intel_lid_notify(struct notifier_block *nb, unsigned long val, - - mutex_lock(&dev->mode_config.mutex); - drm_helper_resume_force_mode(dev); -+ i915_redisable_vga(dev); - mutex_unlock(&dev->mode_config.mutex); - - return NOTIFY_OK; -@@ -552,8 +553,6 @@ static void intel_lvds_destroy(struct drm_connector *connector) - struct drm_device *dev = connector->dev; - struct drm_i915_private *dev_priv = dev->dev_private; - -- intel_panel_destroy_backlight(dev); -- - if (dev_priv->lid_notifier.notifier_call) - acpi_lid_notifier_unregister(&dev_priv->lid_notifier); - drm_sysfs_connector_remove(connector); -@@ -620,7 +619,7 @@ static const struct drm_encoder_funcs intel_lvds_enc_funcs = { - .destroy = intel_encoder_destroy, - }; - --static int __init intel_no_lvds_dmi_callback(const struct dmi_system_id *id) -+static int intel_no_lvds_dmi_callback(const struct dmi_system_id *id) - { - DRM_DEBUG_KMS("Skipping LVDS initialization for %s\n", id->ident); - return 1; -diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c -index cffb007..356a252 100644 ---- a/drivers/gpu/drm/i915/intel_opregion.c -+++ b/drivers/gpu/drm/i915/intel_opregion.c -@@ -161,7 +161,7 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) - - max = intel_panel_get_max_backlight(dev); - intel_panel_set_backlight(dev, bclp * max / 255); -- asle->cblv = (bclp*0x64)/0xff | ASLE_CBLV_VALID; -+ asle->cblv = DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID; - - return 0; - } -diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c -index 48177ec..0bae2bb 100644 ---- a/drivers/gpu/drm/i915/intel_panel.c -+++ b/drivers/gpu/drm/i915/intel_panel.c -@@ -28,6 +28,7 @@ - * Chris Wilson - */ - -+#include - #include "intel_drv.h" - - #define PCI_LBPC 0xf4 /* legacy/combination backlight modes */ -@@ -189,6 +190,27 @@ u32 intel_panel_get_max_backlight(struct drm_device *dev) - return max; - } - -+static int i915_panel_invert_brightness; -+MODULE_PARM_DESC(invert_brightness, "Invert backlight brightness " -+ "(-1 force normal, 0 machine defaults, 1 force inversion), please " -+ "report PCI device ID, subsystem vendor and subsystem device ID " -+ "to dri-devel@lists.freedesktop.org, if your machine needs it. " -+ "It will then be included in an upcoming module version."); -+module_param_named(invert_brightness, i915_panel_invert_brightness, int, 0600); -+static u32 intel_panel_compute_brightness(struct drm_device *dev, u32 val) -+{ -+ struct drm_i915_private *dev_priv = dev->dev_private; -+ -+ if (i915_panel_invert_brightness < 0) -+ return val; -+ -+ if (i915_panel_invert_brightness > 0 || -+ dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS) -+ return intel_panel_get_max_backlight(dev) - val; -+ -+ return val; -+} -+ - u32 intel_panel_get_backlight(struct drm_device *dev) - { - struct drm_i915_private *dev_priv = dev->dev_private; -@@ -209,6 +231,7 @@ u32 intel_panel_get_backlight(struct drm_device *dev) - } - } - -+ val = intel_panel_compute_brightness(dev, val); - DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val); - return val; - } -@@ -226,6 +249,7 @@ static void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level - u32 tmp; - - DRM_DEBUG_DRIVER("set backlight PWM = %d\n", level); -+ level = intel_panel_compute_brightness(dev, level); - - if (HAS_PCH_SPLIT(dev)) - return intel_pch_panel_set_backlight(dev, level); -@@ -335,6 +359,9 @@ int intel_panel_setup_backlight(struct drm_device *dev) - - intel_panel_init_backlight(dev); - -+ if (WARN_ON(dev_priv->backlight)) -+ return -ENODEV; -+ - if (dev_priv->int_lvds_connector) - connector = dev_priv->int_lvds_connector; - else if (dev_priv->int_edp_connector) -@@ -362,8 +389,10 @@ int intel_panel_setup_backlight(struct drm_device *dev) - void intel_panel_destroy_backlight(struct drm_device *dev) - { - struct drm_i915_private *dev_priv = dev->dev_private; -- if (dev_priv->backlight) -+ if (dev_priv->backlight) { - backlight_device_unregister(dev_priv->backlight); -+ dev_priv->backlight = NULL; -+ } - } - #else - int intel_panel_setup_backlight(struct drm_device *dev) -diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c -index c0ba260..8d55a33 100644 ---- a/drivers/gpu/drm/i915/intel_sdvo.c -+++ b/drivers/gpu/drm/i915/intel_sdvo.c -@@ -2265,6 +2265,18 @@ intel_sdvo_output_setup(struct intel_sdvo *intel_sdvo, uint16_t flags) - return true; - } - -+static void intel_sdvo_output_cleanup(struct intel_sdvo *intel_sdvo) -+{ -+ struct drm_device *dev = intel_sdvo->base.base.dev; -+ struct drm_connector *connector, *tmp; -+ -+ list_for_each_entry_safe(connector, tmp, -+ &dev->mode_config.connector_list, head) { -+ if (intel_attached_encoder(connector) == &intel_sdvo->base) -+ intel_sdvo_destroy(connector); -+ } -+} -+ - static bool intel_sdvo_tv_create_property(struct intel_sdvo *intel_sdvo, - struct intel_sdvo_connector *intel_sdvo_connector, - int type) -@@ -2583,7 +2595,8 @@ bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg) - intel_sdvo->caps.output_flags) != true) { - DRM_DEBUG_KMS("SDVO output failed to setup on SDVO%c\n", - IS_SDVOB(sdvo_reg) ? 'B' : 'C'); -- goto err; -+ /* Output_setup can leave behind connectors! */ -+ goto err_output; - } - - /* Only enable the hotplug irq if we need it, to work around noisy -@@ -2596,12 +2609,12 @@ bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg) - - /* Set the input timing to the screen. Assume always input 0. */ - if (!intel_sdvo_set_target_input(intel_sdvo)) -- goto err; -+ goto err_output; - - if (!intel_sdvo_get_input_pixel_clock_range(intel_sdvo, - &intel_sdvo->pixel_clock_min, - &intel_sdvo->pixel_clock_max)) -- goto err; -+ goto err_output; - - DRM_DEBUG_KMS("%s device VID/DID: %02X:%02X.%02X, " - "clock range %dMHz - %dMHz, " -@@ -2621,6 +2634,9 @@ bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg) - (SDVO_OUTPUT_TMDS1 | SDVO_OUTPUT_RGB1) ? 'Y' : 'N'); - return true; - -+err_output: -+ intel_sdvo_output_cleanup(intel_sdvo); -+ - err: - drm_encoder_cleanup(&intel_encoder->base); - i2c_del_adapter(&intel_sdvo->ddc); -diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c -index 284bd25..4339694 100644 ---- a/drivers/gpu/drm/nouveau/nouveau_acpi.c -+++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c -@@ -375,9 +375,6 @@ bool nouveau_acpi_rom_supported(struct pci_dev *pdev) - acpi_status status; - acpi_handle dhandle, rom_handle; - -- if (!nouveau_dsm_priv.dsm_detected && !nouveau_dsm_priv.optimus_detected) -- return false; -- - dhandle = DEVICE_ACPI_HANDLE(&pdev->dev); - if (!dhandle) - return false; -diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c -index 12ce044..2c3d5c8 100644 ---- a/drivers/gpu/drm/nouveau/nouveau_bo.c -+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c -@@ -946,7 +946,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) - if (dev_priv->gart_info.type == NOUVEAU_GART_AGP) { - mem->bus.offset = mem->start << PAGE_SHIFT; - mem->bus.base = dev_priv->gart_info.aper_base; -- mem->bus.is_iomem = true; -+ mem->bus.is_iomem = !dev->agp->cant_use_aperture; - } - #endif - break; -diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c -index ed52a6f..2f46bbf 100644 ---- a/drivers/gpu/drm/nouveau/nouveau_gem.c -+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c -@@ -281,7 +281,8 @@ validate_fini_list(struct list_head *list, struct nouveau_fence *fence) - list_for_each_safe(entry, tmp, list) { - nvbo = list_entry(entry, struct nouveau_bo, entry); - -- nouveau_bo_fence(nvbo, fence); -+ if (likely(fence)) -+ nouveau_bo_fence(nvbo, fence); - - if (unlikely(nvbo->validate_mapped)) { - ttm_bo_kunmap(&nvbo->kmap); -diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c -index ebbfbd2..d51c08d 100644 ---- a/drivers/gpu/drm/radeon/atombios_crtc.c -+++ b/drivers/gpu/drm/radeon/atombios_crtc.c -@@ -573,6 +573,11 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, - /* use frac fb div on APUs */ - if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE61(rdev)) - pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV; -+ /* use frac fb div on RS780/RS880 */ -+ if ((rdev->family == CHIP_RS780) || (rdev->family == CHIP_RS880)) -+ pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV; -+ if (ASIC_IS_DCE32(rdev) && mode->clock > 165000) -+ pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV; - } else { - pll->flags |= RADEON_PLL_LEGACY; - -@@ -858,14 +863,16 @@ static void atombios_crtc_program_pll(struct drm_crtc *crtc, - args.v5.ucMiscInfo = 0; /* HDMI depth, etc. */ - if (ss_enabled && (ss->type & ATOM_EXTERNAL_SS_MASK)) - args.v5.ucMiscInfo |= PIXEL_CLOCK_V5_MISC_REF_DIV_SRC; -- switch (bpc) { -- case 8: -- default: -- args.v5.ucMiscInfo |= PIXEL_CLOCK_V5_MISC_HDMI_24BPP; -- break; -- case 10: -- args.v5.ucMiscInfo |= PIXEL_CLOCK_V5_MISC_HDMI_30BPP; -- break; -+ if (encoder_mode == ATOM_ENCODER_MODE_HDMI) { -+ switch (bpc) { -+ case 8: -+ default: -+ args.v5.ucMiscInfo |= PIXEL_CLOCK_V5_MISC_HDMI_24BPP; -+ break; -+ case 10: -+ args.v5.ucMiscInfo |= PIXEL_CLOCK_V5_MISC_HDMI_30BPP; -+ break; -+ } - } - args.v5.ucTransmitterID = encoder_id; - args.v5.ucEncoderMode = encoder_mode; -@@ -880,20 +887,22 @@ static void atombios_crtc_program_pll(struct drm_crtc *crtc, - args.v6.ucMiscInfo = 0; /* HDMI depth, etc. */ - if (ss_enabled && (ss->type & ATOM_EXTERNAL_SS_MASK)) - args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_REF_DIV_SRC; -- switch (bpc) { -- case 8: -- default: -- args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_24BPP; -- break; -- case 10: -- args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_30BPP; -- break; -- case 12: -- args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_36BPP; -- break; -- case 16: -- args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_48BPP; -- break; -+ if (encoder_mode == ATOM_ENCODER_MODE_HDMI) { -+ switch (bpc) { -+ case 8: -+ default: -+ args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_24BPP; -+ break; -+ case 10: -+ args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_30BPP; -+ break; -+ case 12: -+ args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_36BPP; -+ break; -+ case 16: -+ args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_48BPP; -+ break; -+ } - } - args.v6.ucTransmitterID = encoder_id; - args.v6.ucEncoderMode = encoder_mode; -diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c -index 2f755e2..dd5c14e 100644 ---- a/drivers/gpu/drm/radeon/atombios_encoders.c -+++ b/drivers/gpu/drm/radeon/atombios_encoders.c -@@ -1048,7 +1048,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t - } - if (is_dp) - args.v5.ucLaneNum = dp_lane_count; -- else if (radeon_encoder->pixel_clock > 165000) -+ else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) - args.v5.ucLaneNum = 8; - else - args.v5.ucLaneNum = 4; -@@ -1430,7 +1430,7 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) - * does the same thing and more. - */ - if ((rdev->family != CHIP_RV710) && (rdev->family != CHIP_RV730) && -- (rdev->family != CHIP_RS880)) -+ (rdev->family != CHIP_RS780) && (rdev->family != CHIP_RS880)) - atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); - } - if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { -@@ -1666,8 +1666,11 @@ atombios_set_encoder_crtc_source(struct drm_encoder *encoder) - args.v2.ucEncodeMode = ATOM_ENCODER_MODE_CRT; - else - args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder); -- } else -+ } else if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { -+ args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS; -+ } else { - args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder); -+ } - switch (radeon_encoder->encoder_id) { - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: -diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c -index ad72295..df62c39 100644 ---- a/drivers/gpu/drm/radeon/evergreen.c -+++ b/drivers/gpu/drm/radeon/evergreen.c -@@ -1292,7 +1292,7 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s - WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN); - - for (i = 0; i < rdev->num_crtc; i++) { -- if (save->crtc_enabled) { -+ if (save->crtc_enabled[i]) { - if (ASIC_IS_DCE6(rdev)) { - tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]); - tmp |= EVERGREEN_CRTC_BLANK_DATA_EN; -@@ -1874,7 +1874,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) - case CHIP_SUMO: - rdev->config.evergreen.num_ses = 1; - rdev->config.evergreen.max_pipes = 4; -- rdev->config.evergreen.max_tile_pipes = 2; -+ rdev->config.evergreen.max_tile_pipes = 4; - if (rdev->pdev->device == 0x9648) - rdev->config.evergreen.max_simds = 3; - else if ((rdev->pdev->device == 0x9647) || -@@ -1963,7 +1963,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) - break; - case CHIP_CAICOS: - rdev->config.evergreen.num_ses = 1; -- rdev->config.evergreen.max_pipes = 4; -+ rdev->config.evergreen.max_pipes = 2; - rdev->config.evergreen.max_tile_pipes = 2; - rdev->config.evergreen.max_simds = 2; - rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses; -@@ -3219,6 +3219,8 @@ static int evergreen_startup(struct radeon_device *rdev) - /* enable pcie gen2 link */ - evergreen_pcie_gen2_enable(rdev); - -+ evergreen_mc_program(rdev); -+ - if (ASIC_IS_DCE5(rdev)) { - if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) { - r = ni_init_microcode(rdev); -@@ -3246,7 +3248,6 @@ static int evergreen_startup(struct radeon_device *rdev) - if (r) - return r; - -- evergreen_mc_program(rdev); - if (rdev->flags & RADEON_IS_AGP) { - evergreen_agp_enable(rdev); - } else { -diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c -index 2cbd369..7b4cfc54 100644 ---- a/drivers/gpu/drm/radeon/evergreen_cs.c -+++ b/drivers/gpu/drm/radeon/evergreen_cs.c -@@ -942,7 +942,10 @@ static int evergreen_cs_track_check(struct radeon_cs_parser *p) - if (track->cb_dirty) { - tmp = track->cb_target_mask; - for (i = 0; i < 8; i++) { -- if ((tmp >> (i * 4)) & 0xF) { -+ u32 format = G_028C70_FORMAT(track->cb_color_info[i]); -+ -+ if (format != V_028C70_COLOR_INVALID && -+ (tmp >> (i * 4)) & 0xF) { - /* at least one component is enabled */ - if (track->cb_color_bo[i] == NULL) { - dev_warn(p->dev, "%s:%d mask 0x%08X | 0x%08X no cb for %d\n", -diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c -index f5387b3..461262e 100644 ---- a/drivers/gpu/drm/radeon/ni.c -+++ b/drivers/gpu/drm/radeon/ni.c -@@ -672,6 +672,10 @@ static void cayman_gpu_init(struct radeon_device *rdev) - (rdev->pdev->device == 0x999C)) { - rdev->config.cayman.max_simds_per_se = 6; - rdev->config.cayman.max_backends_per_se = 2; -+ rdev->config.cayman.max_hw_contexts = 8; -+ rdev->config.cayman.sx_max_export_size = 256; -+ rdev->config.cayman.sx_max_export_pos_size = 64; -+ rdev->config.cayman.sx_max_export_smx_size = 192; - } else if ((rdev->pdev->device == 0x9903) || - (rdev->pdev->device == 0x9904) || - (rdev->pdev->device == 0x990A) || -@@ -682,6 +686,10 @@ static void cayman_gpu_init(struct radeon_device *rdev) - (rdev->pdev->device == 0x999D)) { - rdev->config.cayman.max_simds_per_se = 4; - rdev->config.cayman.max_backends_per_se = 2; -+ rdev->config.cayman.max_hw_contexts = 8; -+ rdev->config.cayman.sx_max_export_size = 256; -+ rdev->config.cayman.sx_max_export_pos_size = 64; -+ rdev->config.cayman.sx_max_export_smx_size = 192; - } else if ((rdev->pdev->device == 0x9919) || - (rdev->pdev->device == 0x9990) || - (rdev->pdev->device == 0x9991) || -@@ -692,9 +700,17 @@ static void cayman_gpu_init(struct radeon_device *rdev) - (rdev->pdev->device == 0x99A0)) { - rdev->config.cayman.max_simds_per_se = 3; - rdev->config.cayman.max_backends_per_se = 1; -+ rdev->config.cayman.max_hw_contexts = 4; -+ rdev->config.cayman.sx_max_export_size = 128; -+ rdev->config.cayman.sx_max_export_pos_size = 32; -+ rdev->config.cayman.sx_max_export_smx_size = 96; - } else { - rdev->config.cayman.max_simds_per_se = 2; - rdev->config.cayman.max_backends_per_se = 1; -+ rdev->config.cayman.max_hw_contexts = 4; -+ rdev->config.cayman.sx_max_export_size = 128; -+ rdev->config.cayman.sx_max_export_pos_size = 32; -+ rdev->config.cayman.sx_max_export_smx_size = 96; - } - rdev->config.cayman.max_texture_channel_caches = 2; - rdev->config.cayman.max_gprs = 256; -@@ -702,10 +718,6 @@ static void cayman_gpu_init(struct radeon_device *rdev) - rdev->config.cayman.max_gs_threads = 32; - rdev->config.cayman.max_stack_entries = 512; - rdev->config.cayman.sx_num_of_sets = 8; -- rdev->config.cayman.sx_max_export_size = 256; -- rdev->config.cayman.sx_max_export_pos_size = 64; -- rdev->config.cayman.sx_max_export_smx_size = 192; -- rdev->config.cayman.max_hw_contexts = 8; - rdev->config.cayman.sq_num_cf_insts = 2; - - rdev->config.cayman.sc_prim_fifo_size = 0x40; -@@ -1540,6 +1552,8 @@ static int cayman_startup(struct radeon_device *rdev) - /* enable pcie gen2 link */ - evergreen_pcie_gen2_enable(rdev); - -+ evergreen_mc_program(rdev); -+ - if (rdev->flags & RADEON_IS_IGP) { - if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { - r = ni_init_microcode(rdev); -@@ -1568,7 +1582,6 @@ static int cayman_startup(struct radeon_device *rdev) - if (r) - return r; - -- evergreen_mc_program(rdev); - r = cayman_pcie_gart_enable(rdev); - if (r) - return r; -diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c -index 8c403d9..1555cd6 100644 ---- a/drivers/gpu/drm/radeon/r600.c -+++ b/drivers/gpu/drm/radeon/r600.c -@@ -2313,14 +2313,17 @@ void r600_fence_ring_emit(struct radeon_device *rdev, - struct radeon_fence *fence) - { - struct radeon_ring *ring = &rdev->ring[fence->ring]; -+ u32 cp_coher_cntl = PACKET3_TC_ACTION_ENA | PACKET3_VC_ACTION_ENA | -+ PACKET3_SH_ACTION_ENA; -+ -+ if (rdev->family >= CHIP_RV770) -+ cp_coher_cntl |= PACKET3_FULL_CACHE_ENA; - - if (rdev->wb.use_event) { - u64 addr = rdev->fence_drv[fence->ring].gpu_addr; - /* flush read cache over gart */ - radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); -- radeon_ring_write(ring, PACKET3_TC_ACTION_ENA | -- PACKET3_VC_ACTION_ENA | -- PACKET3_SH_ACTION_ENA); -+ radeon_ring_write(ring, cp_coher_cntl); - radeon_ring_write(ring, 0xFFFFFFFF); - radeon_ring_write(ring, 0); - radeon_ring_write(ring, 10); /* poll interval */ -@@ -2334,9 +2337,7 @@ void r600_fence_ring_emit(struct radeon_device *rdev, - } else { - /* flush read cache over gart */ - radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); -- radeon_ring_write(ring, PACKET3_TC_ACTION_ENA | -- PACKET3_VC_ACTION_ENA | -- PACKET3_SH_ACTION_ENA); -+ radeon_ring_write(ring, cp_coher_cntl); - radeon_ring_write(ring, 0xFFFFFFFF); - radeon_ring_write(ring, 0); - radeon_ring_write(ring, 10); /* poll interval */ -@@ -2430,6 +2431,8 @@ int r600_startup(struct radeon_device *rdev) - /* enable pcie gen2 link */ - r600_pcie_gen2_enable(rdev); - -+ r600_mc_program(rdev); -+ - if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { - r = r600_init_microcode(rdev); - if (r) { -@@ -2442,7 +2445,6 @@ int r600_startup(struct radeon_device *rdev) - if (r) - return r; - -- r600_mc_program(rdev); - if (rdev->flags & RADEON_IS_AGP) { - r600_agp_enable(rdev); - } else { -diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c -index b8e12af3..3cd9b0e 100644 ---- a/drivers/gpu/drm/radeon/r600_cs.c -+++ b/drivers/gpu/drm/radeon/r600_cs.c -@@ -747,7 +747,10 @@ static int r600_cs_track_check(struct radeon_cs_parser *p) - if (track->cb_dirty) { - tmp = track->cb_target_mask; - for (i = 0; i < 8; i++) { -- if ((tmp >> (i * 4)) & 0xF) { -+ u32 format = G_0280A0_FORMAT(track->cb_color_info[i]); -+ -+ if (format != V_0280A0_COLOR_INVALID && -+ (tmp >> (i * 4)) & 0xF) { - /* at least one component is enabled */ - if (track->cb_color_bo[i] == NULL) { - dev_warn(p->dev, "%s:%d mask 0x%08X | 0x%08X no cb for %d\n", -diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c -index 0b59206..61ffe3c 100644 ---- a/drivers/gpu/drm/radeon/r600_hdmi.c -+++ b/drivers/gpu/drm/radeon/r600_hdmi.c -@@ -530,7 +530,7 @@ void r600_hdmi_enable(struct drm_encoder *encoder) - WREG32_P(radeon_encoder->hdmi_config_offset + 0x4, 0x1, ~0x1); - } else if (ASIC_IS_DCE3(rdev)) { - /* TODO */ -- } else if (rdev->family >= CHIP_R600) { -+ } else if (ASIC_IS_DCE2(rdev)) { - switch (radeon_encoder->encoder_id) { - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: - WREG32_P(AVIVO_TMDSA_CNTL, AVIVO_TMDSA_CNTL_HDMI_EN, -@@ -602,7 +602,7 @@ void r600_hdmi_disable(struct drm_encoder *encoder) - WREG32_P(radeon_encoder->hdmi_config_offset + 0xc, 0, ~0x1); - } else if (ASIC_IS_DCE32(rdev)) { - WREG32_P(radeon_encoder->hdmi_config_offset + 0x4, 0, ~0x1); -- } else if (rdev->family >= CHIP_R600 && !ASIC_IS_DCE3(rdev)) { -+ } else if (ASIC_IS_DCE2(rdev) && !ASIC_IS_DCE3(rdev)) { - switch (radeon_encoder->encoder_id) { - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: - WREG32_P(AVIVO_TMDSA_CNTL, 0, -diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h -index 12ceb82..02bb238 100644 ---- a/drivers/gpu/drm/radeon/r600d.h -+++ b/drivers/gpu/drm/radeon/r600d.h -@@ -873,6 +873,7 @@ - #define PACKET3_INDIRECT_BUFFER 0x32 - #define PACKET3_SURFACE_SYNC 0x43 - # define PACKET3_CB0_DEST_BASE_ENA (1 << 6) -+# define PACKET3_FULL_CACHE_ENA (1 << 20) /* r7xx+ only */ - # define PACKET3_TC_ACTION_ENA (1 << 23) - # define PACKET3_VC_ACTION_ENA (1 << 24) - # define PACKET3_CB_ACTION_ENA (1 << 25) -diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c -index c54d295..1ce6743 100644 ---- a/drivers/gpu/drm/radeon/radeon_atombios.c -+++ b/drivers/gpu/drm/radeon/radeon_atombios.c -@@ -463,6 +463,13 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, - } - } - -+ /* Fujitsu D3003-S2 board lists DVI-I as DVI-I and VGA */ -+ if ((dev->pdev->device == 0x9805) && -+ (dev->pdev->subsystem_vendor == 0x1734) && -+ (dev->pdev->subsystem_device == 0x11bd)) { -+ if (*connector_type == DRM_MODE_CONNECTOR_VGA) -+ return false; -+ } - - return true; - } -@@ -2785,6 +2792,10 @@ void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev) - /* tell the bios not to handle mode switching */ - bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH; - -+ /* clear the vbios dpms state */ -+ if (ASIC_IS_DCE4(rdev)) -+ bios_2_scratch &= ~ATOM_S2_DEVICE_DPMS_STATE; -+ - if (rdev->family >= CHIP_R600) { - WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch); - WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch); -diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c -index 2a2cf0b..428bce6 100644 ---- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c -+++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c -@@ -202,6 +202,13 @@ static bool radeon_atpx_detect(void) - has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); - } - -+ /* some newer PX laptops mark the dGPU as a non-VGA display device */ -+ while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) { -+ vga_count++; -+ -+ has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); -+ } -+ - if (has_atpx && vga_count == 2) { - acpi_get_name(radeon_atpx_priv.atpx_handle, ACPI_FULL_PATHNAME, &buffer); - printk(KERN_INFO "VGA switcheroo: detected switching method %s handle\n", -diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c -index 07d0bcd..cf5dd63 100644 ---- a/drivers/gpu/drm/radeon/radeon_combios.c -+++ b/drivers/gpu/drm/radeon/radeon_combios.c -@@ -898,10 +898,14 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct - } - - /* quirks */ -+ /* Radeon 7000 (RV100) */ -+ if (((dev->pdev->device == 0x5159) && -+ (dev->pdev->subsystem_vendor == 0x174B) && -+ (dev->pdev->subsystem_device == 0x7c28)) || - /* Radeon 9100 (R200) */ -- if ((dev->pdev->device == 0x514D) && -+ ((dev->pdev->device == 0x514D) && - (dev->pdev->subsystem_vendor == 0x174B) && -- (dev->pdev->subsystem_device == 0x7149)) { -+ (dev->pdev->subsystem_device == 0x7149))) { - /* vbios value is bad, use the default */ - found = 0; - } -@@ -1484,6 +1488,9 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) - of_machine_is_compatible("PowerBook6,7")) { - /* ibook */ - rdev->mode_info.connector_table = CT_IBOOK; -+ } else if (of_machine_is_compatible("PowerMac3,5")) { -+ /* PowerMac G4 Silver radeon 7500 */ -+ rdev->mode_info.connector_table = CT_MAC_G4_SILVER; - } else if (of_machine_is_compatible("PowerMac4,4")) { - /* emac */ - rdev->mode_info.connector_table = CT_EMAC; -@@ -1509,6 +1516,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) - (rdev->pdev->subsystem_device == 0x4150)) { - /* Mac G5 tower 9600 */ - rdev->mode_info.connector_table = CT_MAC_G5_9600; -+ } else if ((rdev->pdev->device == 0x4c66) && -+ (rdev->pdev->subsystem_vendor == 0x1002) && -+ (rdev->pdev->subsystem_device == 0x4c66)) { -+ /* SAM440ep RV250 embedded board */ -+ rdev->mode_info.connector_table = CT_SAM440EP; - } else - #endif /* CONFIG_PPC_PMAC */ - #ifdef CONFIG_PPC64 -@@ -2082,6 +2094,115 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) - CONNECTOR_OBJECT_ID_SVIDEO, - &hpd); - break; -+ case CT_SAM440EP: -+ DRM_INFO("Connector Table: %d (SAM440ep embedded board)\n", -+ rdev->mode_info.connector_table); -+ /* LVDS */ -+ ddc_i2c = combios_setup_i2c_bus(rdev, DDC_NONE_DETECTED, 0, 0); -+ hpd.hpd = RADEON_HPD_NONE; -+ radeon_add_legacy_encoder(dev, -+ radeon_get_encoder_enum(dev, -+ ATOM_DEVICE_LCD1_SUPPORT, -+ 0), -+ ATOM_DEVICE_LCD1_SUPPORT); -+ radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_LCD1_SUPPORT, -+ DRM_MODE_CONNECTOR_LVDS, &ddc_i2c, -+ CONNECTOR_OBJECT_ID_LVDS, -+ &hpd); -+ /* DVI-I - secondary dac, int tmds */ -+ ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0); -+ hpd.hpd = RADEON_HPD_1; /* ??? */ -+ radeon_add_legacy_encoder(dev, -+ radeon_get_encoder_enum(dev, -+ ATOM_DEVICE_DFP1_SUPPORT, -+ 0), -+ ATOM_DEVICE_DFP1_SUPPORT); -+ radeon_add_legacy_encoder(dev, -+ radeon_get_encoder_enum(dev, -+ ATOM_DEVICE_CRT2_SUPPORT, -+ 2), -+ ATOM_DEVICE_CRT2_SUPPORT); -+ radeon_add_legacy_connector(dev, 1, -+ ATOM_DEVICE_DFP1_SUPPORT | -+ ATOM_DEVICE_CRT2_SUPPORT, -+ DRM_MODE_CONNECTOR_DVII, &ddc_i2c, -+ CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I, -+ &hpd); -+ /* VGA - primary dac */ -+ ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0); -+ hpd.hpd = RADEON_HPD_NONE; -+ radeon_add_legacy_encoder(dev, -+ radeon_get_encoder_enum(dev, -+ ATOM_DEVICE_CRT1_SUPPORT, -+ 1), -+ ATOM_DEVICE_CRT1_SUPPORT); -+ radeon_add_legacy_connector(dev, 2, -+ ATOM_DEVICE_CRT1_SUPPORT, -+ DRM_MODE_CONNECTOR_VGA, &ddc_i2c, -+ CONNECTOR_OBJECT_ID_VGA, -+ &hpd); -+ /* TV - TV DAC */ -+ ddc_i2c.valid = false; -+ hpd.hpd = RADEON_HPD_NONE; -+ radeon_add_legacy_encoder(dev, -+ radeon_get_encoder_enum(dev, -+ ATOM_DEVICE_TV1_SUPPORT, -+ 2), -+ ATOM_DEVICE_TV1_SUPPORT); -+ radeon_add_legacy_connector(dev, 3, ATOM_DEVICE_TV1_SUPPORT, -+ DRM_MODE_CONNECTOR_SVIDEO, -+ &ddc_i2c, -+ CONNECTOR_OBJECT_ID_SVIDEO, -+ &hpd); -+ break; -+ case CT_MAC_G4_SILVER: -+ DRM_INFO("Connector Table: %d (mac g4 silver)\n", -+ rdev->mode_info.connector_table); -+ /* DVI-I - tv dac, int tmds */ -+ ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0); -+ hpd.hpd = RADEON_HPD_1; /* ??? */ -+ radeon_add_legacy_encoder(dev, -+ radeon_get_encoder_enum(dev, -+ ATOM_DEVICE_DFP1_SUPPORT, -+ 0), -+ ATOM_DEVICE_DFP1_SUPPORT); -+ radeon_add_legacy_encoder(dev, -+ radeon_get_encoder_enum(dev, -+ ATOM_DEVICE_CRT2_SUPPORT, -+ 2), -+ ATOM_DEVICE_CRT2_SUPPORT); -+ radeon_add_legacy_connector(dev, 0, -+ ATOM_DEVICE_DFP1_SUPPORT | -+ ATOM_DEVICE_CRT2_SUPPORT, -+ DRM_MODE_CONNECTOR_DVII, &ddc_i2c, -+ CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I, -+ &hpd); -+ /* VGA - primary dac */ -+ ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0); -+ hpd.hpd = RADEON_HPD_NONE; -+ radeon_add_legacy_encoder(dev, -+ radeon_get_encoder_enum(dev, -+ ATOM_DEVICE_CRT1_SUPPORT, -+ 1), -+ ATOM_DEVICE_CRT1_SUPPORT); -+ radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_CRT1_SUPPORT, -+ DRM_MODE_CONNECTOR_VGA, &ddc_i2c, -+ CONNECTOR_OBJECT_ID_VGA, -+ &hpd); -+ /* TV - TV DAC */ -+ ddc_i2c.valid = false; -+ hpd.hpd = RADEON_HPD_NONE; -+ radeon_add_legacy_encoder(dev, -+ radeon_get_encoder_enum(dev, -+ ATOM_DEVICE_TV1_SUPPORT, -+ 2), -+ ATOM_DEVICE_TV1_SUPPORT); -+ radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT, -+ DRM_MODE_CONNECTOR_SVIDEO, -+ &ddc_i2c, -+ CONNECTOR_OBJECT_ID_SVIDEO, -+ &hpd); -+ break; - default: - DRM_INFO("Connector table: %d (invalid)\n", - rdev->mode_info.connector_table); -diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c -index ab63bcd..9184bbe 100644 ---- a/drivers/gpu/drm/radeon/radeon_connectors.c -+++ b/drivers/gpu/drm/radeon/radeon_connectors.c -@@ -1279,7 +1279,7 @@ bool radeon_connector_is_dp12_capable(struct drm_connector *connector) - struct radeon_device *rdev = dev->dev_private; - - if (ASIC_IS_DCE5(rdev) && -- (rdev->clock.dp_extclk >= 53900) && -+ (rdev->clock.default_dispclk >= 53900) && - radeon_connector_encoder_is_hbr2(connector)) { - return true; - } -@@ -1423,6 +1423,24 @@ struct drm_connector_funcs radeon_dp_connector_funcs = { - .force = radeon_dvi_force, - }; - -+static const struct drm_connector_funcs radeon_edp_connector_funcs = { -+ .dpms = drm_helper_connector_dpms, -+ .detect = radeon_dp_detect, -+ .fill_modes = drm_helper_probe_single_connector_modes, -+ .set_property = radeon_lvds_set_property, -+ .destroy = radeon_dp_connector_destroy, -+ .force = radeon_dvi_force, -+}; -+ -+static const struct drm_connector_funcs radeon_lvds_bridge_connector_funcs = { -+ .dpms = drm_helper_connector_dpms, -+ .detect = radeon_dp_detect, -+ .fill_modes = drm_helper_probe_single_connector_modes, -+ .set_property = radeon_lvds_set_property, -+ .destroy = radeon_dp_connector_destroy, -+ .force = radeon_dvi_force, -+}; -+ - void - radeon_add_atom_connector(struct drm_device *dev, - uint32_t connector_id, -@@ -1514,8 +1532,6 @@ radeon_add_atom_connector(struct drm_device *dev, - goto failed; - radeon_dig_connector->igp_lane_info = igp_lane_info; - radeon_connector->con_priv = radeon_dig_connector; -- drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); -- drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); - if (i2c_bus->valid) { - /* add DP i2c bus */ - if (connector_type == DRM_MODE_CONNECTOR_eDP) -@@ -1532,6 +1548,10 @@ radeon_add_atom_connector(struct drm_device *dev, - case DRM_MODE_CONNECTOR_VGA: - case DRM_MODE_CONNECTOR_DVIA: - default: -+ drm_connector_init(dev, &radeon_connector->base, -+ &radeon_dp_connector_funcs, connector_type); -+ drm_connector_helper_add(&radeon_connector->base, -+ &radeon_dp_connector_helper_funcs); - connector->interlace_allowed = true; - connector->doublescan_allowed = true; - radeon_connector->dac_load_detect = true; -@@ -1544,6 +1564,10 @@ radeon_add_atom_connector(struct drm_device *dev, - case DRM_MODE_CONNECTOR_HDMIA: - case DRM_MODE_CONNECTOR_HDMIB: - case DRM_MODE_CONNECTOR_DisplayPort: -+ drm_connector_init(dev, &radeon_connector->base, -+ &radeon_dp_connector_funcs, connector_type); -+ drm_connector_helper_add(&radeon_connector->base, -+ &radeon_dp_connector_helper_funcs); - drm_connector_attach_property(&radeon_connector->base, - rdev->mode_info.underscan_property, - UNDERSCAN_OFF); -@@ -1568,6 +1592,10 @@ radeon_add_atom_connector(struct drm_device *dev, - break; - case DRM_MODE_CONNECTOR_LVDS: - case DRM_MODE_CONNECTOR_eDP: -+ drm_connector_init(dev, &radeon_connector->base, -+ &radeon_lvds_bridge_connector_funcs, connector_type); -+ drm_connector_helper_add(&radeon_connector->base, -+ &radeon_dp_connector_helper_funcs); - drm_connector_attach_property(&radeon_connector->base, - dev->mode_config.scaling_mode_property, - DRM_MODE_SCALE_FULLSCREEN); -@@ -1731,7 +1759,7 @@ radeon_add_atom_connector(struct drm_device *dev, - goto failed; - radeon_dig_connector->igp_lane_info = igp_lane_info; - radeon_connector->con_priv = radeon_dig_connector; -- drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); -+ drm_connector_init(dev, &radeon_connector->base, &radeon_edp_connector_funcs, connector_type); - drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); - if (i2c_bus->valid) { - /* add DP i2c bus */ -diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c -index 00d9cac..adc9bfd 100644 ---- a/drivers/gpu/drm/radeon/radeon_display.c -+++ b/drivers/gpu/drm/radeon/radeon_display.c -@@ -709,6 +709,10 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector) - struct radeon_device *rdev = dev->dev_private; - int ret = 0; - -+ /* don't leak the edid if we already fetched it in detect() */ -+ if (radeon_connector->edid) -+ goto got_edid; -+ - /* on hw with routers, select right port */ - if (radeon_connector->router.ddc_valid) - radeon_router_select_ddc_port(radeon_connector); -@@ -748,8 +752,10 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector) - radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev); - } - if (radeon_connector->edid) { -+got_edid: - drm_mode_connector_update_edid_property(&radeon_connector->base, radeon_connector->edid); - ret = drm_add_edid_modes(&radeon_connector->base, radeon_connector->edid); -+ drm_edid_to_eld(&radeon_connector->base, radeon_connector->edid); - return ret; - } - drm_mode_connector_update_edid_property(&radeon_connector->base, NULL); -diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c -index 6076e85..19d68c5 100644 ---- a/drivers/gpu/drm/radeon/radeon_i2c.c -+++ b/drivers/gpu/drm/radeon/radeon_i2c.c -@@ -1020,6 +1020,9 @@ void radeon_i2c_destroy(struct radeon_i2c_chan *i2c) - /* Add the default buses */ - void radeon_i2c_init(struct radeon_device *rdev) - { -+ if (radeon_hw_i2c) -+ DRM_INFO("hw_i2c forced on, you may experience display detection problems!\n"); -+ - if (rdev->is_atom_bios) - radeon_atombios_i2c_init(rdev); - else -diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c -index 3c2628b..9b46238 100644 ---- a/drivers/gpu/drm/radeon/radeon_kms.c -+++ b/drivers/gpu/drm/radeon/radeon_kms.c -@@ -39,8 +39,12 @@ int radeon_driver_unload_kms(struct drm_device *dev) - - if (rdev == NULL) - return 0; -+ if (rdev->rmmio == NULL) -+ goto done_free; - radeon_modeset_fini(rdev); - radeon_device_fini(rdev); -+ -+done_free: - kfree(rdev); - dev->dev_private = NULL; - return 0; -diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c -index 9760e5a..b44bbf5 100644 ---- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c -+++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c -@@ -416,6 +416,7 @@ int radeon_crtc_do_set_base(struct drm_crtc *crtc, - /* Pin framebuffer & get tilling informations */ - obj = radeon_fb->obj; - rbo = gem_to_radeon_bo(obj); -+retry: - r = radeon_bo_reserve(rbo, false); - if (unlikely(r != 0)) - return r; -@@ -424,6 +425,33 @@ int radeon_crtc_do_set_base(struct drm_crtc *crtc, - &base); - if (unlikely(r != 0)) { - radeon_bo_unreserve(rbo); -+ -+ /* On old GPU like RN50 with little vram pining can fails because -+ * current fb is taking all space needed. So instead of unpining -+ * the old buffer after pining the new one, first unpin old one -+ * and then retry pining new one. -+ * -+ * As only master can set mode only master can pin and it is -+ * unlikely the master client will race with itself especialy -+ * on those old gpu with single crtc. -+ * -+ * We don't shutdown the display controller because new buffer -+ * will end up in same spot. -+ */ -+ if (!atomic && fb && fb != crtc->fb) { -+ struct radeon_bo *old_rbo; -+ unsigned long nsize, osize; -+ -+ old_rbo = gem_to_radeon_bo(to_radeon_framebuffer(fb)->obj); -+ osize = radeon_bo_size(old_rbo); -+ nsize = radeon_bo_size(rbo); -+ if (nsize <= osize && !radeon_bo_reserve(old_rbo, false)) { -+ radeon_bo_unpin(old_rbo); -+ radeon_bo_unreserve(old_rbo); -+ fb = NULL; -+ goto retry; -+ } -+ } - return -EINVAL; - } - radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL); -diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h -index dabfefd..65da706 100644 ---- a/drivers/gpu/drm/radeon/radeon_mode.h -+++ b/drivers/gpu/drm/radeon/radeon_mode.h -@@ -210,6 +210,8 @@ enum radeon_connector_table { - CT_RN50_POWER, - CT_MAC_X800, - CT_MAC_G5_9600, -+ CT_SAM440EP, -+ CT_MAC_G4_SILVER - }; - - enum radeon_dvo_chip { -diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c -index bf6ca2d..4c5a793 100644 ---- a/drivers/gpu/drm/radeon/radeon_pm.c -+++ b/drivers/gpu/drm/radeon/radeon_pm.c -@@ -587,8 +587,10 @@ void radeon_pm_resume(struct radeon_device *rdev) - rdev->pm.current_clock_mode_index = 0; - rdev->pm.current_sclk = rdev->pm.default_sclk; - rdev->pm.current_mclk = rdev->pm.default_mclk; -- rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; -- rdev->pm.current_vddci = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.vddci; -+ if (rdev->pm.power_state) { -+ rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; -+ rdev->pm.current_vddci = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.vddci; -+ } - if (rdev->pm.pm_method == PM_METHOD_DYNPM - && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) { - rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; -diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c -index 5248001..739eb0d 100644 ---- a/drivers/gpu/drm/radeon/rs600.c -+++ b/drivers/gpu/drm/radeon/rs600.c -@@ -539,8 +539,10 @@ int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) - return -EINVAL; - } - addr = addr & 0xFFFFFFFFFFFFF000ULL; -- addr |= R600_PTE_VALID | R600_PTE_SYSTEM | R600_PTE_SNOOPED; -- addr |= R600_PTE_READABLE | R600_PTE_WRITEABLE; -+ if (addr != rdev->dummy_page.addr) -+ addr |= R600_PTE_VALID | R600_PTE_READABLE | -+ R600_PTE_WRITEABLE; -+ addr |= R600_PTE_SYSTEM | R600_PTE_SNOOPED; - writeq(addr, ptr + (i * 8)); - return 0; - } -diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c -index 4a3937f..1ec1255 100644 ---- a/drivers/gpu/drm/radeon/rv770.c -+++ b/drivers/gpu/drm/radeon/rv770.c -@@ -1058,6 +1058,8 @@ static int rv770_startup(struct radeon_device *rdev) - /* enable pcie gen2 link */ - rv770_pcie_gen2_enable(rdev); - -+ rv770_mc_program(rdev); -+ - if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { - r = r600_init_microcode(rdev); - if (r) { -@@ -1070,7 +1072,6 @@ static int rv770_startup(struct radeon_device *rdev) - if (r) - return r; - -- rv770_mc_program(rdev); - if (rdev->flags & RADEON_IS_AGP) { - rv770_agp_enable(rdev); - } else { -diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c -index bd1f18c..e710073 100644 ---- a/drivers/gpu/drm/radeon/si.c -+++ b/drivers/gpu/drm/radeon/si.c -@@ -2479,8 +2479,15 @@ static int si_mc_init(struct radeon_device *rdev) - rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); - rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); - /* size in MB on si */ -- rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; -- rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; -+ tmp = RREG32(CONFIG_MEMSIZE); -+ /* some boards may have garbage in the upper 16 bits */ -+ if (tmp & 0xffff0000) { -+ DRM_INFO("Probable bad vram size: 0x%08x\n", tmp); -+ if (tmp & 0xffff) -+ tmp &= 0xffff; -+ } -+ rdev->mc.mc_vram_size = tmp * 1024ULL * 1024ULL; -+ rdev->mc.real_vram_size = rdev->mc.mc_vram_size; - rdev->mc.visible_vram_size = rdev->mc.aper_size; - si_vram_gtt_location(rdev, &rdev->mc); - radeon_update_bandwidth_info(rdev); -@@ -3827,6 +3834,8 @@ static int si_startup(struct radeon_device *rdev) - struct radeon_ring *ring; - int r; - -+ si_mc_program(rdev); -+ - if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw || - !rdev->rlc_fw || !rdev->mc_fw) { - r = si_init_microcode(rdev); -@@ -3846,7 +3855,6 @@ static int si_startup(struct radeon_device *rdev) - if (r) - return r; - -- si_mc_program(rdev); - r = si_pcie_gart_enable(rdev); - if (r) - return r; -diff --git a/drivers/gpu/drm/radeon/sid.h b/drivers/gpu/drm/radeon/sid.h -index 1767ae7..a9fcbe4 100644 ---- a/drivers/gpu/drm/radeon/sid.h -+++ b/drivers/gpu/drm/radeon/sid.h -@@ -165,7 +165,7 @@ - #define NOOFGROUPS_SHIFT 12 - #define NOOFGROUPS_MASK 0x00001000 - --#define MC_SEQ_TRAIN_WAKEUP_CNTL 0x2808 -+#define MC_SEQ_TRAIN_WAKEUP_CNTL 0x28e8 - #define TRAIN_DONE_D0 (1 << 30) - #define TRAIN_DONE_D1 (1 << 31) - -diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c -index 8b73ae8..a67e61b 100644 ---- a/drivers/gpu/drm/ttm/ttm_bo.c -+++ b/drivers/gpu/drm/ttm/ttm_bo.c -@@ -430,9 +430,11 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo, - - moved: - if (bo->evicted) { -- ret = bdev->driver->invalidate_caches(bdev, bo->mem.placement); -- if (ret) -- pr_err("Can not flush read caches\n"); -+ if (bdev->driver->invalidate_caches) { -+ ret = bdev->driver->invalidate_caches(bdev, bo->mem.placement); -+ if (ret) -+ pr_err("Can not flush read caches\n"); -+ } - bo->evicted = false; - } - -@@ -1089,24 +1091,32 @@ int ttm_bo_move_buffer(struct ttm_buffer_object *bo, - return ret; - } - --static int ttm_bo_mem_compat(struct ttm_placement *placement, -- struct ttm_mem_reg *mem) -+static bool ttm_bo_mem_compat(struct ttm_placement *placement, -+ struct ttm_mem_reg *mem, -+ uint32_t *new_flags) - { - int i; - - if (mem->mm_node && placement->lpfn != 0 && - (mem->start < placement->fpfn || - mem->start + mem->num_pages > placement->lpfn)) -- return -1; -+ return false; - - for (i = 0; i < placement->num_placement; i++) { -- if ((placement->placement[i] & mem->placement & -- TTM_PL_MASK_CACHING) && -- (placement->placement[i] & mem->placement & -- TTM_PL_MASK_MEM)) -- return i; -+ *new_flags = placement->placement[i]; -+ if ((*new_flags & mem->placement & TTM_PL_MASK_CACHING) && -+ (*new_flags & mem->placement & TTM_PL_MASK_MEM)) -+ return true; - } -- return -1; -+ -+ for (i = 0; i < placement->num_busy_placement; i++) { -+ *new_flags = placement->busy_placement[i]; -+ if ((*new_flags & mem->placement & TTM_PL_MASK_CACHING) && -+ (*new_flags & mem->placement & TTM_PL_MASK_MEM)) -+ return true; -+ } -+ -+ return false; - } - - int ttm_bo_validate(struct ttm_buffer_object *bo, -@@ -1115,6 +1125,7 @@ int ttm_bo_validate(struct ttm_buffer_object *bo, - bool no_wait_gpu) - { - int ret; -+ uint32_t new_flags; - - BUG_ON(!atomic_read(&bo->reserved)); - /* Check that range is valid */ -@@ -1125,8 +1136,7 @@ int ttm_bo_validate(struct ttm_buffer_object *bo, - /* - * Check whether we need to move buffer. - */ -- ret = ttm_bo_mem_compat(placement, &bo->mem); -- if (ret < 0) { -+ if (!ttm_bo_mem_compat(placement, &bo->mem, &new_flags)) { - ret = ttm_bo_move_buffer(bo, placement, interruptible, no_wait_reserve, no_wait_gpu); - if (ret) - return ret; -@@ -1135,7 +1145,7 @@ int ttm_bo_validate(struct ttm_buffer_object *bo, - * Use the access and other non-mapping-related flag bits from - * the compatible memory placement flags to the active flags - */ -- ttm_flag_masked(&bo->mem.placement, placement->placement[ret], -+ ttm_flag_masked(&bo->mem.placement, new_flags, - ~TTM_PL_MASK_MEMTYPE); - } - /* -diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c -index f8187ea..2d69262 100644 ---- a/drivers/gpu/drm/ttm/ttm_bo_util.c -+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c -@@ -342,7 +342,9 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo, - if (old_iomap == NULL && ttm == NULL) - goto out2; - -- if (ttm->state == tt_unpopulated) { -+ /* TTM might be null for moves within the same region. -+ */ -+ if (ttm && ttm->state == tt_unpopulated) { - ret = ttm->bdev->driver->ttm_tt_populate(ttm); - if (ret) - goto out1; -diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c -index 3c447bf..7fc3dc7 100644 ---- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c -+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c -@@ -147,7 +147,7 @@ static int vmw_fb_check_var(struct fb_var_screeninfo *var, - } - - if (!vmw_kms_validate_mode_vram(vmw_priv, -- info->fix.line_length, -+ var->xres * var->bits_per_pixel/8, - var->yoffset + var->yres)) { - DRM_ERROR("Requested geom can not fit in framebuffer\n"); - return -EINVAL; -@@ -162,6 +162,8 @@ static int vmw_fb_set_par(struct fb_info *info) - struct vmw_private *vmw_priv = par->vmw_priv; - int ret; - -+ info->fix.line_length = info->var.xres * info->var.bits_per_pixel/8; -+ - ret = vmw_kms_write_svga(vmw_priv, info->var.xres, info->var.yres, - info->fix.line_length, - par->bpp, par->depth); -diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c -index a0c2f12..decca82 100644 ---- a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c -+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c -@@ -163,8 +163,9 @@ void vmw_fifo_release(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) - - mutex_lock(&dev_priv->hw_mutex); - -+ vmw_write(dev_priv, SVGA_REG_SYNC, SVGA_SYNC_GENERIC); - while (vmw_read(dev_priv, SVGA_REG_BUSY) != 0) -- vmw_write(dev_priv, SVGA_REG_SYNC, SVGA_SYNC_GENERIC); -+ ; - - dev_priv->last_read_seqno = ioread32(fifo_mem + SVGA_FIFO_FENCE); - -diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c -index 899c712..ddb83d3 100644 ---- a/drivers/hid/hid-apple.c -+++ b/drivers/hid/hid-apple.c -@@ -48,6 +48,12 @@ module_param(iso_layout, uint, 0644); - MODULE_PARM_DESC(iso_layout, "Enable/Disable hardcoded ISO-layout of the keyboard. " - "(0 = disabled, [1] = enabled)"); - -+static unsigned int swap_opt_cmd = 0; -+module_param(swap_opt_cmd, uint, 0644); -+MODULE_PARM_DESC(swap_opt_cmd, "Swap the Option (\"Alt\") and Command (\"Flag\") keys. " -+ "(For people who want to keep Windows PC keyboard muscle memory. " -+ "[0] = as-is, Mac layout. 1 = swapped, Windows layout.)"); -+ - struct apple_sc { - unsigned long quirks; - unsigned int fn_on; -@@ -152,6 +158,14 @@ static const struct apple_key_translation apple_iso_keyboard[] = { - { } - }; - -+static const struct apple_key_translation swapped_option_cmd_keys[] = { -+ { KEY_LEFTALT, KEY_LEFTMETA }, -+ { KEY_LEFTMETA, KEY_LEFTALT }, -+ { KEY_RIGHTALT, KEY_RIGHTMETA }, -+ { KEY_RIGHTMETA,KEY_RIGHTALT }, -+ { } -+}; -+ - static const struct apple_key_translation *apple_find_translation( - const struct apple_key_translation *table, u16 from) - { -@@ -244,6 +258,14 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input, - } - } - -+ if (swap_opt_cmd) { -+ trans = apple_find_translation(swapped_option_cmd_keys, usage->code); -+ if (trans) { -+ input_event(input, usage->type, trans->to, value); -+ return 1; -+ } -+ } -+ - return 0; - } - -@@ -458,6 +480,9 @@ static const struct hid_device_id apple_devices[] = { - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO), - .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | - APPLE_ISO_KEYBOARD }, -+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, -+ USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI), -+ .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS), - .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI), -diff --git a/drivers/hid/hid-cherry.c b/drivers/hid/hid-cherry.c -index 888ece6..f870bb3 100644 ---- a/drivers/hid/hid-cherry.c -+++ b/drivers/hid/hid-cherry.c -@@ -29,7 +29,7 @@ - static __u8 *ch_report_fixup(struct hid_device *hdev, __u8 *rdesc, - unsigned int *rsize) - { -- if (*rsize >= 17 && rdesc[11] == 0x3c && rdesc[12] == 0x02) { -+ if (*rsize >= 18 && rdesc[11] == 0x3c && rdesc[12] == 0x02) { - hid_info(hdev, "fixing up Cherry Cymotion report descriptor\n"); - rdesc[11] = rdesc[16] = 0xff; - rdesc[12] = rdesc[17] = 0x03; -diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c -index 971c95f..1903aa4 100644 ---- a/drivers/hid/hid-core.c -+++ b/drivers/hid/hid-core.c -@@ -222,9 +222,9 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign - { - struct hid_report *report; - struct hid_field *field; -- int usages; -+ unsigned usages; - unsigned offset; -- int i; -+ unsigned i; - - report = hid_register_report(parser->device, report_type, parser->global.report_id); - if (!report) { -@@ -244,7 +244,8 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign - if (!parser->local.usage_index) /* Ignore padding fields */ - return 0; - -- usages = max_t(int, parser->local.usage_index, parser->global.report_count); -+ usages = max_t(unsigned, parser->local.usage_index, -+ parser->global.report_count); - - field = hid_register_field(report, usages, parser->global.report_count); - if (!field) -@@ -255,7 +256,7 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign - field->application = hid_lookup_collection(parser, HID_COLLECTION_APPLICATION); - - for (i = 0; i < usages; i++) { -- int j = i; -+ unsigned j = i; - /* Duplicate the last usage we parsed if we have excess values */ - if (i >= parser->local.usage_index) - j = parser->local.usage_index - 1; -@@ -860,7 +861,17 @@ struct hid_report *hid_validate_values(struct hid_device *hid, - * ->numbered being checked, which may not always be the case when - * drivers go to access report values. - */ -- report = hid->report_enum[type].report_id_hash[id]; -+ if (id == 0) { -+ /* -+ * Validating on id 0 means we should examine the first -+ * report in the list. -+ */ -+ report = list_entry( -+ hid->report_enum[type].report_list.next, -+ struct hid_report, list); -+ } else { -+ report = hid->report_enum[type].report_id_hash[id]; -+ } - if (!report) { - hid_err(hid, "missing %s %u\n", hid_report_names[type], id); - return NULL; -@@ -1099,7 +1110,7 @@ static struct hid_report *hid_get_report(struct hid_report_enum *report_enum, - return report; - } - --void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, -+int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, - int interrupt) - { - struct hid_report_enum *report_enum = hid->report_enum + type; -@@ -1107,10 +1118,11 @@ void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, - unsigned int a; - int rsize, csize = size; - u8 *cdata = data; -+ int ret = 0; - - report = hid_get_report(report_enum, data); - if (!report) -- return; -+ goto out; - - if (report_enum->numbered) { - cdata++; -@@ -1130,14 +1142,19 @@ void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, - - if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event) - hid->hiddev_report_event(hid, report); -- if (hid->claimed & HID_CLAIMED_HIDRAW) -- hidraw_report_event(hid, data, size); -+ if (hid->claimed & HID_CLAIMED_HIDRAW) { -+ ret = hidraw_report_event(hid, data, size); -+ if (ret) -+ goto out; -+ } - - for (a = 0; a < report->maxfield; a++) - hid_input_field(hid, report->field[a], cdata, interrupt); - - if (hid->claimed & HID_CLAIMED_INPUT) - hidinput_report_event(hid, report); -+out: -+ return ret; - } - EXPORT_SYMBOL_GPL(hid_report_raw_event); - -@@ -1214,7 +1231,7 @@ int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int i - } - } - -- hid_report_raw_event(hid, type, data, size, interrupt); -+ ret = hid_report_raw_event(hid, type, data, size, interrupt); - - unlock: - up(&hid->driver_lock); -@@ -1615,6 +1632,7 @@ static const struct hid_device_id hid_have_special_driver[] = { - { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) }, - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, - { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE) }, - { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, USB_DEVICE_ID_MTP) }, - { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM, USB_DEVICE_ID_MTP_STM) }, - { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX, USB_DEVICE_ID_MTP_SITRONIX) }, -diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h -index 9039dd0..78b1c64 100644 ---- a/drivers/hid/hid-ids.h -+++ b/drivers/hid/hid-ids.h -@@ -293,6 +293,12 @@ - #define USB_VENDOR_ID_FRUCTEL 0x25B6 - #define USB_DEVICE_ID_GAMETEL_MT_MODE 0x0002 - -+#define USB_VENDOR_ID_FORMOSA 0x147a -+#define USB_DEVICE_ID_FORMOSA_IR_RECEIVER 0xe03e -+ -+#define USB_VENDOR_ID_FREESCALE 0x15A2 -+#define USB_DEVICE_ID_FREESCALE_MX28 0x004F -+ - #define USB_VENDOR_ID_GAMERON 0x0810 - #define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR 0x0001 - #define USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR 0x0002 -@@ -556,6 +562,9 @@ - #define USB_VENDOR_ID_MONTEREY 0x0566 - #define USB_DEVICE_ID_GENIUS_KB29E 0x3004 - -+#define USB_VENDOR_ID_MSI 0x1770 -+#define USB_DEVICE_ID_MSI_GX680R_LED_PANEL 0xff00 -+ - #define USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR 0x0400 - #define USB_DEVICE_ID_N_S_HARMONY 0xc359 - -@@ -683,6 +692,7 @@ - - #define USB_VENDOR_ID_SONY 0x054c - #define USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE 0x024b -+#define USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE 0x0374 - #define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268 - #define USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER 0x042f - -diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c -index 6c3e190..e783e5e 100644 ---- a/drivers/hid/hid-input.c -+++ b/drivers/hid/hid-input.c -@@ -459,6 +459,10 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel - if (field->flags & HID_MAIN_ITEM_CONSTANT) - goto ignore; - -+ /* Ignore if report count is out of bounds. */ -+ if (field->report_count < 1) -+ goto ignore; -+ - /* only LED usages are supported in output fields */ - if (field->report_type == HID_OUTPUT_REPORT && - (usage->hid & HID_USAGE_PAGE) != HID_UP_LED) { -@@ -1199,7 +1203,12 @@ static void report_features(struct hid_device *hid) - - rep_enum = &hid->report_enum[HID_FEATURE_REPORT]; - list_for_each_entry(rep, &rep_enum->report_list, list) -- for (i = 0; i < rep->maxfield; i++) -+ for (i = 0; i < rep->maxfield; i++) { -+ -+ /* Ignore if report count is out of bounds. */ -+ if (rep->field[i]->report_count < 1) -+ continue; -+ - for (j = 0; j < rep->field[i]->maxusage; j++) { - /* Verify if Battery Strength feature is available */ - hidinput_setup_battery(hid, HID_FEATURE_REPORT, rep->field[i]); -@@ -1208,6 +1217,7 @@ static void report_features(struct hid_device *hid) - drv->feature_mapping(hid, rep->field[i], - rep->field[i]->usage + j); - } -+ } - } - - /* -diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c -index b4f0d82..d7118f8 100644 ---- a/drivers/hid/hid-kye.c -+++ b/drivers/hid/hid-kye.c -@@ -282,7 +282,7 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, - * - change the button usage range to 4-7 for the extra - * buttons - */ -- if (*rsize >= 74 && -+ if (*rsize >= 75 && - rdesc[61] == 0x05 && rdesc[62] == 0x08 && - rdesc[63] == 0x19 && rdesc[64] == 0x08 && - rdesc[65] == 0x29 && rdesc[66] == 0x0f && -diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c -index e7a7bd1e..cb01e67 100644 ---- a/drivers/hid/hid-lg.c -+++ b/drivers/hid/hid-lg.c -@@ -111,7 +111,7 @@ static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc, - { - unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); - -- if ((quirks & LG_RDESC) && *rsize >= 90 && rdesc[83] == 0x26 && -+ if ((quirks & LG_RDESC) && *rsize >= 91 && rdesc[83] == 0x26 && - rdesc[84] == 0x8c && rdesc[85] == 0x02) { - hid_info(hdev, - "fixing up Logitech keyboard report descriptor\n"); -@@ -120,7 +120,7 @@ static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc, - } - if ((quirks & LG_RDESC_REL_ABS) && *rsize >= 50 && - rdesc[32] == 0x81 && rdesc[33] == 0x06 && -- rdesc[49] == 0x81 && rdesc[50] == 0x06) { -+ rdesc[49] == 0x81 && rdesc[51] == 0x06) { - hid_info(hdev, - "fixing up rel/abs in Logitech report descriptor\n"); - rdesc[33] = rdesc[50] = 0x02; -diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c -index 2652846..f009ab2 100644 ---- a/drivers/hid/hid-logitech-dj.c -+++ b/drivers/hid/hid-logitech-dj.c -@@ -230,13 +230,6 @@ static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev, - return; - } - -- if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) || -- (dj_report->device_index > DJ_DEVICE_INDEX_MAX)) { -- dev_err(&djrcv_hdev->dev, "%s: invalid device index:%d\n", -- __func__, dj_report->device_index); -- return; -- } -- - if (djrcv_dev->paired_dj_devices[dj_report->device_index]) { - /* The device is already known. No need to reallocate it. */ - dbg_hid("%s: device is already known\n", __func__); -@@ -474,28 +467,38 @@ static int logi_dj_recv_send_report(struct dj_receiver_dev *djrcv_dev, - - static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev) - { -- struct dj_report dj_report; -+ struct dj_report *dj_report; -+ int retval; - -- memset(&dj_report, 0, sizeof(dj_report)); -- dj_report.report_id = REPORT_ID_DJ_SHORT; -- dj_report.device_index = 0xFF; -- dj_report.report_type = REPORT_TYPE_CMD_GET_PAIRED_DEVICES; -- return logi_dj_recv_send_report(djrcv_dev, &dj_report); -+ dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL); -+ if (!dj_report) -+ return -ENOMEM; -+ dj_report->report_id = REPORT_ID_DJ_SHORT; -+ dj_report->device_index = 0xFF; -+ dj_report->report_type = REPORT_TYPE_CMD_GET_PAIRED_DEVICES; -+ retval = logi_dj_recv_send_report(djrcv_dev, dj_report); -+ kfree(dj_report); -+ return retval; - } - - - static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev, - unsigned timeout) - { -- struct dj_report dj_report; -+ struct dj_report *dj_report; -+ int retval; - -- memset(&dj_report, 0, sizeof(dj_report)); -- dj_report.report_id = REPORT_ID_DJ_SHORT; -- dj_report.device_index = 0xFF; -- dj_report.report_type = REPORT_TYPE_CMD_SWITCH; -- dj_report.report_params[CMD_SWITCH_PARAM_DEVBITFIELD] = 0x3F; -- dj_report.report_params[CMD_SWITCH_PARAM_TIMEOUT_SECONDS] = (u8)timeout; -- return logi_dj_recv_send_report(djrcv_dev, &dj_report); -+ dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL); -+ if (!dj_report) -+ return -ENOMEM; -+ dj_report->report_id = REPORT_ID_DJ_SHORT; -+ dj_report->device_index = 0xFF; -+ dj_report->report_type = REPORT_TYPE_CMD_SWITCH; -+ dj_report->report_params[CMD_SWITCH_PARAM_DEVBITFIELD] = 0x3F; -+ dj_report->report_params[CMD_SWITCH_PARAM_TIMEOUT_SECONDS] = (u8)timeout; -+ retval = logi_dj_recv_send_report(djrcv_dev, dj_report); -+ kfree(dj_report); -+ return retval; - } - - -@@ -678,7 +681,6 @@ static int logi_dj_raw_event(struct hid_device *hdev, - struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); - struct dj_report *dj_report = (struct dj_report *) data; - unsigned long flags; -- bool report_processed = false; - - dbg_hid("%s, size:%d\n", __func__, size); - -@@ -706,27 +708,41 @@ static int logi_dj_raw_event(struct hid_device *hdev, - * anything else with it. - */ - -+ /* case 1) */ -+ if (data[0] != REPORT_ID_DJ_SHORT) -+ return false; -+ -+ if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) || -+ (dj_report->device_index > DJ_DEVICE_INDEX_MAX)) { -+ /* -+ * Device index is wrong, bail out. -+ * This driver can ignore safely the receiver notifications, -+ * so ignore those reports too. -+ */ -+ if (dj_report->device_index != DJ_RECEIVER_INDEX) -+ dev_err(&hdev->dev, "%s: invalid device index:%d\n", -+ __func__, dj_report->device_index); -+ return false; -+ } -+ - spin_lock_irqsave(&djrcv_dev->lock, flags); -- if (dj_report->report_id == REPORT_ID_DJ_SHORT) { -- switch (dj_report->report_type) { -- case REPORT_TYPE_NOTIF_DEVICE_PAIRED: -- case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED: -- logi_dj_recv_queue_notification(djrcv_dev, dj_report); -- break; -- case REPORT_TYPE_NOTIF_CONNECTION_STATUS: -- if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] == -- STATUS_LINKLOSS) { -- logi_dj_recv_forward_null_report(djrcv_dev, dj_report); -- } -- break; -- default: -- logi_dj_recv_forward_report(djrcv_dev, dj_report); -+ switch (dj_report->report_type) { -+ case REPORT_TYPE_NOTIF_DEVICE_PAIRED: -+ case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED: -+ logi_dj_recv_queue_notification(djrcv_dev, dj_report); -+ break; -+ case REPORT_TYPE_NOTIF_CONNECTION_STATUS: -+ if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] == -+ STATUS_LINKLOSS) { -+ logi_dj_recv_forward_null_report(djrcv_dev, dj_report); - } -- report_processed = true; -+ break; -+ default: -+ logi_dj_recv_forward_report(djrcv_dev, dj_report); - } - spin_unlock_irqrestore(&djrcv_dev->lock, flags); - -- return report_processed; -+ return true; - } - - static int logi_dj_probe(struct hid_device *hdev, -diff --git a/drivers/hid/hid-logitech-dj.h b/drivers/hid/hid-logitech-dj.h -index 4a40003..daeb0aa 100644 ---- a/drivers/hid/hid-logitech-dj.h -+++ b/drivers/hid/hid-logitech-dj.h -@@ -27,6 +27,7 @@ - - #define DJ_MAX_PAIRED_DEVICES 6 - #define DJ_MAX_NUMBER_NOTIFICATIONS 8 -+#define DJ_RECEIVER_INDEX 0 - #define DJ_DEVICE_INDEX_MIN 1 - #define DJ_DEVICE_INDEX_MAX 6 - -diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c -index 8427463..05643cf 100644 ---- a/drivers/hid/hid-magicmouse.c -+++ b/drivers/hid/hid-magicmouse.c -@@ -308,6 +308,11 @@ static int magicmouse_raw_event(struct hid_device *hdev, - if (size < 4 || ((size - 4) % 9) != 0) - return 0; - npoints = (size - 4) / 9; -+ if (npoints > 15) { -+ hid_warn(hdev, "invalid size value (%d) for TRACKPAD_REPORT_ID\n", -+ size); -+ return 0; -+ } - msc->ntouches = 0; - for (ii = 0; ii < npoints; ii++) - magicmouse_emit_touch(msc, ii, data + ii * 9 + 4); -@@ -331,6 +336,11 @@ static int magicmouse_raw_event(struct hid_device *hdev, - if (size < 6 || ((size - 6) % 8) != 0) - return 0; - npoints = (size - 6) / 8; -+ if (npoints > 15) { -+ hid_warn(hdev, "invalid size value (%d) for MOUSE_REPORT_ID\n", -+ size); -+ return 0; -+ } - msc->ntouches = 0; - for (ii = 0; ii < npoints; ii++) - magicmouse_emit_touch(msc, ii, data + ii * 8 + 6); -diff --git a/drivers/hid/hid-monterey.c b/drivers/hid/hid-monterey.c -index dedf757..eb0271e 100644 ---- a/drivers/hid/hid-monterey.c -+++ b/drivers/hid/hid-monterey.c -@@ -25,7 +25,7 @@ - static __u8 *mr_report_fixup(struct hid_device *hdev, __u8 *rdesc, - unsigned int *rsize) - { -- if (*rsize >= 30 && rdesc[29] == 0x05 && rdesc[30] == 0x09) { -+ if (*rsize >= 31 && rdesc[29] == 0x05 && rdesc[30] == 0x09) { - hid_info(hdev, "fixing up button/consumer in HID report descriptor\n"); - rdesc[30] = 0x0c; - } -diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c -index 7a180b9..0e98570 100644 ---- a/drivers/hid/hid-multitouch.c -+++ b/drivers/hid/hid-multitouch.c -@@ -82,8 +82,8 @@ struct mt_device { - multitouch fields */ - unsigned last_field_index; /* last field index of the report */ - unsigned last_slot_field; /* the last field of a slot */ -- __s8 inputmode; /* InputMode HID feature, -1 if non-existent */ -- __s8 maxcontact_report_id; /* Maximum Contact Number HID feature, -+ __s16 inputmode; /* InputMode HID feature, -1 if non-existent */ -+ __s16 maxcontact_report_id; /* Maximum Contact Number HID feature, - -1 if non-existent */ - __u8 num_received; /* how many contacts we received */ - __u8 num_expected; /* expected last contact index */ -diff --git a/drivers/hid/hid-petalynx.c b/drivers/hid/hid-petalynx.c -index f1ea3ff..99f317a 100644 ---- a/drivers/hid/hid-petalynx.c -+++ b/drivers/hid/hid-petalynx.c -@@ -26,7 +26,7 @@ - static __u8 *pl_report_fixup(struct hid_device *hdev, __u8 *rdesc, - unsigned int *rsize) - { -- if (*rsize >= 60 && rdesc[39] == 0x2a && rdesc[40] == 0xf5 && -+ if (*rsize >= 62 && rdesc[39] == 0x2a && rdesc[40] == 0xf5 && - rdesc[41] == 0x00 && rdesc[59] == 0x26 && - rdesc[60] == 0xf9 && rdesc[61] == 0x00) { - hid_info(hdev, "fixing up Petalynx Maxter Remote report descriptor\n"); -diff --git a/drivers/hid/hid-picolcd.c b/drivers/hid/hid-picolcd.c -index 45c3433..4e37b1f 100644 ---- a/drivers/hid/hid-picolcd.c -+++ b/drivers/hid/hid-picolcd.c -@@ -1424,7 +1424,7 @@ static ssize_t picolcd_operation_mode_store(struct device *dev, - buf += 10; - cnt -= 10; - } -- if (!report) -+ if (!report || report->maxfield != 1) - return -EINVAL; - - while (cnt > 0 && (buf[cnt-1] == '\n' || buf[cnt-1] == '\r')) -@@ -2370,6 +2370,12 @@ static int picolcd_raw_event(struct hid_device *hdev, - if (!data) - return 1; - -+ if (size > 64) { -+ hid_warn(hdev, "invalid size value (%d) for picolcd raw event\n", -+ size); -+ return 0; -+ } -+ - if (report->id == REPORT_KEY_STATE) { - if (data->input_keys) - ret = picolcd_raw_keypad(data, report, raw_data+1, size-1); -diff --git a/drivers/hid/hid-roccat-kovaplus.c b/drivers/hid/hid-roccat-kovaplus.c -index 112d934..1973cff 100644 ---- a/drivers/hid/hid-roccat-kovaplus.c -+++ b/drivers/hid/hid-roccat-kovaplus.c -@@ -623,9 +623,13 @@ static void kovaplus_keep_values_up_to_date(struct kovaplus_device *kovaplus, - break; - case KOVAPLUS_MOUSE_REPORT_BUTTON_TYPE_CPI: - kovaplus->actual_cpi = kovaplus_convert_event_cpi(button_report->data1); -+ break; - case KOVAPLUS_MOUSE_REPORT_BUTTON_TYPE_SENSITIVITY: - kovaplus->actual_x_sensitivity = button_report->data1; - kovaplus->actual_y_sensitivity = button_report->data2; -+ break; -+ default: -+ break; - } - } - -diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c -index 5cd25bd..4142c21 100644 ---- a/drivers/hid/hid-sony.c -+++ b/drivers/hid/hid-sony.c -@@ -44,9 +44,19 @@ static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc, - { - struct sony_sc *sc = hid_get_drvdata(hdev); - -- if ((sc->quirks & VAIO_RDESC_CONSTANT) && -- *rsize >= 56 && rdesc[54] == 0x81 && rdesc[55] == 0x07) { -- hid_info(hdev, "Fixing up Sony Vaio VGX report descriptor\n"); -+ /* -+ * Some Sony RF receivers wrongly declare the mouse pointer as a -+ * a constant non-data variable. -+ */ -+ if ((sc->quirks & VAIO_RDESC_CONSTANT) && *rsize >= 56 && -+ /* usage page: generic desktop controls */ -+ /* rdesc[0] == 0x05 && rdesc[1] == 0x01 && */ -+ /* usage: mouse */ -+ rdesc[2] == 0x09 && rdesc[3] == 0x02 && -+ /* input (usage page for x,y axes): constant, variable, relative */ -+ rdesc[54] == 0x81 && rdesc[55] == 0x07) { -+ hid_info(hdev, "Fixing up Sony RF Receiver report descriptor\n"); -+ /* input: data, variable, relative */ - rdesc[55] = 0x06; - } - -@@ -218,6 +228,8 @@ static const struct hid_device_id sony_devices[] = { - .driver_data = SIXAXIS_CONTROLLER_BT }, - { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE), - .driver_data = VAIO_RDESC_CONSTANT }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE), -+ .driver_data = VAIO_RDESC_CONSTANT }, - { } - }; - MODULE_DEVICE_TABLE(hid, sony_devices); -diff --git a/drivers/hid/hid-sunplus.c b/drivers/hid/hid-sunplus.c -index d484a00..3d6ae7b 100644 ---- a/drivers/hid/hid-sunplus.c -+++ b/drivers/hid/hid-sunplus.c -@@ -25,7 +25,7 @@ - static __u8 *sp_report_fixup(struct hid_device *hdev, __u8 *rdesc, - unsigned int *rsize) - { -- if (*rsize >= 107 && rdesc[104] == 0x26 && rdesc[105] == 0x80 && -+ if (*rsize >= 112 && rdesc[104] == 0x26 && rdesc[105] == 0x80 && - rdesc[106] == 0x03) { - hid_info(hdev, "fixing up Sunplus Wireless Desktop report descriptor\n"); - rdesc[105] = rdesc[110] = 0x03; -diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c -index cf7d6d5..9e50f61 100644 ---- a/drivers/hid/hidraw.c -+++ b/drivers/hid/hidraw.c -@@ -87,13 +87,16 @@ static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count, - len = list->buffer[list->tail].len > count ? - count : list->buffer[list->tail].len; - -- if (copy_to_user(buffer, list->buffer[list->tail].value, len)) { -- ret = -EFAULT; -- goto out; -+ if (list->buffer[list->tail].value) { -+ if (copy_to_user(buffer, list->buffer[list->tail].value, len)) { -+ ret = -EFAULT; -+ goto out; -+ } -+ ret = len; - } -- ret = len; - - kfree(list->buffer[list->tail].value); -+ list->buffer[list->tail].value = NULL; - list->tail = (list->tail + 1) & (HIDRAW_BUFFER_SIZE - 1); - } - out: -@@ -110,7 +113,7 @@ static ssize_t hidraw_send_report(struct file *file, const char __user *buffer, - __u8 *buf; - int ret = 0; - -- if (!hidraw_table[minor]) { -+ if (!hidraw_table[minor] || !hidraw_table[minor]->exist) { - ret = -ENODEV; - goto out; - } -@@ -258,7 +261,7 @@ static int hidraw_open(struct inode *inode, struct file *file) - } - - mutex_lock(&minors_lock); -- if (!hidraw_table[minor]) { -+ if (!hidraw_table[minor] || !hidraw_table[minor]->exist) { - err = -ENODEV; - goto out_unlock; - } -@@ -292,35 +295,38 @@ static int hidraw_open(struct inode *inode, struct file *file) - - } - -+static void drop_ref(struct hidraw *hidraw, int exists_bit) -+{ -+ if (exists_bit) { -+ hid_hw_close(hidraw->hid); -+ hidraw->exist = 0; -+ if (hidraw->open) -+ wake_up_interruptible(&hidraw->wait); -+ } else { -+ --hidraw->open; -+ } -+ -+ if (!hidraw->open && !hidraw->exist) { -+ device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); -+ hidraw_table[hidraw->minor] = NULL; -+ kfree(hidraw); -+ } -+} -+ - static int hidraw_release(struct inode * inode, struct file * file) - { - unsigned int minor = iminor(inode); -- struct hidraw *dev; - struct hidraw_list *list = file->private_data; -- int ret; - - mutex_lock(&minors_lock); -- if (!hidraw_table[minor]) { -- ret = -ENODEV; -- goto unlock; -- } - - list_del(&list->node); -- dev = hidraw_table[minor]; -- if (!--dev->open) { -- if (list->hidraw->exist) { -- hid_hw_power(dev->hid, PM_HINT_NORMAL); -- hid_hw_close(dev->hid); -- } else { -- kfree(list->hidraw); -- } -- } - kfree(list); -- ret = 0; --unlock: -- mutex_unlock(&minors_lock); - -- return ret; -+ drop_ref(hidraw_table[minor], 0); -+ -+ mutex_unlock(&minors_lock); -+ return 0; - } - - static long hidraw_ioctl(struct file *file, unsigned int cmd, -@@ -437,19 +443,29 @@ static const struct file_operations hidraw_ops = { - .llseek = noop_llseek, - }; - --void hidraw_report_event(struct hid_device *hid, u8 *data, int len) -+int hidraw_report_event(struct hid_device *hid, u8 *data, int len) - { - struct hidraw *dev = hid->hidraw; - struct hidraw_list *list; -+ int ret = 0; - - list_for_each_entry(list, &dev->list, node) { -- list->buffer[list->head].value = kmemdup(data, len, GFP_ATOMIC); -+ int new_head = (list->head + 1) & (HIDRAW_BUFFER_SIZE - 1); -+ -+ if (new_head == list->tail) -+ continue; -+ -+ if (!(list->buffer[list->head].value = kmemdup(data, len, GFP_ATOMIC))) { -+ ret = -ENOMEM; -+ break; -+ } - list->buffer[list->head].len = len; -- list->head = (list->head + 1) & (HIDRAW_BUFFER_SIZE - 1); -+ list->head = new_head; - kill_fasync(&list->fasync, SIGIO, POLL_IN); - } - - wake_up_interruptible(&dev->wait); -+ return ret; - } - EXPORT_SYMBOL_GPL(hidraw_report_event); - -@@ -514,18 +530,9 @@ void hidraw_disconnect(struct hid_device *hid) - struct hidraw *hidraw = hid->hidraw; - - mutex_lock(&minors_lock); -- hidraw->exist = 0; - -- device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); -+ drop_ref(hidraw, 1); - -- hidraw_table[hidraw->minor] = NULL; -- -- if (hidraw->open) { -- hid_hw_close(hid); -- wake_up_interruptible(&hidraw->wait); -- } else { -- kfree(hidraw); -- } - mutex_unlock(&minors_lock); - } - EXPORT_SYMBOL_GPL(hidraw_disconnect); -@@ -542,21 +549,28 @@ int __init hidraw_init(void) - - if (result < 0) { - pr_warn("can't get major number\n"); -- result = 0; - goto out; - } - - hidraw_class = class_create(THIS_MODULE, "hidraw"); - if (IS_ERR(hidraw_class)) { - result = PTR_ERR(hidraw_class); -- unregister_chrdev(hidraw_major, "hidraw"); -- goto out; -+ goto error_cdev; - } - - cdev_init(&hidraw_cdev, &hidraw_ops); -- cdev_add(&hidraw_cdev, dev_id, HIDRAW_MAX_DEVICES); -+ result = cdev_add(&hidraw_cdev, dev_id, HIDRAW_MAX_DEVICES); -+ if (result < 0) -+ goto error_class; -+ - out: - return result; -+ -+error_class: -+ class_destroy(hidraw_class); -+error_cdev: -+ unregister_chrdev_region(dev_id, HIDRAW_MAX_DEVICES); -+ goto out; - } - - void hidraw_exit(void) -diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c -index d712294..bf60cc3 100644 ---- a/drivers/hid/usbhid/hid-quirks.c -+++ b/drivers/hid/usbhid/hid-quirks.c -@@ -70,7 +70,10 @@ static const struct hid_blacklist { - { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET }, - { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET }, - { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, -+ { USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS }, -+ { USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET }, - { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET }, -+ { USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GX680R_LED_PANEL, HID_QUIRK_NO_INIT_REPORTS }, - { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN, HID_QUIRK_NO_INIT_REPORTS }, - { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1, HID_QUIRK_NO_INIT_REPORTS }, - { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2, HID_QUIRK_NO_INIT_REPORTS }, -diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c -index 8af25a0..d01edf3 100644 ---- a/drivers/hv/ring_buffer.c -+++ b/drivers/hv/ring_buffer.c -@@ -383,7 +383,7 @@ int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info, - sizeof(u64)); - - /* Make sure we flush all writes before updating the writeIndex */ -- smp_wmb(); -+ wmb(); - - /* Now, update the write location */ - hv_set_next_write_location(outring_info, next_write_location); -@@ -485,7 +485,7 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, void *buffer, - /* Make sure all reads are done before we update the read index since */ - /* the writer may start writing to the read area once the read index */ - /*is updated */ -- smp_mb(); -+ mb(); - - /* Update the read index */ - hv_set_next_read_location(inring_info, next_read_location); -diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c -index a220e57..10619b3 100644 ---- a/drivers/hv/vmbus_drv.c -+++ b/drivers/hv/vmbus_drv.c -@@ -466,7 +466,7 @@ static void vmbus_on_msg_dpc(unsigned long data) - * will not deliver any more messages since there is - * no empty slot - */ -- smp_mb(); -+ mb(); - - if (msg->header.message_flags.msg_pending) { - /* -diff --git a/drivers/hwmon/adm1029.c b/drivers/hwmon/adm1029.c -index 80cc465..f078bae 100644 ---- a/drivers/hwmon/adm1029.c -+++ b/drivers/hwmon/adm1029.c -@@ -231,6 +231,9 @@ static ssize_t set_fan_div(struct device *dev, - /* Update the value */ - reg = (reg & 0x3F) | (val << 6); - -+ /* Update the cache */ -+ data->fan_div[attr->index] = reg; -+ - /* Write value */ - i2c_smbus_write_byte_data(client, - ADM1029_REG_FAN_DIV[attr->index], reg); -diff --git a/drivers/hwmon/amc6821.c b/drivers/hwmon/amc6821.c -index f600fa1..1d2bace 100644 ---- a/drivers/hwmon/amc6821.c -+++ b/drivers/hwmon/amc6821.c -@@ -715,7 +715,7 @@ static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, - get_temp_alarm, NULL, IDX_TEMP1_MAX); - static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, - get_temp_alarm, NULL, IDX_TEMP1_CRIT); --static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO | S_IWUSR, -+static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, - get_temp, NULL, IDX_TEMP2_INPUT); - static SENSOR_DEVICE_ATTR(temp2_min, S_IRUGO | S_IWUSR, get_temp, - set_temp, IDX_TEMP2_MIN); -diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c -index 73bea49..5b7afc0 100644 ---- a/drivers/hwmon/applesmc.c -+++ b/drivers/hwmon/applesmc.c -@@ -212,6 +212,7 @@ static int send_argument(const char *key) - - static int read_smc(u8 cmd, const char *key, u8 *buffer, u8 len) - { -+ u8 status, data = 0; - int i; - - if (send_command(cmd) || send_argument(key)) { -@@ -219,6 +220,7 @@ static int read_smc(u8 cmd, const char *key, u8 *buffer, u8 len) - return -EIO; - } - -+ /* This has no effect on newer (2012) SMCs */ - outb(len, APPLESMC_DATA_PORT); - - for (i = 0; i < len; i++) { -@@ -229,6 +231,17 @@ static int read_smc(u8 cmd, const char *key, u8 *buffer, u8 len) - buffer[i] = inb(APPLESMC_DATA_PORT); - } - -+ /* Read the data port until bit0 is cleared */ -+ for (i = 0; i < 16; i++) { -+ udelay(APPLESMC_MIN_WAIT); -+ status = inb(APPLESMC_CMD_PORT); -+ if (!(status & 0x01)) -+ break; -+ data = inb(APPLESMC_DATA_PORT); -+ } -+ if (i) -+ pr_warn("flushed %d bytes, last value is: %d\n", i, data); -+ - return 0; - } - -diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c -index 0f52799..5edfb75 100644 ---- a/drivers/hwmon/coretemp.c -+++ b/drivers/hwmon/coretemp.c -@@ -53,7 +53,7 @@ MODULE_PARM_DESC(tjmax, "TjMax value in degrees Celsius"); - - #define BASE_SYSFS_ATTR_NO 2 /* Sysfs Base attr no for coretemp */ - #define NUM_REAL_CORES 32 /* Number of Real cores per cpu */ --#define CORETEMP_NAME_LENGTH 17 /* String Length of attrs */ -+#define CORETEMP_NAME_LENGTH 19 /* String Length of attrs */ - #define MAX_CORE_ATTRS 4 /* Maximum no of basic attrs */ - #define TOTAL_ATTRS (MAX_CORE_ATTRS + 1) - #define MAX_CORE_DATA (NUM_REAL_CORES + BASE_SYSFS_ATTR_NO) -@@ -191,6 +191,27 @@ static ssize_t show_temp(struct device *dev, - return tdata->valid ? sprintf(buf, "%d\n", tdata->temp) : -EAGAIN; - } - -+struct tjmax { -+ char const *id; -+ int tjmax; -+}; -+ -+static struct tjmax __cpuinitconst tjmax_table[] = { -+ { "CPU D410", 100000 }, -+ { "CPU D425", 100000 }, -+ { "CPU D510", 100000 }, -+ { "CPU D525", 100000 }, -+ { "CPU N450", 100000 }, -+ { "CPU N455", 100000 }, -+ { "CPU N470", 100000 }, -+ { "CPU N475", 100000 }, -+ { "CPU 230", 100000 }, /* Model 0x1c, stepping 2 */ -+ { "CPU 330", 125000 }, /* Model 0x1c, stepping 2 */ -+ { "CPU CE4110", 110000 }, /* Model 0x1c, stepping 10 */ -+ { "CPU CE4150", 110000 }, /* Model 0x1c, stepping 10 */ -+ { "CPU CE4170", 110000 }, /* Model 0x1c, stepping 10 */ -+}; -+ - static int __cpuinit adjust_tjmax(struct cpuinfo_x86 *c, u32 id, - struct device *dev) - { -@@ -202,6 +223,13 @@ static int __cpuinit adjust_tjmax(struct cpuinfo_x86 *c, u32 id, - int err; - u32 eax, edx; - struct pci_dev *host_bridge; -+ int i; -+ -+ /* explicit tjmax table entries override heuristics */ -+ for (i = 0; i < ARRAY_SIZE(tjmax_table); i++) { -+ if (strstr(c->x86_model_id, tjmax_table[i].id)) -+ return tjmax_table[i].tjmax; -+ } - - /* Early chips have no MSR for TjMax */ - -@@ -210,7 +238,8 @@ static int __cpuinit adjust_tjmax(struct cpuinfo_x86 *c, u32 id, - - /* Atom CPUs */ - -- if (c->x86_model == 0x1c) { -+ if (c->x86_model == 0x1c || c->x86_model == 0x26 -+ || c->x86_model == 0x27) { - usemsr_ee = 0; - - host_bridge = pci_get_bus_and_slot(0, PCI_DEVFN(0, 0)); -@@ -223,6 +252,9 @@ static int __cpuinit adjust_tjmax(struct cpuinfo_x86 *c, u32 id, - tjmax = 90000; - - pci_dev_put(host_bridge); -+ } else if (c->x86_model == 0x36) { -+ usemsr_ee = 0; -+ tjmax = 100000; - } - - if (c->x86_model > 0xe && usemsr_ee) { -diff --git a/drivers/hwmon/emc1403.c b/drivers/hwmon/emc1403.c -index 149dcb0..d5c33d5 100644 ---- a/drivers/hwmon/emc1403.c -+++ b/drivers/hwmon/emc1403.c -@@ -161,7 +161,7 @@ static ssize_t store_hyst(struct device *dev, - if (retval < 0) - goto fail; - -- hyst = val - retval * 1000; -+ hyst = retval * 1000 - val; - hyst = DIV_ROUND_CLOSEST(hyst, 1000); - if (hyst < 0 || hyst > 255) { - retval = -ERANGE; -@@ -294,7 +294,7 @@ static int emc1403_detect(struct i2c_client *client, - } - - id = i2c_smbus_read_byte_data(client, THERMAL_REVISION_REG); -- if (id != 0x01) -+ if (id < 0x01 || id > 0x04) - return -ENODEV; - - return 0; -diff --git a/drivers/hwmon/lm78.c b/drivers/hwmon/lm78.c -index f6bc414..8d6a133 100644 ---- a/drivers/hwmon/lm78.c -+++ b/drivers/hwmon/lm78.c -@@ -94,6 +94,8 @@ static inline u8 FAN_TO_REG(long rpm, int div) - { - if (rpm <= 0) - return 255; -+ if (rpm > 1350000) -+ return 1; - return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254); - } - -diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c -index 22b14a68..1f4f941 100644 ---- a/drivers/hwmon/lm90.c -+++ b/drivers/hwmon/lm90.c -@@ -278,7 +278,7 @@ static const struct lm90_params lm90_params[] = { - [max6696] = { - .flags = LM90_HAVE_EMERGENCY - | LM90_HAVE_EMERGENCY_ALARM | LM90_HAVE_TEMP3, -- .alert_alarms = 0x187c, -+ .alert_alarms = 0x1c7c, - .max_convrate = 6, - .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL, - }, -@@ -1504,19 +1504,22 @@ static void lm90_alert(struct i2c_client *client, unsigned int flag) - if ((alarms & 0x7f) == 0 && (alarms2 & 0xfe) == 0) { - dev_info(&client->dev, "Everything OK\n"); - } else { -- if (alarms & 0x61) -+ if ((alarms & 0x61) || (alarms2 & 0x80)) - dev_warn(&client->dev, - "temp%d out of range, please check!\n", 1); -- if (alarms & 0x1a) -+ if ((alarms & 0x1a) || (alarms2 & 0x20)) - dev_warn(&client->dev, - "temp%d out of range, please check!\n", 2); - if (alarms & 0x04) - dev_warn(&client->dev, - "temp%d diode open, please check!\n", 2); - -- if (alarms2 & 0x18) -+ if (alarms2 & 0x5a) - dev_warn(&client->dev, - "temp%d out of range, please check!\n", 3); -+ if (alarms2 & 0x04) -+ dev_warn(&client->dev, -+ "temp%d diode open, please check!\n", 3); - - /* - * Disable ALERT# output, because these chips don't implement -diff --git a/drivers/hwmon/max1668.c b/drivers/hwmon/max1668.c -index 335b183..f058886 100644 ---- a/drivers/hwmon/max1668.c -+++ b/drivers/hwmon/max1668.c -@@ -243,7 +243,7 @@ static ssize_t set_temp_min(struct device *dev, - data->temp_min[index] = SENSORS_LIMIT(temp/1000, -128, 127); - if (i2c_smbus_write_byte_data(client, - MAX1668_REG_LIML_WR(index), -- data->temp_max[index])) -+ data->temp_min[index])) - count = -EIO; - mutex_unlock(&data->update_lock); - -diff --git a/drivers/hwmon/sis5595.c b/drivers/hwmon/sis5595.c -index 6c4d8eb..098489c 100644 ---- a/drivers/hwmon/sis5595.c -+++ b/drivers/hwmon/sis5595.c -@@ -141,6 +141,8 @@ static inline u8 FAN_TO_REG(long rpm, int div) - { - if (rpm <= 0) - return 255; -+ if (rpm > 1350000) -+ return 1; - return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254); - } - -diff --git a/drivers/hwmon/vt8231.c b/drivers/hwmon/vt8231.c -index 386a845..0a287e0 100644 ---- a/drivers/hwmon/vt8231.c -+++ b/drivers/hwmon/vt8231.c -@@ -145,7 +145,7 @@ static const u8 regtempmin[] = { 0x3a, 0x3e, 0x2c, 0x2e, 0x30, 0x32 }; - */ - static inline u8 FAN_TO_REG(long rpm, int div) - { -- if (rpm == 0) -+ if (rpm <= 0 || rpm > 1310720) - return 0; - return SENSORS_LIMIT(1310720 / (rpm * div), 1, 255); - } -diff --git a/drivers/hwmon/w83l786ng.c b/drivers/hwmon/w83l786ng.c -index 5850b77..284d469 100644 ---- a/drivers/hwmon/w83l786ng.c -+++ b/drivers/hwmon/w83l786ng.c -@@ -481,9 +481,11 @@ store_pwm(struct device *dev, struct device_attribute *attr, - if (err) - return err; - val = SENSORS_LIMIT(val, 0, 255); -+ val = DIV_ROUND_CLOSEST(val, 0x11); - - mutex_lock(&data->update_lock); -- data->pwm[nr] = val; -+ data->pwm[nr] = val * 0x11; -+ val |= w83l786ng_read_value(client, W83L786NG_REG_PWM[nr]) & 0xf0; - w83l786ng_write_value(client, W83L786NG_REG_PWM[nr], val); - mutex_unlock(&data->update_lock); - return count; -@@ -510,7 +512,7 @@ store_pwm_enable(struct device *dev, struct device_attribute *attr, - mutex_lock(&data->update_lock); - reg = w83l786ng_read_value(client, W83L786NG_REG_FAN_CFG); - data->pwm_enable[nr] = val; -- reg &= ~(0x02 << W83L786NG_PWM_ENABLE_SHIFT[nr]); -+ reg &= ~(0x03 << W83L786NG_PWM_ENABLE_SHIFT[nr]); - reg |= (val - 1) << W83L786NG_PWM_ENABLE_SHIFT[nr]; - w83l786ng_write_value(client, W83L786NG_REG_FAN_CFG, reg); - mutex_unlock(&data->update_lock); -@@ -781,9 +783,10 @@ static struct w83l786ng_data *w83l786ng_update_device(struct device *dev) - ((pwmcfg >> W83L786NG_PWM_MODE_SHIFT[i]) & 1) - ? 0 : 1; - data->pwm_enable[i] = -- ((pwmcfg >> W83L786NG_PWM_ENABLE_SHIFT[i]) & 2) + 1; -- data->pwm[i] = w83l786ng_read_value(client, -- W83L786NG_REG_PWM[i]); -+ ((pwmcfg >> W83L786NG_PWM_ENABLE_SHIFT[i]) & 3) + 1; -+ data->pwm[i] = -+ (w83l786ng_read_value(client, W83L786NG_REG_PWM[i]) -+ & 0x0f) * 0x11; - } - - -diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig -index ac2e1e1..df36e53 100644 ---- a/drivers/i2c/busses/Kconfig -+++ b/drivers/i2c/busses/Kconfig -@@ -105,6 +105,7 @@ config I2C_I801 - Panther Point (PCH) - Lynx Point (PCH) - Lynx Point-LP (PCH) -+ Avoton (SOC) - - This driver can also be built as a module. If so, the module - will be called i2c-i801. -@@ -137,6 +138,7 @@ config I2C_PIIX4 - ATI SB700 - ATI SB800 - AMD Hudson-2 -+ AMD CZ - Serverworks OSB4 - Serverworks CSB5 - Serverworks CSB6 -diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c -index 3c2812f..aadb398 100644 ---- a/drivers/i2c/busses/i2c-designware-core.c -+++ b/drivers/i2c/busses/i2c-designware-core.c -@@ -346,6 +346,9 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev) - ic_con &= ~DW_IC_CON_10BITADDR_MASTER; - dw_writel(dev, ic_con, DW_IC_CON); - -+ /* enforce disabled interrupts (due to HW issues) */ -+ i2c_dw_disable_int(dev); -+ - /* Enable the adapter */ - dw_writel(dev, 1, DW_IC_ENABLE); - -diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c -index d88ec81..d63e130 100644 ---- a/drivers/i2c/busses/i2c-i801.c -+++ b/drivers/i2c/busses/i2c-i801.c -@@ -53,6 +53,7 @@ - Panther Point (PCH) 0x1e22 32 hard yes yes yes - Lynx Point (PCH) 0x8c22 32 hard yes yes yes - Lynx Point-LP (PCH) 0x9c22 32 hard yes yes yes -+ Avoton (SOC) 0x1f3c 32 hard yes yes yes - - Features supported by this driver: - Software PEC no -@@ -145,6 +146,7 @@ - #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1 0x1d71 - #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2 0x1d72 - #define PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS 0x1e22 -+#define PCI_DEVICE_ID_INTEL_AVOTON_SMBUS 0x1f3c - #define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330 - #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30 - #define PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS 0x8c22 -@@ -639,6 +641,7 @@ static DEFINE_PCI_DEVICE_TABLE(i801_ids) = { - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS) }, - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS) }, - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS) }, -+ { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_AVOTON_SMBUS) }, - { 0, } - }; - -diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c -index c14d48d..a356974 100644 ---- a/drivers/i2c/busses/i2c-piix4.c -+++ b/drivers/i2c/busses/i2c-piix4.c -@@ -22,7 +22,7 @@ - Intel PIIX4, 440MX - Serverworks OSB4, CSB5, CSB6, HT-1000, HT-1100 - ATI IXP200, IXP300, IXP400, SB600, SB700, SB800 -- AMD Hudson-2 -+ AMD Hudson-2, CZ - SMSC Victory66 - - Note: we assume there can only be one device, with one SMBus interface. -@@ -481,6 +481,7 @@ static DEFINE_PCI_DEVICE_TABLE(piix4_ids) = { - { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS) }, - { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS) }, - { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_HUDSON2_SMBUS) }, -+ { PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x790b) }, - { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, - PCI_DEVICE_ID_SERVERWORKS_OSB4) }, - { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, -diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c -index df19f3d..d47ca36 100644 ---- a/drivers/i2c/busses/i2c-tegra.c -+++ b/drivers/i2c/busses/i2c-tegra.c -@@ -341,7 +341,11 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev) - u32 val; - int err = 0; - -- clk_enable(i2c_dev->clk); -+ err = clk_enable(i2c_dev->clk); -+ if (err < 0) { -+ dev_err(i2c_dev->dev, "Clock enable failed %d\n", err); -+ return err; -+ } - - tegra_periph_reset_assert(i2c_dev->clk); - udelay(2); -@@ -543,7 +547,12 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], - if (i2c_dev->is_suspended) - return -EBUSY; - -- clk_enable(i2c_dev->clk); -+ ret = clk_enable(i2c_dev->clk); -+ if (ret < 0) { -+ dev_err(i2c_dev->dev, "Clock enable failed %d\n", ret); -+ return ret; -+ } -+ - for (i = 0; i < num; i++) { - int stop = (i == (num - 1)) ? 1 : 0; - ret = tegra_i2c_xfer_msg(i2c_dev, &msgs[i], stop); -diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c -index d0f59c3..9b09185 100644 ---- a/drivers/idle/intel_idle.c -+++ b/drivers/idle/intel_idle.c -@@ -169,6 +169,38 @@ static struct cpuidle_state snb_cstates[MWAIT_MAX_NUM_CSTATES] = { - .enter = &intel_idle }, - }; - -+static struct cpuidle_state ivb_cstates[MWAIT_MAX_NUM_CSTATES] = { -+ { /* MWAIT C0 */ }, -+ { /* MWAIT C1 */ -+ .name = "C1-IVB", -+ .desc = "MWAIT 0x00", -+ .flags = CPUIDLE_FLAG_TIME_VALID, -+ .exit_latency = 1, -+ .target_residency = 1, -+ .enter = &intel_idle }, -+ { /* MWAIT C2 */ -+ .name = "C3-IVB", -+ .desc = "MWAIT 0x10", -+ .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED, -+ .exit_latency = 59, -+ .target_residency = 156, -+ .enter = &intel_idle }, -+ { /* MWAIT C3 */ -+ .name = "C6-IVB", -+ .desc = "MWAIT 0x20", -+ .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED, -+ .exit_latency = 80, -+ .target_residency = 300, -+ .enter = &intel_idle }, -+ { /* MWAIT C4 */ -+ .name = "C7-IVB", -+ .desc = "MWAIT 0x30", -+ .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED, -+ .exit_latency = 87, -+ .target_residency = 300, -+ .enter = &intel_idle }, -+}; -+ - static struct cpuidle_state atom_cstates[MWAIT_MAX_NUM_CSTATES] = { - { /* MWAIT C0 */ }, - { /* MWAIT C1 */ -@@ -347,6 +379,10 @@ static const struct idle_cpu idle_cpu_snb = { - .state_table = snb_cstates, - }; - -+static const struct idle_cpu idle_cpu_ivb = { -+ .state_table = ivb_cstates, -+}; -+ - #define ICPU(model, cpu) \ - { X86_VENDOR_INTEL, 6, model, X86_FEATURE_MWAIT, (unsigned long)&cpu } - -@@ -362,6 +398,8 @@ static const struct x86_cpu_id intel_idle_ids[] = { - ICPU(0x2f, idle_cpu_nehalem), - ICPU(0x2a, idle_cpu_snb), - ICPU(0x2d, idle_cpu_snb), -+ ICPU(0x3a, idle_cpu_ivb), -+ ICPU(0x3e, idle_cpu_ivb), - {} - }; - MODULE_DEVICE_TABLE(x86cpu, intel_idle_ids); -@@ -405,10 +443,8 @@ static int intel_idle_probe(void) - - if (boot_cpu_has(X86_FEATURE_ARAT)) /* Always Reliable APIC Timer */ - lapic_timer_reliable_states = LAPIC_TIMER_ALWAYS_RELIABLE; -- else { -+ else - on_each_cpu(__setup_broadcast_timer, (void *)true, 1); -- register_cpu_notifier(&setup_broadcast_notifier); -- } - - pr_debug(PREFIX "v" INTEL_IDLE_VERSION - " model 0x%X\n", boot_cpu_data.x86_model); -@@ -556,8 +592,9 @@ static int __init intel_idle_init(void) - intel_idle_cpuidle_driver_init(); - retval = cpuidle_register_driver(&intel_idle_driver); - if (retval) { -+ struct cpuidle_driver *drv = cpuidle_get_driver(); - printk(KERN_DEBUG PREFIX "intel_idle yielding to %s", -- cpuidle_get_driver()->name); -+ drv ? drv->name : "none"); - return retval; - } - -@@ -573,6 +610,9 @@ static int __init intel_idle_init(void) - } - } - -+ if (lapic_timer_reliable_states != LAPIC_TIMER_ALWAYS_RELIABLE) -+ register_cpu_notifier(&setup_broadcast_notifier); -+ - return 0; - } - -diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c -index f0d588f..1acb991 100644 ---- a/drivers/infiniband/core/user_mad.c -+++ b/drivers/infiniband/core/user_mad.c -@@ -98,7 +98,7 @@ struct ib_umad_port { - - struct ib_umad_device { - int start_port, end_port; -- struct kref ref; -+ struct kobject kobj; - struct ib_umad_port port[0]; - }; - -@@ -134,14 +134,18 @@ static DECLARE_BITMAP(dev_map, IB_UMAD_MAX_PORTS); - static void ib_umad_add_one(struct ib_device *device); - static void ib_umad_remove_one(struct ib_device *device); - --static void ib_umad_release_dev(struct kref *ref) -+static void ib_umad_release_dev(struct kobject *kobj) - { - struct ib_umad_device *dev = -- container_of(ref, struct ib_umad_device, ref); -+ container_of(kobj, struct ib_umad_device, kobj); - - kfree(dev); - } - -+static struct kobj_type ib_umad_dev_ktype = { -+ .release = ib_umad_release_dev, -+}; -+ - static int hdr_size(struct ib_umad_file *file) - { - return file->use_pkey_index ? sizeof (struct ib_user_mad_hdr) : -@@ -780,27 +784,19 @@ static int ib_umad_open(struct inode *inode, struct file *filp) - { - struct ib_umad_port *port; - struct ib_umad_file *file; -- int ret; -+ int ret = -ENXIO; - - port = container_of(inode->i_cdev, struct ib_umad_port, cdev); -- if (port) -- kref_get(&port->umad_dev->ref); -- else -- return -ENXIO; - - mutex_lock(&port->file_mutex); - -- if (!port->ib_dev) { -- ret = -ENXIO; -+ if (!port->ib_dev) - goto out; -- } - -+ ret = -ENOMEM; - file = kzalloc(sizeof *file, GFP_KERNEL); -- if (!file) { -- kref_put(&port->umad_dev->ref, ib_umad_release_dev); -- ret = -ENOMEM; -+ if (!file) - goto out; -- } - - mutex_init(&file->mutex); - spin_lock_init(&file->send_lock); -@@ -814,6 +810,13 @@ static int ib_umad_open(struct inode *inode, struct file *filp) - list_add_tail(&file->port_list, &port->file_list); - - ret = nonseekable_open(inode, filp); -+ if (ret) { -+ list_del(&file->port_list); -+ kfree(file); -+ goto out; -+ } -+ -+ kobject_get(&port->umad_dev->kobj); - - out: - mutex_unlock(&port->file_mutex); -@@ -852,7 +855,7 @@ static int ib_umad_close(struct inode *inode, struct file *filp) - mutex_unlock(&file->port->file_mutex); - - kfree(file); -- kref_put(&dev->ref, ib_umad_release_dev); -+ kobject_put(&dev->kobj); - - return 0; - } -@@ -880,10 +883,6 @@ static int ib_umad_sm_open(struct inode *inode, struct file *filp) - int ret; - - port = container_of(inode->i_cdev, struct ib_umad_port, sm_cdev); -- if (port) -- kref_get(&port->umad_dev->ref); -- else -- return -ENXIO; - - if (filp->f_flags & O_NONBLOCK) { - if (down_trylock(&port->sm_sem)) { -@@ -898,17 +897,27 @@ static int ib_umad_sm_open(struct inode *inode, struct file *filp) - } - - ret = ib_modify_port(port->ib_dev, port->port_num, 0, &props); -- if (ret) { -- up(&port->sm_sem); -- goto fail; -- } -+ if (ret) -+ goto err_up_sem; - - filp->private_data = port; - -- return nonseekable_open(inode, filp); -+ ret = nonseekable_open(inode, filp); -+ if (ret) -+ goto err_clr_sm_cap; -+ -+ kobject_get(&port->umad_dev->kobj); -+ -+ return 0; -+ -+err_clr_sm_cap: -+ swap(props.set_port_cap_mask, props.clr_port_cap_mask); -+ ib_modify_port(port->ib_dev, port->port_num, 0, &props); -+ -+err_up_sem: -+ up(&port->sm_sem); - - fail: -- kref_put(&port->umad_dev->ref, ib_umad_release_dev); - return ret; - } - -@@ -927,7 +936,7 @@ static int ib_umad_sm_close(struct inode *inode, struct file *filp) - - up(&port->sm_sem); - -- kref_put(&port->umad_dev->ref, ib_umad_release_dev); -+ kobject_put(&port->umad_dev->kobj); - - return ret; - } -@@ -995,6 +1004,7 @@ static int find_overflow_devnum(void) - } - - static int ib_umad_init_port(struct ib_device *device, int port_num, -+ struct ib_umad_device *umad_dev, - struct ib_umad_port *port) - { - int devnum; -@@ -1027,6 +1037,7 @@ static int ib_umad_init_port(struct ib_device *device, int port_num, - - cdev_init(&port->cdev, &umad_fops); - port->cdev.owner = THIS_MODULE; -+ port->cdev.kobj.parent = &umad_dev->kobj; - kobject_set_name(&port->cdev.kobj, "umad%d", port->dev_num); - if (cdev_add(&port->cdev, base, 1)) - goto err_cdev; -@@ -1045,6 +1056,7 @@ static int ib_umad_init_port(struct ib_device *device, int port_num, - base += IB_UMAD_MAX_PORTS; - cdev_init(&port->sm_cdev, &umad_sm_fops); - port->sm_cdev.owner = THIS_MODULE; -+ port->sm_cdev.kobj.parent = &umad_dev->kobj; - kobject_set_name(&port->sm_cdev.kobj, "issm%d", port->dev_num); - if (cdev_add(&port->sm_cdev, base, 1)) - goto err_sm_cdev; -@@ -1138,7 +1150,7 @@ static void ib_umad_add_one(struct ib_device *device) - if (!umad_dev) - return; - -- kref_init(&umad_dev->ref); -+ kobject_init(&umad_dev->kobj, &ib_umad_dev_ktype); - - umad_dev->start_port = s; - umad_dev->end_port = e; -@@ -1146,7 +1158,8 @@ static void ib_umad_add_one(struct ib_device *device) - for (i = s; i <= e; ++i) { - umad_dev->port[i - s].umad_dev = umad_dev; - -- if (ib_umad_init_port(device, i, &umad_dev->port[i - s])) -+ if (ib_umad_init_port(device, i, umad_dev, -+ &umad_dev->port[i - s])) - goto err; - } - -@@ -1158,7 +1171,7 @@ static void ib_umad_add_one(struct ib_device *device) - while (--i >= s) - ib_umad_kill_port(&umad_dev->port[i - s]); - -- kref_put(&umad_dev->ref, ib_umad_release_dev); -+ kobject_put(&umad_dev->kobj); - } - - static void ib_umad_remove_one(struct ib_device *device) -@@ -1172,7 +1185,7 @@ static void ib_umad_remove_one(struct ib_device *device) - for (i = 0; i <= umad_dev->end_port - umad_dev->start_port; ++i) - ib_umad_kill_port(&umad_dev->port[i]); - -- kref_put(&umad_dev->ref, ib_umad_release_dev); -+ kobject_put(&umad_dev->kobj); - } - - static char *umad_devnode(struct device *dev, umode_t *mode) -diff --git a/drivers/infiniband/hw/ehca/ehca_cq.c b/drivers/infiniband/hw/ehca/ehca_cq.c -index d9b0ebc..6eeb84d 100644 ---- a/drivers/infiniband/hw/ehca/ehca_cq.c -+++ b/drivers/infiniband/hw/ehca/ehca_cq.c -@@ -296,6 +296,7 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector, - (my_cq->galpas.user.fw_handle & (PAGE_SIZE - 1)); - if (ib_copy_to_udata(udata, &resp, sizeof(resp))) { - ehca_err(device, "Copy to udata failed."); -+ cq = ERR_PTR(-EFAULT); - goto create_cq_exit4; - } - } -diff --git a/drivers/infiniband/hw/ipath/ipath_diag.c b/drivers/infiniband/hw/ipath/ipath_diag.c -index 714293b..45802e9 100644 ---- a/drivers/infiniband/hw/ipath/ipath_diag.c -+++ b/drivers/infiniband/hw/ipath/ipath_diag.c -@@ -326,7 +326,7 @@ static ssize_t ipath_diagpkt_write(struct file *fp, - size_t count, loff_t *off) - { - u32 __iomem *piobuf; -- u32 plen, clen, pbufn; -+ u32 plen, pbufn, maxlen_reserve; - struct ipath_diag_pkt odp; - struct ipath_diag_xpkt dp; - u32 *tmpbuf = NULL; -@@ -335,42 +335,24 @@ static ssize_t ipath_diagpkt_write(struct file *fp, - u64 val; - u32 l_state, lt_state; /* LinkState, LinkTrainingState */ - -- if (count < sizeof(odp)) { -- ret = -EINVAL; -- goto bail; -- } - - if (count == sizeof(dp)) { - if (copy_from_user(&dp, data, sizeof(dp))) { - ret = -EFAULT; - goto bail; - } -- } else if (copy_from_user(&odp, data, sizeof(odp))) { -- ret = -EFAULT; -- goto bail; -- } -- -- /* -- * Due to padding/alignment issues (lessened with new struct) -- * the old and new structs are the same length. We need to -- * disambiguate them, which we can do because odp.len has never -- * been less than the total of LRH+BTH+DETH so far, while -- * dp.unit (same offset) unit is unlikely to get that high. -- * Similarly, dp.data, the pointer to user at the same offset -- * as odp.unit, is almost certainly at least one (512byte)page -- * "above" NULL. The if-block below can be omitted if compatibility -- * between a new driver and older diagnostic code is unimportant. -- * compatibility the other direction (new diags, old driver) is -- * handled in the diagnostic code, with a warning. -- */ -- if (dp.unit >= 20 && dp.data < 512) { -- /* very probable version mismatch. Fix it up */ -- memcpy(&odp, &dp, sizeof(odp)); -- /* We got a legacy dp, copy elements to dp */ -+ } else if (count == sizeof(odp)) { -+ if (copy_from_user(&odp, data, sizeof(odp))) { -+ ret = -EFAULT; -+ goto bail; -+ } -+ dp.len = odp.len; - dp.unit = odp.unit; - dp.data = odp.data; -- dp.len = odp.len; -- dp.pbc_wd = 0; /* Indicate we need to compute PBC wd */ -+ dp.pbc_wd = 0; -+ } else { -+ ret = -EINVAL; -+ goto bail; - } - - /* send count must be an exact number of dwords */ -@@ -379,7 +361,7 @@ static ssize_t ipath_diagpkt_write(struct file *fp, - goto bail; - } - -- clen = dp.len >> 2; -+ plen = dp.len >> 2; - - dd = ipath_lookup(dp.unit); - if (!dd || !(dd->ipath_flags & IPATH_PRESENT) || -@@ -422,16 +404,22 @@ static ssize_t ipath_diagpkt_write(struct file *fp, - goto bail; - } - -- /* need total length before first word written */ -- /* +1 word is for the qword padding */ -- plen = sizeof(u32) + dp.len; -- -- if ((plen + 4) > dd->ipath_ibmaxlen) { -+ /* -+ * need total length before first word written, plus 2 Dwords. One Dword -+ * is for padding so we get the full user data when not aligned on -+ * a word boundary. The other Dword is to make sure we have room for the -+ * ICRC which gets tacked on later. -+ */ -+ maxlen_reserve = 2 * sizeof(u32); -+ if (dp.len > dd->ipath_ibmaxlen - maxlen_reserve) { - ipath_dbg("Pkt len 0x%x > ibmaxlen %x\n", -- plen - 4, dd->ipath_ibmaxlen); -+ dp.len, dd->ipath_ibmaxlen); - ret = -EINVAL; -- goto bail; /* before writing pbc */ -+ goto bail; - } -+ -+ plen = sizeof(u32) + dp.len; -+ - tmpbuf = vmalloc(plen); - if (!tmpbuf) { - dev_info(&dd->pcidev->dev, "Unable to allocate tmp buffer, " -@@ -473,11 +461,11 @@ static ssize_t ipath_diagpkt_write(struct file *fp, - */ - if (dd->ipath_flags & IPATH_PIO_FLUSH_WC) { - ipath_flush_wc(); -- __iowrite32_copy(piobuf + 2, tmpbuf, clen - 1); -+ __iowrite32_copy(piobuf + 2, tmpbuf, plen - 1); - ipath_flush_wc(); -- __raw_writel(tmpbuf[clen - 1], piobuf + clen + 1); -+ __raw_writel(tmpbuf[plen - 1], piobuf + plen + 1); - } else -- __iowrite32_copy(piobuf + 2, tmpbuf, clen); -+ __iowrite32_copy(piobuf + 2, tmpbuf, plen); - - ipath_flush_wc(); - -diff --git a/drivers/infiniband/hw/ipath/ipath_user_sdma.c b/drivers/infiniband/hw/ipath/ipath_user_sdma.c -index f5cb13b..cc04b7b 100644 ---- a/drivers/infiniband/hw/ipath/ipath_user_sdma.c -+++ b/drivers/infiniband/hw/ipath/ipath_user_sdma.c -@@ -280,9 +280,7 @@ static int ipath_user_sdma_pin_pages(const struct ipath_devdata *dd, - int j; - int ret; - -- ret = get_user_pages(current, current->mm, addr, -- npages, 0, 1, pages, NULL); -- -+ ret = get_user_pages_fast(addr, npages, 0, pages); - if (ret != npages) { - int i; - -@@ -811,10 +809,7 @@ int ipath_user_sdma_writev(struct ipath_devdata *dd, - while (dim) { - const int mxp = 8; - -- down_write(¤t->mm->mmap_sem); - ret = ipath_user_sdma_queue_pkts(dd, pq, &list, iov, dim, mxp); -- up_write(¤t->mm->mmap_sem); -- - if (ret <= 0) - goto done_unlock; - else { -diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c -index 5b71d43..42dde06 100644 ---- a/drivers/infiniband/hw/mthca/mthca_provider.c -+++ b/drivers/infiniband/hw/mthca/mthca_provider.c -@@ -695,6 +695,7 @@ static struct ib_cq *mthca_create_cq(struct ib_device *ibdev, int entries, - - if (context && ib_copy_to_udata(udata, &cq->cqn, sizeof (__u32))) { - mthca_free_cq(to_mdev(ibdev), cq); -+ err = -EFAULT; - goto err_free; - } - -diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c -index da84ea3..daf70d3 100644 ---- a/drivers/infiniband/hw/nes/nes_verbs.c -+++ b/drivers/infiniband/hw/nes/nes_verbs.c -@@ -1183,7 +1183,7 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd, - nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num); - kfree(nesqp->allocated_buffer); - nes_debug(NES_DBG_QP, "ib_copy_from_udata() Failed \n"); -- return NULL; -+ return ERR_PTR(-EFAULT); - } - if (req.user_wqe_buffers) { - virt_wqs = 1; -diff --git a/drivers/infiniband/hw/qib/qib_iba7322.c b/drivers/infiniband/hw/qib/qib_iba7322.c -index 060b960..d252053 100644 ---- a/drivers/infiniband/hw/qib/qib_iba7322.c -+++ b/drivers/infiniband/hw/qib/qib_iba7322.c -@@ -2279,6 +2279,11 @@ static int qib_7322_bringup_serdes(struct qib_pportdata *ppd) - qib_write_kreg_port(ppd, krp_ibcctrl_a, ppd->cpspec->ibcctrl_a); - qib_write_kreg(dd, kr_scratch, 0ULL); - -+ /* ensure previous Tx parameters are not still forced */ -+ qib_write_kreg_port(ppd, krp_tx_deemph_override, -+ SYM_MASK(IBSD_TX_DEEMPHASIS_OVERRIDE_0, -+ reset_tx_deemphasis_override)); -+ - if (qib_compat_ddr_negotiate) { - ppd->cpspec->ibdeltainprog = 1; - ppd->cpspec->ibsymsnap = read_7322_creg32_port(ppd, -diff --git a/drivers/infiniband/hw/qib/qib_mad.c b/drivers/infiniband/hw/qib/qib_mad.c -index c4ff788..14f3929 100644 ---- a/drivers/infiniband/hw/qib/qib_mad.c -+++ b/drivers/infiniband/hw/qib/qib_mad.c -@@ -1005,7 +1005,7 @@ static int set_pkeys(struct qib_devdata *dd, u8 port, u16 *pkeys) - - event.event = IB_EVENT_PKEY_CHANGE; - event.device = &dd->verbs_dev.ibdev; -- event.element.port_num = 1; -+ event.element.port_num = port; - ib_dispatch_event(&event); - } - return 0; -diff --git a/drivers/infiniband/hw/qib/qib_ud.c b/drivers/infiniband/hw/qib/qib_ud.c -index 828609f..c0d93d4 100644 ---- a/drivers/infiniband/hw/qib/qib_ud.c -+++ b/drivers/infiniband/hw/qib/qib_ud.c -@@ -57,13 +57,20 @@ static void qib_ud_loopback(struct qib_qp *sqp, struct qib_swqe *swqe) - struct qib_sge *sge; - struct ib_wc wc; - u32 length; -+ enum ib_qp_type sqptype, dqptype; - - qp = qib_lookup_qpn(ibp, swqe->wr.wr.ud.remote_qpn); - if (!qp) { - ibp->n_pkt_drops++; - return; - } -- if (qp->ibqp.qp_type != sqp->ibqp.qp_type || -+ -+ sqptype = sqp->ibqp.qp_type == IB_QPT_GSI ? -+ IB_QPT_UD : sqp->ibqp.qp_type; -+ dqptype = qp->ibqp.qp_type == IB_QPT_GSI ? -+ IB_QPT_UD : qp->ibqp.qp_type; -+ -+ if (dqptype != sqptype || - !(ib_qib_state_ops[qp->state] & QIB_PROCESS_RECV_OK)) { - ibp->n_pkt_drops++; - goto drop; -diff --git a/drivers/infiniband/hw/qib/qib_user_sdma.c b/drivers/infiniband/hw/qib/qib_user_sdma.c -index 8244208..573b460 100644 ---- a/drivers/infiniband/hw/qib/qib_user_sdma.c -+++ b/drivers/infiniband/hw/qib/qib_user_sdma.c -@@ -284,8 +284,7 @@ static int qib_user_sdma_pin_pages(const struct qib_devdata *dd, - int j; - int ret; - -- ret = get_user_pages(current, current->mm, addr, -- npages, 0, 1, pages, NULL); -+ ret = get_user_pages_fast(addr, npages, 0, pages); - - if (ret != npages) { - int i; -@@ -830,10 +829,7 @@ int qib_user_sdma_writev(struct qib_ctxtdata *rcd, - while (dim) { - const int mxp = 8; - -- down_write(¤t->mm->mmap_sem); - ret = qib_user_sdma_queue_pkts(dd, pq, &list, iov, dim, mxp); -- up_write(¤t->mm->mmap_sem); -- - if (ret <= 0) - goto done_unlock; - else { -diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c -index 922d845..7fa948d 100644 ---- a/drivers/infiniband/ulp/srp/ib_srp.c -+++ b/drivers/infiniband/ulp/srp/ib_srp.c -@@ -1371,6 +1371,12 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd) - err_iu: - srp_put_tx_iu(target, iu, SRP_IU_CMD); - -+ /* -+ * Avoid that the loops that iterate over the request ring can -+ * encounter a dangling SCSI command pointer. -+ */ -+ req->scmnd = NULL; -+ - spin_lock_irqsave(&target->lock, flags); - list_add(&req->list, &target->free_reqs); - -diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c -index c34d362..550c9ca 100644 ---- a/drivers/infiniband/ulp/srpt/ib_srpt.c -+++ b/drivers/infiniband/ulp/srpt/ib_srpt.c -@@ -1078,6 +1078,7 @@ static void srpt_unmap_sg_to_ib_sge(struct srpt_rdma_ch *ch, - static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, - struct srpt_send_ioctx *ioctx) - { -+ struct ib_device *dev = ch->sport->sdev->device; - struct se_cmd *cmd; - struct scatterlist *sg, *sg_orig; - int sg_cnt; -@@ -1125,7 +1126,7 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, - - db = ioctx->rbufs; - tsize = cmd->data_length; -- dma_len = sg_dma_len(&sg[0]); -+ dma_len = ib_sg_dma_len(dev, &sg[0]); - riu = ioctx->rdma_ius; - - /* -@@ -1156,7 +1157,8 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, - ++j; - if (j < count) { - sg = sg_next(sg); -- dma_len = sg_dma_len(sg); -+ dma_len = ib_sg_dma_len( -+ dev, sg); - } - } - } else { -@@ -1193,8 +1195,8 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, - tsize = cmd->data_length; - riu = ioctx->rdma_ius; - sg = sg_orig; -- dma_len = sg_dma_len(&sg[0]); -- dma_addr = sg_dma_address(&sg[0]); -+ dma_len = ib_sg_dma_len(dev, &sg[0]); -+ dma_addr = ib_sg_dma_address(dev, &sg[0]); - - /* this second loop is really mapped sg_addres to rdma_iu->ib_sge */ - for (i = 0, j = 0; -@@ -1217,8 +1219,10 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, - ++j; - if (j < count) { - sg = sg_next(sg); -- dma_len = sg_dma_len(sg); -- dma_addr = sg_dma_address(sg); -+ dma_len = ib_sg_dma_len( -+ dev, sg); -+ dma_addr = ib_sg_dma_address( -+ dev, sg); - } - } - } else { -diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig -index 69d3686..2c66a8c 100644 ---- a/drivers/input/Kconfig -+++ b/drivers/input/Kconfig -@@ -71,7 +71,7 @@ config INPUT_SPARSEKMAP - comment "Userland interfaces" - - config INPUT_MOUSEDEV -- tristate "Mouse interface" if EXPERT -+ tristate "Mouse interface" - default y - help - Say Y here if you want your mouse to be accessible as char devices -diff --git a/drivers/input/input.c b/drivers/input/input.c -index 79e1c40..d48d68b 100644 ---- a/drivers/input/input.c -+++ b/drivers/input/input.c -@@ -1711,6 +1711,10 @@ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int - break; - - case EV_ABS: -+ input_alloc_absinfo(dev); -+ if (!dev->absinfo) -+ return; -+ - __set_bit(code, dev->absbit); - break; - -diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig -index bfa48de..290d4d9 100644 ---- a/drivers/input/keyboard/Kconfig -+++ b/drivers/input/keyboard/Kconfig -@@ -2,7 +2,7 @@ - # Input core configuration - # - menuconfig INPUT_KEYBOARD -- bool "Keyboards" if EXPERT || !X86 -+ bool "Keyboards" - default y - help - Say Y here, and a list of supported keyboards will be displayed. -@@ -67,7 +67,7 @@ config KEYBOARD_ATARI - module will be called atakbd. - - config KEYBOARD_ATKBD -- tristate "AT keyboard" if EXPERT || !X86 -+ tristate "AT keyboard" - default y - select SERIO - select SERIO_LIBPS2 -diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c -index 4790110..f2c2ffe 100644 ---- a/drivers/input/mouse/elantech.c -+++ b/drivers/input/mouse/elantech.c -@@ -472,8 +472,15 @@ static void elantech_report_absolute_v3(struct psmouse *psmouse, - input_report_key(dev, BTN_TOOL_FINGER, fingers == 1); - input_report_key(dev, BTN_TOOL_DOUBLETAP, fingers == 2); - input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3); -- input_report_key(dev, BTN_LEFT, packet[0] & 0x01); -- input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); -+ -+ /* For clickpads map both buttons to BTN_LEFT */ -+ if (etd->fw_version & 0x001000) { -+ input_report_key(dev, BTN_LEFT, packet[0] & 0x03); -+ } else { -+ input_report_key(dev, BTN_LEFT, packet[0] & 0x01); -+ input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); -+ } -+ - input_report_abs(dev, ABS_PRESSURE, pres); - input_report_abs(dev, ABS_TOOL_WIDTH, width); - -@@ -483,9 +490,17 @@ static void elantech_report_absolute_v3(struct psmouse *psmouse, - static void elantech_input_sync_v4(struct psmouse *psmouse) - { - struct input_dev *dev = psmouse->dev; -+ struct elantech_data *etd = psmouse->private; - unsigned char *packet = psmouse->packet; - -- input_report_key(dev, BTN_LEFT, packet[0] & 0x01); -+ /* For clickpads map both buttons to BTN_LEFT */ -+ if (etd->fw_version & 0x001000) { -+ input_report_key(dev, BTN_LEFT, packet[0] & 0x03); -+ } else { -+ input_report_key(dev, BTN_LEFT, packet[0] & 0x01); -+ input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); -+ } -+ - input_mt_report_pointer_emulation(dev, true); - input_sync(dev); - } -@@ -954,6 +969,44 @@ static int elantech_get_resolution_v4(struct psmouse *psmouse, - } - - /* -+ * Advertise INPUT_PROP_BUTTONPAD for clickpads. The testing of bit 12 in -+ * fw_version for this is based on the following fw_version & caps table: -+ * -+ * Laptop-model: fw_version: caps: buttons: -+ * Acer S3 0x461f00 10, 13, 0e clickpad -+ * Acer S7-392 0x581f01 50, 17, 0d clickpad -+ * Acer V5-131 0x461f02 01, 16, 0c clickpad -+ * Acer V5-551 0x461f00 ? clickpad -+ * Asus K53SV 0x450f01 78, 15, 0c 2 hw buttons -+ * Asus G46VW 0x460f02 00, 18, 0c 2 hw buttons -+ * Asus G750JX 0x360f00 00, 16, 0c 2 hw buttons -+ * Asus UX31 0x361f00 20, 15, 0e clickpad -+ * Asus UX32VD 0x361f02 00, 15, 0e clickpad -+ * Avatar AVIU-145A2 0x361f00 ? clickpad -+ * Gigabyte U2442 0x450f01 58, 17, 0c 2 hw buttons -+ * Lenovo L430 0x350f02 b9, 15, 0c 2 hw buttons (*) -+ * Samsung NF210 0x150b00 78, 14, 0a 2 hw buttons -+ * Samsung NP770Z5E 0x575f01 10, 15, 0f clickpad -+ * Samsung NP700Z5B 0x361f06 21, 15, 0f clickpad -+ * Samsung NP900X3E-A02 0x575f03 ? clickpad -+ * Samsung NP-QX410 0x851b00 19, 14, 0c clickpad -+ * Samsung RC512 0x450f00 08, 15, 0c 2 hw buttons -+ * Samsung RF710 0x450f00 ? 2 hw buttons -+ * System76 Pangolin 0x250f01 ? 2 hw buttons -+ * (*) + 3 trackpoint buttons -+ */ -+static void elantech_set_buttonpad_prop(struct psmouse *psmouse) -+{ -+ struct input_dev *dev = psmouse->dev; -+ struct elantech_data *etd = psmouse->private; -+ -+ if (etd->fw_version & 0x001000) { -+ __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); -+ __clear_bit(BTN_RIGHT, dev->keybit); -+ } -+} -+ -+/* - * Set the appropriate event bits for the input subsystem - */ - static int elantech_set_input_params(struct psmouse *psmouse) -@@ -996,6 +1049,8 @@ static int elantech_set_input_params(struct psmouse *psmouse) - __set_bit(INPUT_PROP_SEMI_MT, dev->propbit); - /* fall through */ - case 3: -+ if (etd->hw_version == 3) -+ elantech_set_buttonpad_prop(psmouse); - input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0); - input_set_abs_params(dev, ABS_Y, y_min, y_max, 0, 0); - if (etd->reports_pressure) { -@@ -1017,9 +1072,7 @@ static int elantech_set_input_params(struct psmouse *psmouse) - */ - psmouse_warn(psmouse, "couldn't query resolution data.\n"); - } -- /* v4 is clickpad, with only one button. */ -- __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); -- __clear_bit(BTN_RIGHT, dev->keybit); -+ elantech_set_buttonpad_prop(psmouse); - __set_bit(BTN_TOOL_QUADTAP, dev->keybit); - /* For X to recognize me as touchpad. */ - input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0); -@@ -1165,6 +1218,13 @@ static bool elantech_is_signature_valid(const unsigned char *param) - if (param[1] == 0) - return true; - -+ /* -+ * Some models have a revision higher then 20. Meaning param[2] may -+ * be 10 or 20, skip the rates check for these. -+ */ -+ if (param[0] == 0x46 && (param[1] & 0xef) == 0x0f && param[2] < 40) -+ return true; -+ - for (i = 0; i < ARRAY_SIZE(rates); i++) - if (param[2] == rates[i]) - return false; -diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c -index a4b14a4..32b1363 100644 ---- a/drivers/input/mouse/synaptics.c -+++ b/drivers/input/mouse/synaptics.c -@@ -40,11 +40,33 @@ - * Note that newer firmware allows querying device for maximum useable - * coordinates. - */ -+#define XMIN 0 -+#define XMAX 6143 -+#define YMIN 0 -+#define YMAX 6143 - #define XMIN_NOMINAL 1472 - #define XMAX_NOMINAL 5472 - #define YMIN_NOMINAL 1408 - #define YMAX_NOMINAL 4448 - -+/* Size in bits of absolute position values reported by the hardware */ -+#define ABS_POS_BITS 13 -+ -+/* -+ * These values should represent the absolute maximum value that will -+ * be reported for a positive position value. Some Synaptics firmware -+ * uses this value to indicate a finger near the edge of the touchpad -+ * whose precise position cannot be determined. -+ * -+ * At least one touchpad is known to report positions in excess of this -+ * value which are actually negative values truncated to the 13-bit -+ * reporting range. These values have never been observed to be lower -+ * than 8184 (i.e. -8), so we treat all values greater than 8176 as -+ * negative and any other value as positive. -+ */ -+#define X_MAX_POSITIVE 8176 -+#define Y_MAX_POSITIVE 8176 -+ - /* - * Synaptics touchpads report the y coordinate from bottom to top, which is - * opposite from what userspace expects. -@@ -215,11 +237,22 @@ static int synaptics_identify(struct psmouse *psmouse) - * Read touchpad resolution and maximum reported coordinates - * Resolution is left zero if touchpad does not support the query - */ -+ -+static const int *quirk_min_max; -+ - static int synaptics_resolution(struct psmouse *psmouse) - { - struct synaptics_data *priv = psmouse->private; - unsigned char resp[3]; - -+ if (quirk_min_max) { -+ priv->x_min = quirk_min_max[0]; -+ priv->x_max = quirk_min_max[1]; -+ priv->y_min = quirk_min_max[2]; -+ priv->y_max = quirk_min_max[3]; -+ return 0; -+ } -+ - if (SYN_ID_MAJOR(priv->identity) < 4) - return 0; - -@@ -484,10 +517,61 @@ static int synaptics_parse_hw_state(const unsigned char buf[], - ((buf[0] & 0x04) >> 1) | - ((buf[3] & 0x04) >> 2)); - -+ if ((SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) || -+ SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) && -+ hw->w == 2) { -+ synaptics_parse_agm(buf, priv, hw); -+ return 1; -+ } -+ -+ hw->x = (((buf[3] & 0x10) << 8) | -+ ((buf[1] & 0x0f) << 8) | -+ buf[4]); -+ hw->y = (((buf[3] & 0x20) << 7) | -+ ((buf[1] & 0xf0) << 4) | -+ buf[5]); -+ hw->z = buf[2]; -+ - hw->left = (buf[0] & 0x01) ? 1 : 0; - hw->right = (buf[0] & 0x02) ? 1 : 0; - -- if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) { -+ if (SYN_CAP_FORCEPAD(priv->ext_cap_0c)) { -+ /* -+ * ForcePads, like Clickpads, use middle button -+ * bits to report primary button clicks. -+ * Unfortunately they report primary button not -+ * only when user presses on the pad above certain -+ * threshold, but also when there are more than one -+ * finger on the touchpad, which interferes with -+ * out multi-finger gestures. -+ */ -+ if (hw->z == 0) { -+ /* No contacts */ -+ priv->press = priv->report_press = false; -+ } else if (hw->w >= 4 && ((buf[0] ^ buf[3]) & 0x01)) { -+ /* -+ * Single-finger touch with pressure above -+ * the threshold. If pressure stays long -+ * enough, we'll start reporting primary -+ * button. We rely on the device continuing -+ * sending data even if finger does not -+ * move. -+ */ -+ if (!priv->press) { -+ priv->press_start = jiffies; -+ priv->press = true; -+ } else if (time_after(jiffies, -+ priv->press_start + -+ msecs_to_jiffies(50))) { -+ priv->report_press = true; -+ } -+ } else { -+ priv->press = false; -+ } -+ -+ hw->left = priv->report_press; -+ -+ } else if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) { - /* - * Clickpad's button is transmitted as middle button, - * however, since it is primary button, we will report -@@ -506,21 +590,6 @@ static int synaptics_parse_hw_state(const unsigned char buf[], - hw->down = ((buf[0] ^ buf[3]) & 0x02) ? 1 : 0; - } - -- if ((SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) || -- SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) && -- hw->w == 2) { -- synaptics_parse_agm(buf, priv, hw); -- return 1; -- } -- -- hw->x = (((buf[3] & 0x10) << 8) | -- ((buf[1] & 0x0f) << 8) | -- buf[4]); -- hw->y = (((buf[3] & 0x20) << 7) | -- ((buf[1] & 0xf0) << 4) | -- buf[5]); -- hw->z = buf[2]; -- - if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) && - ((buf[0] ^ buf[3]) & 0x02)) { - switch (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) & ~0x01) { -@@ -555,6 +624,22 @@ static int synaptics_parse_hw_state(const unsigned char buf[], - hw->right = (buf[0] & 0x02) ? 1 : 0; - } - -+ /* -+ * Convert wrap-around values to negative. (X|Y)_MAX_POSITIVE -+ * is used by some firmware to indicate a finger at the edge of -+ * the touchpad whose precise position cannot be determined, so -+ * convert these values to the maximum axis value. -+ */ -+ if (hw->x > X_MAX_POSITIVE) -+ hw->x -= 1 << ABS_POS_BITS; -+ else if (hw->x == X_MAX_POSITIVE) -+ hw->x = XMAX; -+ -+ if (hw->y > Y_MAX_POSITIVE) -+ hw->y -= 1 << ABS_POS_BITS; -+ else if (hw->y == Y_MAX_POSITIVE) -+ hw->y = YMAX; -+ - return 0; - } - -@@ -1389,10 +1474,54 @@ static const struct dmi_system_id __initconst olpc_dmi_table[] = { - { } - }; - -+static const struct dmi_system_id min_max_dmi_table[] __initconst = { -+#if defined(CONFIG_DMI) -+ { -+ /* Lenovo ThinkPad Helix */ -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), -+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Helix"), -+ }, -+ .driver_data = (int []){1024, 5052, 2258, 4832}, -+ }, -+ { -+ /* Lenovo ThinkPad X240 */ -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), -+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X240"), -+ }, -+ .driver_data = (int []){1232, 5710, 1156, 4696}, -+ }, -+ { -+ /* Lenovo ThinkPad T440s */ -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), -+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T440"), -+ }, -+ .driver_data = (int []){1024, 5112, 2024, 4832}, -+ }, -+ { -+ /* Lenovo ThinkPad T540p */ -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), -+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T540"), -+ }, -+ .driver_data = (int []){1024, 5056, 2058, 4832}, -+ }, -+#endif -+ { } -+}; -+ - void __init synaptics_module_init(void) - { -+ const struct dmi_system_id *min_max_dmi; -+ - impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table); - broken_olpc_ec = dmi_check_system(olpc_dmi_table); -+ -+ min_max_dmi = dmi_first_match(min_max_dmi_table); -+ if (min_max_dmi) -+ quirk_min_max = min_max_dmi->driver_data; - } - - static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode) -diff --git a/drivers/input/mouse/synaptics.h b/drivers/input/mouse/synaptics.h -index fd26ccc..ac1b773 100644 ---- a/drivers/input/mouse/synaptics.h -+++ b/drivers/input/mouse/synaptics.h -@@ -77,6 +77,11 @@ - * 2 0x08 image sensor image sensor tracks 5 fingers, but only - * reports 2. - * 2 0x20 report min query 0x0f gives min coord reported -+ * 2 0x80 forcepad forcepad is a variant of clickpad that -+ * does not have physical buttons but rather -+ * uses pressure above certain threshold to -+ * report primary clicks. Forcepads also have -+ * clickpad bit set. - */ - #define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */ - #define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */ -@@ -85,6 +90,7 @@ - #define SYN_CAP_ADV_GESTURE(ex0c) ((ex0c) & 0x080000) - #define SYN_CAP_REDUCED_FILTERING(ex0c) ((ex0c) & 0x000400) - #define SYN_CAP_IMAGE_SENSOR(ex0c) ((ex0c) & 0x000800) -+#define SYN_CAP_FORCEPAD(ex0c) ((ex0c) & 0x008000) - - /* synaptics modes query bits */ - #define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7)) -@@ -174,6 +180,11 @@ struct synaptics_data { - */ - struct synaptics_hw_state agm; - bool agm_pending; /* new AGM packet received */ -+ -+ /* ForcePad handling */ -+ unsigned long press_start; -+ bool press; -+ bool report_press; - }; - - void synaptics_module_init(void); -diff --git a/drivers/input/serio/Kconfig b/drivers/input/serio/Kconfig -index 55f2c22..93d4182 100644 ---- a/drivers/input/serio/Kconfig -+++ b/drivers/input/serio/Kconfig -@@ -2,7 +2,7 @@ - # Input core configuration - # - config SERIO -- tristate "Serial I/O support" if EXPERT || !X86 -+ tristate "Serial I/O support" - default y - help - Say Yes here if you have any input device that uses serial I/O to -@@ -19,7 +19,7 @@ config SERIO - if SERIO - - config SERIO_I8042 -- tristate "i8042 PC Keyboard controller" if EXPERT || !X86 -+ tristate "i8042 PC Keyboard controller" - default y - depends on !PARISC && (!ARM || ARCH_SHARK || FOOTBRIDGE_HOST) && \ - (!SUPERH || SH_CAYMAN) && !M68K && !BLACKFIN -@@ -168,7 +168,7 @@ config SERIO_MACEPS2 - module will be called maceps2. - - config SERIO_LIBPS2 -- tristate "PS/2 driver library" if EXPERT -+ tristate "PS/2 driver library" - depends on SERIO_I8042 || SERIO_I8042=n - help - Say Y here if you are using a driver for device connected -diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h -index 5f306f7..1291673 100644 ---- a/drivers/input/serio/i8042-x86ia64io.h -+++ b/drivers/input/serio/i8042-x86ia64io.h -@@ -458,6 +458,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { - DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"), - }, - }, -+ { -+ /* Avatar AVIU-145A6 */ -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "Intel"), -+ DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"), -+ }, -+ }, - { } - }; - -@@ -601,6 +608,14 @@ static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = { - DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"), - }, - }, -+ { -+ /* Fujitsu U574 laptop */ -+ /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), -+ DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"), -+ }, -+ }, - { } - }; - -@@ -765,6 +780,7 @@ static struct pnp_device_id pnp_kbd_devids[] = { - { .id = "CPQA0D7", .driver_data = 0 }, - { .id = "", }, - }; -+MODULE_DEVICE_TABLE(pnp, pnp_kbd_devids); - - static struct pnp_driver i8042_pnp_kbd_driver = { - .name = "i8042 kbd", -@@ -786,6 +802,7 @@ static struct pnp_device_id pnp_aux_devids[] = { - { .id = "SYN0801", .driver_data = 0 }, - { .id = "", }, - }; -+MODULE_DEVICE_TABLE(pnp, pnp_aux_devids); - - static struct pnp_driver i8042_pnp_aux_driver = { - .name = "i8042 aux", -diff --git a/drivers/input/serio/serport.c b/drivers/input/serio/serport.c -index 8755f5f..e4ecf3b 100644 ---- a/drivers/input/serio/serport.c -+++ b/drivers/input/serio/serport.c -@@ -21,6 +21,7 @@ - #include - #include - #include -+#include - - MODULE_AUTHOR("Vojtech Pavlik "); - MODULE_DESCRIPTION("Input device TTY line discipline"); -@@ -196,28 +197,55 @@ static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file, u - return 0; - } - -+static void serport_set_type(struct tty_struct *tty, unsigned long type) -+{ -+ struct serport *serport = tty->disc_data; -+ -+ serport->id.proto = type & 0x000000ff; -+ serport->id.id = (type & 0x0000ff00) >> 8; -+ serport->id.extra = (type & 0x00ff0000) >> 16; -+} -+ - /* - * serport_ldisc_ioctl() allows to set the port protocol, and device ID - */ - --static int serport_ldisc_ioctl(struct tty_struct * tty, struct file * file, unsigned int cmd, unsigned long arg) -+static int serport_ldisc_ioctl(struct tty_struct *tty, struct file *file, -+ unsigned int cmd, unsigned long arg) - { -- struct serport *serport = (struct serport*) tty->disc_data; -- unsigned long type; -- - if (cmd == SPIOCSTYPE) { -+ unsigned long type; -+ - if (get_user(type, (unsigned long __user *) arg)) - return -EFAULT; - -- serport->id.proto = type & 0x000000ff; -- serport->id.id = (type & 0x0000ff00) >> 8; -- serport->id.extra = (type & 0x00ff0000) >> 16; -+ serport_set_type(tty, type); -+ return 0; -+ } -+ -+ return -EINVAL; -+} -+ -+#ifdef CONFIG_COMPAT -+#define COMPAT_SPIOCSTYPE _IOW('q', 0x01, compat_ulong_t) -+static long serport_ldisc_compat_ioctl(struct tty_struct *tty, -+ struct file *file, -+ unsigned int cmd, unsigned long arg) -+{ -+ if (cmd == COMPAT_SPIOCSTYPE) { -+ void __user *uarg = compat_ptr(arg); -+ compat_ulong_t compat_type; -+ -+ if (get_user(compat_type, (compat_ulong_t __user *)uarg)) -+ return -EFAULT; - -+ serport_set_type(tty, compat_type); - return 0; - } - - return -EINVAL; - } -+#endif - - static void serport_ldisc_write_wakeup(struct tty_struct * tty) - { -@@ -241,6 +269,9 @@ static struct tty_ldisc_ops serport_ldisc = { - .close = serport_ldisc_close, - .read = serport_ldisc_read, - .ioctl = serport_ldisc_ioctl, -+#ifdef CONFIG_COMPAT -+ .compat_ioctl = serport_ldisc_compat_ioctl, -+#endif - .receive_buf = serport_ldisc_receive, - .write_wakeup = serport_ldisc_write_wakeup - }; -diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c -index 22cd96f..ce384a4 100644 ---- a/drivers/input/touchscreen/usbtouchscreen.c -+++ b/drivers/input/touchscreen/usbtouchscreen.c -@@ -106,6 +106,7 @@ struct usbtouch_device_info { - struct usbtouch_usb { - unsigned char *data; - dma_addr_t data_dma; -+ int data_size; - unsigned char *buffer; - int buf_len; - struct urb *irq; -@@ -1474,7 +1475,7 @@ static int usbtouch_reset_resume(struct usb_interface *intf) - static void usbtouch_free_buffers(struct usb_device *udev, - struct usbtouch_usb *usbtouch) - { -- usb_free_coherent(udev, usbtouch->type->rept_size, -+ usb_free_coherent(udev, usbtouch->data_size, - usbtouch->data, usbtouch->data_dma); - kfree(usbtouch->buffer); - } -@@ -1519,7 +1520,20 @@ static int usbtouch_probe(struct usb_interface *intf, - if (!type->process_pkt) - type->process_pkt = usbtouch_process_pkt; - -- usbtouch->data = usb_alloc_coherent(udev, type->rept_size, -+ usbtouch->data_size = type->rept_size; -+ if (type->get_pkt_len) { -+ /* -+ * When dealing with variable-length packets we should -+ * not request more than wMaxPacketSize bytes at once -+ * as we do not know if there is more data coming or -+ * we filled exactly wMaxPacketSize bytes and there is -+ * nothing else. -+ */ -+ usbtouch->data_size = min(usbtouch->data_size, -+ usb_endpoint_maxp(endpoint)); -+ } -+ -+ usbtouch->data = usb_alloc_coherent(udev, usbtouch->data_size, - GFP_KERNEL, &usbtouch->data_dma); - if (!usbtouch->data) - goto out_free; -@@ -1578,12 +1592,12 @@ static int usbtouch_probe(struct usb_interface *intf, - if (usb_endpoint_type(endpoint) == USB_ENDPOINT_XFER_INT) - usb_fill_int_urb(usbtouch->irq, udev, - usb_rcvintpipe(udev, endpoint->bEndpointAddress), -- usbtouch->data, type->rept_size, -+ usbtouch->data, usbtouch->data_size, - usbtouch_irq, usbtouch, endpoint->bInterval); - else - usb_fill_bulk_urb(usbtouch->irq, udev, - usb_rcvbulkpipe(udev, endpoint->bEndpointAddress), -- usbtouch->data, type->rept_size, -+ usbtouch->data, usbtouch->data_size, - usbtouch_irq, usbtouch); - - usbtouch->irq->dev = udev; -diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c -index 56ddfedf..a20d64d 100644 ---- a/drivers/iommu/amd_iommu.c -+++ b/drivers/iommu/amd_iommu.c -@@ -3028,14 +3028,16 @@ int __init amd_iommu_init_dma_ops(void) - - static void cleanup_domain(struct protection_domain *domain) - { -- struct iommu_dev_data *dev_data, *next; -+ struct iommu_dev_data *entry; - unsigned long flags; - - write_lock_irqsave(&amd_iommu_devtable_lock, flags); - -- list_for_each_entry_safe(dev_data, next, &domain->dev_list, list) { -- __detach_device(dev_data); -- atomic_set(&dev_data->bind, 0); -+ while (!list_empty(&domain->dev_list)) { -+ entry = list_first_entry(&domain->dev_list, -+ struct iommu_dev_data, list); -+ __detach_device(entry); -+ atomic_set(&entry->bind, 0); - } - - write_unlock_irqrestore(&amd_iommu_devtable_lock, flags); -diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c -index 97b2e21..cf065df 100644 ---- a/drivers/iommu/dmar.c -+++ b/drivers/iommu/dmar.c -@@ -582,7 +582,7 @@ int alloc_iommu(struct dmar_drhd_unit *drhd) - { - struct intel_iommu *iommu; - int map_size; -- u32 ver; -+ u32 ver, sts; - static int iommu_allocated = 0; - int agaw = 0; - int msagaw = 0; -@@ -652,6 +652,15 @@ int alloc_iommu(struct dmar_drhd_unit *drhd) - (unsigned long long)iommu->cap, - (unsigned long long)iommu->ecap); - -+ /* Reflect status in gcmd */ -+ sts = readl(iommu->reg + DMAR_GSTS_REG); -+ if (sts & DMA_GSTS_IRES) -+ iommu->gcmd |= DMA_GCMD_IRE; -+ if (sts & DMA_GSTS_TES) -+ iommu->gcmd |= DMA_GCMD_TE; -+ if (sts & DMA_GSTS_QIES) -+ iommu->gcmd |= DMA_GCMD_QIE; -+ - raw_spin_lock_init(&iommu->register_lock); - - drhd->iommu = iommu; -diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c -index befab8c..a5f4359 100644 ---- a/drivers/iommu/intel-iommu.c -+++ b/drivers/iommu/intel-iommu.c -@@ -778,7 +778,11 @@ static struct dma_pte *pfn_to_dma_pte(struct dmar_domain *domain, - int offset; - - BUG_ON(!domain->pgd); -- BUG_ON(addr_width < BITS_PER_LONG && pfn >> addr_width); -+ -+ if (addr_width < BITS_PER_LONG && pfn >> addr_width) -+ /* Address beyond IOMMU's addressing capabilities. */ -+ return NULL; -+ - parent = domain->pgd; - - while (level > 0) { -@@ -909,7 +913,7 @@ static void dma_pte_free_level(struct dmar_domain *domain, int level, - - /* If range covers entire pagetable, free it */ - if (!(start_pfn > level_pfn || -- last_pfn < level_pfn + level_size(level))) { -+ last_pfn < level_pfn + level_size(level) - 1)) { - dma_clear_pte(pte); - domain_flush_cache(domain, pte, sizeof(*pte)); - free_pgtable_page(level_pte); -@@ -3655,6 +3659,7 @@ static struct notifier_block device_nb = { - int __init intel_iommu_init(void) - { - int ret = 0; -+ struct dmar_drhd_unit *drhd; - - /* VT-d is required for a TXT/tboot launch, so enforce that */ - force_on = tboot_force_iommu(); -@@ -3665,6 +3670,20 @@ int __init intel_iommu_init(void) - return -ENODEV; - } - -+ /* -+ * Disable translation if already enabled prior to OS handover. -+ */ -+ for_each_drhd_unit(drhd) { -+ struct intel_iommu *iommu; -+ -+ if (drhd->ignored) -+ continue; -+ -+ iommu = drhd->iommu; -+ if (iommu->gcmd & DMA_GCMD_TE) -+ iommu_disable_translation(iommu); -+ } -+ - if (dmar_dev_scope_init() < 0) { - if (force_on) - panic("tboot: Failed to initialize DMAR device scope\n"); -diff --git a/drivers/isdn/isdnloop/isdnloop.c b/drivers/isdn/isdnloop/isdnloop.c -index baf2686..5a4da94 100644 ---- a/drivers/isdn/isdnloop/isdnloop.c -+++ b/drivers/isdn/isdnloop/isdnloop.c -@@ -518,9 +518,9 @@ static isdnloop_stat isdnloop_cmd_table[] = - static void - isdnloop_fake_err(isdnloop_card *card) - { -- char buf[60]; -+ char buf[64]; - -- sprintf(buf, "E%s", card->omsg); -+ snprintf(buf, sizeof(buf), "E%s", card->omsg); - isdnloop_fake(card, buf, -1); - isdnloop_fake(card, "NAK", -1); - } -@@ -903,6 +903,8 @@ isdnloop_parse_cmd(isdnloop_card *card) - case 7: - /* 0x;EAZ */ - p += 3; -+ if (strlen(p) >= sizeof(card->eazlist[0])) -+ break; - strcpy(card->eazlist[ch - 1], p); - break; - case 8: -@@ -1070,6 +1072,12 @@ isdnloop_start(isdnloop_card *card, isdnloop_sdef *sdefp) - return -EBUSY; - if (copy_from_user((char *) &sdef, (char *) sdefp, sizeof(sdef))) - return -EFAULT; -+ -+ for (i = 0; i < 3; i++) { -+ if (!memchr(sdef.num[i], 0, sizeof(sdef.num[i]))) -+ return -EINVAL; -+ } -+ - spin_lock_irqsave(&card->isdnloop_lock, flags); - switch (sdef.ptype) { - case ISDN_PTYPE_EURO: -@@ -1083,8 +1091,10 @@ isdnloop_start(isdnloop_card *card, isdnloop_sdef *sdefp) - spin_unlock_irqrestore(&card->isdnloop_lock, flags); - return -ENOMEM; - } -- for (i = 0; i < 3; i++) -- strcpy(card->s0num[i], sdef.num[i]); -+ for (i = 0; i < 3; i++) { -+ strlcpy(card->s0num[i], sdef.num[i], -+ sizeof(card->s0num[0])); -+ } - break; - case ISDN_PTYPE_1TR6: - if (isdnloop_fake(card, "DRV1.04TC-1TR6-CAPI-CNS-BASIS-29.11.95", -@@ -1097,7 +1107,7 @@ isdnloop_start(isdnloop_card *card, isdnloop_sdef *sdefp) - spin_unlock_irqrestore(&card->isdnloop_lock, flags); - return -ENOMEM; - } -- strcpy(card->s0num[0], sdef.num[0]); -+ strlcpy(card->s0num[0], sdef.num[0], sizeof(card->s0num[0])); - card->s0num[1][0] = '\0'; - card->s0num[2][0] = '\0'; - break; -@@ -1125,7 +1135,7 @@ isdnloop_command(isdn_ctrl *c, isdnloop_card *card) - { - ulong a; - int i; -- char cbuf[60]; -+ char cbuf[80]; - isdn_ctrl cmd; - isdnloop_cdef cdef; - -@@ -1190,7 +1200,6 @@ isdnloop_command(isdn_ctrl *c, isdnloop_card *card) - break; - if ((c->arg & 255) < ISDNLOOP_BCH) { - char *p; -- char dial[50]; - char dcode[4]; - - a = c->arg; -@@ -1202,10 +1211,10 @@ isdnloop_command(isdn_ctrl *c, isdnloop_card *card) - } else - /* Normal Dial */ - strcpy(dcode, "CAL"); -- strcpy(dial, p); -- sprintf(cbuf, "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1), -- dcode, dial, c->parm.setup.si1, -- c->parm.setup.si2, c->parm.setup.eazmsn); -+ snprintf(cbuf, sizeof(cbuf), -+ "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1), -+ dcode, p, c->parm.setup.si1, -+ c->parm.setup.si2, c->parm.setup.eazmsn); - i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card); - } - break; -diff --git a/drivers/isdn/mISDN/socket.c b/drivers/isdn/mISDN/socket.c -index abe2d69..ade1bcf 100644 ---- a/drivers/isdn/mISDN/socket.c -+++ b/drivers/isdn/mISDN/socket.c -@@ -117,7 +117,6 @@ mISDN_sock_recvmsg(struct kiocb *iocb, struct socket *sock, - { - struct sk_buff *skb; - struct sock *sk = sock->sk; -- struct sockaddr_mISDN *maddr; - - int copied, err; - -@@ -135,9 +134,9 @@ mISDN_sock_recvmsg(struct kiocb *iocb, struct socket *sock, - if (!skb) - return err; - -- if (msg->msg_namelen >= sizeof(struct sockaddr_mISDN)) { -- msg->msg_namelen = sizeof(struct sockaddr_mISDN); -- maddr = (struct sockaddr_mISDN *)msg->msg_name; -+ if (msg->msg_name) { -+ struct sockaddr_mISDN *maddr = msg->msg_name; -+ - maddr->family = AF_ISDN; - maddr->dev = _pms(sk)->dev->id; - if ((sk->sk_protocol == ISDN_P_LAPD_TE) || -@@ -150,11 +149,7 @@ mISDN_sock_recvmsg(struct kiocb *iocb, struct socket *sock, - maddr->sapi = _pms(sk)->ch.addr & 0xFF; - maddr->tei = (_pms(sk)->ch.addr >> 8) & 0xFF; - } -- } else { -- if (msg->msg_namelen) -- printk(KERN_WARNING "%s: too small namelen %d\n", -- __func__, msg->msg_namelen); -- msg->msg_namelen = 0; -+ msg->msg_namelen = sizeof(*maddr); - } - - copied = skb->len + MISDN_HEADER_LEN; -diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig -index 0c433eb..80a19fa 100644 ---- a/drivers/md/Kconfig -+++ b/drivers/md/Kconfig -@@ -185,8 +185,12 @@ config MD_FAULTY - - In unsure, say N. - -+config BLK_DEV_DM_BUILTIN -+ boolean -+ - config BLK_DEV_DM - tristate "Device mapper support" -+ select BLK_DEV_DM_BUILTIN - ---help--- - Device-mapper is a low level volume manager. It works by allowing - people to specify mappings for ranges of logical sectors. Various -diff --git a/drivers/md/Makefile b/drivers/md/Makefile -index 1ac9624..94d4023 100644 ---- a/drivers/md/Makefile -+++ b/drivers/md/Makefile -@@ -28,6 +28,7 @@ obj-$(CONFIG_MD_MULTIPATH) += multipath.o - obj-$(CONFIG_MD_FAULTY) += faulty.o - obj-$(CONFIG_BLK_DEV_MD) += md-mod.o - obj-$(CONFIG_BLK_DEV_DM) += dm-mod.o -+obj-$(CONFIG_BLK_DEV_DM_BUILTIN) += dm-builtin.o - obj-$(CONFIG_DM_BUFIO) += dm-bufio.o - obj-$(CONFIG_DM_CRYPT) += dm-crypt.o - obj-$(CONFIG_DM_DELAY) += dm-delay.o -diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c -index cc06a1e..6f99500 100644 ---- a/drivers/md/dm-bufio.c -+++ b/drivers/md/dm-bufio.c -@@ -321,6 +321,9 @@ static void __cache_size_refresh(void) - static void *alloc_buffer_data(struct dm_bufio_client *c, gfp_t gfp_mask, - enum data_mode *data_mode) - { -+ unsigned noio_flag; -+ void *ptr; -+ - if (c->block_size <= DM_BUFIO_BLOCK_SIZE_SLAB_LIMIT) { - *data_mode = DATA_MODE_SLAB; - return kmem_cache_alloc(DM_BUFIO_CACHE(c), gfp_mask); -@@ -334,7 +337,28 @@ static void *alloc_buffer_data(struct dm_bufio_client *c, gfp_t gfp_mask, - } - - *data_mode = DATA_MODE_VMALLOC; -- return __vmalloc(c->block_size, gfp_mask, PAGE_KERNEL); -+ -+ /* -+ * __vmalloc allocates the data pages and auxiliary structures with -+ * gfp_flags that were specified, but pagetables are always allocated -+ * with GFP_KERNEL, no matter what was specified as gfp_mask. -+ * -+ * Consequently, we must set per-process flag PF_MEMALLOC_NOIO so that -+ * all allocations done by this process (including pagetables) are done -+ * as if GFP_NOIO was specified. -+ */ -+ -+ if (gfp_mask & __GFP_NORETRY) { -+ noio_flag = current->flags & PF_MEMALLOC; -+ current->flags |= PF_MEMALLOC; -+ } -+ -+ ptr = __vmalloc(c->block_size, gfp_mask, PAGE_KERNEL); -+ -+ if (gfp_mask & __GFP_NORETRY) -+ current->flags = (current->flags & ~PF_MEMALLOC) | noio_flag; -+ -+ return ptr; - } - - /* -@@ -1642,6 +1666,11 @@ static int __init dm_bufio_init(void) - { - __u64 mem; - -+ dm_bufio_allocated_kmem_cache = 0; -+ dm_bufio_allocated_get_free_pages = 0; -+ dm_bufio_allocated_vmalloc = 0; -+ dm_bufio_current_allocated = 0; -+ - memset(&dm_bufio_caches, 0, sizeof dm_bufio_caches); - memset(&dm_bufio_cache_names, 0, sizeof dm_bufio_cache_names); - -diff --git a/drivers/md/dm-builtin.c b/drivers/md/dm-builtin.c -new file mode 100644 -index 0000000..797daec ---- /dev/null -+++ b/drivers/md/dm-builtin.c -@@ -0,0 +1,50 @@ -+#include "dm.h" -+ -+#include -+ -+/* -+ * The kobject release method must not be placed in the module itself, -+ * otherwise we are subject to module unload races. -+ * -+ * The release method is called when the last reference to the kobject is -+ * dropped. It may be called by any other kernel code that drops the last -+ * reference. -+ * -+ * The release method suffers from module unload race. We may prevent the -+ * module from being unloaded at the start of the release method (using -+ * increased module reference count or synchronizing against the release -+ * method), however there is no way to prevent the module from being -+ * unloaded at the end of the release method. -+ * -+ * If this code were placed in the dm module, the following race may -+ * happen: -+ * 1. Some other process takes a reference to dm kobject -+ * 2. The user issues ioctl function to unload the dm device -+ * 3. dm_sysfs_exit calls kobject_put, however the object is not released -+ * because of the other reference taken at step 1 -+ * 4. dm_sysfs_exit waits on the completion -+ * 5. The other process that took the reference in step 1 drops it, -+ * dm_kobject_release is called from this process -+ * 6. dm_kobject_release calls complete() -+ * 7. a reschedule happens before dm_kobject_release returns -+ * 8. dm_sysfs_exit continues, the dm device is unloaded, module reference -+ * count is decremented -+ * 9. The user unloads the dm module -+ * 10. The other process that was rescheduled in step 7 continues to run, -+ * it is now executing code in unloaded module, so it crashes -+ * -+ * Note that if the process that takes the foreign reference to dm kobject -+ * has a low priority and the system is sufficiently loaded with -+ * higher-priority processes that prevent the low-priority process from -+ * being scheduled long enough, this bug may really happen. -+ * -+ * In order to fix this module unload race, we place the release method -+ * into a helper code that is compiled directly into the kernel. -+ */ -+ -+void dm_kobject_release(struct kobject *kobj) -+{ -+ complete(dm_get_completion_from_kobject(kobj)); -+} -+ -+EXPORT_SYMBOL(dm_kobject_release); -diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c -index d749d92..19391c1 100644 ---- a/drivers/md/dm-crypt.c -+++ b/drivers/md/dm-crypt.c -@@ -1538,6 +1538,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) - unsigned int key_size, opt_params; - unsigned long long tmpll; - int ret; -+ size_t iv_size_padding; - struct dm_arg_set as; - const char *opt_string; - char dummy; -@@ -1574,12 +1575,23 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) - - cc->dmreq_start = sizeof(struct ablkcipher_request); - cc->dmreq_start += crypto_ablkcipher_reqsize(any_tfm(cc)); -- cc->dmreq_start = ALIGN(cc->dmreq_start, crypto_tfm_ctx_alignment()); -- cc->dmreq_start += crypto_ablkcipher_alignmask(any_tfm(cc)) & -- ~(crypto_tfm_ctx_alignment() - 1); -+ cc->dmreq_start = ALIGN(cc->dmreq_start, __alignof__(struct dm_crypt_request)); -+ -+ if (crypto_ablkcipher_alignmask(any_tfm(cc)) < CRYPTO_MINALIGN) { -+ /* Allocate the padding exactly */ -+ iv_size_padding = -(cc->dmreq_start + sizeof(struct dm_crypt_request)) -+ & crypto_ablkcipher_alignmask(any_tfm(cc)); -+ } else { -+ /* -+ * If the cipher requires greater alignment than kmalloc -+ * alignment, we don't know the exact position of the -+ * initialization vector. We must assume worst case. -+ */ -+ iv_size_padding = crypto_ablkcipher_alignmask(any_tfm(cc)); -+ } - - cc->req_pool = mempool_create_kmalloc_pool(MIN_IOS, cc->dmreq_start + -- sizeof(struct dm_crypt_request) + cc->iv_size); -+ sizeof(struct dm_crypt_request) + iv_size_padding + cc->iv_size); - if (!cc->req_pool) { - ti->error = "Cannot allocate crypt request mempool"; - goto bad; -diff --git a/drivers/md/dm-delay.c b/drivers/md/dm-delay.c -index 2dc22dd..a13a5d0 100644 ---- a/drivers/md/dm-delay.c -+++ b/drivers/md/dm-delay.c -@@ -20,6 +20,7 @@ - struct delay_c { - struct timer_list delay_timer; - struct mutex timer_lock; -+ struct workqueue_struct *kdelayd_wq; - struct work_struct flush_expired_bios; - struct list_head delayed_bios; - atomic_t may_delay; -@@ -45,14 +46,13 @@ struct dm_delay_info { - - static DEFINE_MUTEX(delayed_bios_lock); - --static struct workqueue_struct *kdelayd_wq; - static struct kmem_cache *delayed_cache; - - static void handle_delayed_timer(unsigned long data) - { - struct delay_c *dc = (struct delay_c *)data; - -- queue_work(kdelayd_wq, &dc->flush_expired_bios); -+ queue_work(dc->kdelayd_wq, &dc->flush_expired_bios); - } - - static void queue_timeout(struct delay_c *dc, unsigned long expires) -@@ -191,6 +191,12 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv) - goto bad_dev_write; - } - -+ dc->kdelayd_wq = alloc_workqueue("kdelayd", WQ_MEM_RECLAIM, 0); -+ if (!dc->kdelayd_wq) { -+ DMERR("Couldn't start kdelayd"); -+ goto bad_queue; -+ } -+ - setup_timer(&dc->delay_timer, handle_delayed_timer, (unsigned long)dc); - - INIT_WORK(&dc->flush_expired_bios, flush_expired_bios); -@@ -203,6 +209,8 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv) - ti->private = dc; - return 0; - -+bad_queue: -+ mempool_destroy(dc->delayed_pool); - bad_dev_write: - if (dc->dev_write) - dm_put_device(ti, dc->dev_write); -@@ -217,7 +225,7 @@ static void delay_dtr(struct dm_target *ti) - { - struct delay_c *dc = ti->private; - -- flush_workqueue(kdelayd_wq); -+ destroy_workqueue(dc->kdelayd_wq); - - dm_put_device(ti, dc->dev_read); - -@@ -353,12 +361,6 @@ static int __init dm_delay_init(void) - { - int r = -ENOMEM; - -- kdelayd_wq = alloc_workqueue("kdelayd", WQ_MEM_RECLAIM, 0); -- if (!kdelayd_wq) { -- DMERR("Couldn't start kdelayd"); -- goto bad_queue; -- } -- - delayed_cache = KMEM_CACHE(dm_delay_info, 0); - if (!delayed_cache) { - DMERR("Couldn't create delayed bio cache."); -@@ -376,8 +378,6 @@ static int __init dm_delay_init(void) - bad_register: - kmem_cache_destroy(delayed_cache); - bad_memcache: -- destroy_workqueue(kdelayd_wq); --bad_queue: - return r; - } - -@@ -385,7 +385,6 @@ static void __exit dm_delay_exit(void) - { - dm_unregister_target(&delay_target); - kmem_cache_destroy(delayed_cache); -- destroy_workqueue(kdelayd_wq); - } - - /* Module hooks */ -diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c -index 754f38f..495df03 100644 ---- a/drivers/md/dm-mpath.c -+++ b/drivers/md/dm-mpath.c -@@ -84,6 +84,7 @@ struct multipath { - unsigned queue_io; /* Must we queue all I/O? */ - unsigned queue_if_no_path; /* Queue I/O if last path fails? */ - unsigned saved_queue_if_no_path;/* Saved state during suspension */ -+ unsigned pg_init_disabled:1; /* pg_init is not currently allowed */ - unsigned pg_init_retries; /* Number of times to retry pg_init */ - unsigned pg_init_count; /* Number of times pg_init called */ - unsigned pg_init_delay_msecs; /* Number of msecs before pg_init retry */ -@@ -493,7 +494,8 @@ static void process_queued_ios(struct work_struct *work) - (!pgpath && !m->queue_if_no_path)) - must_queue = 0; - -- if (m->pg_init_required && !m->pg_init_in_progress && pgpath) -+ if (m->pg_init_required && !m->pg_init_in_progress && pgpath && -+ !m->pg_init_disabled) - __pg_init_all_paths(m); - - out: -@@ -907,10 +909,20 @@ static void multipath_wait_for_pg_init_completion(struct multipath *m) - - static void flush_multipath_work(struct multipath *m) - { -+ unsigned long flags; -+ -+ spin_lock_irqsave(&m->lock, flags); -+ m->pg_init_disabled = 1; -+ spin_unlock_irqrestore(&m->lock, flags); -+ - flush_workqueue(kmpath_handlerd); - multipath_wait_for_pg_init_completion(m); - flush_workqueue(kmultipathd); - flush_work_sync(&m->trigger_event); -+ -+ spin_lock_irqsave(&m->lock, flags); -+ m->pg_init_disabled = 0; -+ spin_unlock_irqrestore(&m->lock, flags); - } - - static void multipath_dtr(struct dm_target *ti) -@@ -1129,7 +1141,7 @@ static int pg_init_limit_reached(struct multipath *m, struct pgpath *pgpath) - - spin_lock_irqsave(&m->lock, flags); - -- if (m->pg_init_count <= m->pg_init_retries) -+ if (m->pg_init_count <= m->pg_init_retries && !m->pg_init_disabled) - m->pg_init_required = 1; - else - limit_reached = 1; -@@ -1543,8 +1555,11 @@ static int multipath_ioctl(struct dm_target *ti, unsigned int cmd, - /* - * Only pass ioctls through if the device sizes match exactly. - */ -- if (!r && ti->len != i_size_read(bdev->bd_inode) >> SECTOR_SHIFT) -- r = scsi_verify_blk_ioctl(NULL, cmd); -+ if (!bdev || ti->len != i_size_read(bdev->bd_inode) >> SECTOR_SHIFT) { -+ int err = scsi_verify_blk_ioctl(NULL, cmd); -+ if (err) -+ r = err; -+ } - - return r ? : __blkdev_driver_ioctl(bdev, mode, cmd, arg); - } -@@ -1643,7 +1658,7 @@ static int multipath_busy(struct dm_target *ti) - *---------------------------------------------------------------*/ - static struct target_type multipath_target = { - .name = "multipath", -- .version = {1, 3, 0}, -+ .version = {1, 3, 2}, - .module = THIS_MODULE, - .ctr = multipath_ctr, - .dtr = multipath_dtr, -diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c -index 4caa8e6..2d2b1b7 100644 ---- a/drivers/md/dm-snap-persistent.c -+++ b/drivers/md/dm-snap-persistent.c -@@ -269,6 +269,14 @@ static chunk_t area_location(struct pstore *ps, chunk_t area) - return NUM_SNAPSHOT_HDR_CHUNKS + ((ps->exceptions_per_area + 1) * area); - } - -+static void skip_metadata(struct pstore *ps) -+{ -+ uint32_t stride = ps->exceptions_per_area + 1; -+ chunk_t next_free = ps->next_free; -+ if (sector_div(next_free, stride) == NUM_SNAPSHOT_HDR_CHUNKS) -+ ps->next_free++; -+} -+ - /* - * Read or write a metadata area. Remembering to skip the first - * chunk which holds the header. -@@ -502,6 +510,8 @@ static int read_exceptions(struct pstore *ps, - - ps->current_area--; - -+ skip_metadata(ps); -+ - return 0; - } - -@@ -616,8 +626,6 @@ static int persistent_prepare_exception(struct dm_exception_store *store, - struct dm_exception *e) - { - struct pstore *ps = get_info(store); -- uint32_t stride; -- chunk_t next_free; - sector_t size = get_dev_size(dm_snap_cow(store->snap)->bdev); - - /* Is there enough room ? */ -@@ -630,10 +638,8 @@ static int persistent_prepare_exception(struct dm_exception_store *store, - * Move onto the next free pending, making sure to take - * into account the location of the metadata chunks. - */ -- stride = (ps->exceptions_per_area + 1); -- next_free = ++ps->next_free; -- if (sector_div(next_free, stride) == 1) -- ps->next_free++; -+ ps->next_free++; -+ skip_metadata(ps); - - atomic_inc(&ps->pending_count); - return 0; -diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c -index 448050c..39ca4a4 100644 ---- a/drivers/md/dm-snap.c -+++ b/drivers/md/dm-snap.c -@@ -66,6 +66,18 @@ struct dm_snapshot { - - atomic_t pending_exceptions_count; - -+ /* Protected by "lock" */ -+ sector_t exception_start_sequence; -+ -+ /* Protected by kcopyd single-threaded callback */ -+ sector_t exception_complete_sequence; -+ -+ /* -+ * A list of pending exceptions that completed out of order. -+ * Protected by kcopyd single-threaded callback. -+ */ -+ struct list_head out_of_order_list; -+ - mempool_t *pending_pool; - - struct dm_exception_table pending; -@@ -171,6 +183,14 @@ struct dm_snap_pending_exception { - */ - int started; - -+ /* There was copying error. */ -+ int copy_error; -+ -+ /* A sequence number, it is used for in-order completion. */ -+ sector_t exception_sequence; -+ -+ struct list_head out_of_order_entry; -+ - /* - * For writing a complete chunk, bypassing the copy. - */ -@@ -1090,6 +1110,9 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) - s->valid = 1; - s->active = 0; - atomic_set(&s->pending_exceptions_count, 0); -+ s->exception_start_sequence = 0; -+ s->exception_complete_sequence = 0; -+ INIT_LIST_HEAD(&s->out_of_order_list); - init_rwsem(&s->lock); - INIT_LIST_HEAD(&s->list); - spin_lock_init(&s->pe_lock); -@@ -1448,6 +1471,19 @@ static void commit_callback(void *context, int success) - pending_complete(pe, success); - } - -+static void complete_exception(struct dm_snap_pending_exception *pe) -+{ -+ struct dm_snapshot *s = pe->snap; -+ -+ if (unlikely(pe->copy_error)) -+ pending_complete(pe, 0); -+ -+ else -+ /* Update the metadata if we are persistent */ -+ s->store->type->commit_exception(s->store, &pe->e, -+ commit_callback, pe); -+} -+ - /* - * Called when the copy I/O has finished. kcopyd actually runs - * this code so don't block. -@@ -1457,13 +1493,32 @@ static void copy_callback(int read_err, unsigned long write_err, void *context) - struct dm_snap_pending_exception *pe = context; - struct dm_snapshot *s = pe->snap; - -- if (read_err || write_err) -- pending_complete(pe, 0); -+ pe->copy_error = read_err || write_err; - -- else -- /* Update the metadata if we are persistent */ -- s->store->type->commit_exception(s->store, &pe->e, -- commit_callback, pe); -+ if (pe->exception_sequence == s->exception_complete_sequence) { -+ s->exception_complete_sequence++; -+ complete_exception(pe); -+ -+ while (!list_empty(&s->out_of_order_list)) { -+ pe = list_entry(s->out_of_order_list.next, -+ struct dm_snap_pending_exception, out_of_order_entry); -+ if (pe->exception_sequence != s->exception_complete_sequence) -+ break; -+ s->exception_complete_sequence++; -+ list_del(&pe->out_of_order_entry); -+ complete_exception(pe); -+ } -+ } else { -+ struct list_head *lh; -+ struct dm_snap_pending_exception *pe2; -+ -+ list_for_each_prev(lh, &s->out_of_order_list) { -+ pe2 = list_entry(lh, struct dm_snap_pending_exception, out_of_order_entry); -+ if (pe2->exception_sequence < pe->exception_sequence) -+ break; -+ } -+ list_add(&pe->out_of_order_entry, lh); -+ } - } - - /* -@@ -1558,6 +1613,8 @@ __find_pending_exception(struct dm_snapshot *s, - return NULL; - } - -+ pe->exception_sequence = s->exception_start_sequence++; -+ - dm_insert_exception(&s->pending, &pe->e); - - return pe; -@@ -2204,7 +2261,7 @@ static struct target_type origin_target = { - - static struct target_type snapshot_target = { - .name = "snapshot", -- .version = {1, 10, 0}, -+ .version = {1, 10, 2}, - .module = THIS_MODULE, - .ctr = snapshot_ctr, - .dtr = snapshot_dtr, -@@ -2327,3 +2384,5 @@ module_exit(dm_snapshot_exit); - MODULE_DESCRIPTION(DM_NAME " snapshot target"); - MODULE_AUTHOR("Joe Thornber"); - MODULE_LICENSE("GPL"); -+MODULE_ALIAS("dm-snapshot-origin"); -+MODULE_ALIAS("dm-snapshot-merge"); -diff --git a/drivers/md/dm-sysfs.c b/drivers/md/dm-sysfs.c -index 84d2b91..c62c5ab 100644 ---- a/drivers/md/dm-sysfs.c -+++ b/drivers/md/dm-sysfs.c -@@ -86,6 +86,7 @@ static const struct sysfs_ops dm_sysfs_ops = { - static struct kobj_type dm_ktype = { - .sysfs_ops = &dm_sysfs_ops, - .default_attrs = dm_attrs, -+ .release = dm_kobject_release, - }; - - /* -@@ -104,5 +105,7 @@ int dm_sysfs_init(struct mapped_device *md) - */ - void dm_sysfs_exit(struct mapped_device *md) - { -- kobject_put(dm_kobject(md)); -+ struct kobject *kobj = dm_kobject(md); -+ kobject_put(kobj); -+ wait_for_completion(dm_get_completion_from_kobject(kobj)); - } -diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c -index f220a69..43e19b7 100644 ---- a/drivers/md/dm-table.c -+++ b/drivers/md/dm-table.c -@@ -215,6 +215,11 @@ int dm_table_create(struct dm_table **result, fmode_t mode, - - num_targets = dm_round_up(num_targets, KEYS_PER_NODE); - -+ if (!num_targets) { -+ kfree(t); -+ return -ENOMEM; -+ } -+ - if (alloc_targets(t, num_targets)) { - kfree(t); - t = NULL; -@@ -581,14 +586,28 @@ static int adjoin(struct dm_table *table, struct dm_target *ti) - - /* - * Used to dynamically allocate the arg array. -+ * -+ * We do first allocation with GFP_NOIO because dm-mpath and dm-thin must -+ * process messages even if some device is suspended. These messages have a -+ * small fixed number of arguments. -+ * -+ * On the other hand, dm-switch needs to process bulk data using messages and -+ * excessive use of GFP_NOIO could cause trouble. - */ - static char **realloc_argv(unsigned *array_size, char **old_argv) - { - char **argv; - unsigned new_size; -+ gfp_t gfp; - -- new_size = *array_size ? *array_size * 2 : 64; -- argv = kmalloc(new_size * sizeof(*argv), GFP_KERNEL); -+ if (*array_size) { -+ new_size = *array_size * 2; -+ gfp = GFP_KERNEL; -+ } else { -+ new_size = 8; -+ gfp = GFP_NOIO; -+ } -+ argv = kmalloc(new_size * sizeof(*argv), gfp); - if (argv) { - memcpy(argv, old_argv, *array_size * sizeof(*argv)); - *array_size = new_size; -diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c -index 7c3ab8f..46e0204 100644 ---- a/drivers/md/dm-thin.c -+++ b/drivers/md/dm-thin.c -@@ -1446,9 +1446,9 @@ static void process_deferred_bios(struct pool *pool) - */ - if (ensure_next_mapping(pool)) { - spin_lock_irqsave(&pool->lock, flags); -+ bio_list_add(&pool->deferred_bios, bio); - bio_list_merge(&pool->deferred_bios, &bios); - spin_unlock_irqrestore(&pool->lock, flags); -- - break; - } - -@@ -2461,7 +2461,7 @@ static struct target_type pool_target = { - .name = "thin-pool", - .features = DM_TARGET_SINGLETON | DM_TARGET_ALWAYS_WRITEABLE | - DM_TARGET_IMMUTABLE, -- .version = {1, 1, 0}, -+ .version = {1, 1, 1}, - .module = THIS_MODULE, - .ctr = pool_ctr, - .dtr = pool_dtr, -@@ -2734,7 +2734,7 @@ static void thin_io_hints(struct dm_target *ti, struct queue_limits *limits) - - static struct target_type thin_target = { - .name = "thin", -- .version = {1, 1, 0}, -+ .version = {1, 1, 1}, - .module = THIS_MODULE, - .ctr = thin_ctr, - .dtr = thin_dtr, -diff --git a/drivers/md/dm.c b/drivers/md/dm.c -index 903cb1e..794fa3a 100644 ---- a/drivers/md/dm.c -+++ b/drivers/md/dm.c -@@ -191,8 +191,8 @@ struct mapped_device { - /* forced geometry settings */ - struct hd_geometry geometry; - -- /* sysfs handle */ -- struct kobject kobj; -+ /* kobject and completion */ -+ struct dm_kobject_holder kobj_holder; - - /* zero-length flush that will be cloned and submitted to targets */ - struct bio flush_bio; -@@ -1891,6 +1891,7 @@ static struct mapped_device *alloc_dev(int minor) - init_waitqueue_head(&md->wait); - INIT_WORK(&md->work, dm_wq_work); - init_waitqueue_head(&md->eventq); -+ init_completion(&md->kobj_holder.completion); - - md->disk->major = _major; - md->disk->first_minor = minor; -@@ -2682,20 +2683,14 @@ struct gendisk *dm_disk(struct mapped_device *md) - - struct kobject *dm_kobject(struct mapped_device *md) - { -- return &md->kobj; -+ return &md->kobj_holder.kobj; - } - --/* -- * struct mapped_device should not be exported outside of dm.c -- * so use this check to verify that kobj is part of md structure -- */ - struct mapped_device *dm_get_from_kobject(struct kobject *kobj) - { - struct mapped_device *md; - -- md = container_of(kobj, struct mapped_device, kobj); -- if (&md->kobj != kobj) -- return NULL; -+ md = container_of(kobj, struct mapped_device, kobj_holder.kobj); - - if (test_bit(DMF_FREEING, &md->flags) || - dm_deleting_md(md)) -diff --git a/drivers/md/dm.h b/drivers/md/dm.h -index b7dacd5..9db80c9 100644 ---- a/drivers/md/dm.h -+++ b/drivers/md/dm.h -@@ -15,6 +15,8 @@ - #include - #include - #include -+#include -+#include - - /* - * Suspend feature flags -@@ -119,12 +121,27 @@ void dm_interface_exit(void); - /* - * sysfs interface - */ -+struct dm_kobject_holder { -+ struct kobject kobj; -+ struct completion completion; -+}; -+ -+static inline struct completion *dm_get_completion_from_kobject(struct kobject *kobj) -+{ -+ return &container_of(kobj, struct dm_kobject_holder, kobj)->completion; -+} -+ - int dm_sysfs_init(struct mapped_device *md); - void dm_sysfs_exit(struct mapped_device *md); - struct kobject *dm_kobject(struct mapped_device *md); - struct mapped_device *dm_get_from_kobject(struct kobject *kobj); - - /* -+ * The kobject helper -+ */ -+void dm_kobject_release(struct kobject *kobj); -+ -+/* - * Targets for linear and striped mappings - */ - int dm_linear_init(void); -diff --git a/drivers/md/md.c b/drivers/md/md.c -index 7b45b5e..17e2f52 100644 ---- a/drivers/md/md.c -+++ b/drivers/md/md.c -@@ -3507,6 +3507,7 @@ level_store(struct mddev *mddev, const char *buf, size_t len) - mddev->in_sync = 1; - del_timer_sync(&mddev->safemode_timer); - } -+ blk_set_stacking_limits(&mddev->queue->limits); - pers->run(mddev); - mddev_resume(mddev); - set_bit(MD_CHANGE_DEVS, &mddev->flags); -@@ -7070,8 +7071,10 @@ void md_do_sync(struct mddev *mddev) - /* just incase thread restarts... */ - if (test_bit(MD_RECOVERY_DONE, &mddev->recovery)) - return; -- if (mddev->ro) /* never try to sync a read-only array */ -+ if (mddev->ro) {/* never try to sync a read-only array */ -+ set_bit(MD_RECOVERY_INTR, &mddev->recovery); - return; -+ } - - if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { - if (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)) -@@ -7177,6 +7180,19 @@ void md_do_sync(struct mddev *mddev) - rdev->recovery_offset < j) - j = rdev->recovery_offset; - rcu_read_unlock(); -+ -+ /* If there is a bitmap, we need to make sure all -+ * writes that started before we added a spare -+ * complete before we start doing a recovery. -+ * Otherwise the write might complete and (via -+ * bitmap_endwrite) set a bit in the bitmap after the -+ * recovery has checked that bit and skipped that -+ * region. -+ */ -+ if (mddev->bitmap) { -+ mddev->pers->quiesce(mddev, 1); -+ mddev->pers->quiesce(mddev, 0); -+ } - } - - printk(KERN_INFO "md: %s of RAID array %s\n", desc, mdname(mddev)); -@@ -8166,7 +8182,8 @@ static int md_notify_reboot(struct notifier_block *this, - if (mddev_trylock(mddev)) { - if (mddev->pers) - __md_stop_writes(mddev); -- mddev->safemode = 2; -+ if (mddev->persistent) -+ mddev->safemode = 2; - mddev_unlock(mddev); - } - need_delay = 1; -diff --git a/drivers/md/persistent-data/dm-btree-remove.c b/drivers/md/persistent-data/dm-btree-remove.c -index c4f2813..b88757c 100644 ---- a/drivers/md/persistent-data/dm-btree-remove.c -+++ b/drivers/md/persistent-data/dm-btree-remove.c -@@ -139,15 +139,8 @@ struct child { - struct btree_node *n; - }; - --static struct dm_btree_value_type le64_type = { -- .context = NULL, -- .size = sizeof(__le64), -- .inc = NULL, -- .dec = NULL, -- .equal = NULL --}; -- --static int init_child(struct dm_btree_info *info, struct btree_node *parent, -+static int init_child(struct dm_btree_info *info, struct dm_btree_value_type *vt, -+ struct btree_node *parent, - unsigned index, struct child *result) - { - int r, inc; -@@ -164,7 +157,7 @@ static int init_child(struct dm_btree_info *info, struct btree_node *parent, - result->n = dm_block_data(result->block); - - if (inc) -- inc_children(info->tm, result->n, &le64_type); -+ inc_children(info->tm, result->n, vt); - - *((__le64 *) value_ptr(parent, index)) = - cpu_to_le64(dm_block_location(result->block)); -@@ -236,7 +229,7 @@ static void __rebalance2(struct dm_btree_info *info, struct btree_node *parent, - } - - static int rebalance2(struct shadow_spine *s, struct dm_btree_info *info, -- unsigned left_index) -+ struct dm_btree_value_type *vt, unsigned left_index) - { - int r; - struct btree_node *parent; -@@ -244,11 +237,11 @@ static int rebalance2(struct shadow_spine *s, struct dm_btree_info *info, - - parent = dm_block_data(shadow_current(s)); - -- r = init_child(info, parent, left_index, &left); -+ r = init_child(info, vt, parent, left_index, &left); - if (r) - return r; - -- r = init_child(info, parent, left_index + 1, &right); -+ r = init_child(info, vt, parent, left_index + 1, &right); - if (r) { - exit_child(info, &left); - return r; -@@ -368,7 +361,7 @@ static void __rebalance3(struct dm_btree_info *info, struct btree_node *parent, - } - - static int rebalance3(struct shadow_spine *s, struct dm_btree_info *info, -- unsigned left_index) -+ struct dm_btree_value_type *vt, unsigned left_index) - { - int r; - struct btree_node *parent = dm_block_data(shadow_current(s)); -@@ -377,17 +370,17 @@ static int rebalance3(struct shadow_spine *s, struct dm_btree_info *info, - /* - * FIXME: fill out an array? - */ -- r = init_child(info, parent, left_index, &left); -+ r = init_child(info, vt, parent, left_index, &left); - if (r) - return r; - -- r = init_child(info, parent, left_index + 1, ¢er); -+ r = init_child(info, vt, parent, left_index + 1, ¢er); - if (r) { - exit_child(info, &left); - return r; - } - -- r = init_child(info, parent, left_index + 2, &right); -+ r = init_child(info, vt, parent, left_index + 2, &right); - if (r) { - exit_child(info, &left); - exit_child(info, ¢er); -@@ -434,7 +427,8 @@ static int get_nr_entries(struct dm_transaction_manager *tm, - } - - static int rebalance_children(struct shadow_spine *s, -- struct dm_btree_info *info, uint64_t key) -+ struct dm_btree_info *info, -+ struct dm_btree_value_type *vt, uint64_t key) - { - int i, r, has_left_sibling, has_right_sibling; - uint32_t child_entries; -@@ -472,13 +466,13 @@ static int rebalance_children(struct shadow_spine *s, - has_right_sibling = i < (le32_to_cpu(n->header.nr_entries) - 1); - - if (!has_left_sibling) -- r = rebalance2(s, info, i); -+ r = rebalance2(s, info, vt, i); - - else if (!has_right_sibling) -- r = rebalance2(s, info, i - 1); -+ r = rebalance2(s, info, vt, i - 1); - - else -- r = rebalance3(s, info, i - 1); -+ r = rebalance3(s, info, vt, i - 1); - - return r; - } -@@ -529,7 +523,7 @@ static int remove_raw(struct shadow_spine *s, struct dm_btree_info *info, - if (le32_to_cpu(n->header.flags) & LEAF_NODE) - return do_leaf(n, key, index); - -- r = rebalance_children(s, info, key); -+ r = rebalance_children(s, info, vt, key); - if (r) - break; - -@@ -550,6 +544,14 @@ static int remove_raw(struct shadow_spine *s, struct dm_btree_info *info, - return r; - } - -+static struct dm_btree_value_type le64_type = { -+ .context = NULL, -+ .size = sizeof(__le64), -+ .inc = NULL, -+ .dec = NULL, -+ .equal = NULL -+}; -+ - int dm_btree_remove(struct dm_btree_info *info, dm_block_t root, - uint64_t *keys, dm_block_t *new_root) - { -diff --git a/drivers/md/persistent-data/dm-space-map-common.c b/drivers/md/persistent-data/dm-space-map-common.c -index ff3beed..79c02d9 100644 ---- a/drivers/md/persistent-data/dm-space-map-common.c -+++ b/drivers/md/persistent-data/dm-space-map-common.c -@@ -244,6 +244,10 @@ int sm_ll_extend(struct ll_disk *ll, dm_block_t extra_blocks) - return -EINVAL; - } - -+ /* -+ * We need to set this before the dm_tm_new_block() call below. -+ */ -+ ll->nr_blocks = nr_blocks; - for (i = old_blocks; i < blocks; i++) { - struct dm_block *b; - struct disk_index_entry idx; -@@ -251,6 +255,7 @@ int sm_ll_extend(struct ll_disk *ll, dm_block_t extra_blocks) - r = dm_tm_new_block(ll->tm, &dm_sm_bitmap_validator, &b); - if (r < 0) - return r; -+ - idx.blocknr = cpu_to_le64(dm_block_location(b)); - - r = dm_tm_unlock(ll->tm, b); -@@ -265,7 +270,6 @@ int sm_ll_extend(struct ll_disk *ll, dm_block_t extra_blocks) - return r; - } - -- ll->nr_blocks = nr_blocks; - return 0; - } - -diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c -index ce5f044..75e66c6 100644 ---- a/drivers/md/raid1.c -+++ b/drivers/md/raid1.c -@@ -1357,6 +1357,7 @@ static int raid1_spare_active(struct mddev *mddev) - } - } - if (rdev -+ && rdev->recovery_offset == MaxSector - && !test_bit(Faulty, &rdev->flags) - && !test_and_set_bit(In_sync, &rdev->flags)) { - count++; -diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c -index f7febd8..149426c 100644 ---- a/drivers/md/raid10.c -+++ b/drivers/md/raid10.c -@@ -1117,7 +1117,7 @@ static void make_request(struct mddev *mddev, struct bio * bio) - /* Could not read all from this device, so we will - * need another r10_bio. - */ -- sectors_handled = (r10_bio->sectors + max_sectors -+ sectors_handled = (r10_bio->sector + max_sectors - - bio->bi_sector); - r10_bio->sectors = max_sectors; - spin_lock_irq(&conf->device_lock); -@@ -1125,7 +1125,7 @@ static void make_request(struct mddev *mddev, struct bio * bio) - bio->bi_phys_segments = 2; - else - bio->bi_phys_segments++; -- spin_unlock(&conf->device_lock); -+ spin_unlock_irq(&conf->device_lock); - /* Cannot call generic_make_request directly - * as that will be queued in __generic_make_request - * and subsequent mempool_alloc might block -@@ -1419,14 +1419,16 @@ static int enough(struct r10conf *conf, int ignore) - do { - int n = conf->copies; - int cnt = 0; -+ int this = first; - while (n--) { -- if (conf->mirrors[first].rdev && -- first != ignore) -+ if (conf->mirrors[this].rdev && -+ this != ignore) - cnt++; -- first = (first+1) % conf->raid_disks; -+ this = (this+1) % conf->raid_disks; - } - if (cnt == 0) - return 0; -+ first = (first + conf->near_copies) % conf->raid_disks; - } while (first != 0); - return 1; - } -@@ -1534,6 +1536,7 @@ static int raid10_spare_active(struct mddev *mddev) - } - sysfs_notify_dirent_safe(tmp->replacement->sysfs_state); - } else if (tmp->rdev -+ && tmp->rdev->recovery_offset == MaxSector - && !test_bit(Faulty, &tmp->rdev->flags) - && !test_and_set_bit(In_sync, &tmp->rdev->flags)) { - count++; -@@ -2942,10 +2945,6 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, - if (j == conf->copies) { - /* Cannot recover, so abort the recovery or - * record a bad block */ -- put_buf(r10_bio); -- if (rb2) -- atomic_dec(&rb2->remaining); -- r10_bio = rb2; - if (any_working) { - /* problem is that there are bad blocks - * on other device(s) -@@ -2977,6 +2976,10 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, - mirror->recovery_disabled - = mddev->recovery_disabled; - } -+ put_buf(r10_bio); -+ if (rb2) -+ atomic_dec(&rb2->remaining); -+ r10_bio = rb2; - break; - } - } -diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c -index 6155c8b..c276ad0 100644 ---- a/drivers/md/raid5.c -+++ b/drivers/md/raid5.c -@@ -1805,6 +1805,7 @@ static void raid5_end_write_request(struct bio *bi, int error) - set_bit(R5_MadeGoodRepl, &sh->dev[i].flags); - } else { - if (!uptodate) { -+ set_bit(STRIPE_DEGRADED, &sh->state); - set_bit(WriteErrorSeen, &rdev->flags); - set_bit(R5_WriteError, &sh->dev[i].flags); - if (!test_and_set_bit(WantReplacement, &rdev->flags)) -@@ -3432,6 +3433,8 @@ static void handle_stripe(struct stripe_head *sh) - set_bit(R5_Wantwrite, &dev->flags); - if (prexor) - continue; -+ if (s.failed > 1) -+ continue; - if (!test_bit(R5_Insync, &dev->flags) || - ((i == sh->pd_idx || i == sh->qd_idx) && - s.failed == 0)) -@@ -4677,23 +4680,43 @@ raid5_size(struct mddev *mddev, sector_t sectors, int raid_disks) - return sectors * (raid_disks - conf->max_degraded); - } - -+static void free_scratch_buffer(struct r5conf *conf, struct raid5_percpu *percpu) -+{ -+ safe_put_page(percpu->spare_page); -+ kfree(percpu->scribble); -+ percpu->spare_page = NULL; -+ percpu->scribble = NULL; -+} -+ -+static int alloc_scratch_buffer(struct r5conf *conf, struct raid5_percpu *percpu) -+{ -+ if (conf->level == 6 && !percpu->spare_page) -+ percpu->spare_page = alloc_page(GFP_KERNEL); -+ if (!percpu->scribble) -+ percpu->scribble = kmalloc(conf->scribble_len, GFP_KERNEL); -+ -+ if (!percpu->scribble || (conf->level == 6 && !percpu->spare_page)) { -+ free_scratch_buffer(conf, percpu); -+ return -ENOMEM; -+ } -+ -+ return 0; -+} -+ - static void raid5_free_percpu(struct r5conf *conf) - { -- struct raid5_percpu *percpu; - unsigned long cpu; - - if (!conf->percpu) - return; - -- get_online_cpus(); -- for_each_possible_cpu(cpu) { -- percpu = per_cpu_ptr(conf->percpu, cpu); -- safe_put_page(percpu->spare_page); -- kfree(percpu->scribble); -- } - #ifdef CONFIG_HOTPLUG_CPU - unregister_cpu_notifier(&conf->cpu_notify); - #endif -+ -+ get_online_cpus(); -+ for_each_possible_cpu(cpu) -+ free_scratch_buffer(conf, per_cpu_ptr(conf->percpu, cpu)); - put_online_cpus(); - - free_percpu(conf->percpu); -@@ -4719,15 +4742,7 @@ static int raid456_cpu_notify(struct notifier_block *nfb, unsigned long action, - switch (action) { - case CPU_UP_PREPARE: - case CPU_UP_PREPARE_FROZEN: -- if (conf->level == 6 && !percpu->spare_page) -- percpu->spare_page = alloc_page(GFP_KERNEL); -- if (!percpu->scribble) -- percpu->scribble = kmalloc(conf->scribble_len, GFP_KERNEL); -- -- if (!percpu->scribble || -- (conf->level == 6 && !percpu->spare_page)) { -- safe_put_page(percpu->spare_page); -- kfree(percpu->scribble); -+ if (alloc_scratch_buffer(conf, percpu)) { - pr_err("%s: failed memory allocation for cpu%ld\n", - __func__, cpu); - return notifier_from_errno(-ENOMEM); -@@ -4735,10 +4750,7 @@ static int raid456_cpu_notify(struct notifier_block *nfb, unsigned long action, - break; - case CPU_DEAD: - case CPU_DEAD_FROZEN: -- safe_put_page(percpu->spare_page); -- kfree(percpu->scribble); -- percpu->spare_page = NULL; -- percpu->scribble = NULL; -+ free_scratch_buffer(conf, per_cpu_ptr(conf->percpu, cpu)); - break; - default: - break; -@@ -4750,40 +4762,29 @@ static int raid456_cpu_notify(struct notifier_block *nfb, unsigned long action, - static int raid5_alloc_percpu(struct r5conf *conf) - { - unsigned long cpu; -- struct page *spare_page; -- struct raid5_percpu __percpu *allcpus; -- void *scribble; -- int err; -+ int err = 0; - -- allcpus = alloc_percpu(struct raid5_percpu); -- if (!allcpus) -+ conf->percpu = alloc_percpu(struct raid5_percpu); -+ if (!conf->percpu) - return -ENOMEM; -- conf->percpu = allcpus; -+ -+#ifdef CONFIG_HOTPLUG_CPU -+ conf->cpu_notify.notifier_call = raid456_cpu_notify; -+ conf->cpu_notify.priority = 0; -+ err = register_cpu_notifier(&conf->cpu_notify); -+ if (err) -+ return err; -+#endif - - get_online_cpus(); -- err = 0; - for_each_present_cpu(cpu) { -- if (conf->level == 6) { -- spare_page = alloc_page(GFP_KERNEL); -- if (!spare_page) { -- err = -ENOMEM; -- break; -- } -- per_cpu_ptr(conf->percpu, cpu)->spare_page = spare_page; -- } -- scribble = kmalloc(conf->scribble_len, GFP_KERNEL); -- if (!scribble) { -- err = -ENOMEM; -+ err = alloc_scratch_buffer(conf, per_cpu_ptr(conf->percpu, cpu)); -+ if (err) { -+ pr_err("%s: failed memory allocation for cpu%ld\n", -+ __func__, cpu); - break; - } -- per_cpu_ptr(conf->percpu, cpu)->scribble = scribble; - } --#ifdef CONFIG_HOTPLUG_CPU -- conf->cpu_notify.notifier_call = raid456_cpu_notify; -- conf->cpu_notify.priority = 0; -- if (err == 0) -- err = register_cpu_notifier(&conf->cpu_notify); --#endif - put_online_cpus(); - - return err; -diff --git a/drivers/media/media-device.c b/drivers/media/media-device.c -index 7d97c26..01f00b4 100644 ---- a/drivers/media/media-device.c -+++ b/drivers/media/media-device.c -@@ -90,6 +90,7 @@ static long media_device_enum_entities(struct media_device *mdev, - struct media_entity *ent; - struct media_entity_desc u_ent; - -+ memset(&u_ent, 0, sizeof(u_ent)); - if (copy_from_user(&u_ent.id, &uent->id, sizeof(u_ent.id))) - return -EFAULT; - -diff --git a/drivers/media/video/gspca/kinect.c b/drivers/media/video/gspca/kinect.c -index e8e8f2f..bfbc228 100644 ---- a/drivers/media/video/gspca/kinect.c -+++ b/drivers/media/video/gspca/kinect.c -@@ -390,6 +390,7 @@ static const struct sd_desc sd_desc = { - /* -- module initialisation -- */ - static const struct usb_device_id device_table[] = { - {USB_DEVICE(0x045e, 0x02ae)}, -+ {USB_DEVICE(0x045e, 0x02bf)}, - {} - }; - -diff --git a/drivers/media/video/hdpvr/hdpvr-core.c b/drivers/media/video/hdpvr/hdpvr-core.c -index 6510110..e09c4b6 100644 ---- a/drivers/media/video/hdpvr/hdpvr-core.c -+++ b/drivers/media/video/hdpvr/hdpvr-core.c -@@ -309,6 +309,11 @@ static int hdpvr_probe(struct usb_interface *interface, - - dev->workqueue = 0; - -+ /* init video transfer queues first of all */ -+ /* to prevent oops in hdpvr_delete() on error paths */ -+ INIT_LIST_HEAD(&dev->free_buff_list); -+ INIT_LIST_HEAD(&dev->rec_buff_list); -+ - /* register v4l2_device early so it can be used for printks */ - if (v4l2_device_register(&interface->dev, &dev->v4l2_dev)) { - err("v4l2_device_register failed"); -@@ -331,10 +336,6 @@ static int hdpvr_probe(struct usb_interface *interface, - if (!dev->workqueue) - goto error; - -- /* init video transfer queues */ -- INIT_LIST_HEAD(&dev->free_buff_list); -- INIT_LIST_HEAD(&dev->rec_buff_list); -- - dev->options = hdpvr_default_options; - - if (default_video_input < HDPVR_VIDEO_INPUTS) -@@ -385,12 +386,6 @@ static int hdpvr_probe(struct usb_interface *interface, - } - mutex_unlock(&dev->io_mutex); - -- if (hdpvr_register_videodev(dev, &interface->dev, -- video_nr[atomic_inc_return(&dev_nr)])) { -- v4l2_err(&dev->v4l2_dev, "registering videodev failed\n"); -- goto error; -- } -- - #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - retval = hdpvr_register_i2c_adapter(dev); - if (retval < 0) { -@@ -411,6 +406,13 @@ static int hdpvr_probe(struct usb_interface *interface, - } - #endif - -+ retval = hdpvr_register_videodev(dev, &interface->dev, -+ video_nr[atomic_inc_return(&dev_nr)]); -+ if (retval < 0) { -+ v4l2_err(&dev->v4l2_dev, "registering videodev failed\n"); -+ goto reg_fail; -+ } -+ - /* let the user know what node this device is now attached to */ - v4l2_info(&dev->v4l2_dev, "device now attached to %s\n", - video_device_node_name(dev->video_dev)); -diff --git a/drivers/media/video/omap/omap_vout.c b/drivers/media/video/omap/omap_vout.c -index 88cf9d9..89f354e 100644 ---- a/drivers/media/video/omap/omap_vout.c -+++ b/drivers/media/video/omap/omap_vout.c -@@ -206,19 +206,21 @@ static u32 omap_vout_uservirt_to_phys(u32 virtp) - struct vm_area_struct *vma; - struct mm_struct *mm = current->mm; - -- vma = find_vma(mm, virtp); - /* For kernel direct-mapped memory, take the easy way */ -- if (virtp >= PAGE_OFFSET) { -- physp = virt_to_phys((void *) virtp); -- } else if (vma && (vma->vm_flags & VM_IO) && vma->vm_pgoff) { -+ if (virtp >= PAGE_OFFSET) -+ return virt_to_phys((void *) virtp); -+ -+ down_read(¤t->mm->mmap_sem); -+ vma = find_vma(mm, virtp); -+ if (vma && (vma->vm_flags & VM_IO) && vma->vm_pgoff) { - /* this will catch, kernel-allocated, mmaped-to-usermode - addresses */ - physp = (vma->vm_pgoff << PAGE_SHIFT) + (virtp - vma->vm_start); -+ up_read(¤t->mm->mmap_sem); - } else { - /* otherwise, use get_user_pages() for general userland pages */ - int res, nr_pages = 1; - struct page *pages; -- down_read(¤t->mm->mmap_sem); - - res = get_user_pages(current, current->mm, virtp, nr_pages, 1, - 0, &pages, NULL); -diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c -index 10460fd..dbcdfbf 100644 ---- a/drivers/media/video/saa7134/saa7134-alsa.c -+++ b/drivers/media/video/saa7134/saa7134-alsa.c -@@ -172,7 +172,9 @@ static void saa7134_irq_alsa_done(struct saa7134_dev *dev, - dprintk("irq: overrun [full=%d/%d] - Blocks in %d\n",dev->dmasound.read_count, - dev->dmasound.bufsize, dev->dmasound.blocks); - spin_unlock(&dev->slock); -+ snd_pcm_stream_lock(dev->dmasound.substream); - snd_pcm_stop(dev->dmasound.substream,SNDRV_PCM_STATE_XRUN); -+ snd_pcm_stream_unlock(dev->dmasound.substream); - return; - } - -diff --git a/drivers/media/video/saa7164/saa7164-core.c b/drivers/media/video/saa7164/saa7164-core.c -index 3b7d7b4..8f3c47e 100644 ---- a/drivers/media/video/saa7164/saa7164-core.c -+++ b/drivers/media/video/saa7164/saa7164-core.c -@@ -1386,9 +1386,11 @@ static int __devinit saa7164_initdev(struct pci_dev *pci_dev, - if (fw_debug) { - dev->kthread = kthread_run(saa7164_thread_function, dev, - "saa7164 debug"); -- if (!dev->kthread) -+ if (IS_ERR(dev->kthread)) { -+ dev->kthread = NULL; - printk(KERN_ERR "%s() Failed to create " - "debug kernel thread\n", __func__); -+ } - } - - } /* != BOARD_UNKNOWN */ -diff --git a/drivers/media/video/v4l2-device.c b/drivers/media/video/v4l2-device.c -index 1f203b8..683ae99 100644 ---- a/drivers/media/video/v4l2-device.c -+++ b/drivers/media/video/v4l2-device.c -@@ -159,31 +159,21 @@ int v4l2_device_register_subdev(struct v4l2_device *v4l2_dev, - sd->v4l2_dev = v4l2_dev; - if (sd->internal_ops && sd->internal_ops->registered) { - err = sd->internal_ops->registered(sd); -- if (err) { -- module_put(sd->owner); -- return err; -- } -+ if (err) -+ goto error_module; - } - - /* This just returns 0 if either of the two args is NULL */ - err = v4l2_ctrl_add_handler(v4l2_dev->ctrl_handler, sd->ctrl_handler); -- if (err) { -- if (sd->internal_ops && sd->internal_ops->unregistered) -- sd->internal_ops->unregistered(sd); -- module_put(sd->owner); -- return err; -- } -+ if (err) -+ goto error_unregister; - - #if defined(CONFIG_MEDIA_CONTROLLER) - /* Register the entity. */ - if (v4l2_dev->mdev) { - err = media_device_register_entity(v4l2_dev->mdev, entity); -- if (err < 0) { -- if (sd->internal_ops && sd->internal_ops->unregistered) -- sd->internal_ops->unregistered(sd); -- module_put(sd->owner); -- return err; -- } -+ if (err < 0) -+ goto error_unregister; - } - #endif - -@@ -192,6 +182,14 @@ int v4l2_device_register_subdev(struct v4l2_device *v4l2_dev, - spin_unlock(&v4l2_dev->lock); - - return 0; -+ -+error_unregister: -+ if (sd->internal_ops && sd->internal_ops->unregistered) -+ sd->internal_ops->unregistered(sd); -+error_module: -+ module_put(sd->owner); -+ sd->v4l2_dev = NULL; -+ return err; - } - EXPORT_SYMBOL_GPL(v4l2_device_register_subdev); - -diff --git a/drivers/mfd/max8925-i2c.c b/drivers/mfd/max8925-i2c.c -index d9e4b36..6d71067 100644 ---- a/drivers/mfd/max8925-i2c.c -+++ b/drivers/mfd/max8925-i2c.c -@@ -156,9 +156,18 @@ static int __devinit max8925_probe(struct i2c_client *client, - mutex_init(&chip->io_lock); - - chip->rtc = i2c_new_dummy(chip->i2c->adapter, RTC_I2C_ADDR); -+ if (!chip->rtc) { -+ dev_err(chip->dev, "Failed to allocate I2C device for RTC\n"); -+ return -ENODEV; -+ } - i2c_set_clientdata(chip->rtc, chip); - - chip->adc = i2c_new_dummy(chip->i2c->adapter, ADC_I2C_ADDR); -+ if (!chip->adc) { -+ dev_err(chip->dev, "Failed to allocate I2C device for ADC\n"); -+ i2c_unregister_device(chip->rtc); -+ return -ENODEV; -+ } - i2c_set_clientdata(chip->adc, chip); - - device_init_wakeup(&client->dev, 1); -diff --git a/drivers/mfd/max8997.c b/drivers/mfd/max8997.c -index cb83a7a..b4d48af 100644 ---- a/drivers/mfd/max8997.c -+++ b/drivers/mfd/max8997.c -@@ -149,10 +149,26 @@ static int max8997_i2c_probe(struct i2c_client *i2c, - mutex_init(&max8997->iolock); - - max8997->rtc = i2c_new_dummy(i2c->adapter, I2C_ADDR_RTC); -+ if (!max8997->rtc) { -+ dev_err(max8997->dev, "Failed to allocate I2C device for RTC\n"); -+ return -ENODEV; -+ } - i2c_set_clientdata(max8997->rtc, max8997); -+ - max8997->haptic = i2c_new_dummy(i2c->adapter, I2C_ADDR_HAPTIC); -+ if (!max8997->haptic) { -+ dev_err(max8997->dev, "Failed to allocate I2C device for Haptic\n"); -+ ret = -ENODEV; -+ goto err_i2c_haptic; -+ } - i2c_set_clientdata(max8997->haptic, max8997); -+ - max8997->muic = i2c_new_dummy(i2c->adapter, I2C_ADDR_MUIC); -+ if (!max8997->muic) { -+ dev_err(max8997->dev, "Failed to allocate I2C device for MUIC\n"); -+ ret = -ENODEV; -+ goto err_i2c_muic; -+ } - i2c_set_clientdata(max8997->muic, max8997); - - pm_runtime_set_active(max8997->dev); -@@ -179,7 +195,9 @@ static int max8997_i2c_probe(struct i2c_client *i2c, - err_mfd: - mfd_remove_devices(max8997->dev); - i2c_unregister_device(max8997->muic); -+err_i2c_muic: - i2c_unregister_device(max8997->haptic); -+err_i2c_haptic: - i2c_unregister_device(max8997->rtc); - err: - kfree(max8997); -diff --git a/drivers/mfd/max8998.c b/drivers/mfd/max8998.c -index 6ef56d2..0a44816 100644 ---- a/drivers/mfd/max8998.c -+++ b/drivers/mfd/max8998.c -@@ -152,6 +152,10 @@ static int max8998_i2c_probe(struct i2c_client *i2c, - mutex_init(&max8998->iolock); - - max8998->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR); -+ if (!max8998->rtc) { -+ dev_err(&i2c->dev, "Failed to allocate I2C device for RTC\n"); -+ return -ENODEV; -+ } - i2c_set_clientdata(max8998->rtc, max8998); - - max8998_irq_init(max8998); -diff --git a/drivers/misc/enclosure.c b/drivers/misc/enclosure.c -index 00e5fcac8..cbee842 100644 ---- a/drivers/misc/enclosure.c -+++ b/drivers/misc/enclosure.c -@@ -198,6 +198,13 @@ static void enclosure_remove_links(struct enclosure_component *cdev) - { - char name[ENCLOSURE_NAME_SIZE]; - -+ /* -+ * In odd circumstances, like multipath devices, something else may -+ * already have removed the links, so check for this condition first. -+ */ -+ if (!cdev->dev->kobj.sd) -+ return; -+ - enclosure_link_name(cdev, name); - sysfs_remove_link(&cdev->dev->kobj, name); - sysfs_remove_link(&cdev->cdev.kobj, "device"); -diff --git a/drivers/misc/hpilo.c b/drivers/misc/hpilo.c -index fffc227..9c99680 100644 ---- a/drivers/misc/hpilo.c -+++ b/drivers/misc/hpilo.c -@@ -735,7 +735,14 @@ static void ilo_remove(struct pci_dev *pdev) - free_irq(pdev->irq, ilo_hw); - ilo_unmap_device(pdev, ilo_hw); - pci_release_regions(pdev); -- pci_disable_device(pdev); -+ /* -+ * pci_disable_device(pdev) used to be here. But this PCI device has -+ * two functions with interrupt lines connected to a single pin. The -+ * other one is a USB host controller. So when we disable the PIN here -+ * e.g. by rmmod hpilo, the controller stops working. It is because -+ * the interrupt link is disabled in ACPI since it is not refcounted -+ * yet. See acpi_pci_link_free_irq called from acpi_pci_irq_disable. -+ */ - kfree(ilo_hw); - ilo_hwdev[(minor / MAX_CCB)] = 0; - } -@@ -820,7 +827,7 @@ static int __devinit ilo_probe(struct pci_dev *pdev, - free_regions: - pci_release_regions(pdev); - disable: -- pci_disable_device(pdev); -+/* pci_disable_device(pdev); see comment in ilo_remove */ - free: - kfree(ilo_hw); - out: -diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c -index 2a822d9e..e6f08d9 100644 ---- a/drivers/mmc/host/atmel-mci.c -+++ b/drivers/mmc/host/atmel-mci.c -@@ -1022,11 +1022,22 @@ static void atmci_start_request(struct atmel_mci *host, - iflags |= ATMCI_CMDRDY; - cmd = mrq->cmd; - cmdflags = atmci_prepare_command(slot->mmc, cmd); -- atmci_send_command(host, cmd, cmdflags); -+ -+ /* -+ * DMA transfer should be started before sending the command to avoid -+ * unexpected errors especially for read operations in SDIO mode. -+ * Unfortunately, in PDC mode, command has to be sent before starting -+ * the transfer. -+ */ -+ if (host->submit_data != &atmci_submit_data_dma) -+ atmci_send_command(host, cmd, cmdflags); - - if (data) - host->submit_data(host, data); - -+ if (host->submit_data == &atmci_submit_data_dma) -+ atmci_send_command(host, cmd, cmdflags); -+ - if (mrq->stop) { - host->stop_cmdr = atmci_prepare_command(slot->mmc, mrq->stop); - host->stop_cmdr |= ATMCI_CMDR_STOP_XFER; -diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c -index b6def20..13ce63b 100644 ---- a/drivers/mmc/host/mxs-mmc.c -+++ b/drivers/mmc/host/mxs-mmc.c -@@ -639,10 +639,6 @@ static void mxs_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable) - host->base + HW_SSP_CTRL0 + MXS_SET_ADDR); - writel(BM_SSP_CTRL1_SDIO_IRQ_EN, - host->base + HW_SSP_CTRL1 + MXS_SET_ADDR); -- -- if (readl(host->base + HW_SSP_STATUS) & BM_SSP_STATUS_SDIO_IRQ) -- mmc_signal_sdio_irq(host->mmc); -- - } else { - writel(BM_SSP_CTRL0_SDIO_IRQ_CHECK, - host->base + HW_SSP_CTRL0 + MXS_CLR_ADDR); -@@ -651,6 +647,10 @@ static void mxs_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable) - } - - spin_unlock_irqrestore(&host->lock, flags); -+ -+ if (enable && readl(host->base + HW_SSP_STATUS) & BM_SSP_STATUS_SDIO_IRQ) -+ mmc_signal_sdio_irq(host->mmc); -+ - } - - static const struct mmc_host_ops mxs_mmc_ops = { -diff --git a/drivers/mtd/devices/m25p80.c b/drivers/mtd/devices/m25p80.c -index 1924d24..797860e 100644 ---- a/drivers/mtd/devices/m25p80.c -+++ b/drivers/mtd/devices/m25p80.c -@@ -71,7 +71,7 @@ - - /* Define max times to check status register before we give up. */ - #define MAX_READY_WAIT_JIFFIES (40 * HZ) /* M25P16 specs 40s max chip erase */ --#define MAX_CMD_SIZE 5 -+#define MAX_CMD_SIZE 6 - - #ifdef CONFIG_M25PXX_USE_FAST_READ - #define OPCODE_READ OPCODE_FAST_READ -@@ -843,14 +843,13 @@ static int __devinit m25p_probe(struct spi_device *spi) - } - } - -- flash = kzalloc(sizeof *flash, GFP_KERNEL); -+ flash = devm_kzalloc(&spi->dev, sizeof(*flash), GFP_KERNEL); - if (!flash) - return -ENOMEM; -- flash->command = kmalloc(MAX_CMD_SIZE + FAST_READ_DUMMY_BYTE, GFP_KERNEL); -- if (!flash->command) { -- kfree(flash); -+ -+ flash->command = devm_kzalloc(&spi->dev, MAX_CMD_SIZE, GFP_KERNEL); -+ if (!flash->command) - return -ENOMEM; -- } - - flash->spi = spi; - mutex_init(&flash->lock); -@@ -947,14 +946,10 @@ static int __devinit m25p_probe(struct spi_device *spi) - static int __devexit m25p_remove(struct spi_device *spi) - { - struct m25p *flash = dev_get_drvdata(&spi->dev); -- int status; - - /* Clean up MTD stuff. */ -- status = mtd_device_unregister(&flash->mtd); -- if (status == 0) { -- kfree(flash->command); -- kfree(flash); -- } -+ mtd_device_unregister(&flash->mtd); -+ - return 0; - } - -diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c -index 9ec51ce..0f000e6 100644 ---- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c -+++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c -@@ -227,8 +227,6 @@ static void dma_irq_callback(void *param) - struct gpmi_nand_data *this = param; - struct completion *dma_c = &this->dma_done; - -- complete(dma_c); -- - switch (this->dma_type) { - case DMA_FOR_COMMAND: - dma_unmap_sg(this->dev, &this->cmd_sgl, 1, DMA_TO_DEVICE); -@@ -253,6 +251,8 @@ static void dma_irq_callback(void *param) - default: - pr_err("in wrong DMA operation.\n"); - } -+ -+ complete(dma_c); - } - - int start_dma_without_bch_irq(struct gpmi_nand_data *this, -diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c -index 6f87c74..a06231f 100644 ---- a/drivers/mtd/nand/mxc_nand.c -+++ b/drivers/mtd/nand/mxc_nand.c -@@ -596,7 +596,6 @@ static int mxc_nand_correct_data_v2_v3(struct mtd_info *mtd, u_char *dat, - ecc_stat >>= 4; - } while (--no_subpages); - -- mtd->ecc_stats.corrected += ret; - pr_debug("%d Symbol Correctable RS-ECC Error\n", ret); - - return ret; -diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c -index eb9f5fb..e50a0b4 100644 ---- a/drivers/mtd/nand/nand_base.c -+++ b/drivers/mtd/nand/nand_base.c -@@ -2888,10 +2888,21 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip, - sanitize_string(p->model, sizeof(p->model)); - if (!mtd->name) - mtd->name = p->model; -+ - mtd->writesize = le32_to_cpu(p->byte_per_page); -- mtd->erasesize = le32_to_cpu(p->pages_per_block) * mtd->writesize; -+ -+ /* -+ * pages_per_block and blocks_per_lun may not be a power-of-2 size -+ * (don't ask me who thought of this...). MTD assumes that these -+ * dimensions will be power-of-2, so just truncate the remaining area. -+ */ -+ mtd->erasesize = 1 << (fls(le32_to_cpu(p->pages_per_block)) - 1); -+ mtd->erasesize *= mtd->writesize; -+ - mtd->oobsize = le16_to_cpu(p->spare_bytes_per_page); -- chip->chipsize = le32_to_cpu(p->blocks_per_lun); -+ -+ /* See erasesize comment */ -+ chip->chipsize = 1 << (fls(le32_to_cpu(p->blocks_per_lun)) - 1); - chip->chipsize *= (uint64_t)mtd->erasesize * p->lun_count; - *busw = 0; - if (le16_to_cpu(p->features) & 1) -diff --git a/drivers/mtd/nand/nuc900_nand.c b/drivers/mtd/nand/nuc900_nand.c -index 8febe46..9f55d40 100644 ---- a/drivers/mtd/nand/nuc900_nand.c -+++ b/drivers/mtd/nand/nuc900_nand.c -@@ -250,7 +250,7 @@ static void nuc900_nand_enable(struct nuc900_nand *nand) - val = __raw_readl(nand->reg + REG_FMICSR); - - if (!(val & NAND_EN)) -- __raw_writel(val | NAND_EN, REG_FMICSR); -+ __raw_writel(val | NAND_EN, nand->reg + REG_FMICSR); - - val = __raw_readl(nand->reg + REG_SMCSR); - -diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c -index def50ca..fd11af4 100644 ---- a/drivers/mtd/nand/pxa3xx_nand.c -+++ b/drivers/mtd/nand/pxa3xx_nand.c -@@ -93,10 +93,10 @@ - - /* macros for registers read/write */ - #define nand_writel(info, off, val) \ -- __raw_writel((val), (info)->mmio_base + (off)) -+ writel_relaxed((val), (info)->mmio_base + (off)) - - #define nand_readl(info, off) \ -- __raw_readl((info)->mmio_base + (off)) -+ readl_relaxed((info)->mmio_base + (off)) - - /* error code and state */ - enum { -diff --git a/drivers/mtd/sm_ftl.c b/drivers/mtd/sm_ftl.c -index 9e2dfd5..539835f 100644 ---- a/drivers/mtd/sm_ftl.c -+++ b/drivers/mtd/sm_ftl.c -@@ -59,15 +59,12 @@ struct attribute_group *sm_create_sysfs_attributes(struct sm_ftl *ftl) - struct attribute_group *attr_group; - struct attribute **attributes; - struct sm_sysfs_attribute *vendor_attribute; -+ char *vendor; - -- int vendor_len = strnlen(ftl->cis_buffer + SM_CIS_VENDOR_OFFSET, -- SM_SMALL_PAGE - SM_CIS_VENDOR_OFFSET); -- -- char *vendor = kmalloc(vendor_len, GFP_KERNEL); -+ vendor = kstrndup(ftl->cis_buffer + SM_CIS_VENDOR_OFFSET, -+ SM_SMALL_PAGE - SM_CIS_VENDOR_OFFSET, GFP_KERNEL); - if (!vendor) - goto error1; -- memcpy(vendor, ftl->cis_buffer + SM_CIS_VENDOR_OFFSET, vendor_len); -- vendor[vendor_len] = 0; - - /* Initialize sysfs attributes */ - vendor_attribute = -@@ -78,7 +75,7 @@ struct attribute_group *sm_create_sysfs_attributes(struct sm_ftl *ftl) - sysfs_attr_init(&vendor_attribute->dev_attr.attr); - - vendor_attribute->data = vendor; -- vendor_attribute->len = vendor_len; -+ vendor_attribute->len = strlen(vendor); - vendor_attribute->dev_attr.attr.name = "vendor"; - vendor_attribute->dev_attr.attr.mode = S_IRUGO; - vendor_attribute->dev_attr.show = sm_attr_show; -diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c -index 12c43b4..4f71793 100644 ---- a/drivers/mtd/ubi/scan.c -+++ b/drivers/mtd/ubi/scan.c -@@ -997,7 +997,7 @@ static int process_eb(struct ubi_device *ubi, struct ubi_scan_info *si, - return err; - goto adjust_mean_ec; - case UBI_IO_FF: -- if (ec_err) -+ if (ec_err || bitflips) - err = add_to_list(si, pnum, ec, 1, &si->erase); - else - err = add_to_list(si, pnum, ec, 0, &si->free); -diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c -index 3463b46..184be29 100644 ---- a/drivers/net/bonding/bond_3ad.c -+++ b/drivers/net/bonding/bond_3ad.c -@@ -1854,8 +1854,6 @@ void bond_3ad_initiate_agg_selection(struct bonding *bond, int timeout) - BOND_AD_INFO(bond).agg_select_timer = timeout; - } - --static u16 aggregator_identifier; -- - /** - * bond_3ad_initialize - initialize a bond's 802.3ad parameters and structures - * @bond: bonding struct to work on -@@ -1869,7 +1867,7 @@ void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution) - if (MAC_ADDRESS_COMPARE(&(BOND_AD_INFO(bond).system.sys_mac_addr), - bond->dev->dev_addr)) { - -- aggregator_identifier = 0; -+ BOND_AD_INFO(bond).aggregator_identifier = 0; - - BOND_AD_INFO(bond).system.sys_priority = 0xFFFF; - BOND_AD_INFO(bond).system.sys_mac_addr = *((struct mac_addr *)bond->dev->dev_addr); -@@ -1941,7 +1939,7 @@ int bond_3ad_bind_slave(struct slave *slave) - ad_initialize_agg(aggregator); - - aggregator->aggregator_mac_address = *((struct mac_addr *)bond->dev->dev_addr); -- aggregator->aggregator_identifier = (++aggregator_identifier); -+ aggregator->aggregator_identifier = ++BOND_AD_INFO(bond).aggregator_identifier; - aggregator->slave = slave; - aggregator->is_active = 0; - aggregator->num_of_ports = 0; -diff --git a/drivers/net/bonding/bond_3ad.h b/drivers/net/bonding/bond_3ad.h -index 5ee7e3c..656b2f5 100644 ---- a/drivers/net/bonding/bond_3ad.h -+++ b/drivers/net/bonding/bond_3ad.h -@@ -253,6 +253,7 @@ struct ad_system { - struct ad_bond_info { - struct ad_system system; /* 802.3ad system structure */ - u32 agg_select_timer; // Timer to select aggregator after all adapter's hand shakes -+ u16 aggregator_identifier; - }; - - struct ad_slave_info { -diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c -index 098581a..2402af3 100644 ---- a/drivers/net/bonding/bond_main.c -+++ b/drivers/net/bonding/bond_main.c -@@ -4930,6 +4930,7 @@ static int __init bonding_init(void) - out: - return res; - err: -+ bond_destroy_debugfs(); - rtnl_link_unregister(&bond_link_ops); - err_link: - unregister_pernet_subsys(&bond_net_ops); -diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c -index c40c0a8..f42a00a 100644 ---- a/drivers/net/bonding/bond_sysfs.c -+++ b/drivers/net/bonding/bond_sysfs.c -@@ -533,8 +533,9 @@ static ssize_t bonding_store_arp_interval(struct device *d, - goto out; - } - if (bond->params.mode == BOND_MODE_ALB || -- bond->params.mode == BOND_MODE_TLB) { -- pr_info("%s: ARP monitoring cannot be used with ALB/TLB. Only MII monitoring is supported on %s.\n", -+ bond->params.mode == BOND_MODE_TLB || -+ bond->params.mode == BOND_MODE_8023AD) { -+ pr_info("%s: ARP monitoring cannot be used with ALB/TLB/802.3ad. Only MII monitoring is supported on %s.\n", - bond->dev->name, bond->dev->name); - ret = -EINVAL; - goto out; -@@ -692,6 +693,8 @@ static ssize_t bonding_store_downdelay(struct device *d, - int new_value, ret = count; - struct bonding *bond = to_bond(d); - -+ if (!rtnl_trylock()) -+ return restart_syscall(); - if (!(bond->params.miimon)) { - pr_err("%s: Unable to set down delay as MII monitoring is disabled\n", - bond->dev->name); -@@ -725,6 +728,7 @@ static ssize_t bonding_store_downdelay(struct device *d, - } - - out: -+ rtnl_unlock(); - return ret; - } - static DEVICE_ATTR(downdelay, S_IRUGO | S_IWUSR, -@@ -747,6 +751,8 @@ static ssize_t bonding_store_updelay(struct device *d, - int new_value, ret = count; - struct bonding *bond = to_bond(d); - -+ if (!rtnl_trylock()) -+ return restart_syscall(); - if (!(bond->params.miimon)) { - pr_err("%s: Unable to set up delay as MII monitoring is disabled\n", - bond->dev->name); -@@ -780,6 +786,7 @@ static ssize_t bonding_store_updelay(struct device *d, - } - - out: -+ rtnl_unlock(); - return ret; - } - static DEVICE_ATTR(updelay, S_IRUGO | S_IWUSR, -diff --git a/drivers/net/can/at91_can.c b/drivers/net/can/at91_can.c -index 6ea905c..12328068 100644 ---- a/drivers/net/can/at91_can.c -+++ b/drivers/net/can/at91_can.c -@@ -1115,7 +1115,9 @@ static int at91_open(struct net_device *dev) - struct at91_priv *priv = netdev_priv(dev); - int err; - -- clk_enable(priv->clk); -+ err = clk_prepare_enable(priv->clk); -+ if (err) -+ return err; - - /* check or determine and set bittime */ - err = open_candev(dev); -@@ -1139,7 +1141,7 @@ static int at91_open(struct net_device *dev) - out_close: - close_candev(dev); - out: -- clk_disable(priv->clk); -+ clk_disable_unprepare(priv->clk); - - return err; - } -@@ -1156,7 +1158,7 @@ static int at91_close(struct net_device *dev) - at91_chip_stop(dev, CAN_STATE_STOPPED); - - free_irq(dev->irq, dev); -- clk_disable(priv->clk); -+ clk_disable_unprepare(priv->clk); - - close_candev(dev); - -diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c -index 21a3d77..91d1b5a 100644 ---- a/drivers/net/can/c_can/c_can.c -+++ b/drivers/net/can/c_can/c_can.c -@@ -446,8 +446,12 @@ static void c_can_setup_receive_object(struct net_device *dev, int iface, - - priv->write_reg(priv, &priv->regs->ifregs[iface].mask1, - IFX_WRITE_LOW_16BIT(mask)); -+ -+ /* According to C_CAN documentation, the reserved bit -+ * in IFx_MASK2 register is fixed 1 -+ */ - priv->write_reg(priv, &priv->regs->ifregs[iface].mask2, -- IFX_WRITE_HIGH_16BIT(mask)); -+ IFX_WRITE_HIGH_16BIT(mask) | BIT(13)); - - priv->write_reg(priv, &priv->regs->ifregs[iface].arb1, - IFX_WRITE_LOW_16BIT(id)); -@@ -760,9 +764,6 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota) - msg_ctrl_save = priv->read_reg(priv, - &priv->regs->ifregs[0].msg_cntrl); - -- if (msg_ctrl_save & IF_MCONT_EOB) -- return num_rx_pkts; -- - if (msg_ctrl_save & IF_MCONT_MSGLST) { - c_can_handle_lost_msg_obj(dev, 0, msg_obj); - num_rx_pkts++; -@@ -770,6 +771,9 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota) - continue; - } - -+ if (msg_ctrl_save & IF_MCONT_EOB) -+ return num_rx_pkts; -+ - if (!(msg_ctrl_save & IF_MCONT_NEWDAT)) - continue; - -diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c -index e86f4c3..c2cdefa 100644 ---- a/drivers/net/can/dev.c -+++ b/drivers/net/can/dev.c -@@ -665,14 +665,14 @@ static size_t can_get_size(const struct net_device *dev) - size_t size; - - size = nla_total_size(sizeof(u32)); /* IFLA_CAN_STATE */ -- size += sizeof(struct can_ctrlmode); /* IFLA_CAN_CTRLMODE */ -+ size += nla_total_size(sizeof(struct can_ctrlmode)); /* IFLA_CAN_CTRLMODE */ - size += nla_total_size(sizeof(u32)); /* IFLA_CAN_RESTART_MS */ -- size += sizeof(struct can_bittiming); /* IFLA_CAN_BITTIMING */ -- size += sizeof(struct can_clock); /* IFLA_CAN_CLOCK */ -+ size += nla_total_size(sizeof(struct can_bittiming)); /* IFLA_CAN_BITTIMING */ -+ size += nla_total_size(sizeof(struct can_clock)); /* IFLA_CAN_CLOCK */ - if (priv->do_get_berr_counter) /* IFLA_CAN_BERR_COUNTER */ -- size += sizeof(struct can_berr_counter); -+ size += nla_total_size(sizeof(struct can_berr_counter)); - if (priv->bittiming_const) /* IFLA_CAN_BITTIMING_CONST */ -- size += sizeof(struct can_bittiming_const); -+ size += nla_total_size(sizeof(struct can_bittiming_const)); - - return size; - } -diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c -index 00baa7e..b523e65 100644 ---- a/drivers/net/can/flexcan.c -+++ b/drivers/net/can/flexcan.c -@@ -60,7 +60,7 @@ - #define FLEXCAN_MCR_BCC BIT(16) - #define FLEXCAN_MCR_LPRIO_EN BIT(13) - #define FLEXCAN_MCR_AEN BIT(12) --#define FLEXCAN_MCR_MAXMB(x) ((x) & 0xf) -+#define FLEXCAN_MCR_MAXMB(x) ((x) & 0x1f) - #define FLEXCAN_MCR_IDAM_A (0 << 8) - #define FLEXCAN_MCR_IDAM_B (1 << 8) - #define FLEXCAN_MCR_IDAM_C (2 << 8) -@@ -123,7 +123,9 @@ - FLEXCAN_ESR_BOFF_INT | FLEXCAN_ESR_ERR_INT) - - /* FLEXCAN interrupt flag register (IFLAG) bits */ --#define FLEXCAN_TX_BUF_ID 8 -+/* Errata ERR005829 step7: Reserve first valid MB */ -+#define FLEXCAN_TX_BUF_RESERVED 8 -+#define FLEXCAN_TX_BUF_ID 9 - #define FLEXCAN_IFLAG_BUF(x) BIT(x) - #define FLEXCAN_IFLAG_RX_FIFO_OVERFLOW BIT(7) - #define FLEXCAN_IFLAG_RX_FIFO_WARN BIT(6) -@@ -134,6 +136,17 @@ - - /* FLEXCAN message buffers */ - #define FLEXCAN_MB_CNT_CODE(x) (((x) & 0xf) << 24) -+#define FLEXCAN_MB_CODE_RX_INACTIVE (0x0 << 24) -+#define FLEXCAN_MB_CODE_RX_EMPTY (0x4 << 24) -+#define FLEXCAN_MB_CODE_RX_FULL (0x2 << 24) -+#define FLEXCAN_MB_CODE_RX_OVERRRUN (0x6 << 24) -+#define FLEXCAN_MB_CODE_RX_RANSWER (0xa << 24) -+ -+#define FLEXCAN_MB_CODE_TX_INACTIVE (0x8 << 24) -+#define FLEXCAN_MB_CODE_TX_ABORT (0x9 << 24) -+#define FLEXCAN_MB_CODE_TX_DATA (0xc << 24) -+#define FLEXCAN_MB_CODE_TX_TANSWER (0xe << 24) -+ - #define FLEXCAN_MB_CNT_SRR BIT(22) - #define FLEXCAN_MB_CNT_IDE BIT(21) - #define FLEXCAN_MB_CNT_RTR BIT(20) -@@ -306,6 +319,14 @@ static int flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev) - flexcan_write(can_id, ®s->cantxfg[FLEXCAN_TX_BUF_ID].can_id); - flexcan_write(ctrl, ®s->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl); - -+ /* Errata ERR005829 step8: -+ * Write twice INACTIVE(0x8) code to first MB. -+ */ -+ flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE, -+ ®s->cantxfg[FLEXCAN_TX_BUF_RESERVED].can_ctrl); -+ flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE, -+ ®s->cantxfg[FLEXCAN_TX_BUF_RESERVED].can_ctrl); -+ - return NETDEV_TX_OK; - } - -@@ -612,6 +633,9 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id) - if (reg_iflag1 & (1 << FLEXCAN_TX_BUF_ID)) { - stats->tx_bytes += can_get_echo_skb(dev, 0); - stats->tx_packets++; -+ /* after sending a RTR frame mailbox is in RX mode */ -+ flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE, -+ ®s->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl); - flexcan_write((1 << FLEXCAN_TX_BUF_ID), ®s->iflag1); - netif_wake_queue(dev); - } -@@ -667,9 +691,9 @@ static int flexcan_chip_start(struct net_device *dev) - { - struct flexcan_priv *priv = netdev_priv(dev); - struct flexcan_regs __iomem *regs = priv->base; -- unsigned int i; - int err; - u32 reg_mcr, reg_ctrl; -+ int i; - - /* enable module */ - flexcan_chip_enable(priv); -@@ -701,9 +725,11 @@ static int flexcan_chip_start(struct net_device *dev) - * - */ - reg_mcr = flexcan_read(®s->mcr); -+ reg_mcr &= ~FLEXCAN_MCR_MAXMB(0xff); - reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_FEN | FLEXCAN_MCR_HALT | - FLEXCAN_MCR_SUPV | FLEXCAN_MCR_WRN_EN | -- FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_SRX_DIS; -+ FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_SRX_DIS | -+ FLEXCAN_MCR_MAXMB(FLEXCAN_TX_BUF_ID); - netdev_dbg(dev, "%s: writing mcr=0x%08x", __func__, reg_mcr); - flexcan_write(reg_mcr, ®s->mcr); - -@@ -733,17 +759,20 @@ static int flexcan_chip_start(struct net_device *dev) - netdev_dbg(dev, "%s: writing ctrl=0x%08x", __func__, reg_ctrl); - flexcan_write(reg_ctrl, ®s->ctrl); - -- for (i = 0; i < ARRAY_SIZE(regs->cantxfg); i++) { -- flexcan_write(0, ®s->cantxfg[i].can_ctrl); -- flexcan_write(0, ®s->cantxfg[i].can_id); -- flexcan_write(0, ®s->cantxfg[i].data[0]); -- flexcan_write(0, ®s->cantxfg[i].data[1]); -- -- /* put MB into rx queue */ -- flexcan_write(FLEXCAN_MB_CNT_CODE(0x4), -- ®s->cantxfg[i].can_ctrl); -+ /* clear and invalidate all mailboxes first */ -+ for (i = FLEXCAN_TX_BUF_ID; i < ARRAY_SIZE(regs->cantxfg); i++) { -+ flexcan_write(FLEXCAN_MB_CODE_RX_INACTIVE, -+ ®s->cantxfg[i].can_ctrl); - } - -+ /* Errata ERR005829: mark first TX mailbox as INACTIVE */ -+ flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE, -+ ®s->cantxfg[FLEXCAN_TX_BUF_RESERVED].can_ctrl); -+ -+ /* mark TX mailbox as INACTIVE */ -+ flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE, -+ ®s->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl); -+ - /* acceptance mask/acceptance code (accept everything) */ - flexcan_write(0x0, ®s->rxgmask); - flexcan_write(0x0, ®s->rx14mask); -@@ -811,7 +840,7 @@ static int flexcan_open(struct net_device *dev) - - err = request_irq(dev->irq, flexcan_irq, IRQF_SHARED, dev->name, dev); - if (err) -- goto out_close; -+ goto out_free_irq; - - /* start chip and queuing */ - err = flexcan_chip_start(dev); -@@ -822,6 +851,8 @@ static int flexcan_open(struct net_device *dev) - - return 0; - -+ out_free_irq: -+ free_irq(dev->irq, dev); - out_close: - close_candev(dev); - out: -diff --git a/drivers/net/can/sja1000/peak_pci.c b/drivers/net/can/sja1000/peak_pci.c -index 5f92b86..a28c5d3 100644 ---- a/drivers/net/can/sja1000/peak_pci.c -+++ b/drivers/net/can/sja1000/peak_pci.c -@@ -547,7 +547,7 @@ static int __devinit peak_pci_probe(struct pci_dev *pdev, - { - struct sja1000_priv *priv; - struct peak_pci_chan *chan; -- struct net_device *dev; -+ struct net_device *dev, *prev_dev; - void __iomem *cfg_base, *reg_base; - u16 sub_sys_id, icr; - int i, err, channels; -@@ -681,11 +681,13 @@ static int __devinit peak_pci_probe(struct pci_dev *pdev, - writew(0x0, cfg_base + PITA_ICR + 2); - - chan = NULL; -- for (dev = pci_get_drvdata(pdev); dev; dev = chan->prev_dev) { -- unregister_sja1000dev(dev); -- free_sja1000dev(dev); -+ for (dev = pci_get_drvdata(pdev); dev; dev = prev_dev) { - priv = netdev_priv(dev); - chan = priv->priv; -+ prev_dev = chan->prev_dev; -+ -+ unregister_sja1000dev(dev); -+ free_sja1000dev(dev); - } - - /* free any PCIeC resources too */ -@@ -719,10 +721,12 @@ static void __devexit peak_pci_remove(struct pci_dev *pdev) - - /* Loop over all registered devices */ - while (1) { -+ struct net_device *prev_dev = chan->prev_dev; -+ - dev_info(&pdev->dev, "removing device %s\n", dev->name); - unregister_sja1000dev(dev); - free_sja1000dev(dev); -- dev = chan->prev_dev; -+ dev = prev_dev; - - if (!dev) { - /* do that only for first channel */ -diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c -index c2309ec..2d3ad72 100644 ---- a/drivers/net/can/sja1000/sja1000.c -+++ b/drivers/net/can/sja1000/sja1000.c -@@ -487,19 +487,19 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id) - uint8_t isrc, status; - int n = 0; - -- /* Shared interrupts and IRQ off? */ -- if (priv->read_reg(priv, REG_IER) == IRQ_OFF) -- return IRQ_NONE; -- - if (priv->pre_irq) - priv->pre_irq(priv); - -+ /* Shared interrupts and IRQ off? */ -+ if (priv->read_reg(priv, REG_IER) == IRQ_OFF) -+ goto out; -+ - while ((isrc = priv->read_reg(priv, REG_IR)) && (n < SJA1000_MAX_IRQ)) { -- n++; -+ - status = priv->read_reg(priv, SJA1000_REG_SR); - /* check for absent controller due to hw unplug */ - if (status == 0xFF && sja1000_is_absent(priv)) -- return IRQ_NONE; -+ goto out; - - if (isrc & IRQ_WUI) - netdev_warn(dev, "wakeup interrupt\n"); -@@ -518,7 +518,7 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id) - status = priv->read_reg(priv, SJA1000_REG_SR); - /* check for absent controller */ - if (status == 0xFF && sja1000_is_absent(priv)) -- return IRQ_NONE; -+ goto out; - } - } - if (isrc & (IRQ_DOI | IRQ_EI | IRQ_BEI | IRQ_EPI | IRQ_ALI)) { -@@ -526,8 +526,9 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id) - if (sja1000_err(dev, isrc, status)) - break; - } -+ n++; - } -- -+out: - if (priv->post_irq) - priv->post_irq(priv); - -diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c -index acd8246..0f05cef 100644 ---- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c -+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c -@@ -71,6 +71,7 @@ static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata, - struct sk_buff *skb = tx_buf->skb; - u16 bd_idx = TX_BD(tx_buf->first_bd), new_cons; - int nbd; -+ u16 split_bd_len = 0; - - /* prefetch skb end pointer to speedup dev_kfree_skb() */ - prefetch(&skb->end); -@@ -78,10 +79,7 @@ static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata, - DP(NETIF_MSG_TX_DONE, "fp[%d]: pkt_idx %d buff @(%p)->skb %p\n", - txdata->txq_index, idx, tx_buf, skb); - -- /* unmap first bd */ - tx_start_bd = &txdata->tx_desc_ring[bd_idx].start_bd; -- dma_unmap_single(&bp->pdev->dev, BD_UNMAP_ADDR(tx_start_bd), -- BD_UNMAP_LEN(tx_start_bd), DMA_TO_DEVICE); - - - nbd = le16_to_cpu(tx_start_bd->nbd) - 1; -@@ -100,12 +98,19 @@ static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata, - --nbd; - bd_idx = TX_BD(NEXT_TX_IDX(bd_idx)); - -- /* ...and the TSO split header bd since they have no mapping */ -+ /* TSO headers+data bds share a common mapping. See bnx2x_tx_split() */ - if (tx_buf->flags & BNX2X_TSO_SPLIT_BD) { -+ tx_data_bd = &txdata->tx_desc_ring[bd_idx].reg_bd; -+ split_bd_len = BD_UNMAP_LEN(tx_data_bd); - --nbd; - bd_idx = TX_BD(NEXT_TX_IDX(bd_idx)); - } - -+ /* unmap first bd */ -+ dma_unmap_single(&bp->pdev->dev, BD_UNMAP_ADDR(tx_start_bd), -+ BD_UNMAP_LEN(tx_start_bd) + split_bd_len, -+ DMA_TO_DEVICE); -+ - /* now free frags */ - while (nbd > 0) { - -@@ -547,6 +552,7 @@ static inline void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp, - skb, cqe, cqe_idx)) { - if (tpa_info->parsing_flags & PARSING_FLAGS_VLAN) - __vlan_hwaccel_put_tag(skb, tpa_info->vlan_tag); -+ skb_record_rx_queue(skb, fp->rx_queue); - napi_gro_receive(&fp->napi, skb); - } else { - DP(NETIF_MSG_RX_STATUS, -diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c -index 3551ad8..cbc6a62 100644 ---- a/drivers/net/ethernet/broadcom/tg3.c -+++ b/drivers/net/ethernet/broadcom/tg3.c -@@ -1631,6 +1631,9 @@ static int tg3_poll_fw(struct tg3 *tp) - int i; - u32 val; - -+ if (tg3_flag(tp, NO_FWARE_REPORTED)) -+ return 0; -+ - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { - /* Wait up to 20ms for init done. */ - for (i = 0; i < 200; i++) { -@@ -2737,6 +2740,31 @@ static int tg3_5700_link_polarity(struct tg3 *tp, u32 speed) - return 0; - } - -+static bool tg3_phy_power_bug(struct tg3 *tp) -+{ -+ switch (GET_ASIC_REV(tp->pci_chip_rev_id)) { -+ case ASIC_REV_5700: -+ case ASIC_REV_5704: -+ return true; -+ case ASIC_REV_5780: -+ if (tp->phy_flags & TG3_PHYFLG_MII_SERDES) -+ return true; -+ return false; -+ case ASIC_REV_5717: -+ if (!tp->pci_fn) -+ return true; -+ return false; -+ case ASIC_REV_5719: -+ case ASIC_REV_5720: -+ if ((tp->phy_flags & TG3_PHYFLG_PHY_SERDES) && -+ !tp->pci_fn) -+ return true; -+ return false; -+ } -+ -+ return false; -+} -+ - static void tg3_power_down_phy(struct tg3 *tp, bool do_low_power) - { - u32 val; -@@ -2793,12 +2821,7 @@ static void tg3_power_down_phy(struct tg3 *tp, bool do_low_power) - /* The PHY should not be powered down on some chips because - * of bugs. - */ -- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || -- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 || -- (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780 && -- (tp->phy_flags & TG3_PHYFLG_MII_SERDES)) || -- (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 && -- !tp->pci_fn)) -+ if (tg3_phy_power_bug(tp)) - return; - - if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5784_AX || -@@ -5844,8 +5867,7 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget) - - work_mask |= opaque_key; - -- if ((desc->err_vlan & RXD_ERR_MASK) != 0 && -- (desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII)) { -+ if (desc->err_vlan & RXD_ERR_MASK) { - drop_it: - tg3_recycle_rx(tnapi, tpr, opaque_key, - desc_idx, *post_ptr); -@@ -8526,6 +8548,14 @@ static void tg3_rss_write_indir_tbl(struct tg3 *tp) - } - } - -+static inline u32 tg3_lso_rd_dma_workaround_bit(struct tg3 *tp) -+{ -+ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719) -+ return TG3_LSO_RD_DMA_TX_LENGTH_WA_5719; -+ else -+ return TG3_LSO_RD_DMA_TX_LENGTH_WA_5720; -+} -+ - /* tp->lock is held. */ - static int tg3_reset_hw(struct tg3 *tp, int reset_phy) - { -@@ -9162,6 +9192,20 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) - tw32_f(RDMAC_MODE, rdmac_mode); - udelay(40); - -+ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 || -+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720) { -+ for (i = 0; i < TG3_NUM_RDMA_CHANNELS; i++) { -+ if (tr32(TG3_RDMA_LENGTH + (i << 2)) > TG3_MAX_MTU(tp)) -+ break; -+ } -+ if (i < TG3_NUM_RDMA_CHANNELS) { -+ val = tr32(TG3_LSO_RD_DMA_CRPTEN_CTRL); -+ val |= tg3_lso_rd_dma_workaround_bit(tp); -+ tw32(TG3_LSO_RD_DMA_CRPTEN_CTRL, val); -+ tg3_flag_set(tp, 5719_5720_RDMA_BUG); -+ } -+ } -+ - tw32(RCVDCC_MODE, RCVDCC_MODE_ENABLE | RCVDCC_MODE_ATTN_ENABLE); - if (!tg3_flag(tp, 5705_PLUS)) - tw32(MBFREE_MODE, MBFREE_MODE_ENABLE); -@@ -9383,6 +9427,13 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) - */ - static int tg3_init_hw(struct tg3 *tp, int reset_phy) - { -+ /* Chip may have been just powered on. If so, the boot code may still -+ * be running initialization. Wait for it to finish to avoid races in -+ * accessing the hardware. -+ */ -+ tg3_enable_register_access(tp); -+ tg3_poll_fw(tp); -+ - tg3_switch_clocks(tp); - - tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0); -@@ -9417,6 +9468,16 @@ static void tg3_periodic_fetch_stats(struct tg3 *tp) - TG3_STAT_ADD32(&sp->tx_ucast_packets, MAC_TX_STATS_UCAST); - TG3_STAT_ADD32(&sp->tx_mcast_packets, MAC_TX_STATS_MCAST); - TG3_STAT_ADD32(&sp->tx_bcast_packets, MAC_TX_STATS_BCAST); -+ if (unlikely(tg3_flag(tp, 5719_5720_RDMA_BUG) && -+ (sp->tx_ucast_packets.low + sp->tx_mcast_packets.low + -+ sp->tx_bcast_packets.low) > TG3_NUM_RDMA_CHANNELS)) { -+ u32 val; -+ -+ val = tr32(TG3_LSO_RD_DMA_CRPTEN_CTRL); -+ val &= ~tg3_lso_rd_dma_workaround_bit(tp); -+ tw32(TG3_LSO_RD_DMA_CRPTEN_CTRL, val); -+ tg3_flag_clear(tp, 5719_5720_RDMA_BUG); -+ } - - TG3_STAT_ADD32(&sp->rx_octets, MAC_RX_STATS_OCTETS); - TG3_STAT_ADD32(&sp->rx_fragments, MAC_RX_STATS_FRAGMENTS); -@@ -10800,7 +10861,9 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e - if (tg3_flag(tp, MAX_RXPEND_64) && - tp->rx_pending > 63) - tp->rx_pending = 63; -- tp->rx_jumbo_pending = ering->rx_jumbo_pending; -+ -+ if (tg3_flag(tp, JUMBO_RING_ENABLE)) -+ tp->rx_jumbo_pending = ering->rx_jumbo_pending; - - for (i = 0; i < tp->irq_max; i++) - tp->napi[i].tx_pending = ering->tx_pending; -@@ -12343,12 +12406,12 @@ static int tg3_change_mtu(struct net_device *dev, int new_mtu) - - tg3_netif_stop(tp); - -+ tg3_set_mtu(dev, tp, new_mtu); -+ - tg3_full_lock(tp, 1); - - tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - -- tg3_set_mtu(dev, tp, new_mtu); -- - /* Reset PHY, otherwise the read DMA engine will be in a mode that - * breaks all requests to 256 bytes. - */ -@@ -14671,6 +14734,9 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) - /* Clear this out for sanity. */ - tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0); - -+ /* Clear TG3PCI_REG_BASE_ADDR to prevent hangs. */ -+ tw32(TG3PCI_REG_BASE_ADDR, 0); -+ - pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE, - &pci_state_reg); - if ((pci_state_reg & PCISTATE_CONV_PCI_MODE) == 0 && -diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h -index 93865f8..6639a63 100644 ---- a/drivers/net/ethernet/broadcom/tg3.h -+++ b/drivers/net/ethernet/broadcom/tg3.h -@@ -1376,7 +1376,12 @@ - #define TG3_LSO_RD_DMA_CRPTEN_CTRL 0x00004910 - #define TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_BD_4K 0x00030000 - #define TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_LSO_4K 0x000c0000 --/* 0x4914 --> 0x4c00 unused */ -+#define TG3_LSO_RD_DMA_TX_LENGTH_WA_5719 0x02000000 -+#define TG3_LSO_RD_DMA_TX_LENGTH_WA_5720 0x00200000 -+/* 0x4914 --> 0x4be0 unused */ -+ -+#define TG3_NUM_RDMA_CHANNELS 4 -+#define TG3_RDMA_LENGTH 0x00004be0 - - /* Write DMA control registers */ - #define WDMAC_MODE 0x00004c00 -@@ -2484,7 +2489,11 @@ struct tg3_rx_buffer_desc { - #define RXD_ERR_TOO_SMALL 0x00400000 - #define RXD_ERR_NO_RESOURCES 0x00800000 - #define RXD_ERR_HUGE_FRAME 0x01000000 --#define RXD_ERR_MASK 0xffff0000 -+ -+#define RXD_ERR_MASK (RXD_ERR_BAD_CRC | RXD_ERR_COLLISION | \ -+ RXD_ERR_LINK_LOST | RXD_ERR_PHY_DECODE | \ -+ RXD_ERR_MAC_ABRT | RXD_ERR_TOO_SMALL | \ -+ RXD_ERR_NO_RESOURCES | RXD_ERR_HUGE_FRAME) - - u32 reserved; - u32 opaque; -@@ -2920,6 +2929,7 @@ enum TG3_FLAGS { - TG3_FLAG_L1PLLPD_EN, - TG3_FLAG_APE_HAS_NCSI, - TG3_FLAG_4K_FIFO_LIMIT, -+ TG3_FLAG_5719_5720_RDMA_BUG, - TG3_FLAG_RESET_TASK_PENDING, - TG3_FLAG_5705_PLUS, - TG3_FLAG_IS_5788, -diff --git a/drivers/net/ethernet/calxeda/xgmac.c b/drivers/net/ethernet/calxeda/xgmac.c -index 4ebbe6f..5699105 100644 ---- a/drivers/net/ethernet/calxeda/xgmac.c -+++ b/drivers/net/ethernet/calxeda/xgmac.c -@@ -1776,7 +1776,7 @@ static int xgmac_probe(struct platform_device *pdev) - if (device_can_wakeup(priv->device)) - priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */ - -- ndev->hw_features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA; -+ ndev->hw_features = NETIF_F_SG | NETIF_F_HIGHDMA; - if (readl(priv->base + XGMAC_DMA_HW_FEATURE) & DMA_HW_FEAT_TXCOESEL) - ndev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | - NETIF_F_RXCSUM; -diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c -index ef1f940..b2740f1 100644 ---- a/drivers/net/ethernet/emulex/benet/be_main.c -+++ b/drivers/net/ethernet/emulex/benet/be_main.c -@@ -2411,7 +2411,7 @@ static int be_open(struct net_device *netdev) - - for_all_evt_queues(adapter, eqo, i) { - napi_enable(&eqo->napi); -- be_eq_notify(adapter, eqo->q.id, true, false, 0); -+ be_eq_notify(adapter, eqo->q.id, true, true, 0); - } - - status = be_cmd_link_status_query(adapter, NULL, NULL, -diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c -index f4d2da0..8b3da6e 100644 ---- a/drivers/net/ethernet/ibm/ehea/ehea_main.c -+++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c -@@ -3029,7 +3029,7 @@ static struct ehea_port *ehea_setup_single_port(struct ehea_adapter *adapter, - - dev->hw_features = NETIF_F_SG | NETIF_F_TSO - | NETIF_F_IP_CSUM | NETIF_F_HW_VLAN_TX | NETIF_F_LRO; -- dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_TSO -+ dev->features = NETIF_F_SG | NETIF_F_TSO - | NETIF_F_HIGHDMA | NETIF_F_IP_CSUM | NETIF_F_HW_VLAN_TX - | NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER - | NETIF_F_RXCSUM; -diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c -index 33a1760..b2b715f 100644 ---- a/drivers/net/ethernet/ibm/ibmveth.c -+++ b/drivers/net/ethernet/ibm/ibmveth.c -@@ -293,6 +293,18 @@ static void ibmveth_replenish_buffer_pool(struct ibmveth_adapter *adapter, - atomic_add(buffers_added, &(pool->available)); - } - -+/* -+ * The final 8 bytes of the buffer list is a counter of frames dropped -+ * because there was not a buffer in the buffer list capable of holding -+ * the frame. -+ */ -+static void ibmveth_update_rx_no_buffer(struct ibmveth_adapter *adapter) -+{ -+ __be64 *p = adapter->buffer_list_addr + 4096 - 8; -+ -+ adapter->rx_no_buffer = be64_to_cpup(p); -+} -+ - /* replenish routine */ - static void ibmveth_replenish_task(struct ibmveth_adapter *adapter) - { -@@ -308,8 +320,7 @@ static void ibmveth_replenish_task(struct ibmveth_adapter *adapter) - ibmveth_replenish_buffer_pool(adapter, pool); - } - -- adapter->rx_no_buffer = *(u64 *)(((char*)adapter->buffer_list_addr) + -- 4096 - 8); -+ ibmveth_update_rx_no_buffer(adapter); - } - - /* empty and free ana buffer pool - also used to do cleanup in error paths */ -@@ -692,8 +703,7 @@ static int ibmveth_close(struct net_device *netdev) - - free_irq(netdev->irq, netdev); - -- adapter->rx_no_buffer = *(u64 *)(((char *)adapter->buffer_list_addr) + -- 4096 - 8); -+ ibmveth_update_rx_no_buffer(adapter); - - ibmveth_cleanup(adapter); - -diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h -index 1ab8067..21c058b 100644 ---- a/drivers/net/ethernet/intel/e1000e/e1000.h -+++ b/drivers/net/ethernet/intel/e1000e/e1000.h -@@ -309,6 +309,7 @@ struct e1000_adapter { - */ - struct e1000_ring *tx_ring /* One per active queue */ - ____cacheline_aligned_in_smp; -+ u32 tx_fifo_limit; - - struct napi_struct napi; - -diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c -index c80b4b4..e65f529 100644 ---- a/drivers/net/ethernet/intel/e1000e/netdev.c -+++ b/drivers/net/ethernet/intel/e1000e/netdev.c -@@ -3498,6 +3498,15 @@ void e1000e_reset(struct e1000_adapter *adapter) - } - - /* -+ * Alignment of Tx data is on an arbitrary byte boundary with the -+ * maximum size per Tx descriptor limited only to the transmit -+ * allocation of the packet buffer minus 96 bytes with an upper -+ * limit of 24KB due to receive synchronization limitations. -+ */ -+ adapter->tx_fifo_limit = min_t(u32, ((er32(PBA) >> 16) << 10) - 96, -+ 24 << 10); -+ -+ /* - * Disable Adaptive Interrupt Moderation if 2 full packets cannot - * fit in receive buffer. - */ -@@ -4766,12 +4775,9 @@ static bool e1000_tx_csum(struct e1000_ring *tx_ring, struct sk_buff *skb) - return 1; - } - --#define E1000_MAX_PER_TXD 8192 --#define E1000_MAX_TXD_PWR 12 -- - static int e1000_tx_map(struct e1000_ring *tx_ring, struct sk_buff *skb, - unsigned int first, unsigned int max_per_txd, -- unsigned int nr_frags, unsigned int mss) -+ unsigned int nr_frags) - { - struct e1000_adapter *adapter = tx_ring->adapter; - struct pci_dev *pdev = adapter->pdev; -@@ -5004,20 +5010,19 @@ static int __e1000_maybe_stop_tx(struct e1000_ring *tx_ring, int size) - - static int e1000_maybe_stop_tx(struct e1000_ring *tx_ring, int size) - { -+ BUG_ON(size > tx_ring->count); -+ - if (e1000_desc_unused(tx_ring) >= size) - return 0; - return __e1000_maybe_stop_tx(tx_ring, size); - } - --#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1) - static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, - struct net_device *netdev) - { - struct e1000_adapter *adapter = netdev_priv(netdev); - struct e1000_ring *tx_ring = adapter->tx_ring; - unsigned int first; -- unsigned int max_per_txd = E1000_MAX_PER_TXD; -- unsigned int max_txd_pwr = E1000_MAX_TXD_PWR; - unsigned int tx_flags = 0; - unsigned int len = skb_headlen(skb); - unsigned int nr_frags; -@@ -5037,18 +5042,8 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, - } - - mss = skb_shinfo(skb)->gso_size; -- /* -- * The controller does a simple calculation to -- * make sure there is enough room in the FIFO before -- * initiating the DMA for each buffer. The calc is: -- * 4 = ceil(buffer len/mss). To make sure we don't -- * overrun the FIFO, adjust the max buffer len if mss -- * drops. -- */ - if (mss) { - u8 hdr_len; -- max_per_txd = min(mss << 2, max_per_txd); -- max_txd_pwr = fls(max_per_txd) - 1; - - /* - * TSO Workaround for 82571/2/3 Controllers -- if skb->data -@@ -5078,12 +5073,12 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, - count++; - count++; - -- count += TXD_USE_COUNT(len, max_txd_pwr); -+ count += DIV_ROUND_UP(len, adapter->tx_fifo_limit); - - nr_frags = skb_shinfo(skb)->nr_frags; - for (f = 0; f < nr_frags; f++) -- count += TXD_USE_COUNT(skb_frag_size(&skb_shinfo(skb)->frags[f]), -- max_txd_pwr); -+ count += DIV_ROUND_UP(skb_frag_size(&skb_shinfo(skb)->frags[f]), -+ adapter->tx_fifo_limit); - - if (adapter->hw.mac.tx_pkt_filtering) - e1000_transfer_dhcp_info(adapter, skb); -@@ -5125,13 +5120,16 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, - tx_flags |= E1000_TX_FLAGS_NO_FCS; - - /* if count is 0 then mapping error has occurred */ -- count = e1000_tx_map(tx_ring, skb, first, max_per_txd, nr_frags, mss); -+ count = e1000_tx_map(tx_ring, skb, first, adapter->tx_fifo_limit, -+ nr_frags); - if (count) { - netdev_sent_queue(netdev, skb->len); - e1000_tx_queue(tx_ring, tx_flags, count); - /* Make sure there is space in the ring for the next send. */ -- e1000_maybe_stop_tx(tx_ring, MAX_SKB_FRAGS + 2); -- -+ e1000_maybe_stop_tx(tx_ring, -+ (MAX_SKB_FRAGS * -+ DIV_ROUND_UP(PAGE_SIZE, -+ adapter->tx_fifo_limit) + 2)); - } else { - dev_kfree_skb_any(skb); - tx_ring->buffer_info[first].time_stamp = 0; -@@ -6303,8 +6301,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev, - adapter->hw.phy.autoneg_advertised = 0x2f; - - /* ring size defaults */ -- adapter->rx_ring->count = 256; -- adapter->tx_ring->count = 256; -+ adapter->rx_ring->count = E1000_DEFAULT_RXD; -+ adapter->tx_ring->count = E1000_DEFAULT_TXD; - - /* - * Initial Wake on LAN setting - If APM wake is enabled in -diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c -index 8f95545..8611409 100644 ---- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c -+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c -@@ -7464,12 +7464,15 @@ static int __init ixgbe_init_module(void) - pr_info("%s - version %s\n", ixgbe_driver_string, ixgbe_driver_version); - pr_info("%s\n", ixgbe_copyright); - -+ ret = pci_register_driver(&ixgbe_driver); -+ if (ret) -+ return ret; -+ - #ifdef CONFIG_IXGBE_DCA - dca_register_notify(&dca_notifier); - #endif - -- ret = pci_register_driver(&ixgbe_driver); -- return ret; -+ return 0; - } - - module_init(ixgbe_init_module); -diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c -index 307611a..d8e4562 100644 ---- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c -+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c -@@ -969,8 +969,6 @@ static irqreturn_t ixgbevf_msix_clean_tx(int irq, void *data) - r_idx = find_first_bit(q_vector->txr_idx, adapter->num_tx_queues); - for (i = 0; i < q_vector->txr_count; i++) { - tx_ring = &(adapter->tx_ring[r_idx]); -- tx_ring->total_bytes = 0; -- tx_ring->total_packets = 0; - ixgbevf_clean_tx_irq(adapter, tx_ring); - r_idx = find_next_bit(q_vector->txr_idx, adapter->num_tx_queues, - r_idx + 1); -@@ -994,16 +992,6 @@ static irqreturn_t ixgbevf_msix_clean_rx(int irq, void *data) - struct ixgbe_hw *hw = &adapter->hw; - struct ixgbevf_ring *rx_ring; - int r_idx; -- int i; -- -- r_idx = find_first_bit(q_vector->rxr_idx, adapter->num_rx_queues); -- for (i = 0; i < q_vector->rxr_count; i++) { -- rx_ring = &(adapter->rx_ring[r_idx]); -- rx_ring->total_bytes = 0; -- rx_ring->total_packets = 0; -- r_idx = find_next_bit(q_vector->rxr_idx, adapter->num_rx_queues, -- r_idx + 1); -- } - - if (!q_vector->rxr_count) - return IRQ_HANDLED; -diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c -index 5e1ca0f..ffa6a72 100644 ---- a/drivers/net/ethernet/marvell/mv643xx_eth.c -+++ b/drivers/net/ethernet/marvell/mv643xx_eth.c -@@ -1274,15 +1274,13 @@ static void mib_counters_update(struct mv643xx_eth_private *mp) - p->rx_discard += rdlp(mp, RX_DISCARD_FRAME_CNT); - p->rx_overrun += rdlp(mp, RX_OVERRUN_FRAME_CNT); - spin_unlock_bh(&mp->mib_counters_lock); -- -- mod_timer(&mp->mib_counters_timer, jiffies + 30 * HZ); - } - - static void mib_counters_timer_wrapper(unsigned long _mp) - { - struct mv643xx_eth_private *mp = (void *)_mp; -- - mib_counters_update(mp); -+ mod_timer(&mp->mib_counters_timer, jiffies + 30 * HZ); - } - - -@@ -2370,6 +2368,7 @@ static int mv643xx_eth_open(struct net_device *dev) - mp->int_mask |= INT_TX_END_0 << i; - } - -+ add_timer(&mp->mib_counters_timer); - port_start(mp); - - wrlp(mp, INT_MASK_EXT, INT_EXT_LINK_PHY | INT_EXT_TX); -@@ -2911,7 +2910,6 @@ static int mv643xx_eth_probe(struct platform_device *pdev) - mp->mib_counters_timer.data = (unsigned long)mp; - mp->mib_counters_timer.function = mib_counters_timer_wrapper; - mp->mib_counters_timer.expires = jiffies + 30 * HZ; -- add_timer(&mp->mib_counters_timer); - - spin_lock_init(&mp->mib_counters_lock); - -diff --git a/drivers/net/ethernet/mellanox/mlx4/en_cq.c b/drivers/net/ethernet/mellanox/mlx4/en_cq.c -index 00b8127..174b622 100644 ---- a/drivers/net/ethernet/mellanox/mlx4/en_cq.c -+++ b/drivers/net/ethernet/mellanox/mlx4/en_cq.c -@@ -55,7 +55,6 @@ int mlx4_en_create_cq(struct mlx4_en_priv *priv, - - cq->ring = ring; - cq->is_tx = mode; -- spin_lock_init(&cq->lock); - - err = mlx4_alloc_hwq_res(mdev->dev, &cq->wqres, - cq->buf_size, 2 * PAGE_SIZE); -diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c -index 31b455a..467a511 100644 ---- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c -+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c -@@ -370,15 +370,11 @@ static void mlx4_en_netpoll(struct net_device *dev) - { - struct mlx4_en_priv *priv = netdev_priv(dev); - struct mlx4_en_cq *cq; -- unsigned long flags; - int i; - - for (i = 0; i < priv->rx_ring_num; i++) { - cq = &priv->rx_cq[i]; -- spin_lock_irqsave(&cq->lock, flags); -- napi_synchronize(&cq->napi); -- mlx4_en_process_rx_cq(dev, cq, 0); -- spin_unlock_irqrestore(&cq->lock, flags); -+ napi_schedule(&cq->napi); - } - } - #endif -diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c -index 1995cb0..6e49bb4 100644 ---- a/drivers/net/ethernet/mellanox/mlx4/main.c -+++ b/drivers/net/ethernet/mellanox/mlx4/main.c -@@ -92,8 +92,6 @@ MODULE_PARM_DESC(log_num_mgm_entry_size, "log mgm size, that defines the num" - " 10 gives 248.range: 9<=" - " log_num_mgm_entry_size <= 12"); - --#define MLX4_VF (1 << 0) -- - #define HCA_GLOBAL_CAP_MASK 0 - #define PF_CONTEXT_BEHAVIOUR_MASK 0 - -@@ -1731,7 +1729,7 @@ static void mlx4_free_ownership(struct mlx4_dev *dev) - iounmap(owner); - } - --static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) -+static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data) - { - struct mlx4_priv *priv; - struct mlx4_dev *dev; -@@ -1754,12 +1752,11 @@ static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) - /* - * Check for BARs. - */ -- if (((id == NULL) || !(id->driver_data & MLX4_VF)) && -+ if (!(pci_dev_data & MLX4_PCI_DEV_IS_VF) && - !(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { - dev_err(&pdev->dev, "Missing DCS, aborting." -- "(id == 0X%p, id->driver_data: 0x%lx," -- " pci_resource_flags(pdev, 0):0x%lx)\n", id, -- id ? id->driver_data : 0, pci_resource_flags(pdev, 0)); -+ "(driver_data: 0x%x, pci_resource_flags(pdev, 0):0x%lx)\n", -+ pci_dev_data, pci_resource_flags(pdev, 0)); - err = -ENODEV; - goto err_disable_pdev; - } -@@ -1801,15 +1798,8 @@ static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) - /* Allow large DMA segments, up to the firmware limit of 1 GB */ - dma_set_max_seg_size(&pdev->dev, 1024 * 1024 * 1024); - -- priv = kzalloc(sizeof *priv, GFP_KERNEL); -- if (!priv) { -- dev_err(&pdev->dev, "Device struct alloc failed, " -- "aborting.\n"); -- err = -ENOMEM; -- goto err_release_regions; -- } -- -- dev = &priv->dev; -+ dev = pci_get_drvdata(pdev); -+ priv = mlx4_priv(dev); - dev->pdev = pdev; - INIT_LIST_HEAD(&priv->ctx_list); - spin_lock_init(&priv->ctx_lock); -@@ -1824,7 +1814,7 @@ static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) - - dev->rev_id = pdev->revision; - /* Detect if this device is a virtual function */ -- if (id && id->driver_data & MLX4_VF) { -+ if (pci_dev_data & MLX4_PCI_DEV_IS_VF) { - /* When acting as pf, we normally skip vfs unless explicitly - * requested to probe them. */ - if (num_vfs && extended_func_num(pdev) > probe_vf) { -@@ -1970,7 +1960,7 @@ static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) - mlx4_sense_init(dev); - mlx4_start_sense(dev); - -- pci_set_drvdata(pdev, dev); -+ priv->removed = 0; - - return 0; - -@@ -2037,79 +2027,111 @@ static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) - static int __devinit mlx4_init_one(struct pci_dev *pdev, - const struct pci_device_id *id) - { -+ struct mlx4_priv *priv; -+ struct mlx4_dev *dev; -+ - printk_once(KERN_INFO "%s", mlx4_version); - -- return __mlx4_init_one(pdev, id); -+ priv = kzalloc(sizeof(*priv), GFP_KERNEL); -+ if (!priv) -+ return -ENOMEM; -+ -+ dev = &priv->dev; -+ pci_set_drvdata(pdev, dev); -+ priv->pci_dev_data = id->driver_data; -+ -+ return __mlx4_init_one(pdev, id->driver_data); - } - --static void mlx4_remove_one(struct pci_dev *pdev) -+static void __mlx4_remove_one(struct pci_dev *pdev) - { - struct mlx4_dev *dev = pci_get_drvdata(pdev); - struct mlx4_priv *priv = mlx4_priv(dev); -+ int pci_dev_data; - int p; - -- if (dev) { -- /* in SRIOV it is not allowed to unload the pf's -- * driver while there are alive vf's */ -- if (mlx4_is_master(dev)) { -- if (mlx4_how_many_lives_vf(dev)) -- printk(KERN_ERR "Removing PF when there are assigned VF's !!!\n"); -- } -- mlx4_stop_sense(dev); -- mlx4_unregister_device(dev); -+ if (priv->removed) -+ return; - -- for (p = 1; p <= dev->caps.num_ports; p++) { -- mlx4_cleanup_port_info(&priv->port[p]); -- mlx4_CLOSE_PORT(dev, p); -- } -+ pci_dev_data = priv->pci_dev_data; - -- mlx4_cleanup_counters_table(dev); -- mlx4_cleanup_mcg_table(dev); -- mlx4_cleanup_qp_table(dev); -- mlx4_cleanup_srq_table(dev); -- mlx4_cleanup_cq_table(dev); -- mlx4_cmd_use_polling(dev); -- mlx4_cleanup_eq_table(dev); -- mlx4_cleanup_mr_table(dev); -- mlx4_cleanup_xrcd_table(dev); -- mlx4_cleanup_pd_table(dev); -+ /* in SRIOV it is not allowed to unload the pf's -+ * driver while there are alive vf's */ -+ if (mlx4_is_master(dev)) { -+ if (mlx4_how_many_lives_vf(dev)) -+ printk(KERN_ERR "Removing PF when there are assigned VF's !!!\n"); -+ } -+ mlx4_stop_sense(dev); -+ mlx4_unregister_device(dev); - -- if (mlx4_is_master(dev)) -- mlx4_free_resource_tracker(dev); -- -- iounmap(priv->kar); -- mlx4_uar_free(dev, &priv->driver_uar); -- mlx4_cleanup_uar_table(dev); -- if (!mlx4_is_slave(dev)) -- mlx4_clear_steering(dev); -- mlx4_free_eq_table(dev); -- if (mlx4_is_master(dev)) -- mlx4_multi_func_cleanup(dev); -- mlx4_close_hca(dev); -- if (mlx4_is_slave(dev)) -- mlx4_multi_func_cleanup(dev); -- mlx4_cmd_cleanup(dev); -- -- if (dev->flags & MLX4_FLAG_MSI_X) -- pci_disable_msix(pdev); -- if (num_vfs && (dev->flags & MLX4_FLAG_SRIOV)) { -- mlx4_warn(dev, "Disabling sriov\n"); -- pci_disable_sriov(pdev); -- } -+ for (p = 1; p <= dev->caps.num_ports; p++) { -+ mlx4_cleanup_port_info(&priv->port[p]); -+ mlx4_CLOSE_PORT(dev, p); -+ } -+ -+ mlx4_cleanup_counters_table(dev); -+ mlx4_cleanup_mcg_table(dev); -+ mlx4_cleanup_qp_table(dev); -+ mlx4_cleanup_srq_table(dev); -+ mlx4_cleanup_cq_table(dev); -+ mlx4_cmd_use_polling(dev); -+ mlx4_cleanup_eq_table(dev); -+ mlx4_cleanup_mr_table(dev); -+ mlx4_cleanup_xrcd_table(dev); -+ mlx4_cleanup_pd_table(dev); -+ -+ if (mlx4_is_master(dev)) -+ mlx4_free_resource_tracker(dev); -+ -+ iounmap(priv->kar); -+ mlx4_uar_free(dev, &priv->driver_uar); -+ mlx4_cleanup_uar_table(dev); -+ if (!mlx4_is_slave(dev)) -+ mlx4_clear_steering(dev); -+ mlx4_free_eq_table(dev); -+ if (mlx4_is_master(dev)) -+ mlx4_multi_func_cleanup(dev); -+ mlx4_close_hca(dev); -+ if (mlx4_is_slave(dev)) -+ mlx4_multi_func_cleanup(dev); -+ mlx4_cmd_cleanup(dev); - -- if (!mlx4_is_slave(dev)) -- mlx4_free_ownership(dev); -- kfree(priv); -- pci_release_regions(pdev); -- pci_disable_device(pdev); -- pci_set_drvdata(pdev, NULL); -+ if (dev->flags & MLX4_FLAG_MSI_X) -+ pci_disable_msix(pdev); -+ if (num_vfs && (dev->flags & MLX4_FLAG_SRIOV)) { -+ mlx4_warn(dev, "Disabling sriov\n"); -+ pci_disable_sriov(pdev); - } -+ -+ if (!mlx4_is_slave(dev)) -+ mlx4_free_ownership(dev); -+ -+ pci_release_regions(pdev); -+ pci_disable_device(pdev); -+ memset(priv, 0, sizeof(*priv)); -+ priv->pci_dev_data = pci_dev_data; -+ priv->removed = 1; -+} -+ -+static void mlx4_remove_one(struct pci_dev *pdev) -+{ -+ struct mlx4_dev *dev = pci_get_drvdata(pdev); -+ struct mlx4_priv *priv = mlx4_priv(dev); -+ -+ __mlx4_remove_one(pdev); -+ kfree(priv); -+ pci_set_drvdata(pdev, NULL); - } - - int mlx4_restart_one(struct pci_dev *pdev) - { -- mlx4_remove_one(pdev); -- return __mlx4_init_one(pdev, NULL); -+ struct mlx4_dev *dev = pci_get_drvdata(pdev); -+ struct mlx4_priv *priv = mlx4_priv(dev); -+ int pci_dev_data; -+ -+ pci_dev_data = priv->pci_dev_data; -+ __mlx4_remove_one(pdev); -+ return __mlx4_init_one(pdev, pci_dev_data); - } - - static DEFINE_PCI_DEVICE_TABLE(mlx4_pci_table) = { -@@ -2138,11 +2160,11 @@ static DEFINE_PCI_DEVICE_TABLE(mlx4_pci_table) = { - /* MT26478 ConnectX2 40GigE PCIe gen2 */ - { PCI_VDEVICE(MELLANOX, 0x676e), 0 }, - /* MT25400 Family [ConnectX-2 Virtual Function] */ -- { PCI_VDEVICE(MELLANOX, 0x1002), MLX4_VF }, -+ { PCI_VDEVICE(MELLANOX, 0x1002), MLX4_PCI_DEV_IS_VF }, - /* MT27500 Family [ConnectX-3] */ - { PCI_VDEVICE(MELLANOX, 0x1003), 0 }, - /* MT27500 Family [ConnectX-3 Virtual Function] */ -- { PCI_VDEVICE(MELLANOX, 0x1004), MLX4_VF }, -+ { PCI_VDEVICE(MELLANOX, 0x1004), MLX4_PCI_DEV_IS_VF }, - { PCI_VDEVICE(MELLANOX, 0x1005), 0 }, /* MT27510 Family */ - { PCI_VDEVICE(MELLANOX, 0x1006), 0 }, /* MT27511 Family */ - { PCI_VDEVICE(MELLANOX, 0x1007), 0 }, /* MT27520 Family */ -diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h -index 2a0ff2c..a3ef1df 100644 ---- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h -+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h -@@ -711,6 +711,10 @@ struct mlx4_steer { - struct list_head steer_entries[MLX4_NUM_STEERS]; - }; - -+enum { -+ MLX4_PCI_DEV_IS_VF = 1 << 0, -+}; -+ - struct mlx4_priv { - struct mlx4_dev dev; - -@@ -718,6 +722,9 @@ struct mlx4_priv { - struct list_head ctx_list; - spinlock_t ctx_lock; - -+ int pci_dev_data; -+ int removed; -+ - struct list_head pgdir_list; - struct mutex pgdir_mutex; - -diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h -index d69fee4..8df3c4b 100644 ---- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h -+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h -@@ -301,7 +301,6 @@ struct mlx4_en_cq { - struct mlx4_cq mcq; - struct mlx4_hwq_resources wqres; - int ring; -- spinlock_t lock; - struct net_device *dev; - struct napi_struct napi; - /* Per-core Tx cq processing support */ -diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c -index 1b44047..effb3b7 100644 ---- a/drivers/net/ethernet/realtek/8139cp.c -+++ b/drivers/net/ethernet/realtek/8139cp.c -@@ -1232,6 +1232,7 @@ static void cp_tx_timeout(struct net_device *dev) - cp_clean_rings(cp); - rc = cp_init_rings(cp); - cp_start_hw(cp); -+ cp_enable_irq(cp); - - netif_wake_queue(dev); - -diff --git a/drivers/net/ethernet/sun/sunvnet.c b/drivers/net/ethernet/sun/sunvnet.c -index 8e2ac64..ed6ec51 100644 ---- a/drivers/net/ethernet/sun/sunvnet.c -+++ b/drivers/net/ethernet/sun/sunvnet.c -@@ -1086,6 +1086,24 @@ static struct vnet * __devinit vnet_find_or_create(const u64 *local_mac) - return vp; - } - -+static void vnet_cleanup(void) -+{ -+ struct vnet *vp; -+ struct net_device *dev; -+ -+ mutex_lock(&vnet_list_mutex); -+ while (!list_empty(&vnet_list)) { -+ vp = list_first_entry(&vnet_list, struct vnet, list); -+ list_del(&vp->list); -+ dev = vp->dev; -+ /* vio_unregister_driver() should have cleaned up port_list */ -+ BUG_ON(!list_empty(&vp->port_list)); -+ unregister_netdev(dev); -+ free_netdev(dev); -+ } -+ mutex_unlock(&vnet_list_mutex); -+} -+ - static const char *local_mac_prop = "local-mac-address"; - - static struct vnet * __devinit vnet_find_parent(struct mdesc_handle *hp, -@@ -1244,7 +1262,6 @@ static int vnet_port_remove(struct vio_dev *vdev) - - kfree(port); - -- unregister_netdev(vp->dev); - } - return 0; - } -@@ -1272,6 +1289,7 @@ static int __init vnet_init(void) - static void __exit vnet_exit(void) - { - vio_unregister_driver(&vnet_port_driver); -+ vnet_cleanup(); - } - - module_init(vnet_init); -diff --git a/drivers/net/ethernet/tehuti/tehuti.c b/drivers/net/ethernet/tehuti/tehuti.c -index ad973ff..32f0bcd 100644 ---- a/drivers/net/ethernet/tehuti/tehuti.c -+++ b/drivers/net/ethernet/tehuti/tehuti.c -@@ -1995,7 +1995,6 @@ bdx_probe(struct pci_dev *pdev, const struct pci_device_id *ent) - ndev->features = NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_TSO - | NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX | - NETIF_F_HW_VLAN_FILTER | NETIF_F_RXCSUM -- /*| NETIF_F_FRAGLIST */ - ; - ndev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG | - NETIF_F_TSO | NETIF_F_HW_VLAN_TX; -diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c -index 43fada5..c336d36 100644 ---- a/drivers/net/ethernet/ti/davinci_emac.c -+++ b/drivers/net/ethernet/ti/davinci_emac.c -@@ -875,8 +875,7 @@ static void emac_dev_mcast_set(struct net_device *ndev) - netdev_mc_count(ndev) > EMAC_DEF_MAX_MULTICAST_ADDRESSES) { - mbp_enable = (mbp_enable | EMAC_MBP_RXMCAST); - emac_add_mcast(priv, EMAC_ALL_MULTI_SET, NULL); -- } -- if (!netdev_mc_empty(ndev)) { -+ } else if (!netdev_mc_empty(ndev)) { - struct netdev_hw_addr *ha; - - mbp_enable = (mbp_enable | EMAC_MBP_RXMCAST); -diff --git a/drivers/net/ethernet/via/via-rhine.c b/drivers/net/ethernet/via/via-rhine.c -index 5fa0880..60f4a51 100644 ---- a/drivers/net/ethernet/via/via-rhine.c -+++ b/drivers/net/ethernet/via/via-rhine.c -@@ -1601,6 +1601,7 @@ static void rhine_reset_task(struct work_struct *work) - goto out_unlock; - - napi_disable(&rp->napi); -+ netif_tx_disable(dev); - spin_lock_bh(&rp->lock); - - /* clear all descriptors */ -diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c -index 5e5b791..d240c06 100644 ---- a/drivers/net/ethernet/xilinx/ll_temac_main.c -+++ b/drivers/net/ethernet/xilinx/ll_temac_main.c -@@ -1026,7 +1026,7 @@ static int __devinit temac_of_probe(struct platform_device *op) - dev_set_drvdata(&op->dev, ndev); - SET_NETDEV_DEV(ndev, &op->dev); - ndev->flags &= ~IFF_MULTICAST; /* clear multicast */ -- ndev->features = NETIF_F_SG | NETIF_F_FRAGLIST; -+ ndev->features = NETIF_F_SG; - ndev->netdev_ops = &temac_netdev_ops; - ndev->ethtool_ops = &temac_ethtool_ops; - #if 0 -diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c -index 9c365e1..fde716d 100644 ---- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c -+++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c -@@ -1494,7 +1494,7 @@ static int __devinit axienet_of_probe(struct platform_device *op) - - SET_NETDEV_DEV(ndev, &op->dev); - ndev->flags &= ~IFF_MULTICAST; /* clear multicast */ -- ndev->features = NETIF_F_SG | NETIF_F_FRAGLIST; -+ ndev->features = NETIF_F_SG; - ndev->netdev_ops = &axienet_netdev_ops; - ndev->ethtool_ops = &axienet_ethtool_ops; - -diff --git a/drivers/net/hamradio/hdlcdrv.c b/drivers/net/hamradio/hdlcdrv.c -index a4a3516..3b3a7e0 100644 ---- a/drivers/net/hamradio/hdlcdrv.c -+++ b/drivers/net/hamradio/hdlcdrv.c -@@ -571,6 +571,8 @@ static int hdlcdrv_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) - case HDLCDRVCTL_CALIBRATE: - if(!capable(CAP_SYS_RAWIO)) - return -EPERM; -+ if (bi.data.calibrate > INT_MAX / s->par.bitrate) -+ return -EINVAL; - s->hdlctx.calibrate = bi.data.calibrate * s->par.bitrate / 16; - return 0; - -diff --git a/drivers/net/hamradio/yam.c b/drivers/net/hamradio/yam.c -index 5a6412e..d8faeb6 100644 ---- a/drivers/net/hamradio/yam.c -+++ b/drivers/net/hamradio/yam.c -@@ -1058,6 +1058,7 @@ static int yam_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) - break; - - case SIOCYAMGCFG: -+ memset(&yi, 0, sizeof(yi)); - yi.cfg.mask = 0xffffffff; - yi.cfg.iobase = yp->iobase; - yi.cfg.irq = yp->irq; -diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c -index 2d59138..a6ed382 100644 ---- a/drivers/net/hyperv/netvsc_drv.c -+++ b/drivers/net/hyperv/netvsc_drv.c -@@ -321,7 +321,6 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu) - return -EINVAL; - - nvdev->start_remove = true; -- cancel_delayed_work_sync(&ndevctx->dwork); - cancel_work_sync(&ndevctx->work); - netif_tx_disable(ndev); - rndis_filter_device_remove(hdev); -diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c -index 7160523..6749acf 100644 ---- a/drivers/net/macvlan.c -+++ b/drivers/net/macvlan.c -@@ -237,11 +237,9 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev) - const struct macvlan_dev *vlan = netdev_priv(dev); - const struct macvlan_port *port = vlan->port; - const struct macvlan_dev *dest; -- __u8 ip_summed = skb->ip_summed; - - if (vlan->mode == MACVLAN_MODE_BRIDGE) { - const struct ethhdr *eth = (void *)skb->data; -- skb->ip_summed = CHECKSUM_UNNECESSARY; - - /* send to other bridge ports directly */ - if (is_multicast_ether_addr(eth->h_dest)) { -@@ -259,7 +257,6 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev) - } - - xmit_world: -- skb->ip_summed = ip_summed; - skb->dev = vlan->lowerdev; - return dev_queue_xmit(skb); - } -@@ -458,6 +455,7 @@ static int macvlan_init(struct net_device *dev) - (lowerdev->state & MACVLAN_STATE_MASK); - dev->features = lowerdev->features & MACVLAN_FEATURES; - dev->features |= NETIF_F_LLTX; -+ dev->vlan_features = lowerdev->vlan_features & MACVLAN_FEATURES; - dev->gso_max_size = lowerdev->gso_max_size; - dev->iflink = lowerdev->ifindex; - dev->hard_header_len = lowerdev->hard_header_len; -diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c -index 77ce8b2..f5b9de4 100644 ---- a/drivers/net/macvtap.c -+++ b/drivers/net/macvtap.c -@@ -797,11 +797,10 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q, - const struct sk_buff *skb, - const struct iovec *iv, int len) - { -- struct macvlan_dev *vlan; - int ret; - int vnet_hdr_len = 0; - int vlan_offset = 0; -- int copied; -+ int copied, total; - - if (q->flags & IFF_VNET_HDR) { - struct virtio_net_hdr vnet_hdr; -@@ -816,7 +815,8 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q, - if (memcpy_toiovecend(iv, (void *)&vnet_hdr, 0, sizeof(vnet_hdr))) - return -EFAULT; - } -- copied = vnet_hdr_len; -+ total = copied = vnet_hdr_len; -+ total += skb->len; - - if (!vlan_tx_tag_present(skb)) - len = min_t(int, skb->len, len); -@@ -831,6 +831,7 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q, - - vlan_offset = offsetof(struct vlan_ethhdr, h_vlan_proto); - len = min_t(int, skb->len + VLAN_HLEN, len); -+ total += VLAN_HLEN; - - copy = min_t(int, vlan_offset, len); - ret = skb_copy_datagram_const_iovec(skb, 0, iv, copied, copy); -@@ -848,16 +849,9 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q, - } - - ret = skb_copy_datagram_const_iovec(skb, vlan_offset, iv, copied, len); -- copied += len; - - done: -- rcu_read_lock_bh(); -- vlan = rcu_dereference_bh(q->vlan); -- if (vlan) -- macvlan_count_rx(vlan, copied - vnet_hdr_len, ret == 0, 0); -- rcu_read_unlock_bh(); -- -- return ret ? ret : copied; -+ return ret ? ret : total; - } - - static ssize_t macvtap_do_read(struct macvtap_queue *q, struct kiocb *iocb, -@@ -911,7 +905,9 @@ static ssize_t macvtap_aio_read(struct kiocb *iocb, const struct iovec *iv, - } - - ret = macvtap_do_read(q, iocb, iv, len, file->f_flags & O_NONBLOCK); -- ret = min_t(ssize_t, ret, len); /* XXX copied from tun.c. Why? */ -+ ret = min_t(ssize_t, ret, len); -+ if (ret > 0) -+ iocb->ki_pos = ret; - out: - return ret; - } -diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c -index 2e0d876..fbe75a7 100644 ---- a/drivers/net/ppp/pppoe.c -+++ b/drivers/net/ppp/pppoe.c -@@ -681,7 +681,7 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr, - po->chan.hdrlen = (sizeof(struct pppoe_hdr) + - dev->hard_header_len); - -- po->chan.mtu = dev->mtu - sizeof(struct pppoe_hdr); -+ po->chan.mtu = dev->mtu - sizeof(struct pppoe_hdr) - 2; - po->chan.private = sk; - po->chan.ops = &pppoe_chan_ops; - -@@ -985,8 +985,6 @@ static int pppoe_recvmsg(struct kiocb *iocb, struct socket *sock, - if (error < 0) - goto end; - -- m->msg_namelen = 0; -- - if (skb) { - total_len = min_t(size_t, total_len, skb->len); - error = skb_copy_datagram_iovec(skb, 0, m->msg_iov, total_len); -diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c -index 8f81805..d16800f 100644 ---- a/drivers/net/team/team.c -+++ b/drivers/net/team/team.c -@@ -889,6 +889,7 @@ static int team_change_mtu(struct net_device *dev, int new_mtu) - * to traverse list in reverse under rcu_read_lock - */ - mutex_lock(&team->lock); -+ team->port_mtu_change_allowed = true; - list_for_each_entry(port, &team->port_list, list) { - err = dev_set_mtu(port->dev, new_mtu); - if (err) { -@@ -897,6 +898,7 @@ static int team_change_mtu(struct net_device *dev, int new_mtu) - goto unwind; - } - } -+ team->port_mtu_change_allowed = false; - mutex_unlock(&team->lock); - - dev->mtu = new_mtu; -@@ -906,6 +908,7 @@ static int team_change_mtu(struct net_device *dev, int new_mtu) - unwind: - list_for_each_entry_continue_reverse(port, &team->port_list, list) - dev_set_mtu(port->dev, dev->mtu); -+ team->port_mtu_change_allowed = false; - mutex_unlock(&team->lock); - - return err; -@@ -1671,7 +1674,9 @@ static int team_device_event(struct notifier_block *unused, - break; - case NETDEV_CHANGEMTU: - /* Forbid to change mtu of underlaying device */ -- return NOTIFY_BAD; -+ if (!port->team->port_mtu_change_allowed) -+ return NOTIFY_BAD; -+ break; - case NETDEV_PRE_TYPE_CHANGE: - /* Forbid to change type of underlaying device */ - return NOTIFY_BAD; -diff --git a/drivers/net/tun.c b/drivers/net/tun.c -index b463b84..19e451b 100644 ---- a/drivers/net/tun.c -+++ b/drivers/net/tun.c -@@ -903,6 +903,8 @@ static ssize_t tun_chr_aio_read(struct kiocb *iocb, const struct iovec *iv, - - ret = tun_do_read(tun, iocb, iv, len, file->f_flags & O_NONBLOCK); - ret = min_t(ssize_t, ret, len); -+ if (ret > 0) -+ iocb->ki_pos = ret; - out: - tun_put(tun); - return ret; -diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c -index ef84a58..e3e0ca1 100644 ---- a/drivers/net/usb/asix.c -+++ b/drivers/net/usb/asix.c -@@ -183,6 +183,17 @@ struct ax88172_int_data { - __le16 res3; - } __packed; - -+struct asix_rx_fixup_info { -+ struct sk_buff *ax_skb; -+ u32 header; -+ u16 size; -+ bool split_head; -+}; -+ -+struct asix_common_private { -+ struct asix_rx_fixup_info rx_fixup_info; -+}; -+ - static int asix_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, - u16 size, void *data) - { -@@ -304,49 +315,89 @@ asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, - } - } - --static int asix_rx_fixup(struct usbnet *dev, struct sk_buff *skb) -+static int asix_rx_fixup_internal(struct usbnet *dev, struct sk_buff *skb, -+ struct asix_rx_fixup_info *rx) - { - int offset = 0; - -- while (offset + sizeof(u32) < skb->len) { -- struct sk_buff *ax_skb; -- u16 size; -- u32 header = get_unaligned_le32(skb->data + offset); -- -- offset += sizeof(u32); -- -- /* get the packet length */ -- size = (u16) (header & 0x7ff); -- if (size != ((~header >> 16) & 0x07ff)) { -- netdev_err(dev->net, "asix_rx_fixup() Bad Header Length\n"); -- return 0; -+ while (offset + sizeof(u16) <= skb->len) { -+ u16 remaining = 0; -+ unsigned char *data; -+ -+ if (!rx->size) { -+ if ((skb->len - offset == sizeof(u16)) || -+ rx->split_head) { -+ if (!rx->split_head) { -+ rx->header = get_unaligned_le16( -+ skb->data + offset); -+ rx->split_head = true; -+ offset += sizeof(u16); -+ break; -+ } else { -+ rx->header |= (get_unaligned_le16( -+ skb->data + offset) -+ << 16); -+ rx->split_head = false; -+ offset += sizeof(u16); -+ } -+ } else { -+ rx->header = get_unaligned_le32(skb->data + -+ offset); -+ offset += sizeof(u32); -+ } -+ -+ /* get the packet length */ -+ rx->size = (u16) (rx->header & 0x7ff); -+ if (rx->size != ((~rx->header >> 16) & 0x7ff)) { -+ netdev_err(dev->net, "asix_rx_fixup() Bad Header Length 0x%x, offset %d\n", -+ rx->header, offset); -+ rx->size = 0; -+ return 0; -+ } -+ rx->ax_skb = netdev_alloc_skb_ip_align(dev->net, -+ rx->size); -+ if (!rx->ax_skb) -+ return 0; - } - -- if ((size > dev->net->mtu + ETH_HLEN + VLAN_HLEN) || -- (size + offset > skb->len)) { -+ if (rx->size > dev->net->mtu + ETH_HLEN + VLAN_HLEN) { - netdev_err(dev->net, "asix_rx_fixup() Bad RX Length %d\n", -- size); -+ rx->size); -+ kfree_skb(rx->ax_skb); - return 0; - } -- ax_skb = netdev_alloc_skb_ip_align(dev->net, size); -- if (!ax_skb) -- return 0; - -- skb_put(ax_skb, size); -- memcpy(ax_skb->data, skb->data + offset, size); -- usbnet_skb_return(dev, ax_skb); -+ if (rx->size > skb->len - offset) { -+ remaining = rx->size - (skb->len - offset); -+ rx->size = skb->len - offset; -+ } -+ -+ data = skb_put(rx->ax_skb, rx->size); -+ memcpy(data, skb->data + offset, rx->size); -+ if (!remaining) -+ usbnet_skb_return(dev, rx->ax_skb); - -- offset += (size + 1) & 0xfffe; -+ offset += (rx->size + 1) & 0xfffe; -+ rx->size = remaining; - } - - if (skb->len != offset) { -- netdev_err(dev->net, "asix_rx_fixup() Bad SKB Length %d\n", -- skb->len); -+ netdev_err(dev->net, "asix_rx_fixup() Bad SKB Length %d, %d\n", -+ skb->len, offset); - return 0; - } -+ - return 1; - } - -+static int asix_rx_fixup_common(struct usbnet *dev, struct sk_buff *skb) -+{ -+ struct asix_common_private *dp = dev->driver_priv; -+ struct asix_rx_fixup_info *rx = &dp->rx_fixup_info; -+ -+ return asix_rx_fixup_internal(dev, skb, rx); -+} -+ - static struct sk_buff *asix_tx_fixup(struct usbnet *dev, struct sk_buff *skb, - gfp_t flags) - { -@@ -1110,9 +1161,19 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) - dev->rx_urb_size = 2048; - } - -+ dev->driver_priv = kzalloc(sizeof(struct asix_common_private), -+ GFP_KERNEL); -+ if (!dev->driver_priv) -+ return -ENOMEM; -+ - return 0; - } - -+static void ax88772_unbind(struct usbnet *dev, struct usb_interface *intf) -+{ -+ kfree(dev->driver_priv); -+} -+ - static const struct ethtool_ops ax88178_ethtool_ops = { - .get_drvinfo = asix_get_drvinfo, - .get_link = asix_get_link, -@@ -1445,6 +1506,11 @@ static int ax88178_bind(struct usbnet *dev, struct usb_interface *intf) - dev->rx_urb_size = 2048; - } - -+ dev->driver_priv = kzalloc(sizeof(struct asix_common_private), -+ GFP_KERNEL); -+ if (!dev->driver_priv) -+ return -ENOMEM; -+ - return 0; - } - -@@ -1491,22 +1557,26 @@ static const struct driver_info hawking_uf200_info = { - static const struct driver_info ax88772_info = { - .description = "ASIX AX88772 USB 2.0 Ethernet", - .bind = ax88772_bind, -+ .unbind = ax88772_unbind, - .status = asix_status, - .link_reset = ax88772_link_reset, - .reset = ax88772_reset, -- .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | FLAG_MULTI_PACKET, -- .rx_fixup = asix_rx_fixup, -+ .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | -+ FLAG_MULTI_PACKET, -+ .rx_fixup = asix_rx_fixup_common, - .tx_fixup = asix_tx_fixup, - }; - - static const struct driver_info ax88178_info = { - .description = "ASIX AX88178 USB 2.0 Ethernet", - .bind = ax88178_bind, -+ .unbind = ax88772_unbind, - .status = asix_status, - .link_reset = ax88178_link_reset, - .reset = ax88178_reset, -- .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR, -- .rx_fixup = asix_rx_fixup, -+ .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | -+ FLAG_MULTI_PACKET, -+ .rx_fixup = asix_rx_fixup_common, - .tx_fixup = asix_tx_fixup, - }; - -diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c -index 905b16f..1785183 100644 ---- a/drivers/net/usb/dm9601.c -+++ b/drivers/net/usb/dm9601.c -@@ -445,7 +445,12 @@ static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf) - dev->net->ethtool_ops = &dm9601_ethtool_ops; - dev->net->hard_header_len += DM_TX_OVERHEAD; - dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len; -- dev->rx_urb_size = dev->net->mtu + ETH_HLEN + DM_RX_OVERHEAD; -+ -+ /* dm9620/21a require room for 4 byte padding, even in dm9601 -+ * mode, so we need +1 to be able to receive full size -+ * ethernet frames. -+ */ -+ dev->rx_urb_size = dev->net->mtu + ETH_HLEN + DM_RX_OVERHEAD + 1; - - dev->mii.dev = dev->net; - dev->mii.mdio_read = dm9601_mdio_read; -@@ -531,7 +536,7 @@ static int dm9601_rx_fixup(struct usbnet *dev, struct sk_buff *skb) - static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb, - gfp_t flags) - { -- int len; -+ int len, pad; - - /* format: - b1: packet length low -@@ -539,12 +544,23 @@ static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb, - b3..n: packet data - */ - -- len = skb->len; -+ len = skb->len + DM_TX_OVERHEAD; - -- if (skb_headroom(skb) < DM_TX_OVERHEAD) { -+ /* workaround for dm962x errata with tx fifo getting out of -+ * sync if a USB bulk transfer retry happens right after a -+ * packet with odd / maxpacket length by adding up to 3 bytes -+ * padding. -+ */ -+ while ((len & 1) || !(len % dev->maxpacket)) -+ len++; -+ -+ len -= DM_TX_OVERHEAD; /* hw header doesn't count as part of length */ -+ pad = len - skb->len; -+ -+ if (skb_headroom(skb) < DM_TX_OVERHEAD || skb_tailroom(skb) < pad) { - struct sk_buff *skb2; - -- skb2 = skb_copy_expand(skb, DM_TX_OVERHEAD, 0, flags); -+ skb2 = skb_copy_expand(skb, DM_TX_OVERHEAD, pad, flags); - dev_kfree_skb_any(skb); - skb = skb2; - if (!skb) -@@ -553,10 +569,10 @@ static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb, - - __skb_push(skb, DM_TX_OVERHEAD); - -- /* usbnet adds padding if length is a multiple of packet size -- if so, adjust length value in header */ -- if ((skb->len % dev->maxpacket) == 0) -- len++; -+ if (pad) { -+ memset(skb->data + skb->len, 0, pad); -+ __skb_put(skb, pad); -+ } - - skb->data[0] = len; - skb->data[1] = len >> 8; -diff --git a/drivers/net/usb/gl620a.c b/drivers/net/usb/gl620a.c -index 38266bd..71e0b99 100644 ---- a/drivers/net/usb/gl620a.c -+++ b/drivers/net/usb/gl620a.c -@@ -86,6 +86,10 @@ static int genelink_rx_fixup(struct usbnet *dev, struct sk_buff *skb) - u32 size; - u32 count; - -+ /* This check is no longer done by usbnet */ -+ if (skb->len < dev->net->hard_header_len) -+ return 0; -+ - header = (struct gl_header *) skb->data; - - // get the packet count of the received skb -diff --git a/drivers/net/usb/mcs7830.c b/drivers/net/usb/mcs7830.c -index c434b6b..21a9377 100644 ---- a/drivers/net/usb/mcs7830.c -+++ b/drivers/net/usb/mcs7830.c -@@ -601,8 +601,9 @@ static int mcs7830_rx_fixup(struct usbnet *dev, struct sk_buff *skb) - { - u8 status; - -- if (skb->len == 0) { -- dev_err(&dev->udev->dev, "unexpected empty rx frame\n"); -+ /* This check is no longer done by usbnet */ -+ if (skb->len < dev->net->hard_header_len) { -+ dev_err(&dev->udev->dev, "unexpected tiny rx frame\n"); - return 0; - } - -diff --git a/drivers/net/usb/net1080.c b/drivers/net/usb/net1080.c -index 83f965c..006a142 100644 ---- a/drivers/net/usb/net1080.c -+++ b/drivers/net/usb/net1080.c -@@ -419,6 +419,10 @@ static int net1080_rx_fixup(struct usbnet *dev, struct sk_buff *skb) - struct nc_trailer *trailer; - u16 hdr_len, packet_len; - -+ /* This check is no longer done by usbnet */ -+ if (skb->len < dev->net->hard_header_len) -+ return 0; -+ - if (!(skb->len & 0x01)) { - #ifdef DEBUG - struct net_device *net = dev->net; -diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c -index 3b6e932..387ecec 100644 ---- a/drivers/net/usb/qmi_wwan.c -+++ b/drivers/net/usb/qmi_wwan.c -@@ -202,10 +202,10 @@ static int qmi_wwan_rx_fixup(struct usbnet *dev, struct sk_buff *skb) - { - __be16 proto; - -- /* usbnet rx_complete guarantees that skb->len is at least -- * hard_header_len, so we can inspect the dest address without -- * checking skb->len -- */ -+ /* This check is no longer done by usbnet */ -+ if (skb->len < dev->net->hard_header_len) -+ return 0; -+ - switch (skb->data[0] & 0xf0) { - case 0x40: - proto = htons(ETH_P_IP); -diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c -index c8f1b5b..bf4c0979c 100644 ---- a/drivers/net/usb/rndis_host.c -+++ b/drivers/net/usb/rndis_host.c -@@ -490,6 +490,10 @@ EXPORT_SYMBOL_GPL(rndis_unbind); - */ - int rndis_rx_fixup(struct usbnet *dev, struct sk_buff *skb) - { -+ /* This check is no longer done by usbnet */ -+ if (skb->len < dev->net->hard_header_len) -+ return 0; -+ - /* peripheral may have batched packets to us... */ - while (likely(skb->len)) { - struct rndis_data_hdr *hdr = (void *)skb->data; -diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c -index d89747a..5a82fcd 100644 ---- a/drivers/net/usb/smsc75xx.c -+++ b/drivers/net/usb/smsc75xx.c -@@ -1093,6 +1093,10 @@ static void smsc75xx_rx_csum_offload(struct usbnet *dev, struct sk_buff *skb, - - static int smsc75xx_rx_fixup(struct usbnet *dev, struct sk_buff *skb) - { -+ /* This check is no longer done by usbnet */ -+ if (skb->len < dev->net->hard_header_len) -+ return 0; -+ - while (skb->len > 0) { - u32 rx_cmd_a, rx_cmd_b, align_count, size; - struct sk_buff *ax_skb; -diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c -index 94ae669..13f5071 100644 ---- a/drivers/net/usb/smsc95xx.c -+++ b/drivers/net/usb/smsc95xx.c -@@ -1041,6 +1041,10 @@ static void smsc95xx_rx_csum_offload(struct sk_buff *skb) - - static int smsc95xx_rx_fixup(struct usbnet *dev, struct sk_buff *skb) - { -+ /* This check is no longer done by usbnet */ -+ if (skb->len < dev->net->hard_header_len) -+ return 0; -+ - while (skb->len > 0) { - u32 header, align_count; - struct sk_buff *ax_skb; -diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c -index b42050c..4965b37 100644 ---- a/drivers/net/usb/usbnet.c -+++ b/drivers/net/usb/usbnet.c -@@ -428,17 +428,19 @@ static inline void rx_process (struct usbnet *dev, struct sk_buff *skb) - } - // else network stack removes extra byte if we forced a short packet - -- if (skb->len) { -- /* all data was already cloned from skb inside the driver */ -- if (dev->driver_info->flags & FLAG_MULTI_PACKET) -- dev_kfree_skb_any(skb); -- else -- usbnet_skb_return(dev, skb); -+ /* all data was already cloned from skb inside the driver */ -+ if (dev->driver_info->flags & FLAG_MULTI_PACKET) -+ goto done; -+ -+ if (skb->len < ETH_HLEN) { -+ dev->net->stats.rx_errors++; -+ dev->net->stats.rx_length_errors++; -+ netif_dbg(dev, rx_err, dev->net, "rx length %d\n", skb->len); -+ } else { -+ usbnet_skb_return(dev, skb); - return; - } - -- netif_dbg(dev, rx_err, dev->net, "drop\n"); -- dev->net->stats.rx_errors++; - done: - skb_queue_tail(&dev->done, skb); - } -@@ -460,13 +462,6 @@ void rx_complete(struct urb *urb) - switch (urb_status) { - /* success */ - case 0: -- if (skb->len < dev->net->hard_header_len) { -- state = rx_cleanup; -- dev->net->stats.rx_errors++; -- dev->net->stats.rx_length_errors++; -- netif_dbg(dev, rx_err, dev->net, -- "rx length %d\n", skb->len); -- } - break; - - /* stalls need manual reset. this is rare ... except that -diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c -index 795b80e..6de7ca0 100644 ---- a/drivers/net/virtio_net.c -+++ b/drivers/net/virtio_net.c -@@ -1084,7 +1084,8 @@ static int virtnet_probe(struct virtio_device *vdev) - /* If we can receive ANY GSO packets, we must allocate large ones. */ - if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) || - virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) || -- virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN)) -+ virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN) || -+ virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_UFO)) - vi->big_packets = true; - - if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF)) -diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c -index 3f04ba0..d43df93 100644 ---- a/drivers/net/vmxnet3/vmxnet3_drv.c -+++ b/drivers/net/vmxnet3/vmxnet3_drv.c -@@ -1729,11 +1729,20 @@ vmxnet3_netpoll(struct net_device *netdev) - { - struct vmxnet3_adapter *adapter = netdev_priv(netdev); - -- if (adapter->intr.mask_mode == VMXNET3_IMM_ACTIVE) -- vmxnet3_disable_all_intrs(adapter); -- -- vmxnet3_do_poll(adapter, adapter->rx_queue[0].rx_ring[0].size); -- vmxnet3_enable_all_intrs(adapter); -+ switch (adapter->intr.type) { -+#ifdef CONFIG_PCI_MSI -+ case VMXNET3_IT_MSIX: { -+ int i; -+ for (i = 0; i < adapter->num_rx_queues; i++) -+ vmxnet3_msix_rx(0, &adapter->rx_queue[i]); -+ break; -+ } -+#endif -+ case VMXNET3_IT_MSI: -+ default: -+ vmxnet3_intr(0, adapter->netdev); -+ break; -+ } - - } - #endif /* CONFIG_NET_POLL_CONTROLLER */ -diff --git a/drivers/net/wan/farsync.c b/drivers/net/wan/farsync.c -index 1a62318..3710427 100644 ---- a/drivers/net/wan/farsync.c -+++ b/drivers/net/wan/farsync.c -@@ -1972,6 +1972,7 @@ fst_get_iface(struct fst_card_info *card, struct fst_port_info *port, - } - - i = port->index; -+ memset(&sync, 0, sizeof(sync)); - sync.clock_rate = FST_RDL(card, portConfig[i].lineSpeed); - /* Lucky card and linux use same encoding here */ - sync.clock_type = FST_RDB(card, portConfig[i].internalClock) == -diff --git a/drivers/net/wan/wanxl.c b/drivers/net/wan/wanxl.c -index feb7541..ccd496b 100644 ---- a/drivers/net/wan/wanxl.c -+++ b/drivers/net/wan/wanxl.c -@@ -355,6 +355,7 @@ static int wanxl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) - ifr->ifr_settings.size = size; /* data size wanted */ - return -ENOBUFS; - } -+ memset(&line, 0, sizeof(line)); - line.clock_type = get_status(port)->clocking; - line.clock_rate = 0; - line.loopback = 0; -diff --git a/drivers/net/wimax/i2400m/usb-rx.c b/drivers/net/wimax/i2400m/usb-rx.c -index e325768..b78ee67 100644 ---- a/drivers/net/wimax/i2400m/usb-rx.c -+++ b/drivers/net/wimax/i2400m/usb-rx.c -@@ -277,7 +277,7 @@ struct sk_buff *i2400mu_rx(struct i2400mu *i2400mu, struct sk_buff *rx_skb) - d_printf(1, dev, "RX: size changed to %d, received %d, " - "copied %d, capacity %ld\n", - rx_size, read_size, rx_skb->len, -- (long) (skb_end_pointer(new_skb) - new_skb->head)); -+ (long) skb_end_offset(new_skb)); - goto retry; - } - /* In most cases, it happens due to the hardware scheduling a -diff --git a/drivers/net/wireless/ath/ath9k/ar9002_mac.c b/drivers/net/wireless/ath/ath9k/ar9002_mac.c -index aa2abaf..fa7581a 100644 ---- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c -+++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c -@@ -76,9 +76,16 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked) - mask2 |= ATH9K_INT_CST; - if (isr2 & AR_ISR_S2_TSFOOR) - mask2 |= ATH9K_INT_TSFOOR; -+ -+ if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) { -+ REG_WRITE(ah, AR_ISR_S2, isr2); -+ isr &= ~AR_ISR_BCNMISC; -+ } - } - -- isr = REG_READ(ah, AR_ISR_RAC); -+ if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED) -+ isr = REG_READ(ah, AR_ISR_RAC); -+ - if (isr == 0xffffffff) { - *masked = 0; - return false; -@@ -97,11 +104,23 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked) - - *masked |= ATH9K_INT_TX; - -- s0_s = REG_READ(ah, AR_ISR_S0_S); -+ if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED) { -+ s0_s = REG_READ(ah, AR_ISR_S0_S); -+ s1_s = REG_READ(ah, AR_ISR_S1_S); -+ } else { -+ s0_s = REG_READ(ah, AR_ISR_S0); -+ REG_WRITE(ah, AR_ISR_S0, s0_s); -+ s1_s = REG_READ(ah, AR_ISR_S1); -+ REG_WRITE(ah, AR_ISR_S1, s1_s); -+ -+ isr &= ~(AR_ISR_TXOK | -+ AR_ISR_TXDESC | -+ AR_ISR_TXERR | -+ AR_ISR_TXEOL); -+ } -+ - ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXOK); - ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXDESC); -- -- s1_s = REG_READ(ah, AR_ISR_S1_S); - ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXERR); - ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXEOL); - } -@@ -114,13 +133,15 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked) - *masked |= mask2; - } - -- if (AR_SREV_9100(ah)) -- return true; -- -- if (isr & AR_ISR_GENTMR) { -+ if (!AR_SREV_9100(ah) && (isr & AR_ISR_GENTMR)) { - u32 s5_s; - -- s5_s = REG_READ(ah, AR_ISR_S5_S); -+ if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED) { -+ s5_s = REG_READ(ah, AR_ISR_S5_S); -+ } else { -+ s5_s = REG_READ(ah, AR_ISR_S5); -+ } -+ - ah->intr_gen_timer_trigger = - MS(s5_s, AR_ISR_S5_GENTIMER_TRIG); - -@@ -133,8 +154,21 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked) - if ((s5_s & AR_ISR_S5_TIM_TIMER) && - !(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) - *masked |= ATH9K_INT_TIM_TIMER; -+ -+ if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) { -+ REG_WRITE(ah, AR_ISR_S5, s5_s); -+ isr &= ~AR_ISR_GENTMR; -+ } - } - -+ if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) { -+ REG_WRITE(ah, AR_ISR, isr); -+ REG_READ(ah, AR_ISR); -+ } -+ -+ if (AR_SREV_9100(ah)) -+ return true; -+ - if (sync_cause) { - fatal_int = - (sync_cause & -diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c -index 6bb4db0..6f2fff3 100644 ---- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c -+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c -@@ -3592,7 +3592,7 @@ static u16 ar9003_hw_ant_ctrl_chain_get(struct ath_hw *ah, - static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz) - { - int chain; -- u32 regval; -+ u32 regval, value; - u32 ant_div_ctl1; - static const u32 switch_chain_reg[AR9300_MAX_CHAINS] = { - AR_PHY_SWITCH_CHAIN_0, -@@ -3600,7 +3600,11 @@ static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz) - AR_PHY_SWITCH_CHAIN_2, - }; - -- u32 value = ar9003_hw_ant_ctrl_common_get(ah, is2ghz); -+ if (AR_SREV_9485(ah) && (ar9003_hw_get_rx_gain_idx(ah) == 0)) -+ ath9k_hw_cfg_output(ah, AR9300_EXT_LNA_CTL_GPIO_AR9485, -+ AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED); -+ -+ value = ar9003_hw_ant_ctrl_common_get(ah, is2ghz); - - if (AR_SREV_9462(ah)) { - REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM, -diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c -index 0f56e32..42ad784 100644 ---- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c -+++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c -@@ -33,9 +33,6 @@ - */ - static void ar9003_hw_init_mode_regs(struct ath_hw *ah) - { --#define PCIE_PLL_ON_CREQ_DIS_L1_2P0 \ -- ar9462_pciephy_pll_on_clkreq_disable_L1_2p0 -- - #define AR9462_BB_CTX_COEFJ(x) \ - ar9462_##x##_baseband_core_txfir_coeff_japan_2484 - -@@ -312,13 +309,13 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah) - - /* Awake -> Sleep Setting */ - INIT_INI_ARRAY(&ah->iniPcieSerdes, -- PCIE_PLL_ON_CREQ_DIS_L1_2P0, -- ARRAY_SIZE(PCIE_PLL_ON_CREQ_DIS_L1_2P0), -+ ar9462_pciephy_clkreq_disable_L1_2p0, -+ ARRAY_SIZE(ar9462_pciephy_clkreq_disable_L1_2p0), - 2); - /* Sleep -> Awake Setting */ - INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, -- PCIE_PLL_ON_CREQ_DIS_L1_2P0, -- ARRAY_SIZE(PCIE_PLL_ON_CREQ_DIS_L1_2P0), -+ ar9462_pciephy_clkreq_disable_L1_2p0, -+ ARRAY_SIZE(ar9462_pciephy_clkreq_disable_L1_2p0), - 2); - - /* Fast clock modal settings */ -@@ -637,8 +634,8 @@ static void ar9003_rx_gain_table_mode0(struct ath_hw *ah) - 2); - else if (AR_SREV_9485_11(ah)) - INIT_INI_ARRAY(&ah->iniModesRxGain, -- ar9485Common_wo_xlna_rx_gain_1_1, -- ARRAY_SIZE(ar9485Common_wo_xlna_rx_gain_1_1), -+ ar9485_common_rx_gain_1_1, -+ ARRAY_SIZE(ar9485_common_rx_gain_1_1), - 2); - else if (AR_SREV_9580(ah)) - INIT_INI_ARRAY(&ah->iniModesRxGain, -diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c -index 503ff9f..8783500 100644 ---- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c -+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c -@@ -545,33 +545,20 @@ static void ar9003_hw_init_bb(struct ath_hw *ah, - - void ar9003_hw_set_chain_masks(struct ath_hw *ah, u8 rx, u8 tx) - { -- switch (rx) { -- case 0x5: -+ if (ah->caps.tx_chainmask == 5 || ah->caps.rx_chainmask == 5) - REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP, - AR_PHY_SWAP_ALT_CHAIN); -- case 0x3: -- case 0x1: -- case 0x2: -- case 0x7: -- REG_WRITE(ah, AR_PHY_RX_CHAINMASK, rx); -- REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, rx); -- break; -- default: -- break; -- } -+ -+ REG_WRITE(ah, AR_PHY_RX_CHAINMASK, rx); -+ REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, rx); - - if ((ah->caps.hw_caps & ATH9K_HW_CAP_APM) && (tx == 0x7)) -- REG_WRITE(ah, AR_SELFGEN_MASK, 0x3); -+ tx = 3; - else if (AR_SREV_9462(ah)) - /* xxx only when MCI support is enabled */ -- REG_WRITE(ah, AR_SELFGEN_MASK, 0x3); -- else -- REG_WRITE(ah, AR_SELFGEN_MASK, tx); -+ tx = 3; - -- if (tx == 0x5) { -- REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP, -- AR_PHY_SWAP_ALT_CHAIN); -- } -+ REG_WRITE(ah, AR_SELFGEN_MASK, tx); - } - - /* -diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.h b/drivers/net/wireless/ath/ath9k/ar9003_phy.h -index d834d97..6402b9e 100644 ---- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h -+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h -@@ -339,6 +339,8 @@ - - #define AR_PHY_CCA_NOM_VAL_9330_2GHZ -118 - -+#define AR9300_EXT_LNA_CTL_GPIO_AR9485 9 -+ - /* - * AGC Field Definitions - */ -diff --git a/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h b/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h -index b6ba1e8..1596002 100644 ---- a/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h -+++ b/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h -@@ -55,7 +55,7 @@ static const u32 ar9462_2p0_baseband_postamble[][5] = { - {0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3376605e, 0x33795d5e}, - {0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - {0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c}, -- {0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce}, -+ {0x00009e20, 0x000003a5, 0x000003a5, 0x000003a5, 0x000003a5}, - {0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021}, - {0x00009e3c, 0xcf946220, 0xcf946220, 0xcfd5c782, 0xcfd5c282}, - {0x00009e44, 0x62321e27, 0x62321e27, 0xfe291e27, 0xfe291e27}, -@@ -94,7 +94,7 @@ static const u32 ar9462_2p0_baseband_postamble[][5] = { - {0x0000ae04, 0x001c0000, 0x001c0000, 0x001c0000, 0x00100000}, - {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - {0x0000ae1c, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c}, -- {0x0000ae20, 0x000001b5, 0x000001b5, 0x000001ce, 0x000001ce}, -+ {0x0000ae20, 0x000001a6, 0x000001a6, 0x000001aa, 0x000001aa}, - {0x0000b284, 0x00000000, 0x00000000, 0x00000550, 0x00000550}, - }; - -diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c -index 85e7453..a393e87 100644 ---- a/drivers/net/wireless/ath/ath9k/calib.c -+++ b/drivers/net/wireless/ath/ath9k/calib.c -@@ -410,6 +410,7 @@ void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah, - - ah->caldata->channel = chan->channel; - ah->caldata->channelFlags = chan->channelFlags & ~CHANNEL_CW_INT; -+ ah->caldata->chanmode = chan->chanmode; - h = ah->caldata->nfCalHist; - default_nf = ath9k_hw_get_default_nf(ah, chan); - for (i = 0; i < NUM_NF_READINGS; i++) { -diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h -index 1357952..17f687b 100644 ---- a/drivers/net/wireless/ath/ath9k/htc.h -+++ b/drivers/net/wireless/ath/ath9k/htc.h -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - #include - #include - #include -diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c -index abbd6ef..204619e 100644 ---- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c -+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c -@@ -139,21 +139,26 @@ static void ath9k_htc_bssid_iter(void *data, u8 *mac, struct ieee80211_vif *vif) - struct ath9k_vif_iter_data *iter_data = data; - int i; - -- for (i = 0; i < ETH_ALEN; i++) -- iter_data->mask[i] &= ~(iter_data->hw_macaddr[i] ^ mac[i]); -+ if (iter_data->hw_macaddr != NULL) { -+ for (i = 0; i < ETH_ALEN; i++) -+ iter_data->mask[i] &= ~(iter_data->hw_macaddr[i] ^ mac[i]); -+ } else { -+ iter_data->hw_macaddr = mac; -+ } - } - --static void ath9k_htc_set_bssid_mask(struct ath9k_htc_priv *priv, -+static void ath9k_htc_set_mac_bssid_mask(struct ath9k_htc_priv *priv, - struct ieee80211_vif *vif) - { - struct ath_common *common = ath9k_hw_common(priv->ah); - struct ath9k_vif_iter_data iter_data; - - /* -- * Use the hardware MAC address as reference, the hardware uses it -- * together with the BSSID mask when matching addresses. -+ * Pick the MAC address of the first interface as the new hardware -+ * MAC address. The hardware will use it together with the BSSID mask -+ * when matching addresses. - */ -- iter_data.hw_macaddr = common->macaddr; -+ iter_data.hw_macaddr = NULL; - memset(&iter_data.mask, 0xff, ETH_ALEN); - - if (vif) -@@ -164,6 +169,10 @@ static void ath9k_htc_set_bssid_mask(struct ath9k_htc_priv *priv, - &iter_data); - - memcpy(common->bssidmask, iter_data.mask, ETH_ALEN); -+ -+ if (iter_data.hw_macaddr) -+ memcpy(common->macaddr, iter_data.hw_macaddr, ETH_ALEN); -+ - ath_hw_setbssidmask(common); - } - -@@ -1091,7 +1100,7 @@ static int ath9k_htc_add_interface(struct ieee80211_hw *hw, - goto out; - } - -- ath9k_htc_set_bssid_mask(priv, vif); -+ ath9k_htc_set_mac_bssid_mask(priv, vif); - - priv->vif_slot |= (1 << avp->index); - priv->nvifs++; -@@ -1154,7 +1163,7 @@ static void ath9k_htc_remove_interface(struct ieee80211_hw *hw, - - ath9k_htc_set_opmode(priv); - -- ath9k_htc_set_bssid_mask(priv, vif); -+ ath9k_htc_set_mac_bssid_mask(priv, vif); - - /* - * Stop ANI only if there are no associated station interfaces. -diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c -index b290a8e..6596a23 100644 ---- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c -+++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c -@@ -1077,15 +1077,19 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv, - - last_rssi = priv->rx.last_rssi; - -- if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER)) -- rxbuf->rxstatus.rs_rssi = ATH_EP_RND(last_rssi, -- ATH_RSSI_EP_MULTIPLIER); -+ if (ieee80211_is_beacon(hdr->frame_control) && -+ !is_zero_ether_addr(common->curbssid) && -+ compare_ether_addr(hdr->addr3, common->curbssid) == 0) { -+ s8 rssi = rxbuf->rxstatus.rs_rssi; - -- if (rxbuf->rxstatus.rs_rssi < 0) -- rxbuf->rxstatus.rs_rssi = 0; -+ if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER)) -+ rssi = ATH_EP_RND(last_rssi, ATH_RSSI_EP_MULTIPLIER); - -- if (ieee80211_is_beacon(fc)) -- priv->ah->stats.avgbrssi = rxbuf->rxstatus.rs_rssi; -+ if (rssi < 0) -+ rssi = 0; -+ -+ priv->ah->stats.avgbrssi = rssi; -+ } - - rx_status->mactime = be64_to_cpu(rxbuf->rxstatus.rs_tstamp); - rx_status->band = hw->conf.channel->band; -diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c -index 20baf70..60ed50dd 100644 ---- a/drivers/net/wireless/ath/ath9k/hw.c -+++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -1628,7 +1628,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, - if (caldata && - (chan->channel != caldata->channel || - (chan->channelFlags & ~CHANNEL_CW_INT) != -- (caldata->channelFlags & ~CHANNEL_CW_INT))) { -+ (caldata->channelFlags & ~CHANNEL_CW_INT) || -+ chan->chanmode != caldata->chanmode)) { - /* Operating channel changed, reset channel calibration data */ - memset(caldata, 0, sizeof(*caldata)); - ath9k_init_nfcal_hist_buffer(ah, chan); -diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h -index d5c5dca..f49be96 100644 ---- a/drivers/net/wireless/ath/ath9k/hw.h -+++ b/drivers/net/wireless/ath/ath9k/hw.h -@@ -361,6 +361,7 @@ struct ath9k_rtt_hist { - struct ath9k_hw_cal_data { - u16 channel; - u32 channelFlags; -+ u32 chanmode; - int32_t CalValid; - int8_t iCoff; - int8_t qCoff; -diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c -index f6a095f..ef26056 100644 ---- a/drivers/net/wireless/ath/ath9k/main.c -+++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -1290,8 +1290,9 @@ void ath9k_calculate_iter_data(struct ieee80211_hw *hw, - struct ath_common *common = ath9k_hw_common(ah); - - /* -- * Use the hardware MAC address as reference, the hardware uses it -- * together with the BSSID mask when matching addresses. -+ * Pick the MAC address of the first interface as the new hardware -+ * MAC address. The hardware will use it together with the BSSID mask -+ * when matching addresses. - */ - memset(iter_data, 0, sizeof(*iter_data)); - iter_data->hw_macaddr = common->macaddr; -@@ -1613,13 +1614,6 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed) - ath_update_survey_stats(sc); - spin_unlock_irqrestore(&common->cc_lock, flags); - -- /* -- * Preserve the current channel values, before updating -- * the same channel -- */ -- if (ah->curchan && (old_pos == pos)) -- ath9k_hw_getnf(ah, ah->curchan); -- - ath9k_cmn_update_ichannel(&sc->sc_ah->channels[pos], - curchan, conf->channel_type); - -diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c -index 3d0aa47..1a5f275 100644 ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -1242,14 +1242,16 @@ void ath_tx_aggr_sleep(struct ieee80211_sta *sta, struct ath_softc *sc, - for (tidno = 0, tid = &an->tid[tidno]; - tidno < WME_NUM_TID; tidno++, tid++) { - -- if (!tid->sched) -- continue; -- - ac = tid->ac; - txq = ac->txq; - - ath_txq_lock(sc, txq); - -+ if (!tid->sched) { -+ ath_txq_unlock(sc, txq); -+ continue; -+ } -+ - buffered = !skb_queue_empty(&tid->buf_q); - - tid->sched = false; -diff --git a/drivers/net/wireless/b43/Kconfig b/drivers/net/wireless/b43/Kconfig -index 3876c7e..af40211 100644 ---- a/drivers/net/wireless/b43/Kconfig -+++ b/drivers/net/wireless/b43/Kconfig -@@ -28,7 +28,7 @@ config B43 - - config B43_BCMA - bool "Support for BCMA bus" -- depends on B43 && BCMA -+ depends on B43 && (BCMA = y || BCMA = B43) - default y - - config B43_BCMA_EXTRA -@@ -39,7 +39,7 @@ config B43_BCMA_EXTRA - - config B43_SSB - bool -- depends on B43 && SSB -+ depends on B43 && (SSB = y || SSB = B43) - default y - - # Auto-select SSB PCI-HOST support, if possible -diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h -index 05cb5f6..46389a0 100644 ---- a/drivers/net/wireless/b43/b43.h -+++ b/drivers/net/wireless/b43/b43.h -@@ -719,8 +719,6 @@ enum b43_firmware_file_type { - struct b43_request_fw_context { - /* The device we are requesting the fw for. */ - struct b43_wldev *dev; -- /* a completion event structure needed if this call is asynchronous */ -- struct completion fw_load_complete; - /* a pointer to the firmware object */ - const struct firmware *blob; - /* The type of firmware to request. */ -@@ -797,6 +795,8 @@ enum { - struct b43_wldev { - struct b43_bus_dev *dev; - struct b43_wl *wl; -+ /* a completion event structure needed if this call is asynchronous */ -+ struct completion fw_load_complete; - - /* The device initialization status. - * Use b43_status() to query. */ -diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c -index f8c4499..b91f559 100644 ---- a/drivers/net/wireless/b43/main.c -+++ b/drivers/net/wireless/b43/main.c -@@ -2061,6 +2061,7 @@ void b43_do_release_fw(struct b43_firmware_file *fw) - - static void b43_release_firmware(struct b43_wldev *dev) - { -+ complete(&dev->fw_load_complete); - b43_do_release_fw(&dev->fw.ucode); - b43_do_release_fw(&dev->fw.pcm); - b43_do_release_fw(&dev->fw.initvals); -@@ -2086,7 +2087,7 @@ static void b43_fw_cb(const struct firmware *firmware, void *context) - struct b43_request_fw_context *ctx = context; - - ctx->blob = firmware; -- complete(&ctx->fw_load_complete); -+ complete(&ctx->dev->fw_load_complete); - } - - int b43_do_request_fw(struct b43_request_fw_context *ctx, -@@ -2133,7 +2134,7 @@ int b43_do_request_fw(struct b43_request_fw_context *ctx, - } - if (async) { - /* do this part asynchronously */ -- init_completion(&ctx->fw_load_complete); -+ init_completion(&ctx->dev->fw_load_complete); - err = request_firmware_nowait(THIS_MODULE, 1, ctx->fwname, - ctx->dev->dev->dev, GFP_KERNEL, - ctx, b43_fw_cb); -@@ -2141,12 +2142,11 @@ int b43_do_request_fw(struct b43_request_fw_context *ctx, - pr_err("Unable to load firmware\n"); - return err; - } -- /* stall here until fw ready */ -- wait_for_completion(&ctx->fw_load_complete); -+ wait_for_completion(&ctx->dev->fw_load_complete); - if (ctx->blob) - goto fw_ready; - /* On some ARM systems, the async request will fail, but the next sync -- * request works. For this reason, we dall through here -+ * request works. For this reason, we fall through here - */ - } - err = request_firmware(&ctx->blob, ctx->fwname, -@@ -2413,6 +2413,7 @@ static int b43_try_request_fw(struct b43_request_fw_context *ctx) - - static int b43_one_core_attach(struct b43_bus_dev *dev, struct b43_wl *wl); - static void b43_one_core_detach(struct b43_bus_dev *dev); -+static int b43_rng_init(struct b43_wl *wl); - - static void b43_request_firmware(struct work_struct *work) - { -@@ -2459,6 +2460,10 @@ static void b43_request_firmware(struct work_struct *work) - if (err) - goto err_one_core_detach; - b43_leds_register(wl->current_dev); -+ -+ /* Register HW RNG driver */ -+ b43_rng_init(wl); -+ - goto out; - - err_one_core_detach: -@@ -4583,9 +4588,6 @@ static void b43_wireless_core_exit(struct b43_wldev *dev) - if (!dev || b43_status(dev) != B43_STAT_INITIALIZED) - return; - -- /* Unregister HW RNG driver */ -- b43_rng_exit(dev->wl); -- - b43_set_status(dev, B43_STAT_UNINIT); - - /* Stop the microcode PSM. */ -@@ -4728,9 +4730,6 @@ static int b43_wireless_core_init(struct b43_wldev *dev) - - b43_set_status(dev, B43_STAT_INITIALIZED); - -- /* Register HW RNG driver */ -- b43_rng_init(dev->wl); -- - out: - return err; - -@@ -5388,6 +5387,9 @@ static void b43_bcma_remove(struct bcma_device *core) - - b43_one_core_detach(wldev->dev); - -+ /* Unregister HW RNG driver */ -+ b43_rng_exit(wl); -+ - b43_leds_unregister(wl); - - ieee80211_free_hw(wl->hw); -@@ -5468,6 +5470,9 @@ static void b43_ssb_remove(struct ssb_device *sdev) - - b43_one_core_detach(dev); - -+ /* Unregister HW RNG driver */ -+ b43_rng_exit(wl); -+ - if (list_empty(&wl->devlist)) { - b43_leds_unregister(wl); - /* Last core on the chip unregistered. -diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c -index 4ce3e1f..547964d 100644 ---- a/drivers/net/wireless/b43/phy_n.c -+++ b/drivers/net/wireless/b43/phy_n.c -@@ -4599,22 +4599,22 @@ static void b43_nphy_channel_setup(struct b43_wldev *dev, - int ch = new_channel->hw_value; - - u16 old_band_5ghz; -- u32 tmp32; -+ u16 tmp16; - - old_band_5ghz = - b43_phy_read(dev, B43_NPHY_BANDCTL) & B43_NPHY_BANDCTL_5GHZ; - if (new_channel->band == IEEE80211_BAND_5GHZ && !old_band_5ghz) { -- tmp32 = b43_read32(dev, B43_MMIO_PSM_PHY_HDR); -- b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32 | 4); -+ tmp16 = b43_read16(dev, B43_MMIO_PSM_PHY_HDR); -+ b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16 | 4); - b43_phy_set(dev, B43_PHY_B_BBCFG, 0xC000); -- b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32); -+ b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16); - b43_phy_set(dev, B43_NPHY_BANDCTL, B43_NPHY_BANDCTL_5GHZ); - } else if (new_channel->band == IEEE80211_BAND_2GHZ && old_band_5ghz) { - b43_phy_mask(dev, B43_NPHY_BANDCTL, ~B43_NPHY_BANDCTL_5GHZ); -- tmp32 = b43_read32(dev, B43_MMIO_PSM_PHY_HDR); -- b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32 | 4); -+ tmp16 = b43_read16(dev, B43_MMIO_PSM_PHY_HDR); -+ b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16 | 4); - b43_phy_mask(dev, B43_PHY_B_BBCFG, 0x3FFF); -- b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32); -+ b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16); - } - - b43_chantab_phy_upload(dev, e); -diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c -index 2c53678..ad39611 100644 ---- a/drivers/net/wireless/b43/xmit.c -+++ b/drivers/net/wireless/b43/xmit.c -@@ -808,9 +808,13 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr) - break; - case B43_PHYTYPE_G: - status.band = IEEE80211_BAND_2GHZ; -- /* chanid is the radio channel cookie value as used -- * to tune the radio. */ -- status.freq = chanid + 2400; -+ /* Somewhere between 478.104 and 508.1084 firmware for G-PHY -+ * has been modified to be compatible with N-PHY and others. -+ */ -+ if (dev->fw.rev >= 508) -+ status.freq = ieee80211_channel_to_frequency(chanid, status.band); -+ else -+ status.freq = chanid + 2400; - break; - case B43_PHYTYPE_N: - case B43_PHYTYPE_LP: -@@ -819,10 +823,10 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr) - * channel number in b43. */ - if (chanstat & B43_RX_CHAN_5GHZ) { - status.band = IEEE80211_BAND_5GHZ; -- status.freq = b43_freq_to_channel_5ghz(chanid); -+ status.freq = b43_channel_to_freq_5ghz(chanid); - } else { - status.band = IEEE80211_BAND_2GHZ; -- status.freq = b43_freq_to_channel_2ghz(chanid); -+ status.freq = b43_channel_to_freq_2ghz(chanid); - } - break; - default: -diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c -index 53696ef..ce72424 100644 ---- a/drivers/net/wireless/b43legacy/main.c -+++ b/drivers/net/wireless/b43legacy/main.c -@@ -3915,6 +3915,7 @@ static void b43legacy_remove(struct ssb_device *dev) - * as the ieee80211 unreg will destroy the workqueue. */ - cancel_work_sync(&wldev->restart_work); - cancel_work_sync(&wl->firmware_load); -+ complete(&wldev->fw_load_complete); - - B43legacy_WARN_ON(!wl); - if (!wldev->fw.ucode) -diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c -index 2067bdff..dd6dce2 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-6000.c -+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c -@@ -459,6 +459,12 @@ const struct iwl_cfg iwl6035_2agn_cfg = { - .ht_params = &iwl6000_ht_params, - }; - -+const struct iwl_cfg iwl6035_2agn_sff_cfg = { -+ .name = "Intel(R) Centrino(R) Ultimate-N 6235 AGN", -+ IWL_DEVICE_6035, -+ .ht_params = &iwl6000_ht_params, -+}; -+ - const struct iwl_cfg iwl1030_bgn_cfg = { - .name = "Intel(R) Centrino(R) Wireless-N 1030 BGN", - IWL_DEVICE_6030, -diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c -index 2a9a16f..69d2de1 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-agn.c -+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c -@@ -680,7 +680,7 @@ int iwl_alive_start(struct iwl_priv *priv) - BT_COEX_PRIO_TBL_EVT_INIT_CALIB2); - if (ret) - return ret; -- } else { -+ } else if (priv->shrd->cfg->bt_params) { - /* - * default is 2-wire BT coexexistence support - */ -diff --git a/drivers/net/wireless/iwlwifi/iwl-cfg.h b/drivers/net/wireless/iwlwifi/iwl-cfg.h -index 82152311..a133e9e 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-cfg.h -+++ b/drivers/net/wireless/iwlwifi/iwl-cfg.h -@@ -106,6 +106,7 @@ extern const struct iwl_cfg iwl2000_2bgn_cfg; - extern const struct iwl_cfg iwl2000_2bgn_d_cfg; - extern const struct iwl_cfg iwl2030_2bgn_cfg; - extern const struct iwl_cfg iwl6035_2agn_cfg; -+extern const struct iwl_cfg iwl6035_2agn_sff_cfg; - extern const struct iwl_cfg iwl105_bgn_cfg; - extern const struct iwl_cfg iwl105_bgn_d_cfg; - extern const struct iwl_cfg iwl135_bgn_cfg; -diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c -index 46490d3..75ebb82 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-core.c -+++ b/drivers/net/wireless/iwlwifi/iwl-core.c -@@ -801,7 +801,10 @@ void iwl_chswitch_done(struct iwl_priv *priv, bool is_success) - if (test_bit(STATUS_EXIT_PENDING, &priv->status)) - return; - -- if (test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) -+ if (!test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) -+ return; -+ -+ if (ctx->vif) - ieee80211_chswitch_done(ctx->vif, is_success); - } - -diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c -index 2bbaebd..d587bcd 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c -+++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c -@@ -227,6 +227,9 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file, - const struct fw_img *img; - size_t bufsz; - -+ if (!iwl_is_ready_rf(priv)) -+ return -EAGAIN; -+ - /* default is to dump the entire data segment */ - if (!priv->dbgfs_sram_offset && !priv->dbgfs_sram_len) { - priv->dbgfs_sram_offset = 0x800000; -diff --git a/drivers/net/wireless/iwlwifi/iwl-pci.c b/drivers/net/wireless/iwlwifi/iwl-pci.c -index c5e339e..1b90471 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-pci.c -+++ b/drivers/net/wireless/iwlwifi/iwl-pci.c -@@ -138,13 +138,16 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = { - - /* 6x00 Series */ - {IWL_PCI_DEVICE(0x422B, 0x1101, iwl6000_3agn_cfg)}, -+ {IWL_PCI_DEVICE(0x422B, 0x1108, iwl6000_3agn_cfg)}, - {IWL_PCI_DEVICE(0x422B, 0x1121, iwl6000_3agn_cfg)}, -+ {IWL_PCI_DEVICE(0x422B, 0x1128, iwl6000_3agn_cfg)}, - {IWL_PCI_DEVICE(0x422C, 0x1301, iwl6000i_2agn_cfg)}, - {IWL_PCI_DEVICE(0x422C, 0x1306, iwl6000i_2abg_cfg)}, - {IWL_PCI_DEVICE(0x422C, 0x1307, iwl6000i_2bg_cfg)}, - {IWL_PCI_DEVICE(0x422C, 0x1321, iwl6000i_2agn_cfg)}, - {IWL_PCI_DEVICE(0x422C, 0x1326, iwl6000i_2abg_cfg)}, - {IWL_PCI_DEVICE(0x4238, 0x1111, iwl6000_3agn_cfg)}, -+ {IWL_PCI_DEVICE(0x4238, 0x1118, iwl6000_3agn_cfg)}, - {IWL_PCI_DEVICE(0x4239, 0x1311, iwl6000i_2agn_cfg)}, - {IWL_PCI_DEVICE(0x4239, 0x1316, iwl6000i_2abg_cfg)}, - -@@ -152,12 +155,16 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = { - {IWL_PCI_DEVICE(0x0082, 0x1301, iwl6005_2agn_cfg)}, - {IWL_PCI_DEVICE(0x0082, 0x1306, iwl6005_2abg_cfg)}, - {IWL_PCI_DEVICE(0x0082, 0x1307, iwl6005_2bg_cfg)}, -+ {IWL_PCI_DEVICE(0x0082, 0x1308, iwl6005_2agn_cfg)}, - {IWL_PCI_DEVICE(0x0082, 0x1321, iwl6005_2agn_cfg)}, - {IWL_PCI_DEVICE(0x0082, 0x1326, iwl6005_2abg_cfg)}, -+ {IWL_PCI_DEVICE(0x0082, 0x1328, iwl6005_2agn_cfg)}, - {IWL_PCI_DEVICE(0x0085, 0x1311, iwl6005_2agn_cfg)}, -+ {IWL_PCI_DEVICE(0x0085, 0x1318, iwl6005_2agn_cfg)}, - {IWL_PCI_DEVICE(0x0085, 0x1316, iwl6005_2abg_cfg)}, - {IWL_PCI_DEVICE(0x0082, 0xC020, iwl6005_2agn_sff_cfg)}, - {IWL_PCI_DEVICE(0x0085, 0xC220, iwl6005_2agn_sff_cfg)}, -+ {IWL_PCI_DEVICE(0x0085, 0xC228, iwl6005_2agn_sff_cfg)}, - {IWL_PCI_DEVICE(0x0082, 0x4820, iwl6005_2agn_d_cfg)}, - {IWL_PCI_DEVICE(0x0082, 0x1304, iwl6005_2agn_mow1_cfg)},/* low 5GHz active */ - {IWL_PCI_DEVICE(0x0082, 0x1305, iwl6005_2agn_mow2_cfg)},/* high 5GHz active */ -@@ -239,8 +246,11 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = { - - /* 6x35 Series */ - {IWL_PCI_DEVICE(0x088E, 0x4060, iwl6035_2agn_cfg)}, -+ {IWL_PCI_DEVICE(0x088E, 0x406A, iwl6035_2agn_sff_cfg)}, - {IWL_PCI_DEVICE(0x088F, 0x4260, iwl6035_2agn_cfg)}, -+ {IWL_PCI_DEVICE(0x088F, 0x426A, iwl6035_2agn_sff_cfg)}, - {IWL_PCI_DEVICE(0x088E, 0x4460, iwl6035_2agn_cfg)}, -+ {IWL_PCI_DEVICE(0x088E, 0x446A, iwl6035_2agn_sff_cfg)}, - {IWL_PCI_DEVICE(0x088E, 0x4860, iwl6035_2agn_cfg)}, - - /* 105 Series */ -diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h -index 3b844b7..9ae2b49 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h -+++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h -@@ -209,6 +209,15 @@ struct iwl_queue { - #define TFD_TX_CMD_SLOTS 256 - #define TFD_CMD_SLOTS 32 - -+/* -+ * The FH will write back to the first TB only, so we need -+ * to copy some data into the buffer regardless of whether -+ * it should be mapped or not. This indicates how much to -+ * copy, even for HCMDs it must be big enough to fit the -+ * DRAM scratch from the TX cmd, at least 16 bytes. -+ */ -+#define IWL_HCMD_MIN_COPY_SIZE 16 -+ - struct iwl_tx_queue { - struct iwl_queue q; - struct iwl_tfd *tfds; -@@ -352,7 +361,7 @@ int iwl_queue_space(const struct iwl_queue *q); - ******************************************************/ - int iwl_dump_nic_event_log(struct iwl_trans *trans, bool full_log, - char **buf, bool display); --int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display); -+int iwl_dump_fh(struct iwl_trans *trans, char **buf); - void iwl_dump_csr(struct iwl_trans *trans); - - /***************************************************** -diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c -index aa7aea1..7bcaeaf 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c -+++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c -@@ -315,6 +315,14 @@ static void iwlagn_rx_allocate(struct iwl_trans *trans, gfp_t priority) - rxb->page_dma = dma_map_page(trans->dev, page, 0, - PAGE_SIZE << hw_params(trans).rx_page_order, - DMA_FROM_DEVICE); -+ if (dma_mapping_error(trans->dev, rxb->page_dma)) { -+ rxb->page = NULL; -+ spin_lock_irqsave(&rxq->lock, flags); -+ list_add(&rxb->list, &rxq->rx_used); -+ spin_unlock_irqrestore(&rxq->lock, flags); -+ __free_pages(page, hw_params(trans).rx_page_order); -+ return; -+ } - /* dma address must be no more than 36 bits */ - BUG_ON(rxb->page_dma & ~DMA_BIT_MASK(36)); - /* and also 256 byte aligned! */ -@@ -450,8 +458,19 @@ static void iwl_rx_handle_rxbuf(struct iwl_trans *trans, - dma_map_page(trans->dev, rxb->page, 0, - PAGE_SIZE << hw_params(trans).rx_page_order, - DMA_FROM_DEVICE); -- list_add_tail(&rxb->list, &rxq->rx_free); -- rxq->free_count++; -+ if (dma_mapping_error(trans->dev, rxb->page_dma)) { -+ /* -+ * free the page(s) as well to not break -+ * the invariant that the items on the used -+ * list have no page(s) -+ */ -+ __free_pages(rxb->page, hw_params(trans).rx_page_order); -+ rxb->page = NULL; -+ list_add_tail(&rxb->list, &rxq->rx_used); -+ } else { -+ list_add_tail(&rxb->list, &rxq->rx_free); -+ rxq->free_count++; -+ } - } else - list_add_tail(&rxb->list, &rxq->rx_used); - spin_unlock_irqrestore(&rxq->lock, flags); -@@ -695,7 +714,7 @@ static void iwl_irq_handle_error(struct iwl_trans *trans) - - iwl_dump_nic_error_log(trans); - iwl_dump_csr(trans); -- iwl_dump_fh(trans, NULL, false); -+ iwl_dump_fh(trans, NULL); - iwl_dump_nic_event_log(trans, false, NULL, false); - - iwl_op_mode_nic_error(trans->op_mode); -@@ -1264,12 +1283,20 @@ static irqreturn_t iwl_isr(int irq, void *data) - * back-to-back ISRs and sporadic interrupts from our NIC. - * If we have something to service, the tasklet will re-enable ints. - * If we *don't* have something, we'll re-enable before leaving here. */ -- inta_mask = iwl_read32(trans, CSR_INT_MASK); /* just for debug */ -+ inta_mask = iwl_read32(trans, CSR_INT_MASK); - iwl_write32(trans, CSR_INT_MASK, 0x00000000); - - /* Discover which interrupts are active/pending */ - inta = iwl_read32(trans, CSR_INT); - -+ if (inta & (~inta_mask)) { -+ IWL_DEBUG_ISR(trans, -+ "We got a masked interrupt (0x%08x)...Ack and ignore\n", -+ inta & (~inta_mask)); -+ iwl_write32(trans, CSR_INT, inta & (~inta_mask)); -+ inta &= inta_mask; -+ } -+ - /* Ignore interrupt if there's nothing in NIC to service. - * This may be due to IRQ shared with another device, - * or due to sporadic interrupts thrown from our NIC. */ -@@ -1353,7 +1380,7 @@ irqreturn_t iwl_isr_ict(int irq, void *data) - * If we have something to service, the tasklet will re-enable ints. - * If we *don't* have something, we'll re-enable before leaving here. - */ -- inta_mask = iwl_read32(trans, CSR_INT_MASK); /* just for debug */ -+ inta_mask = iwl_read32(trans, CSR_INT_MASK); - iwl_write32(trans, CSR_INT_MASK, 0x00000000); - - -diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c -index d7964b1..ba38ace 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c -+++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c -@@ -677,10 +677,12 @@ static int iwl_enqueue_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd) - struct iwl_cmd_meta *out_meta; - dma_addr_t phys_addr; - u32 idx; -- u16 copy_size, cmd_size; -+ u16 copy_size, cmd_size, dma_size; - bool had_nocopy = false; - int i; - u8 *cmd_dest; -+ const u8 *cmddata[IWL_MAX_CMD_TFDS]; -+ u16 cmdlen[IWL_MAX_CMD_TFDS]; - #ifdef CONFIG_IWLWIFI_DEVICE_TRACING - const void *trace_bufs[IWL_MAX_CMD_TFDS + 1] = {}; - int trace_lens[IWL_MAX_CMD_TFDS + 1] = {}; -@@ -699,15 +701,30 @@ static int iwl_enqueue_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd) - BUILD_BUG_ON(IWL_MAX_CMD_TFDS > IWL_NUM_OF_TBS - 1); - - for (i = 0; i < IWL_MAX_CMD_TFDS; i++) { -+ cmddata[i] = cmd->data[i]; -+ cmdlen[i] = cmd->len[i]; -+ - if (!cmd->len[i]) - continue; -+ -+ /* need at least IWL_HCMD_MIN_COPY_SIZE copied */ -+ if (copy_size < IWL_HCMD_MIN_COPY_SIZE) { -+ int copy = IWL_HCMD_MIN_COPY_SIZE - copy_size; -+ -+ if (copy > cmdlen[i]) -+ copy = cmdlen[i]; -+ cmdlen[i] -= copy; -+ cmddata[i] += copy; -+ copy_size += copy; -+ } -+ - if (cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY) { - had_nocopy = true; - } else { - /* NOCOPY must not be followed by normal! */ - if (WARN_ON(had_nocopy)) - return -EINVAL; -- copy_size += cmd->len[i]; -+ copy_size += cmdlen[i]; - } - cmd_size += cmd->len[i]; - } -@@ -750,13 +767,30 @@ static int iwl_enqueue_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd) - /* and copy the data that needs to be copied */ - - cmd_dest = out_cmd->payload; -+ copy_size = sizeof(out_cmd->hdr); - for (i = 0; i < IWL_MAX_CMD_TFDS; i++) { -- if (!cmd->len[i]) -+ int copy = 0; -+ -+ if (!cmd->len) - continue; -- if (cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY) -- break; -- memcpy(cmd_dest, cmd->data[i], cmd->len[i]); -- cmd_dest += cmd->len[i]; -+ -+ /* need at least IWL_HCMD_MIN_COPY_SIZE copied */ -+ if (copy_size < IWL_HCMD_MIN_COPY_SIZE) { -+ copy = IWL_HCMD_MIN_COPY_SIZE - copy_size; -+ -+ if (copy > cmd->len[i]) -+ copy = cmd->len[i]; -+ } -+ -+ /* copy everything if not nocopy/dup */ -+ if (!(cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY)) -+ copy = cmd->len[i]; -+ -+ if (copy) { -+ memcpy(cmd_dest, cmd->data[i], copy); -+ cmd_dest += copy; -+ copy_size += copy; -+ } - } - - IWL_DEBUG_HC(trans, "Sending command %s (#%x), seq: 0x%04X, " -@@ -766,7 +800,14 @@ static int iwl_enqueue_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd) - le16_to_cpu(out_cmd->hdr.sequence), cmd_size, - q->write_ptr, idx, trans_pcie->cmd_queue); - -- phys_addr = dma_map_single(trans->dev, &out_cmd->hdr, copy_size, -+ /* -+ * If the entire command is smaller than IWL_HCMD_MIN_COPY_SIZE, we must -+ * still map at least that many bytes for the hardware to write back to. -+ * We have enough space, so that's not a problem. -+ */ -+ dma_size = max_t(u16, copy_size, IWL_HCMD_MIN_COPY_SIZE); -+ -+ phys_addr = dma_map_single(trans->dev, &out_cmd->hdr, dma_size, - DMA_BIDIRECTIONAL); - if (unlikely(dma_mapping_error(trans->dev, phys_addr))) { - idx = -ENOMEM; -@@ -774,7 +815,7 @@ static int iwl_enqueue_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd) - } - - dma_unmap_addr_set(out_meta, mapping, phys_addr); -- dma_unmap_len_set(out_meta, len, copy_size); -+ dma_unmap_len_set(out_meta, len, dma_size); - - iwlagn_txq_attach_buf_to_tfd(trans, txq, - phys_addr, copy_size, 1); -@@ -784,14 +825,15 @@ static int iwl_enqueue_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd) - trace_idx = 1; - #endif - -+ /* map the remaining (adjusted) nocopy/dup fragments */ - for (i = 0; i < IWL_MAX_CMD_TFDS; i++) { -- if (!cmd->len[i]) -+ if (!cmdlen[i]) - continue; - if (!(cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY)) - continue; - phys_addr = dma_map_single(trans->dev, -- (void *)cmd->data[i], -- cmd->len[i], DMA_BIDIRECTIONAL); -+ (void *)cmddata[i], -+ cmdlen[i], DMA_BIDIRECTIONAL); - if (dma_mapping_error(trans->dev, phys_addr)) { - iwlagn_unmap_tfd(trans, out_meta, - &txq->tfds[q->write_ptr], -@@ -801,10 +843,10 @@ static int iwl_enqueue_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd) - } - - iwlagn_txq_attach_buf_to_tfd(trans, txq, phys_addr, -- cmd->len[i], 0); -+ cmdlen[i], 0); - #ifdef CONFIG_IWLWIFI_DEVICE_TRACING -- trace_bufs[trace_idx] = cmd->data[i]; -- trace_lens[trace_idx] = cmd->len[i]; -+ trace_bufs[trace_idx] = cmddata[i]; -+ trace_lens[trace_idx] = cmdlen[i]; - trace_idx++; - #endif - } -diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c -index 8741048..1780d3f 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c -+++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c -@@ -1768,13 +1768,9 @@ static const char *get_fh_string(int cmd) - } - } - --int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display) -+int iwl_dump_fh(struct iwl_trans *trans, char **buf) - { - int i; --#ifdef CONFIG_IWLWIFI_DEBUG -- int pos = 0; -- size_t bufsz = 0; --#endif - static const u32 fh_tbl[] = { - FH_RSCSR_CHNL0_STTS_WPTR_REG, - FH_RSCSR_CHNL0_RBDCB_BASE_REG, -@@ -1786,29 +1782,34 @@ int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display) - FH_TSSR_TX_STATUS_REG, - FH_TSSR_TX_ERROR_REG - }; --#ifdef CONFIG_IWLWIFI_DEBUG -- if (display) { -+ -+#ifdef CONFIG_IWLWIFI_DEBUGFS -+ if (buf) { -+ int pos = 0; -+ size_t bufsz = ARRAY_SIZE(fh_tbl) * 48 + 40; -+ - bufsz = ARRAY_SIZE(fh_tbl) * 48 + 40; - *buf = kmalloc(bufsz, GFP_KERNEL); - if (!*buf) - return -ENOMEM; - pos += scnprintf(*buf + pos, bufsz - pos, - "FH register values:\n"); -- for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) { -+ -+ for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) - pos += scnprintf(*buf + pos, bufsz - pos, - " %34s: 0X%08x\n", - get_fh_string(fh_tbl[i]), - iwl_read_direct32(trans, fh_tbl[i])); -- } -+ - return pos; - } - #endif - IWL_ERR(trans, "FH register values:\n"); -- for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) { -+ for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) - IWL_ERR(trans, " %34s: 0X%08x\n", - get_fh_string(fh_tbl[i]), - iwl_read_direct32(trans, fh_tbl[i])); -- } -+ - return 0; - } - -@@ -2152,11 +2153,11 @@ static ssize_t iwl_dbgfs_fh_reg_read(struct file *file, - size_t count, loff_t *ppos) - { - struct iwl_trans *trans = file->private_data; -- char *buf; -+ char *buf = NULL; - int pos = 0; - ssize_t ret = -EFAULT; - -- ret = pos = iwl_dump_fh(trans, &buf, true); -+ ret = pos = iwl_dump_fh(trans, &buf); - if (buf) { - ret = simple_read_from_buffer(user_buf, - count, ppos, buf, pos); -diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c -index a06cc28..0b48430 100644 ---- a/drivers/net/wireless/libertas/debugfs.c -+++ b/drivers/net/wireless/libertas/debugfs.c -@@ -913,7 +913,10 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf, - char *p2; - struct debug_data *d = f->private_data; - -- pdata = kmalloc(cnt, GFP_KERNEL); -+ if (cnt == 0) -+ return 0; -+ -+ pdata = kmalloc(cnt + 1, GFP_KERNEL); - if (pdata == NULL) - return 0; - -@@ -922,6 +925,7 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf, - kfree(pdata); - return 0; - } -+ pdata[cnt] = '\0'; - - p0 = pdata; - for (i = 0; i < num_of_items; i++) { -diff --git a/drivers/net/wireless/mwifiex/11n.c b/drivers/net/wireless/mwifiex/11n.c -index a5e182b..6f882bc 100644 ---- a/drivers/net/wireless/mwifiex/11n.c -+++ b/drivers/net/wireless/mwifiex/11n.c -@@ -340,8 +340,7 @@ mwifiex_cmd_append_11n_tlv(struct mwifiex_private *priv, - ht_cap->header.len = - cpu_to_le16(sizeof(struct ieee80211_ht_cap)); - memcpy((u8 *) ht_cap + sizeof(struct mwifiex_ie_types_header), -- (u8 *) bss_desc->bcn_ht_cap + -- sizeof(struct ieee_types_header), -+ (u8 *)bss_desc->bcn_ht_cap, - le16_to_cpu(ht_cap->header.len)); - - mwifiex_fill_cap_info(priv, radio_type, ht_cap); -diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c -index 9d1b3ca..a884c32 100644 ---- a/drivers/net/wireless/mwifiex/main.c -+++ b/drivers/net/wireless/mwifiex/main.c -@@ -457,6 +457,7 @@ mwifiex_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) - } - - tx_info = MWIFIEX_SKB_TXCB(skb); -+ memset(tx_info, 0, sizeof(*tx_info)); - tx_info->bss_num = priv->bss_num; - tx_info->bss_type = priv->bss_type; - mwifiex_fill_buffer(skb); -diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c -index 4be8ccc..daf55ba 100644 ---- a/drivers/net/wireless/mwifiex/sdio.c -+++ b/drivers/net/wireless/mwifiex/sdio.c -@@ -938,7 +938,10 @@ static int mwifiex_decode_rx_packet(struct mwifiex_adapter *adapter, - struct sk_buff *skb, u32 upld_typ) - { - u8 *cmd_buf; -+ __le16 *curr_ptr = (__le16 *)skb->data; -+ u16 pkt_len = le16_to_cpu(*curr_ptr); - -+ skb_trim(skb, pkt_len); - skb_pull(skb, INTF_HEADER_LEN); - - switch (upld_typ) { -diff --git a/drivers/net/wireless/p54/txrx.c b/drivers/net/wireless/p54/txrx.c -index a08a6f0..2933819 100644 ---- a/drivers/net/wireless/p54/txrx.c -+++ b/drivers/net/wireless/p54/txrx.c -@@ -583,7 +583,7 @@ static void p54_rx_stats(struct p54_common *priv, struct sk_buff *skb) - chan = priv->curchan; - if (chan) { - struct survey_info *survey = &priv->survey[chan->hw_value]; -- survey->noise = clamp_t(s8, priv->noise, -128, 127); -+ survey->noise = clamp(priv->noise, -128, 127); - survey->channel_time = priv->survey_raw.active; - survey->channel_time_tx = priv->survey_raw.tx; - survey->channel_time_busy = priv->survey_raw.tx + -diff --git a/drivers/net/wireless/prism54/islpci_dev.c b/drivers/net/wireless/prism54/islpci_dev.c -index 5970ff6..d498b02 100644 ---- a/drivers/net/wireless/prism54/islpci_dev.c -+++ b/drivers/net/wireless/prism54/islpci_dev.c -@@ -811,6 +811,10 @@ static const struct net_device_ops islpci_netdev_ops = { - .ndo_validate_addr = eth_validate_addr, - }; - -+static struct device_type wlan_type = { -+ .name = "wlan", -+}; -+ - struct net_device * - islpci_setup(struct pci_dev *pdev) - { -@@ -821,9 +825,8 @@ islpci_setup(struct pci_dev *pdev) - return ndev; - - pci_set_drvdata(pdev, ndev); --#if defined(SET_NETDEV_DEV) - SET_NETDEV_DEV(ndev, &pdev->dev); --#endif -+ SET_NETDEV_DEVTYPE(ndev, &wlan_type); - - /* setup the structure members */ - ndev->base_addr = pci_resource_start(pdev, 0); -diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c -index 0ea85f4..131b22b 100644 ---- a/drivers/net/wireless/rt2x00/rt2400pci.c -+++ b/drivers/net/wireless/rt2x00/rt2400pci.c -@@ -1253,7 +1253,7 @@ static void rt2400pci_fill_rxdone(struct queue_entry *entry, - */ - rxdesc->timestamp = ((u64)rx_high << 32) | rx_low; - rxdesc->signal = rt2x00_get_field32(word2, RXD_W2_SIGNAL) & ~0x08; -- rxdesc->rssi = rt2x00_get_field32(word2, RXD_W3_RSSI) - -+ rxdesc->rssi = rt2x00_get_field32(word3, RXD_W3_RSSI) - - entry->queue->rt2x00dev->rssi_offset; - rxdesc->size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT); - -diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c -index aa10c48..f8ea77c 100644 ---- a/drivers/net/wireless/rt2x00/rt2500pci.c -+++ b/drivers/net/wireless/rt2x00/rt2500pci.c -@@ -1679,8 +1679,13 @@ static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev) - /* - * Detect if this device has an hardware controlled radio. - */ -- if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO)) -+ if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO)) { - __set_bit(CAPABILITY_HW_BUTTON, &rt2x00dev->cap_flags); -+ /* -+ * On this device RFKILL initialized during probe does not work. -+ */ -+ __set_bit(REQUIRE_DELAYED_RFKILL, &rt2x00dev->cap_flags); -+ } - - /* - * Check if the BBP tuning should be enabled. -diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c -index e0a7efc..9e55deb 100644 ---- a/drivers/net/wireless/rt2x00/rt2500usb.c -+++ b/drivers/net/wireless/rt2x00/rt2500usb.c -@@ -1921,7 +1921,7 @@ static struct usb_device_id rt2500usb_device_table[] = { - { USB_DEVICE(0x0b05, 0x1706) }, - { USB_DEVICE(0x0b05, 0x1707) }, - /* Belkin */ -- { USB_DEVICE(0x050d, 0x7050) }, -+ { USB_DEVICE(0x050d, 0x7050) }, /* FCC ID: K7SF5D7050A ver. 2.x */ - { USB_DEVICE(0x050d, 0x7051) }, - /* Cisco Systems */ - { USB_DEVICE(0x13b1, 0x000d) }, -diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c -index 65cb425..664e93d 100644 ---- a/drivers/net/wireless/rt2x00/rt2800usb.c -+++ b/drivers/net/wireless/rt2x00/rt2800usb.c -@@ -143,6 +143,8 @@ static bool rt2800usb_txstatus_timeout(struct rt2x00_dev *rt2x00dev) - return false; - } - -+#define TXSTATUS_READ_INTERVAL 1000000 -+ - static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, - int urb_status, u32 tx_status) - { -@@ -170,8 +172,9 @@ static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, - queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); - - if (rt2800usb_txstatus_pending(rt2x00dev)) { -- /* Read register after 250 us */ -- hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 250000), -+ /* Read register after 1 ms */ -+ hrtimer_start(&rt2x00dev->txstatus_timer, -+ ktime_set(0, TXSTATUS_READ_INTERVAL), - HRTIMER_MODE_REL); - return false; - } -@@ -196,8 +199,9 @@ static void rt2800usb_async_read_tx_status(struct rt2x00_dev *rt2x00dev) - if (test_and_set_bit(TX_STATUS_READING, &rt2x00dev->flags)) - return; - -- /* Read TX_STA_FIFO register after 500 us */ -- hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 500000), -+ /* Read TX_STA_FIFO register after 2 ms */ -+ hrtimer_start(&rt2x00dev->txstatus_timer, -+ ktime_set(0, 2*TXSTATUS_READ_INTERVAL), - HRTIMER_MODE_REL); - } - -@@ -1005,6 +1009,7 @@ static struct usb_device_id rt2800usb_device_table[] = { - { USB_DEVICE(0x07d1, 0x3c15) }, - { USB_DEVICE(0x07d1, 0x3c16) }, - { USB_DEVICE(0x2001, 0x3c1b) }, -+ { USB_DEVICE(0x2001, 0x3c1e) }, - /* Draytek */ - { USB_DEVICE(0x07fa, 0x7712) }, - /* DVICO */ -@@ -1136,6 +1141,7 @@ static struct usb_device_id rt2800usb_device_table[] = { - { USB_DEVICE(0x177f, 0x0153) }, - { USB_DEVICE(0x177f, 0x0302) }, - { USB_DEVICE(0x177f, 0x0313) }, -+ { USB_DEVICE(0x177f, 0x0323) }, - /* U-Media */ - { USB_DEVICE(0x157e, 0x300e) }, - { USB_DEVICE(0x157e, 0x3013) }, -diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h -index c264dfa..4be11e36 100644 ---- a/drivers/net/wireless/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/rt2x00/rt2x00.h -@@ -717,6 +717,7 @@ enum rt2x00_capability_flags { - REQUIRE_SW_SEQNO, - REQUIRE_HT_TX_DESC, - REQUIRE_PS_AUTOWAKE, -+ REQUIRE_DELAYED_RFKILL, - - /* - * Capabilities -diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c -index 8f2c88e..da65f8e 100644 ---- a/drivers/net/wireless/rt2x00/rt2x00dev.c -+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c -@@ -1022,9 +1022,10 @@ static void rt2x00lib_uninitialize(struct rt2x00_dev *rt2x00dev) - return; - - /* -- * Unregister extra components. -+ * Stop rfkill polling. - */ -- rt2x00rfkill_unregister(rt2x00dev); -+ if (test_bit(REQUIRE_DELAYED_RFKILL, &rt2x00dev->cap_flags)) -+ rt2x00rfkill_unregister(rt2x00dev); - - /* - * Allow the HW to uninitialize. -@@ -1062,6 +1063,12 @@ static int rt2x00lib_initialize(struct rt2x00_dev *rt2x00dev) - - set_bit(DEVICE_STATE_INITIALIZED, &rt2x00dev->flags); - -+ /* -+ * Start rfkill polling. -+ */ -+ if (test_bit(REQUIRE_DELAYED_RFKILL, &rt2x00dev->cap_flags)) -+ rt2x00rfkill_register(rt2x00dev); -+ - return 0; - } - -@@ -1207,7 +1214,12 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev) - rt2x00link_register(rt2x00dev); - rt2x00leds_register(rt2x00dev); - rt2x00debug_register(rt2x00dev); -- rt2x00rfkill_register(rt2x00dev); -+ -+ /* -+ * Start rfkill polling. -+ */ -+ if (!test_bit(REQUIRE_DELAYED_RFKILL, &rt2x00dev->cap_flags)) -+ rt2x00rfkill_register(rt2x00dev); - - return 0; - -@@ -1223,6 +1235,12 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev) - clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); - - /* -+ * Stop rfkill polling. -+ */ -+ if (!test_bit(REQUIRE_DELAYED_RFKILL, &rt2x00dev->cap_flags)) -+ rt2x00rfkill_unregister(rt2x00dev); -+ -+ /* - * Disable radio. - */ - rt2x00lib_disable_radio(rt2x00dev); -diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c -index a8885f0..e6daf12 100644 ---- a/drivers/net/wireless/rt2x00/rt2x00mac.c -+++ b/drivers/net/wireless/rt2x00/rt2x00mac.c -@@ -517,6 +517,8 @@ int rt2x00mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, - crypto.cipher = rt2x00crypto_key_to_cipher(key); - if (crypto.cipher == CIPHER_NONE) - return -EOPNOTSUPP; -+ if (crypto.cipher == CIPHER_TKIP && rt2x00_is_usb(rt2x00dev)) -+ return -EOPNOTSUPP; - - crypto.cmd = cmd; - -@@ -651,20 +653,18 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw, - bss_conf->bssid); - - /* -- * Update the beacon. This is only required on USB devices. PCI -- * devices fetch beacons periodically. -- */ -- if (changes & BSS_CHANGED_BEACON && rt2x00_is_usb(rt2x00dev)) -- rt2x00queue_update_beacon(rt2x00dev, vif); -- -- /* - * Start/stop beaconing. - */ - if (changes & BSS_CHANGED_BEACON_ENABLED) { - if (!bss_conf->enable_beacon && intf->enable_beacon) { -- rt2x00queue_clear_beacon(rt2x00dev, vif); - rt2x00dev->intf_beaconing--; - intf->enable_beacon = false; -+ /* -+ * Clear beacon in the H/W for this vif. This is needed -+ * to disable beaconing on this particular interface -+ * and keep it running on other interfaces. -+ */ -+ rt2x00queue_clear_beacon(rt2x00dev, vif); - - if (rt2x00dev->intf_beaconing == 0) { - /* -@@ -675,11 +675,15 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw, - rt2x00queue_stop_queue(rt2x00dev->bcn); - mutex_unlock(&intf->beacon_skb_mutex); - } -- -- - } else if (bss_conf->enable_beacon && !intf->enable_beacon) { - rt2x00dev->intf_beaconing++; - intf->enable_beacon = true; -+ /* -+ * Upload beacon to the H/W. This is only required on -+ * USB devices. PCI devices fetch beacons periodically. -+ */ -+ if (rt2x00_is_usb(rt2x00dev)) -+ rt2x00queue_update_beacon(rt2x00dev, vif); - - if (rt2x00dev->intf_beaconing == 1) { - /* -@@ -771,6 +775,9 @@ void rt2x00mac_flush(struct ieee80211_hw *hw, bool drop) - struct rt2x00_dev *rt2x00dev = hw->priv; - struct data_queue *queue; - -+ if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) -+ return; -+ - tx_queue_for_each(rt2x00dev, queue) - rt2x00queue_flush_queue(queue, drop); - } -diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c -index ffdd32e..ef4cd40 100644 ---- a/drivers/net/wireless/rt2x00/rt73usb.c -+++ b/drivers/net/wireless/rt2x00/rt73usb.c -@@ -2422,6 +2422,7 @@ static struct usb_device_id rt73usb_device_table[] = { - { USB_DEVICE(0x0b05, 0x1723) }, - { USB_DEVICE(0x0b05, 0x1724) }, - /* Belkin */ -+ { USB_DEVICE(0x050d, 0x7050) }, /* FCC ID: K7SF5D7050B ver. 3.x */ - { USB_DEVICE(0x050d, 0x705a) }, - { USB_DEVICE(0x050d, 0x905b) }, - { USB_DEVICE(0x050d, 0x905c) }, -diff --git a/drivers/net/wireless/rtl818x/rtl8187/rtl8187.h b/drivers/net/wireless/rtl818x/rtl8187/rtl8187.h -index e19a20a..ecd1ac4 100644 ---- a/drivers/net/wireless/rtl818x/rtl8187/rtl8187.h -+++ b/drivers/net/wireless/rtl818x/rtl8187/rtl8187.h -@@ -15,6 +15,8 @@ - #ifndef RTL8187_H - #define RTL8187_H - -+#include -+ - #include "rtl818x.h" - #include "leds.h" - -@@ -139,7 +141,10 @@ struct rtl8187_priv { - u8 aifsn[4]; - u8 rfkill_mask; - struct { -- __le64 buf; -+ union { -+ __le64 buf; -+ u8 dummy1[L1_CACHE_BYTES]; -+ } ____cacheline_aligned; - struct sk_buff_head queue; - } b_tx_status; /* This queue is used by both -b and non-b devices */ - struct mutex io_mutex; -@@ -147,7 +152,8 @@ struct rtl8187_priv { - u8 bits8; - __le16 bits16; - __le32 bits32; -- } *io_dmabuf; -+ u8 dummy2[L1_CACHE_BYTES]; -+ } *io_dmabuf ____cacheline_aligned; - bool rfkill_off; - u16 seqno; - }; -diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c -index 18d9eb3a..b175793 100644 ---- a/drivers/net/wireless/rtlwifi/base.c -+++ b/drivers/net/wireless/rtlwifi/base.c -@@ -37,6 +37,7 @@ - - #include - #include -+#include - - /* - *NOTICE!!!: This file will be very big, we should -@@ -957,61 +958,51 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx) - if (!ieee80211_is_data(fc)) - return false; - -+ ip = (const struct iphdr *)(skb->data + mac_hdr_len + -+ SNAP_SIZE + PROTOC_TYPE_SIZE); -+ ether_type = be16_to_cpup((__be16 *) -+ (skb->data + mac_hdr_len + SNAP_SIZE)); - -- ip = (struct iphdr *)((u8 *) skb->data + mac_hdr_len + -- SNAP_SIZE + PROTOC_TYPE_SIZE); -- ether_type = *(u16 *) ((u8 *) skb->data + mac_hdr_len + SNAP_SIZE); -- /* ether_type = ntohs(ether_type); */ -- -- if (ETH_P_IP == ether_type) { -- if (IPPROTO_UDP == ip->protocol) { -- struct udphdr *udp = (struct udphdr *)((u8 *) ip + -- (ip->ihl << 2)); -- if (((((u8 *) udp)[1] == 68) && -- (((u8 *) udp)[3] == 67)) || -- ((((u8 *) udp)[1] == 67) && -- (((u8 *) udp)[3] == 68))) { -- /* -- * 68 : UDP BOOTP client -- * 67 : UDP BOOTP server -- */ -- RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), -- DBG_DMESG, "dhcp %s !!\n", -- is_tx ? "Tx" : "Rx"); -- -- if (is_tx) { -- schedule_work(&rtlpriv-> -- works.lps_leave_work); -- ppsc->last_delaylps_stamp_jiffies = -- jiffies; -- } -+ switch (ether_type) { -+ case ETH_P_IP: { -+ struct udphdr *udp; -+ u16 src; -+ u16 dst; - -- return true; -- } -- } -- } else if (ETH_P_ARP == ether_type) { -- if (is_tx) { -- schedule_work(&rtlpriv->works.lps_leave_work); -- ppsc->last_delaylps_stamp_jiffies = jiffies; -- } -+ if (ip->protocol != IPPROTO_UDP) -+ return false; -+ udp = (struct udphdr *)((u8 *)ip + (ip->ihl << 2)); -+ src = be16_to_cpu(udp->source); -+ dst = be16_to_cpu(udp->dest); - -- return true; -- } else if (ETH_P_PAE == ether_type) { -+ /* If this case involves port 68 (UDP BOOTP client) connecting -+ * with port 67 (UDP BOOTP server), then return true so that -+ * the lowest speed is used. -+ */ -+ if (!((src == 68 && dst == 67) || (src == 67 && dst == 68))) -+ return false; -+ -+ RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG, -+ "dhcp %s !!\n", is_tx ? "Tx" : "Rx"); -+ break; -+ } -+ case ETH_P_ARP: -+ break; -+ case ETH_P_PAE: - RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG, - "802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx"); -- -- if (is_tx) { -- schedule_work(&rtlpriv->works.lps_leave_work); -- ppsc->last_delaylps_stamp_jiffies = jiffies; -- } -- -- return true; -- } else if (ETH_P_IPV6 == ether_type) { -- /* IPv6 */ -- return true; -+ break; -+ case ETH_P_IPV6: -+ /* TODO: Is this right? */ -+ return false; -+ default: -+ return false; - } -- -- return false; -+ if (is_tx) { -+ schedule_work(&rtlpriv->works.lps_leave_work); -+ ppsc->last_delaylps_stamp_jiffies = jiffies; -+ } -+ return true; - } - - /********************************************************* -diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c -index 278e9f9..c3d3258 100644 ---- a/drivers/net/wireless/rtlwifi/core.c -+++ b/drivers/net/wireless/rtlwifi/core.c -@@ -175,6 +175,7 @@ static int rtl_op_add_interface(struct ieee80211_hw *hw, - rtlpriv->cfg->maps - [RTL_IBSS_INT_MASKS]); - } -+ mac->link_state = MAC80211_LINKED; - break; - case NL80211_IFTYPE_ADHOC: - RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, -diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c -index 67f9430..5c1379c 100644 ---- a/drivers/net/wireless/rtlwifi/pci.c -+++ b/drivers/net/wireless/rtlwifi/pci.c -@@ -678,6 +678,8 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) - }; - int index = rtlpci->rx_ring[rx_queue_idx].idx; - -+ if (rtlpci->driver_is_goingto_unload) -+ return; - /*RX NORMAL PKT */ - while (count--) { - /*rx descriptor */ -@@ -1553,6 +1555,7 @@ static void rtl_pci_stop(struct ieee80211_hw *hw) - */ - set_hal_stop(rtlhal); - -+ rtlpci->driver_is_goingto_unload = true; - rtlpriv->cfg->ops->disable_interrupt(hw); - cancel_work_sync(&rtlpriv->works.lps_leave_work); - -@@ -1570,7 +1573,6 @@ static void rtl_pci_stop(struct ieee80211_hw *hw) - ppsc->rfchange_inprogress = true; - spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flags); - -- rtlpci->driver_is_goingto_unload = true; - rtlpriv->cfg->ops->hw_disable(hw); - /* some things are not needed if firmware not available */ - if (!rtlpriv->max_fw_size) -diff --git a/drivers/net/wireless/rtlwifi/ps.c b/drivers/net/wireless/rtlwifi/ps.c -index 5b9c3b5..7fe4f91 100644 ---- a/drivers/net/wireless/rtlwifi/ps.c -+++ b/drivers/net/wireless/rtlwifi/ps.c -@@ -48,7 +48,7 @@ bool rtl_ps_enable_nic(struct ieee80211_hw *hw) - - /*<2> Enable Adapter */ - if (rtlpriv->cfg->ops->hw_init(hw)) -- return 1; -+ return false; - RT_CLEAR_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC); - - /*<3> Enable Interrupt */ -diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c -index 1208b75..513baa0 100644 ---- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c -+++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c -@@ -1210,11 +1210,14 @@ static void rtl92c_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw) - if (rtlhal->interface == INTF_PCI) { - rcu_read_lock(); - sta = ieee80211_find_sta(mac->vif, mac->bssid); -+ if (!sta) -+ goto out_unlock; - } - rtlpriv->cfg->ops->update_rate_tbl(hw, sta, - p_ra->ratr_state); - - p_ra->pre_ratr_state = p_ra->ratr_state; -+ out_unlock: - if (rtlhal->interface == INTF_PCI) - rcu_read_unlock(); - } -diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c -index 509f661..18ddf57 100644 ---- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c -+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c -@@ -902,14 +902,26 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw) - bool is92c; - int err; - u8 tmp_u1b; -+ unsigned long flags; - - rtlpci->being_init_adapter = true; -+ -+ /* Since this function can take a very long time (up to 350 ms) -+ * and can be called with irqs disabled, reenable the irqs -+ * to let the other devices continue being serviced. -+ * -+ * It is safe doing so since our own interrupts will only be enabled -+ * in a subsequent step. -+ */ -+ local_save_flags(flags); -+ local_irq_enable(); -+ - rtlpriv->intf_ops->disable_aspm(hw); - rtstatus = _rtl92ce_init_mac(hw); - if (!rtstatus) { - RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n"); - err = 1; -- return err; -+ goto exit; - } - - err = rtl92c_download_fw(hw); -@@ -917,7 +929,7 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw) - RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, - "Failed to download FW. Init HW without FW now..\n"); - err = 1; -- return err; -+ goto exit; - } - - rtlhal->last_hmeboxnum = 0; -@@ -978,6 +990,8 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw) - RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "under 1.5V\n"); - } - rtl92c_dm_init(hw); -+exit: -+ local_irq_restore(flags); - rtlpci->being_init_adapter = false; - return err; - } -diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c -index 91d2e28..0908a3b 100644 ---- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c -+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c -@@ -985,19 +985,30 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw) - struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); - int err = 0; - static bool iqk_initialized; -+ unsigned long flags; -+ -+ /* As this function can take a very long time (up to 350 ms) -+ * and can be called with irqs disabled, reenable the irqs -+ * to let the other devices continue being serviced. -+ * -+ * It is safe doing so since our own interrupts will only be enabled -+ * in a subsequent step. -+ */ -+ local_save_flags(flags); -+ local_irq_enable(); - - rtlhal->hw_type = HARDWARE_TYPE_RTL8192CU; - err = _rtl92cu_init_mac(hw); - if (err) { - RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "init mac failed!\n"); -- return err; -+ goto exit; - } - err = rtl92c_download_fw(hw); - if (err) { - RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, - "Failed to download FW. Init HW without FW now..\n"); - err = 1; -- return err; -+ goto exit; - } - rtlhal->last_hmeboxnum = 0; /* h2c */ - _rtl92cu_phy_param_tab_init(hw); -@@ -1034,6 +1045,8 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw) - _InitPABias(hw); - _update_mac_setting(hw); - rtl92c_dm_init(hw); -+exit: -+ local_irq_restore(flags); - return err; - } - -diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c -index 025bdc2..4f7f822 100644 ---- a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c -+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c -@@ -762,7 +762,7 @@ static long _rtl92c_signal_scale_mapping(struct ieee80211_hw *hw, - - static void _rtl92c_query_rxphystatus(struct ieee80211_hw *hw, - struct rtl_stats *pstats, -- struct rx_desc_92c *pdesc, -+ struct rx_desc_92c *p_desc, - struct rx_fwinfo_92c *p_drvinfo, - bool packet_match_bssid, - bool packet_toself, -@@ -777,11 +777,11 @@ static void _rtl92c_query_rxphystatus(struct ieee80211_hw *hw, - u32 rssi, total_rssi = 0; - bool in_powersavemode = false; - bool is_cck_rate; -+ u8 *pdesc = (u8 *)p_desc; - -- is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc); -+ is_cck_rate = RX_HAL_IS_CCK_RATE(p_desc); - pstats->packet_matchbssid = packet_match_bssid; - pstats->packet_toself = packet_toself; -- pstats->is_cck = is_cck_rate; - pstats->packet_beacon = packet_beacon; - pstats->is_cck = is_cck_rate; - pstats->RX_SIGQ[0] = -1; -diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c b/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c -index 4763426..bbe9a78 100644 ---- a/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c -+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c -@@ -85,17 +85,15 @@ void rtl92cu_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw, - if (mac->act_scanning) { - tx_agc[RF90_PATH_A] = 0x3f3f3f3f; - tx_agc[RF90_PATH_B] = 0x3f3f3f3f; -- if (turbo_scanoff) { -- for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { -- tx_agc[idx1] = ppowerlevel[idx1] | -- (ppowerlevel[idx1] << 8) | -- (ppowerlevel[idx1] << 16) | -- (ppowerlevel[idx1] << 24); -- if (rtlhal->interface == INTF_USB) { -- if (tx_agc[idx1] > 0x20 && -- rtlefuse->external_pa) -- tx_agc[idx1] = 0x20; -- } -+ for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { -+ tx_agc[idx1] = ppowerlevel[idx1] | -+ (ppowerlevel[idx1] << 8) | -+ (ppowerlevel[idx1] << 16) | -+ (ppowerlevel[idx1] << 24); -+ if (rtlhal->interface == INTF_USB) { -+ if (tx_agc[idx1] > 0x20 && -+ rtlefuse->external_pa) -+ tx_agc[idx1] = 0x20; - } - } - } else { -@@ -107,7 +105,7 @@ void rtl92cu_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw, - TXHIGHPWRLEVEL_LEVEL2) { - tx_agc[RF90_PATH_A] = 0x00000000; - tx_agc[RF90_PATH_B] = 0x00000000; -- } else{ -+ } else { - for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { - tx_agc[idx1] = ppowerlevel[idx1] | - (ppowerlevel[idx1] << 8) | -@@ -379,7 +377,12 @@ static void _rtl92c_write_ofdm_power_reg(struct ieee80211_hw *hw, - regoffset == RTXAGC_B_MCS07_MCS04) - regoffset = 0xc98; - for (i = 0; i < 3; i++) { -- writeVal = (writeVal > 6) ? (writeVal - 6) : 0; -+ if (i != 2) -+ writeVal = (writeVal > 8) ? -+ (writeVal - 8) : 0; -+ else -+ writeVal = (writeVal > 6) ? -+ (writeVal - 6) : 0; - rtl_write_byte(rtlpriv, (u32)(regoffset + i), - (u8)writeVal); - } -diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c -index 3f869c9..2c4cdce 100644 ---- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c -+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c -@@ -306,6 +306,8 @@ static struct usb_device_id rtl8192c_usb_ids[] = { - {RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/ - {RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ - {RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ -+ {RTL_USB_DEVICE(0x0df6, 0x0070, rtl92cu_hal_cfg)}, /*Sitecom - 150N */ -+ {RTL_USB_DEVICE(0x0df6, 0x0077, rtl92cu_hal_cfg)}, /*Sitecom-WLA2100V2*/ - {RTL_USB_DEVICE(0x0eb0, 0x9071, rtl92cu_hal_cfg)}, /*NO Brand - Etop*/ - {RTL_USB_DEVICE(0x4856, 0x0091, rtl92cu_hal_cfg)}, /*NetweeN - Feixun*/ - /* HP - Lite-On ,8188CUS Slim Combo */ -diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c -index 21bc827..2fd8297 100644 ---- a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c -+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c -@@ -303,10 +303,10 @@ static enum rtl_desc_qsel _rtl8192cu_mq_to_descq(struct ieee80211_hw *hw, - bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw, - struct rtl_stats *stats, - struct ieee80211_rx_status *rx_status, -- u8 *p_desc, struct sk_buff *skb) -+ u8 *pdesc, struct sk_buff *skb) - { - struct rx_fwinfo_92c *p_drvinfo; -- struct rx_desc_92c *pdesc = (struct rx_desc_92c *)p_desc; -+ struct rx_desc_92c *p_desc = (struct rx_desc_92c *)pdesc; - u32 phystatus = GET_RX_DESC_PHY_STATUS(pdesc); - - stats->length = (u16) GET_RX_DESC_PKT_LEN(pdesc); -@@ -343,12 +343,13 @@ bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw, - (bool)GET_RX_DESC_PAGGR(pdesc)); - rx_status->mactime = GET_RX_DESC_TSFL(pdesc); - if (phystatus) { -- p_drvinfo = (struct rx_fwinfo_92c *)(pdesc + RTL_RX_DESC_SIZE); -- rtl92c_translate_rx_signal_stuff(hw, skb, stats, pdesc, -+ p_drvinfo = (struct rx_fwinfo_92c *)(skb->data + -+ stats->rx_bufshift); -+ rtl92c_translate_rx_signal_stuff(hw, skb, stats, p_desc, - p_drvinfo); - } - /*rx_status->qual = stats->signal; */ -- rx_status->signal = stats->rssi + 10; -+ rx_status->signal = stats->recvsignalpower + 10; - /*rx_status->noise = -stats->noise; */ - return true; - } -diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c -index a7f6126..1a2bbc2 100644 ---- a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c -+++ b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c -@@ -529,7 +529,7 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats, - p_drvinfo); - } - /*rx_status->qual = stats->signal; */ -- rx_status->signal = stats->rssi + 10; -+ rx_status->signal = stats->recvsignalpower + 10; - /*rx_status->noise = -stats->noise; */ - return true; - } -diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/hw.c b/drivers/net/wireless/rtlwifi/rtl8192se/hw.c -index b141c35..f90eb0c 100644 ---- a/drivers/net/wireless/rtlwifi/rtl8192se/hw.c -+++ b/drivers/net/wireless/rtlwifi/rtl8192se/hw.c -@@ -922,7 +922,7 @@ int rtl92se_hw_init(struct ieee80211_hw *hw) - struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); - struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); - u8 tmp_byte = 0; -- -+ unsigned long flags; - bool rtstatus = true; - u8 tmp_u1b; - int err = false; -@@ -934,6 +934,16 @@ int rtl92se_hw_init(struct ieee80211_hw *hw) - - rtlpci->being_init_adapter = true; - -+ /* As this function can take a very long time (up to 350 ms) -+ * and can be called with irqs disabled, reenable the irqs -+ * to let the other devices continue being serviced. -+ * -+ * It is safe doing so since our own interrupts will only be enabled -+ * in a subsequent step. -+ */ -+ local_save_flags(flags); -+ local_irq_enable(); -+ - rtlpriv->intf_ops->disable_aspm(hw); - - /* 1. MAC Initialize */ -@@ -951,7 +961,8 @@ int rtl92se_hw_init(struct ieee80211_hw *hw) - RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, - "Failed to download FW. Init HW without FW now... " - "Please copy FW into /lib/firmware/rtlwifi\n"); -- return 1; -+ err = 1; -+ goto exit; - } - - /* After FW download, we have to reset MAC register */ -@@ -964,7 +975,8 @@ int rtl92se_hw_init(struct ieee80211_hw *hw) - /* 3. Initialize MAC/PHY Config by MACPHY_reg.txt */ - if (!rtl92s_phy_mac_config(hw)) { - RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "MAC Config failed\n"); -- return rtstatus; -+ err = rtstatus; -+ goto exit; - } - - /* Make sure BB/RF write OK. We should prevent enter IPS. radio off. */ -@@ -974,7 +986,8 @@ int rtl92se_hw_init(struct ieee80211_hw *hw) - /* 4. Initialize BB After MAC Config PHY_reg.txt, AGC_Tab.txt */ - if (!rtl92s_phy_bb_config(hw)) { - RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG, "BB Config failed\n"); -- return rtstatus; -+ err = rtstatus; -+ goto exit; - } - - /* 5. Initiailze RF RAIO_A.txt RF RAIO_B.txt */ -@@ -1010,7 +1023,8 @@ int rtl92se_hw_init(struct ieee80211_hw *hw) - - if (!rtl92s_phy_rf_config(hw)) { - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "RF Config failed\n"); -- return rtstatus; -+ err = rtstatus; -+ goto exit; - } - - /* After read predefined TXT, we must set BB/MAC/RF -@@ -1084,8 +1098,9 @@ int rtl92se_hw_init(struct ieee80211_hw *hw) - - rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_ON); - rtl92s_dm_init(hw); -+exit: -+ local_irq_restore(flags); - rtlpci->being_init_adapter = false; -- - return err; - } - -diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/rf.c b/drivers/net/wireless/rtlwifi/rtl8192se/rf.c -index 08c2f56..c405f96 100644 ---- a/drivers/net/wireless/rtlwifi/rtl8192se/rf.c -+++ b/drivers/net/wireless/rtlwifi/rtl8192se/rf.c -@@ -268,7 +268,7 @@ static void _rtl92s_get_txpower_writeval_byregulatory(struct ieee80211_hw *hw, - rtlefuse->pwrgroup_ht40 - [RF90_PATH_A][chnl - 1]) { - pwrdiff_limit[i] = -- rtlefuse->pwrgroup_ht20 -+ rtlefuse->pwrgroup_ht40 - [RF90_PATH_A][chnl - 1]; - } - } else { -diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c -index 2fd3d13..94bbce8 100644 ---- a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c -+++ b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c -@@ -582,7 +582,7 @@ bool rtl92se_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats, - } - - /*rx_status->qual = stats->signal; */ -- rx_status->signal = stats->rssi + 10; -+ rx_status->signal = stats->recvsignalpower + 10; - /*rx_status->noise = -stats->noise; */ - - return true; -diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h -index 38c51ea..905fec4 100644 ---- a/drivers/net/wireless/rtlwifi/wifi.h -+++ b/drivers/net/wireless/rtlwifi/wifi.h -@@ -77,11 +77,7 @@ - #define RTL_SLOT_TIME_9 9 - #define RTL_SLOT_TIME_20 20 - --/*related with tcp/ip. */ --/*if_ehther.h*/ --#define ETH_P_PAE 0x888E /*Port Access Entity (IEEE 802.1X) */ --#define ETH_P_IP 0x0800 /*Internet Protocol packet */ --#define ETH_P_ARP 0x0806 /*Address Resolution packet */ -+/*related to tcp/ip. */ - #define SNAP_SIZE 6 - #define PROTOC_TYPE_SIZE 2 - -diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h -index 9d7f172..093bf0a 100644 ---- a/drivers/net/xen-netback/common.h -+++ b/drivers/net/xen-netback/common.h -@@ -88,6 +88,7 @@ struct xenvif { - unsigned long credit_usec; - unsigned long remaining_credit; - struct timer_list credit_timeout; -+ u64 credit_window_start; - - /* Statistics */ - unsigned long rx_gso_checksum_fixup; -diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c -index 221f426..cfaaf68 100644 ---- a/drivers/net/xen-netback/interface.c -+++ b/drivers/net/xen-netback/interface.c -@@ -273,8 +273,7 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid, - vif->credit_bytes = vif->remaining_credit = ~0UL; - vif->credit_usec = 0UL; - init_timer(&vif->credit_timeout); -- /* Initialize 'expires' now: it's used to track the credit window. */ -- vif->credit_timeout.expires = jiffies; -+ vif->credit_window_start = get_jiffies_64(); - - dev->netdev_ops = &xenvif_netdev_ops; - dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO; -diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c -index 0d22cff..cd4966b 100644 ---- a/drivers/net/xen-netback/netback.c -+++ b/drivers/net/xen-netback/netback.c -@@ -46,11 +46,25 @@ - #include - #include - -+/* -+ * This is the maximum slots a skb can have. If a guest sends a skb -+ * which exceeds this limit it is considered malicious. -+ */ -+#define MAX_SKB_SLOTS_DEFAULT 20 -+static unsigned int max_skb_slots = MAX_SKB_SLOTS_DEFAULT; -+module_param(max_skb_slots, uint, 0444); -+ -+typedef unsigned int pending_ring_idx_t; -+#define INVALID_PENDING_RING_IDX (~0U) -+ - struct pending_tx_info { -- struct xen_netif_tx_request req; -+ struct xen_netif_tx_request req; /* coalesced tx request */ - struct xenvif *vif; -+ pending_ring_idx_t head; /* head != INVALID_PENDING_RING_IDX -+ * if it is head of one or more tx -+ * reqs -+ */ - }; --typedef unsigned int pending_ring_idx_t; - - struct netbk_rx_meta { - int id; -@@ -101,7 +115,11 @@ struct xen_netbk { - atomic_t netfront_count; - - struct pending_tx_info pending_tx_info[MAX_PENDING_REQS]; -- struct gnttab_copy tx_copy_ops[MAX_PENDING_REQS]; -+ /* Coalescing tx requests before copying makes number of grant -+ * copy ops greater or equal to number of slots required. In -+ * worst case a tx request consumes 2 gnttab_copy. -+ */ -+ struct gnttab_copy tx_copy_ops[2*MAX_PENDING_REQS]; - - u16 pending_ring[MAX_PENDING_REQS]; - -@@ -117,6 +135,16 @@ struct xen_netbk { - static struct xen_netbk *xen_netbk; - static int xen_netbk_group_nr; - -+/* -+ * If head != INVALID_PENDING_RING_IDX, it means this tx request is head of -+ * one or more merged tx requests, otherwise it is the continuation of -+ * previous tx request. -+ */ -+static inline int pending_tx_is_head(struct xen_netbk *netbk, RING_IDX idx) -+{ -+ return netbk->pending_tx_info[idx].head != INVALID_PENDING_RING_IDX; -+} -+ - void xen_netbk_add_xenvif(struct xenvif *vif) - { - int i; -@@ -249,6 +277,7 @@ static int max_required_rx_slots(struct xenvif *vif) - { - int max = DIV_ROUND_UP(vif->dev->mtu, PAGE_SIZE); - -+ /* XXX FIXME: RX path dependent on MAX_SKB_FRAGS */ - if (vif->can_sg || vif->gso || vif->gso_prefix) - max += MAX_SKB_FRAGS + 1; /* extra_info + frags */ - -@@ -309,8 +338,8 @@ static bool start_new_rx_buffer(int offset, unsigned long size, int head) - * into multiple copies tend to give large frags their - * own buffers as before. - */ -- if ((offset + size > MAX_BUFFER_OFFSET) && -- (size <= MAX_BUFFER_OFFSET) && offset && !head) -+ BUG_ON(size > MAX_BUFFER_OFFSET); -+ if ((offset + size > MAX_BUFFER_OFFSET) && offset && !head) - return true; - - return false; -@@ -627,6 +656,7 @@ static void xen_netbk_rx_action(struct xen_netbk *netbk) - __skb_queue_tail(&rxq, skb); - - /* Filled the batch queue? */ -+ /* XXX FIXME: RX path dependent on MAX_SKB_FRAGS */ - if (count + MAX_SKB_FRAGS >= XEN_NETIF_RX_RING_SIZE) - break; - } -@@ -870,47 +900,88 @@ static void netbk_fatal_tx_err(struct xenvif *vif) - - static int netbk_count_requests(struct xenvif *vif, - struct xen_netif_tx_request *first, -+ RING_IDX first_idx, - struct xen_netif_tx_request *txp, - int work_to_do) - { - RING_IDX cons = vif->tx.req_cons; -- int frags = 0; -+ int slots = 0; -+ int drop_err = 0; - - if (!(first->flags & XEN_NETTXF_more_data)) - return 0; - - do { -- if (frags >= work_to_do) { -- netdev_err(vif->dev, "Need more frags\n"); -+ if (slots >= work_to_do) { -+ netdev_err(vif->dev, -+ "Asked for %d slots but exceeds this limit\n", -+ work_to_do); - netbk_fatal_tx_err(vif); - return -ENODATA; - } - -- if (unlikely(frags >= MAX_SKB_FRAGS)) { -- netdev_err(vif->dev, "Too many frags\n"); -+ /* This guest is really using too many slots and -+ * considered malicious. -+ */ -+ if (unlikely(slots >= max_skb_slots)) { -+ netdev_err(vif->dev, -+ "Malicious frontend using %d slots, threshold %u\n", -+ slots, max_skb_slots); - netbk_fatal_tx_err(vif); - return -E2BIG; - } - -- memcpy(txp, RING_GET_REQUEST(&vif->tx, cons + frags), -+ /* Xen network protocol had implicit dependency on -+ * MAX_SKB_FRAGS. XEN_NETIF_NR_SLOTS_MIN is set to the -+ * historical MAX_SKB_FRAGS value 18 to honor the same -+ * behavior as before. Any packet using more than 18 -+ * slots but less than max_skb_slots slots is dropped -+ */ -+ if (!drop_err && slots >= XEN_NETIF_NR_SLOTS_MIN) { -+ if (net_ratelimit()) -+ netdev_dbg(vif->dev, -+ "Too many slots (%d) exceeding limit (%d), dropping packet\n", -+ slots, XEN_NETIF_NR_SLOTS_MIN); -+ drop_err = -E2BIG; -+ } -+ -+ memcpy(txp, RING_GET_REQUEST(&vif->tx, cons + slots), - sizeof(*txp)); -- if (txp->size > first->size) { -- netdev_err(vif->dev, "Frag is bigger than frame.\n"); -- netbk_fatal_tx_err(vif); -- return -EIO; -+ -+ /* If the guest submitted a frame >= 64 KiB then -+ * first->size overflowed and following slots will -+ * appear to be larger than the frame. -+ * -+ * This cannot be fatal error as there are buggy -+ * frontends that do this. -+ * -+ * Consume all slots and drop the packet. -+ */ -+ if (!drop_err && txp->size > first->size) { -+ if (net_ratelimit()) -+ netdev_dbg(vif->dev, -+ "Invalid tx request, slot size %u > remaining size %u\n", -+ txp->size, first->size); -+ drop_err = -EIO; - } - - first->size -= txp->size; -- frags++; -+ slots++; - - if (unlikely((txp->offset + txp->size) > PAGE_SIZE)) { -- netdev_err(vif->dev, "txp->offset: %x, size: %u\n", -+ netdev_err(vif->dev, "Cross page boundary, txp->offset: %x, size: %u\n", - txp->offset, txp->size); - netbk_fatal_tx_err(vif); - return -EINVAL; - } - } while ((txp++)->flags & XEN_NETTXF_more_data); -- return frags; -+ -+ if (drop_err) { -+ netbk_tx_err(vif, first, first_idx + slots); -+ return drop_err; -+ } -+ -+ return slots; - } - - static struct page *xen_netbk_alloc_page(struct xen_netbk *netbk, -@@ -934,48 +1005,114 @@ static struct gnttab_copy *xen_netbk_get_requests(struct xen_netbk *netbk, - struct skb_shared_info *shinfo = skb_shinfo(skb); - skb_frag_t *frags = shinfo->frags; - u16 pending_idx = *((u16 *)skb->data); -- int i, start; -+ u16 head_idx = 0; -+ int slot, start; -+ struct page *page; -+ pending_ring_idx_t index, start_idx = 0; -+ uint16_t dst_offset; -+ unsigned int nr_slots; -+ struct pending_tx_info *first = NULL; -+ -+ /* At this point shinfo->nr_frags is in fact the number of -+ * slots, which can be as large as XEN_NETIF_NR_SLOTS_MIN. -+ */ -+ nr_slots = shinfo->nr_frags; - - /* Skip first skb fragment if it is on same page as header fragment. */ - start = (frag_get_pending_idx(&shinfo->frags[0]) == pending_idx); - -- for (i = start; i < shinfo->nr_frags; i++, txp++) { -- struct page *page; -- pending_ring_idx_t index; -+ /* Coalesce tx requests, at this point the packet passed in -+ * should be <= 64K. Any packets larger than 64K have been -+ * handled in netbk_count_requests(). -+ */ -+ for (shinfo->nr_frags = slot = start; slot < nr_slots; -+ shinfo->nr_frags++) { - struct pending_tx_info *pending_tx_info = - netbk->pending_tx_info; - -- index = pending_index(netbk->pending_cons++); -- pending_idx = netbk->pending_ring[index]; -- page = xen_netbk_alloc_page(netbk, pending_idx); -+ page = alloc_page(GFP_KERNEL|__GFP_COLD); - if (!page) - goto err; - -- gop->source.u.ref = txp->gref; -- gop->source.domid = vif->domid; -- gop->source.offset = txp->offset; -- -- gop->dest.u.gmfn = virt_to_mfn(page_address(page)); -- gop->dest.domid = DOMID_SELF; -- gop->dest.offset = txp->offset; -- -- gop->len = txp->size; -- gop->flags = GNTCOPY_source_gref; -+ dst_offset = 0; -+ first = NULL; -+ while (dst_offset < PAGE_SIZE && slot < nr_slots) { -+ gop->flags = GNTCOPY_source_gref; -+ -+ gop->source.u.ref = txp->gref; -+ gop->source.domid = vif->domid; -+ gop->source.offset = txp->offset; -+ -+ gop->dest.domid = DOMID_SELF; -+ -+ gop->dest.offset = dst_offset; -+ gop->dest.u.gmfn = virt_to_mfn(page_address(page)); -+ -+ if (dst_offset + txp->size > PAGE_SIZE) { -+ /* This page can only merge a portion -+ * of tx request. Do not increment any -+ * pointer / counter here. The txp -+ * will be dealt with in future -+ * rounds, eventually hitting the -+ * `else` branch. -+ */ -+ gop->len = PAGE_SIZE - dst_offset; -+ txp->offset += gop->len; -+ txp->size -= gop->len; -+ dst_offset += gop->len; /* quit loop */ -+ } else { -+ /* This tx request can be merged in the page */ -+ gop->len = txp->size; -+ dst_offset += gop->len; -+ -+ index = pending_index(netbk->pending_cons++); -+ -+ pending_idx = netbk->pending_ring[index]; -+ -+ memcpy(&pending_tx_info[pending_idx].req, txp, -+ sizeof(*txp)); -+ xenvif_get(vif); -+ -+ pending_tx_info[pending_idx].vif = vif; -+ -+ /* Poison these fields, corresponding -+ * fields for head tx req will be set -+ * to correct values after the loop. -+ */ -+ netbk->mmap_pages[pending_idx] = (void *)(~0UL); -+ pending_tx_info[pending_idx].head = -+ INVALID_PENDING_RING_IDX; -+ -+ if (!first) { -+ first = &pending_tx_info[pending_idx]; -+ start_idx = index; -+ head_idx = pending_idx; -+ } -+ -+ txp++; -+ slot++; -+ } - -- gop++; -+ gop++; -+ } - -- memcpy(&pending_tx_info[pending_idx].req, txp, sizeof(*txp)); -- xenvif_get(vif); -- pending_tx_info[pending_idx].vif = vif; -- frag_set_pending_idx(&frags[i], pending_idx); -+ first->req.offset = 0; -+ first->req.size = dst_offset; -+ first->head = start_idx; -+ set_page_ext(page, netbk, head_idx); -+ netbk->mmap_pages[head_idx] = page; -+ frag_set_pending_idx(&frags[shinfo->nr_frags], head_idx); - } - -+ BUG_ON(shinfo->nr_frags > MAX_SKB_FRAGS); -+ - return gop; - err: - /* Unwind, freeing all pages and sending error responses. */ -- while (i-- > start) { -- xen_netbk_idx_release(netbk, frag_get_pending_idx(&frags[i]), -- XEN_NETIF_RSP_ERROR); -+ while (shinfo->nr_frags-- > start) { -+ xen_netbk_idx_release(netbk, -+ frag_get_pending_idx(&frags[shinfo->nr_frags]), -+ XEN_NETIF_RSP_ERROR); - } - /* The head too, if necessary. */ - if (start) -@@ -991,8 +1128,10 @@ static int xen_netbk_tx_check_gop(struct xen_netbk *netbk, - struct gnttab_copy *gop = *gopp; - u16 pending_idx = *((u16 *)skb->data); - struct skb_shared_info *shinfo = skb_shinfo(skb); -+ struct pending_tx_info *tx_info; - int nr_frags = shinfo->nr_frags; - int i, err, start; -+ u16 peek; /* peek into next tx request */ - - /* Check status of header. */ - err = gop->status; -@@ -1004,11 +1143,20 @@ static int xen_netbk_tx_check_gop(struct xen_netbk *netbk, - - for (i = start; i < nr_frags; i++) { - int j, newerr; -+ pending_ring_idx_t head; - - pending_idx = frag_get_pending_idx(&shinfo->frags[i]); -+ tx_info = &netbk->pending_tx_info[pending_idx]; -+ head = tx_info->head; - - /* Check error status: if okay then remember grant handle. */ -- newerr = (++gop)->status; -+ do { -+ newerr = (++gop)->status; -+ if (newerr) -+ break; -+ peek = netbk->pending_ring[pending_index(++head)]; -+ } while (!pending_tx_is_head(netbk, peek)); -+ - if (likely(!newerr)) { - /* Had a previous error? Invalidate this fragment. */ - if (unlikely(err)) -@@ -1197,9 +1345,8 @@ static int checksum_setup(struct xenvif *vif, struct sk_buff *skb) - - static bool tx_credit_exceeded(struct xenvif *vif, unsigned size) - { -- unsigned long now = jiffies; -- unsigned long next_credit = -- vif->credit_timeout.expires + -+ u64 now = get_jiffies_64(); -+ u64 next_credit = vif->credit_window_start + - msecs_to_jiffies(vif->credit_usec / 1000); - - /* Timer could already be pending in rare cases. */ -@@ -1207,8 +1354,8 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size) - return true; - - /* Passed the point where we can replenish credit? */ -- if (time_after_eq(now, next_credit)) { -- vif->credit_timeout.expires = now; -+ if (time_after_eq64(now, next_credit)) { -+ vif->credit_window_start = now; - tx_add_credit(vif); - } - -@@ -1220,6 +1367,7 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size) - tx_credit_callback; - mod_timer(&vif->credit_timeout, - next_credit); -+ vif->credit_window_start = next_credit; - - return true; - } -@@ -1233,11 +1381,12 @@ static unsigned xen_netbk_tx_build_gops(struct xen_netbk *netbk) - struct sk_buff *skb; - int ret; - -- while (((nr_pending_reqs(netbk) + MAX_SKB_FRAGS) < MAX_PENDING_REQS) && -+ while ((nr_pending_reqs(netbk) + XEN_NETIF_NR_SLOTS_MIN -+ < MAX_PENDING_REQS) && - !list_empty(&netbk->net_schedule_list)) { - struct xenvif *vif; - struct xen_netif_tx_request txreq; -- struct xen_netif_tx_request txfrags[MAX_SKB_FRAGS]; -+ struct xen_netif_tx_request txfrags[max_skb_slots]; - struct page *page; - struct xen_netif_extra_info extras[XEN_NETIF_EXTRA_TYPE_MAX-1]; - u16 pending_idx; -@@ -1298,7 +1447,8 @@ static unsigned xen_netbk_tx_build_gops(struct xen_netbk *netbk) - continue; - } - -- ret = netbk_count_requests(vif, &txreq, txfrags, work_to_do); -+ ret = netbk_count_requests(vif, &txreq, idx, -+ txfrags, work_to_do); - if (unlikely(ret < 0)) - continue; - -@@ -1325,7 +1475,7 @@ static unsigned xen_netbk_tx_build_gops(struct xen_netbk *netbk) - pending_idx = netbk->pending_ring[index]; - - data_len = (txreq.size > PKT_PROT_LEN && -- ret < MAX_SKB_FRAGS) ? -+ ret < XEN_NETIF_NR_SLOTS_MIN) ? - PKT_PROT_LEN : txreq.size; - - skb = alloc_skb(data_len + NET_SKB_PAD + NET_IP_ALIGN, -@@ -1375,6 +1525,7 @@ static unsigned xen_netbk_tx_build_gops(struct xen_netbk *netbk) - memcpy(&netbk->pending_tx_info[pending_idx].req, - &txreq, sizeof(txreq)); - netbk->pending_tx_info[pending_idx].vif = vif; -+ netbk->pending_tx_info[pending_idx].head = index; - *((u16 *)skb->data) = pending_idx; - - __skb_put(skb, data_len); -@@ -1505,7 +1656,10 @@ static void xen_netbk_idx_release(struct xen_netbk *netbk, u16 pending_idx, - { - struct xenvif *vif; - struct pending_tx_info *pending_tx_info; -- pending_ring_idx_t index; -+ pending_ring_idx_t head; -+ u16 peek; /* peek into next tx request */ -+ -+ BUG_ON(netbk->mmap_pages[pending_idx] == (void *)(~0UL)); - - /* Already complete? */ - if (netbk->mmap_pages[pending_idx] == NULL) -@@ -1514,19 +1668,40 @@ static void xen_netbk_idx_release(struct xen_netbk *netbk, u16 pending_idx, - pending_tx_info = &netbk->pending_tx_info[pending_idx]; - - vif = pending_tx_info->vif; -+ head = pending_tx_info->head; - -- make_tx_response(vif, &pending_tx_info->req, status); -+ BUG_ON(!pending_tx_is_head(netbk, head)); -+ BUG_ON(netbk->pending_ring[pending_index(head)] != pending_idx); - -- index = pending_index(netbk->pending_prod++); -- netbk->pending_ring[index] = pending_idx; -+ do { -+ pending_ring_idx_t index; -+ pending_ring_idx_t idx = pending_index(head); -+ u16 info_idx = netbk->pending_ring[idx]; - -- xenvif_put(vif); -+ pending_tx_info = &netbk->pending_tx_info[info_idx]; -+ make_tx_response(vif, &pending_tx_info->req, status); -+ -+ /* Setting any number other than -+ * INVALID_PENDING_RING_IDX indicates this slot is -+ * starting a new packet / ending a previous packet. -+ */ -+ pending_tx_info->head = 0; -+ -+ index = pending_index(netbk->pending_prod++); -+ netbk->pending_ring[index] = netbk->pending_ring[info_idx]; -+ -+ xenvif_put(vif); -+ -+ peek = netbk->pending_ring[pending_index(++head)]; -+ -+ } while (!pending_tx_is_head(netbk, peek)); - - netbk->mmap_pages[pending_idx]->mapping = 0; - put_page(netbk->mmap_pages[pending_idx]); - netbk->mmap_pages[pending_idx] = NULL; - } - -+ - static void make_tx_response(struct xenvif *vif, - struct xen_netif_tx_request *txp, - s8 st) -@@ -1579,8 +1754,9 @@ static inline int rx_work_todo(struct xen_netbk *netbk) - static inline int tx_work_todo(struct xen_netbk *netbk) - { - -- if (((nr_pending_reqs(netbk) + MAX_SKB_FRAGS) < MAX_PENDING_REQS) && -- !list_empty(&netbk->net_schedule_list)) -+ if ((nr_pending_reqs(netbk) + XEN_NETIF_NR_SLOTS_MIN -+ < MAX_PENDING_REQS) && -+ !list_empty(&netbk->net_schedule_list)) - return 1; - - return 0; -@@ -1663,6 +1839,13 @@ static int __init netback_init(void) - if (!xen_domain()) - return -ENODEV; - -+ if (max_skb_slots < XEN_NETIF_NR_SLOTS_MIN) { -+ printk(KERN_INFO -+ "xen-netback: max_skb_slots too small (%d), bump it to XEN_NETIF_NR_SLOTS_MIN (%d)\n", -+ max_skb_slots, XEN_NETIF_NR_SLOTS_MIN); -+ max_skb_slots = XEN_NETIF_NR_SLOTS_MIN; -+ } -+ - xen_netbk_group_nr = num_online_cpus(); - xen_netbk = vzalloc(sizeof(struct xen_netbk) * xen_netbk_group_nr); - if (!xen_netbk) -diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c -index 796afbf..fe50f14 100644 ---- a/drivers/net/xen-netfront.c -+++ b/drivers/net/xen-netfront.c -@@ -36,7 +36,7 @@ - #include - #include - #include --#include -+#include - #include - #include - #include -@@ -492,6 +492,16 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev) - unsigned int len = skb_headlen(skb); - unsigned long flags; - -+ /* If skb->len is too big for wire format, drop skb and alert -+ * user about misconfiguration. -+ */ -+ if (unlikely(skb->len > XEN_NETIF_MAX_TX_SIZE)) { -+ net_alert_ratelimited( -+ "xennet: skb->len = %u, too big for wire format\n", -+ skb->len); -+ goto drop; -+ } -+ - frags += DIV_ROUND_UP(offset + len, PAGE_SIZE); - if (unlikely(frags > MAX_SKB_FRAGS + 1)) { - printk(KERN_ALERT "xennet: skb rides the rocket: %d frags\n", -@@ -1045,7 +1055,8 @@ static int xennet_poll(struct napi_struct *napi, int budget) - - static int xennet_change_mtu(struct net_device *dev, int mtu) - { -- int max = xennet_can_sg(dev) ? 65535 - ETH_HLEN : ETH_DATA_LEN; -+ int max = xennet_can_sg(dev) ? -+ XEN_NETIF_MAX_TX_SIZE - MAX_TCP_HEADER : ETH_DATA_LEN; - - if (mtu > max) - return -EINVAL; -@@ -1349,6 +1360,8 @@ static struct net_device * __devinit xennet_create_dev(struct xenbus_device *dev - SET_ETHTOOL_OPS(netdev, &xennet_ethtool_ops); - SET_NETDEV_DEV(netdev, &dev->dev); - -+ netif_set_gso_max_size(netdev, XEN_NETIF_MAX_TX_SIZE - MAX_TCP_HEADER); -+ - np->netdev = netdev; - - netif_carrier_off(netdev); -diff --git a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c -index 0cb64f5..a655ae2 100644 ---- a/drivers/parport/parport_pc.c -+++ b/drivers/parport/parport_pc.c -@@ -2875,8 +2875,6 @@ enum parport_pc_pci_cards { - syba_2p_epp, - syba_1p_ecp, - titan_010l, -- titan_1284p1, -- titan_1284p2, - avlab_1p, - avlab_2p, - oxsemi_952, -@@ -2935,8 +2933,6 @@ static struct parport_pc_pci { - /* syba_2p_epp AP138B */ { 2, { { 0, 0x078 }, { 0, 0x178 }, } }, - /* syba_1p_ecp W83787 */ { 1, { { 0, 0x078 }, } }, - /* titan_010l */ { 1, { { 3, -1 }, } }, -- /* titan_1284p1 */ { 1, { { 0, 1 }, } }, -- /* titan_1284p2 */ { 2, { { 0, 1 }, { 2, 3 }, } }, - /* avlab_1p */ { 1, { { 0, 1}, } }, - /* avlab_2p */ { 2, { { 0, 1}, { 2, 3 },} }, - /* The Oxford Semi cards are unusual: 954 doesn't support ECP, -@@ -2952,8 +2948,8 @@ static struct parport_pc_pci { - /* netmos_9705 */ { 1, { { 0, -1 }, } }, - /* netmos_9715 */ { 2, { { 0, 1 }, { 2, 3 },} }, - /* netmos_9755 */ { 2, { { 0, 1 }, { 2, 3 },} }, -- /* netmos_9805 */ { 1, { { 0, -1 }, } }, -- /* netmos_9815 */ { 2, { { 0, -1 }, { 2, -1 }, } }, -+ /* netmos_9805 */ { 1, { { 0, 1 }, } }, -+ /* netmos_9815 */ { 2, { { 0, 1 }, { 2, 3 }, } }, - /* netmos_9901 */ { 1, { { 0, -1 }, } }, - /* netmos_9865 */ { 1, { { 0, -1 }, } }, - /* quatech_sppxp100 */ { 1, { { 0, 1 }, } }, -@@ -2997,8 +2993,6 @@ static const struct pci_device_id parport_pc_pci_tbl[] = { - PCI_ANY_ID, PCI_ANY_ID, 0, 0, syba_1p_ecp }, - { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_010L, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, titan_010l }, -- { 0x9710, 0x9805, 0x1000, 0x0010, 0, 0, titan_1284p1 }, -- { 0x9710, 0x9815, 0x1000, 0x0020, 0, 0, titan_1284p2 }, - /* PCI_VENDOR_ID_AVLAB/Intek21 has another bunch of cards ...*/ - /* AFAVLAB_TK9902 */ - { 0x14db, 0x2120, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1p}, -diff --git a/drivers/pci/hotplug/shpchp.h b/drivers/pci/hotplug/shpchp.h -index 1b69d95..b849f995 100644 ---- a/drivers/pci/hotplug/shpchp.h -+++ b/drivers/pci/hotplug/shpchp.h -@@ -46,7 +46,6 @@ - extern bool shpchp_poll_mode; - extern int shpchp_poll_time; - extern bool shpchp_debug; --extern struct workqueue_struct *shpchp_wq; - - #define dbg(format, arg...) \ - do { \ -@@ -90,6 +89,7 @@ struct slot { - struct list_head slot_list; - struct delayed_work work; /* work for button event */ - struct mutex lock; -+ struct workqueue_struct *wq; - u8 hp_slot; - }; - -diff --git a/drivers/pci/hotplug/shpchp_core.c b/drivers/pci/hotplug/shpchp_core.c -index 5f1f0d9..dd37452 100644 ---- a/drivers/pci/hotplug/shpchp_core.c -+++ b/drivers/pci/hotplug/shpchp_core.c -@@ -39,7 +39,6 @@ - bool shpchp_debug; - bool shpchp_poll_mode; - int shpchp_poll_time; --struct workqueue_struct *shpchp_wq; - - #define DRIVER_VERSION "0.4" - #define DRIVER_AUTHOR "Dan Zink , Greg Kroah-Hartman , Dely Sy " -@@ -122,6 +121,14 @@ static int init_slots(struct controller *ctrl) - slot->device = ctrl->slot_device_offset + i; - slot->hpc_ops = ctrl->hpc_ops; - slot->number = ctrl->first_slot + (ctrl->slot_num_inc * i); -+ -+ snprintf(name, sizeof(name), "shpchp-%d", slot->number); -+ slot->wq = alloc_workqueue(name, 0, 0); -+ if (!slot->wq) { -+ retval = -ENOMEM; -+ goto error_info; -+ } -+ - mutex_init(&slot->lock); - INIT_DELAYED_WORK(&slot->work, shpchp_queue_pushbutton_work); - -@@ -141,7 +148,7 @@ static int init_slots(struct controller *ctrl) - if (retval) { - ctrl_err(ctrl, "pci_hp_register failed with error %d\n", - retval); -- goto error_info; -+ goto error_slotwq; - } - - get_power_status(hotplug_slot, &info->power_status); -@@ -153,6 +160,8 @@ static int init_slots(struct controller *ctrl) - } - - return 0; -+error_slotwq: -+ destroy_workqueue(slot->wq); - error_info: - kfree(info); - error_hpslot: -@@ -173,7 +182,7 @@ void cleanup_slots(struct controller *ctrl) - slot = list_entry(tmp, struct slot, slot_list); - list_del(&slot->slot_list); - cancel_delayed_work(&slot->work); -- flush_workqueue(shpchp_wq); -+ destroy_workqueue(slot->wq); - pci_hp_deregister(slot->hotplug_slot); - } - } -@@ -356,18 +365,12 @@ static struct pci_driver shpc_driver = { - - static int __init shpcd_init(void) - { -- int retval = 0; -- -- shpchp_wq = alloc_ordered_workqueue("shpchp", 0); -- if (!shpchp_wq) -- return -ENOMEM; -+ int retval; - - retval = pci_register_driver(&shpc_driver); - dbg("%s: pci_register_driver = %d\n", __func__, retval); - info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); -- if (retval) { -- destroy_workqueue(shpchp_wq); -- } -+ - return retval; - } - -@@ -375,7 +378,6 @@ static void __exit shpcd_cleanup(void) - { - dbg("unload_shpchpd()\n"); - pci_unregister_driver(&shpc_driver); -- destroy_workqueue(shpchp_wq); - info(DRIVER_DESC " version: " DRIVER_VERSION " unloaded\n"); - } - -diff --git a/drivers/pci/hotplug/shpchp_ctrl.c b/drivers/pci/hotplug/shpchp_ctrl.c -index bba5b3e..b888675 100644 ---- a/drivers/pci/hotplug/shpchp_ctrl.c -+++ b/drivers/pci/hotplug/shpchp_ctrl.c -@@ -51,7 +51,7 @@ static int queue_interrupt_event(struct slot *p_slot, u32 event_type) - info->p_slot = p_slot; - INIT_WORK(&info->work, interrupt_event_handler); - -- queue_work(shpchp_wq, &info->work); -+ queue_work(p_slot->wq, &info->work); - - return 0; - } -@@ -285,8 +285,8 @@ static int board_added(struct slot *p_slot) - return WRONG_BUS_FREQUENCY; - } - -- bsp = ctrl->pci_dev->bus->cur_bus_speed; -- msp = ctrl->pci_dev->bus->max_bus_speed; -+ bsp = ctrl->pci_dev->subordinate->cur_bus_speed; -+ msp = ctrl->pci_dev->subordinate->max_bus_speed; - - /* Check if there are other slots or devices on the same bus */ - if (!list_empty(&ctrl->pci_dev->subordinate->devices)) -@@ -456,7 +456,7 @@ void shpchp_queue_pushbutton_work(struct work_struct *work) - kfree(info); - goto out; - } -- queue_work(shpchp_wq, &info->work); -+ queue_work(p_slot->wq, &info->work); - out: - mutex_unlock(&p_slot->lock); - } -@@ -504,7 +504,7 @@ static void handle_button_press_event(struct slot *p_slot) - p_slot->hpc_ops->green_led_blink(p_slot); - p_slot->hpc_ops->set_attention_status(p_slot, 0); - -- queue_delayed_work(shpchp_wq, &p_slot->work, 5*HZ); -+ queue_delayed_work(p_slot->wq, &p_slot->work, 5*HZ); - break; - case BLINKINGOFF_STATE: - case BLINKINGON_STATE: -diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c -index 2ab18ec..92f38e7 100644 ---- a/drivers/pci/pci-driver.c -+++ b/drivers/pci/pci-driver.c -@@ -663,6 +663,7 @@ static int pci_pm_suspend(struct device *dev) - goto Fixup; - } - -+ pci_dev->state_saved = false; - if (pm->suspend) { - pci_power_t prev = pci_dev->current_state; - int error; -@@ -809,6 +810,7 @@ static int pci_pm_freeze(struct device *dev) - return 0; - } - -+ pci_dev->state_saved = false; - if (pm->freeze) { - int error; - -@@ -897,6 +899,7 @@ static int pci_pm_poweroff(struct device *dev) - goto Fixup; - } - -+ pci_dev->state_saved = false; - if (pm->poweroff) { - int error; - -@@ -1015,6 +1018,7 @@ static int pci_pm_runtime_suspend(struct device *dev) - if (!pm || !pm->runtime_suspend) - return -ENOSYS; - -+ pci_dev->state_saved = false; - error = pm->runtime_suspend(dev); - suspend_report_result(pm->runtime_suspend, error); - if (error) -diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c -index d08c0d8..4cdd2bc 100644 ---- a/drivers/pci/pci.c -+++ b/drivers/pci/pci.c -@@ -1984,10 +1984,6 @@ void pci_enable_ari(struct pci_dev *dev) - if (pcie_ari_disabled || !pci_is_pcie(dev) || dev->devfn) - return; - -- pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI); -- if (!pos) -- return; -- - bridge = dev->bus->self; - if (!bridge || !pci_is_pcie(bridge)) - return; -@@ -2006,10 +2002,14 @@ void pci_enable_ari(struct pci_dev *dev) - return; - - pci_read_config_word(bridge, pos + PCI_EXP_DEVCTL2, &ctrl); -- ctrl |= PCI_EXP_DEVCTL2_ARI; -+ if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI)) { -+ ctrl |= PCI_EXP_DEVCTL2_ARI; -+ bridge->ari_enabled = 1; -+ } else { -+ ctrl &= ~PCI_EXP_DEVCTL2_ARI; -+ bridge->ari_enabled = 0; -+ } - pci_write_config_word(bridge, pos + PCI_EXP_DEVCTL2, ctrl); -- -- bridge->ari_enabled = 1; - } - - /** -@@ -3610,7 +3610,7 @@ int pci_set_vga_state(struct pci_dev *dev, bool decode, - u16 cmd; - int rc; - -- WARN_ON((flags & PCI_VGA_STATE_CHANGE_DECODES) & (command_bits & ~(PCI_COMMAND_IO|PCI_COMMAND_MEMORY))); -+ WARN_ON((flags & PCI_VGA_STATE_CHANGE_DECODES) && (command_bits & ~(PCI_COMMAND_IO|PCI_COMMAND_MEMORY))); - - /* ARCH specific VGA enables */ - rc = pci_set_vga_state_arch(dev, decode, command_bits, flags); -diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c -index 474f22f..c9ce611 100644 ---- a/drivers/pci/pcie/aspm.c -+++ b/drivers/pci/pcie/aspm.c -@@ -583,6 +583,9 @@ void pcie_aspm_init_link_state(struct pci_dev *pdev) - struct pcie_link_state *link; - int blacklist = !!pcie_aspm_sanity_check(pdev); - -+ if (!aspm_support_enabled) -+ return; -+ - if (!pci_is_pcie(pdev) || pdev->link_state) - return; - if (pdev->pcie_type != PCI_EXP_TYPE_ROOT_PORT && -diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c -index e0610bd..7e41b70 100644 ---- a/drivers/pci/pcie/portdrv_pci.c -+++ b/drivers/pci/pcie/portdrv_pci.c -@@ -151,7 +151,6 @@ static int __devinit pcie_portdrv_probe(struct pci_dev *dev, - static void pcie_portdrv_remove(struct pci_dev *dev) - { - pcie_port_device_remove(dev); -- pci_disable_device(dev); - } - - static int error_detected_iter(struct device *device, void *data) -diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c -index 103c95e..61bc33e 100644 ---- a/drivers/pci/quirks.c -+++ b/drivers/pci/quirks.c -@@ -2921,6 +2921,7 @@ static void __devinit disable_igfx_irq(struct pci_dev *dev) - } - DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0102, disable_igfx_irq); - DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq); -+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0152, disable_igfx_irq); - - static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, - struct pci_fixup *end) -diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c -index eea85da..be76eba 100644 ---- a/drivers/pci/setup-res.c -+++ b/drivers/pci/setup-res.c -@@ -206,7 +206,8 @@ static int pci_revert_fw_address(struct resource *res, struct pci_dev *dev, - return ret; - } - --static int _pci_assign_resource(struct pci_dev *dev, int resno, int size, resource_size_t min_align) -+static int _pci_assign_resource(struct pci_dev *dev, int resno, -+ resource_size_t size, resource_size_t min_align) - { - struct resource *res = dev->resource + resno; - struct pci_bus *bus; -diff --git a/drivers/platform/x86/hp_accel.c b/drivers/platform/x86/hp_accel.c -index fdacfce..0076fea 100644 ---- a/drivers/platform/x86/hp_accel.c -+++ b/drivers/platform/x86/hp_accel.c -@@ -77,6 +77,7 @@ static inline void delayed_sysfs_set(struct led_classdev *led_cdev, - static struct acpi_device_id lis3lv02d_device_ids[] = { - {"HPQ0004", 0}, /* HP Mobile Data Protection System PNP */ - {"HPQ6000", 0}, /* HP Mobile Data Protection System PNP */ -+ {"HPQ6007", 0}, /* HP Mobile Data Protection System PNP */ - {"", 0}, - }; - MODULE_DEVICE_TABLE(acpi, lis3lv02d_device_ids); -diff --git a/drivers/platform/x86/msi-wmi.c b/drivers/platform/x86/msi-wmi.c -index 2264331..b96766b 100644 ---- a/drivers/platform/x86/msi-wmi.c -+++ b/drivers/platform/x86/msi-wmi.c -@@ -176,7 +176,7 @@ static void msi_wmi_notify(u32 value, void *context) - pr_debug("Suppressed key event 0x%X - " - "Last press was %lld us ago\n", - key->code, ktime_to_us(diff)); -- return; -+ goto msi_wmi_notify_exit; - } - last_pressed[key->code - SCANCODE_BASE] = cur; - -@@ -195,6 +195,8 @@ static void msi_wmi_notify(u32 value, void *context) - pr_info("Unknown key pressed - %x\n", eventcode); - } else - pr_info("Unknown event received\n"); -+ -+msi_wmi_notify_exit: - kfree(response.pointer); - } - -diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c -index f08aee6..aa232de 100644 ---- a/drivers/platform/x86/thinkpad_acpi.c -+++ b/drivers/platform/x86/thinkpad_acpi.c -@@ -3402,7 +3402,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm) - /* Do not issue duplicate brightness change events to - * userspace. tpacpi_detect_brightness_capabilities() must have - * been called before this point */ -- if (tp_features.bright_acpimode && acpi_video_backlight_support()) { -+ if (acpi_video_backlight_support()) { - pr_info("This ThinkPad has standard ACPI backlight " - "brightness control, supported by the ACPI " - "video driver\n"); -diff --git a/drivers/power/max17040_battery.c b/drivers/power/max17040_battery.c -index c284143..ec8b948 100644 ---- a/drivers/power/max17040_battery.c -+++ b/drivers/power/max17040_battery.c -@@ -148,7 +148,7 @@ static void max17040_get_online(struct i2c_client *client) - { - struct max17040_chip *chip = i2c_get_clientdata(client); - -- if (chip->pdata->battery_online) -+ if (chip->pdata && chip->pdata->battery_online) - chip->online = chip->pdata->battery_online(); - else - chip->online = 1; -@@ -158,7 +158,8 @@ static void max17040_get_status(struct i2c_client *client) - { - struct max17040_chip *chip = i2c_get_clientdata(client); - -- if (!chip->pdata->charger_online || !chip->pdata->charger_enable) { -+ if (!chip->pdata || !chip->pdata->charger_online -+ || !chip->pdata->charger_enable) { - chip->status = POWER_SUPPLY_STATUS_UNKNOWN; - return; - } -diff --git a/drivers/pps/clients/pps-ldisc.c b/drivers/pps/clients/pps-ldisc.c -index 79451f2..60cee9e 100644 ---- a/drivers/pps/clients/pps-ldisc.c -+++ b/drivers/pps/clients/pps-ldisc.c -@@ -31,7 +31,7 @@ - static void pps_tty_dcd_change(struct tty_struct *tty, unsigned int status, - struct pps_event_time *ts) - { -- struct pps_device *pps = (struct pps_device *)tty->disc_data; -+ struct pps_device *pps = pps_lookup_dev(tty); - - BUG_ON(pps == NULL); - -@@ -67,9 +67,9 @@ static int pps_tty_open(struct tty_struct *tty) - pr_err("cannot register PPS source \"%s\"\n", info.path); - return -ENOMEM; - } -- tty->disc_data = pps; -+ pps->lookup_cookie = tty; - -- /* Should open N_TTY ldisc too */ -+ /* Now open the base class N_TTY ldisc */ - ret = alias_n_tty_open(tty); - if (ret < 0) { - pr_err("cannot open tty ldisc \"%s\"\n", info.path); -@@ -81,7 +81,6 @@ static int pps_tty_open(struct tty_struct *tty) - return 0; - - err_unregister: -- tty->disc_data = NULL; - pps_unregister_source(pps); - return ret; - } -@@ -90,11 +89,10 @@ static void (*alias_n_tty_close)(struct tty_struct *tty); - - static void pps_tty_close(struct tty_struct *tty) - { -- struct pps_device *pps = (struct pps_device *)tty->disc_data; -+ struct pps_device *pps = pps_lookup_dev(tty); - - alias_n_tty_close(tty); - -- tty->disc_data = NULL; - dev_info(pps->dev, "removed\n"); - pps_unregister_source(pps); - } -diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c -index 98fbe62..f129f4d 100644 ---- a/drivers/pps/pps.c -+++ b/drivers/pps/pps.c -@@ -247,12 +247,15 @@ static int pps_cdev_open(struct inode *inode, struct file *file) - struct pps_device *pps = container_of(inode->i_cdev, - struct pps_device, cdev); - file->private_data = pps; -- -+ kobject_get(&pps->dev->kobj); - return 0; - } - - static int pps_cdev_release(struct inode *inode, struct file *file) - { -+ struct pps_device *pps = container_of(inode->i_cdev, -+ struct pps_device, cdev); -+ kobject_put(&pps->dev->kobj); - return 0; - } - -@@ -274,8 +277,10 @@ static void pps_device_destruct(struct device *dev) - { - struct pps_device *pps = dev_get_drvdata(dev); - -- /* release id here to protect others from using it while it's -- * still in use */ -+ cdev_del(&pps->cdev); -+ -+ /* Now we can release the ID for re-use */ -+ pr_debug("deallocating pps%d\n", pps->id); - mutex_lock(&pps_idr_lock); - idr_remove(&pps_idr, pps->id); - mutex_unlock(&pps_idr_lock); -@@ -330,6 +335,7 @@ int pps_register_cdev(struct pps_device *pps) - if (IS_ERR(pps->dev)) - goto del_cdev; - -+ /* Override the release function with our own */ - pps->dev->release = pps_device_destruct; - - pr_debug("source %s got cdev (%d:%d)\n", pps->info.name, -@@ -350,11 +356,44 @@ int pps_register_cdev(struct pps_device *pps) - - void pps_unregister_cdev(struct pps_device *pps) - { -+ pr_debug("unregistering pps%d\n", pps->id); -+ pps->lookup_cookie = NULL; - device_destroy(pps_class, pps->dev->devt); -- cdev_del(&pps->cdev); - } - - /* -+ * Look up a pps device by magic cookie. -+ * The cookie is usually a pointer to some enclosing device, but this -+ * code doesn't care; you should never be dereferencing it. -+ * -+ * This is a bit of a kludge that is currently used only by the PPS -+ * serial line discipline. It may need to be tweaked when a second user -+ * is found. -+ * -+ * There is no function interface for setting the lookup_cookie field. -+ * It's initialized to NULL when the pps device is created, and if a -+ * client wants to use it, just fill it in afterward. -+ * -+ * The cookie is automatically set to NULL in pps_unregister_source() -+ * so that it will not be used again, even if the pps device cannot -+ * be removed from the idr due to pending references holding the minor -+ * number in use. -+ */ -+struct pps_device *pps_lookup_dev(void const *cookie) -+{ -+ struct pps_device *pps; -+ unsigned id; -+ -+ rcu_read_lock(); -+ idr_for_each_entry(&pps_idr, pps, id) -+ if (cookie == pps->lookup_cookie) -+ break; -+ rcu_read_unlock(); -+ return pps; -+} -+EXPORT_SYMBOL(pps_lookup_dev); -+ -+/* - * Module stuff - */ - -diff --git a/drivers/rapidio/devices/tsi721.c b/drivers/rapidio/devices/tsi721.c -index 33471e1..84eab3f 100644 ---- a/drivers/rapidio/devices/tsi721.c -+++ b/drivers/rapidio/devices/tsi721.c -@@ -475,6 +475,10 @@ static irqreturn_t tsi721_irqhandler(int irq, void *ptr) - u32 intval; - u32 ch_inte; - -+ /* For MSI mode disable all device-level interrupts */ -+ if (priv->flags & TSI721_USING_MSI) -+ iowrite32(0, priv->regs + TSI721_DEV_INTE); -+ - dev_int = ioread32(priv->regs + TSI721_DEV_INT); - if (!dev_int) - return IRQ_NONE; -@@ -548,6 +552,13 @@ static irqreturn_t tsi721_irqhandler(int irq, void *ptr) - tsi721_pw_handler(mport); - } - -+ /* For MSI mode re-enable device-level interrupts */ -+ if (priv->flags & TSI721_USING_MSI) { -+ dev_int = TSI721_DEV_INT_SR2PC_CH | TSI721_DEV_INT_SRIO | -+ TSI721_DEV_INT_SMSG_CH; -+ iowrite32(dev_int, priv->regs + TSI721_DEV_INTE); -+ } -+ - return IRQ_HANDLED; - } - -diff --git a/drivers/regulator/max8997.c b/drivers/regulator/max8997.c -index 17a58c5..8350f50 100644 ---- a/drivers/regulator/max8997.c -+++ b/drivers/regulator/max8997.c -@@ -71,26 +71,26 @@ struct voltage_map_desc { - unsigned int n_bits; - }; - --/* Voltage maps in mV */ -+/* Voltage maps in uV */ - static const struct voltage_map_desc ldo_voltage_map_desc = { -- .min = 800, .max = 3950, .step = 50, .n_bits = 6, -+ .min = 800000, .max = 3950000, .step = 50000, .n_bits = 6, - }; /* LDO1 ~ 18, 21 all */ - - static const struct voltage_map_desc buck1245_voltage_map_desc = { -- .min = 650, .max = 2225, .step = 25, .n_bits = 6, -+ .min = 650000, .max = 2225000, .step = 25000, .n_bits = 6, - }; /* Buck1, 2, 4, 5 */ - - static const struct voltage_map_desc buck37_voltage_map_desc = { -- .min = 750, .max = 3900, .step = 50, .n_bits = 6, -+ .min = 750000, .max = 3900000, .step = 50000, .n_bits = 6, - }; /* Buck3, 7 */ - --/* current map in mA */ -+/* current map in uA */ - static const struct voltage_map_desc charger_current_map_desc = { -- .min = 200, .max = 950, .step = 50, .n_bits = 4, -+ .min = 200000, .max = 950000, .step = 50000, .n_bits = 4, - }; - - static const struct voltage_map_desc topoff_current_map_desc = { -- .min = 50, .max = 200, .step = 10, .n_bits = 4, -+ .min = 50000, .max = 200000, .step = 10000, .n_bits = 4, - }; - - static const struct voltage_map_desc *reg_voltage_map[] = { -@@ -194,7 +194,7 @@ static int max8997_list_voltage(struct regulator_dev *rdev, - if (val > desc->max) - return -EINVAL; - -- return val * 1000; -+ return val; - } - - static int max8997_get_enable_register(struct regulator_dev *rdev, -@@ -496,7 +496,6 @@ static int max8997_set_voltage_ldobuck(struct regulator_dev *rdev, - { - struct max8997_data *max8997 = rdev_get_drvdata(rdev); - struct i2c_client *i2c = max8997->iodev->i2c; -- int min_vol = min_uV / 1000, max_vol = max_uV / 1000; - const struct voltage_map_desc *desc; - int rid = rdev_get_id(rdev); - int reg, shift = 0, mask, ret; -@@ -522,7 +521,7 @@ static int max8997_set_voltage_ldobuck(struct regulator_dev *rdev, - - desc = reg_voltage_map[rid]; - -- i = max8997_get_voltage_proper_val(desc, min_vol, max_vol); -+ i = max8997_get_voltage_proper_val(desc, min_uV, max_uV); - if (i < 0) - return i; - -@@ -541,7 +540,7 @@ static int max8997_set_voltage_ldobuck(struct regulator_dev *rdev, - /* If the voltage is increasing */ - if (org < i) - udelay(DIV_ROUND_UP(desc->step * (i - org), -- max8997->ramp_delay)); -+ max8997->ramp_delay * 1000)); - } - - return ret; -@@ -640,7 +639,6 @@ static int max8997_set_voltage_buck(struct regulator_dev *rdev, - const struct voltage_map_desc *desc; - int new_val, new_idx, damage, tmp_val, tmp_idx, tmp_dmg; - bool gpio_dvs_mode = false; -- int min_vol = min_uV / 1000, max_vol = max_uV / 1000; - - if (rid < MAX8997_BUCK1 || rid > MAX8997_BUCK7) - return -EINVAL; -@@ -665,7 +663,7 @@ static int max8997_set_voltage_buck(struct regulator_dev *rdev, - selector); - - desc = reg_voltage_map[rid]; -- new_val = max8997_get_voltage_proper_val(desc, min_vol, max_vol); -+ new_val = max8997_get_voltage_proper_val(desc, min_uV, max_uV); - if (new_val < 0) - return new_val; - -@@ -997,8 +995,8 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) - max8997->buck1_vol[i] = ret = - max8997_get_voltage_proper_val( - &buck1245_voltage_map_desc, -- pdata->buck1_voltage[i] / 1000, -- pdata->buck1_voltage[i] / 1000 + -+ pdata->buck1_voltage[i], -+ pdata->buck1_voltage[i] + - buck1245_voltage_map_desc.step); - if (ret < 0) - goto err_alloc; -@@ -1006,8 +1004,8 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) - max8997->buck2_vol[i] = ret = - max8997_get_voltage_proper_val( - &buck1245_voltage_map_desc, -- pdata->buck2_voltage[i] / 1000, -- pdata->buck2_voltage[i] / 1000 + -+ pdata->buck2_voltage[i], -+ pdata->buck2_voltage[i] + - buck1245_voltage_map_desc.step); - if (ret < 0) - goto err_alloc; -@@ -1015,8 +1013,8 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) - max8997->buck5_vol[i] = ret = - max8997_get_voltage_proper_val( - &buck1245_voltage_map_desc, -- pdata->buck5_voltage[i] / 1000, -- pdata->buck5_voltage[i] / 1000 + -+ pdata->buck5_voltage[i], -+ pdata->buck5_voltage[i] + - buck1245_voltage_map_desc.step); - if (ret < 0) - goto err_alloc; -diff --git a/drivers/regulator/max8998.c b/drivers/regulator/max8998.c -index 5890265..1300383 100644 ---- a/drivers/regulator/max8998.c -+++ b/drivers/regulator/max8998.c -@@ -492,7 +492,7 @@ static int max8998_set_voltage_buck(struct regulator_dev *rdev, - - difference = desc->min + desc->step*i - previous_vol/1000; - if (difference > 0) -- udelay(difference / ((val & 0x0f) + 1)); -+ udelay(DIV_ROUND_UP(difference, (val & 0x0f) + 1)); - - return ret; - } -diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c -index dc474bc..7029c80 100644 ---- a/drivers/rtc/rtc-at91rm9200.c -+++ b/drivers/rtc/rtc-at91rm9200.c -@@ -162,6 +162,8 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) - - at91_alarm_year = tm.tm_year; - -+ tm.tm_mon = alrm->time.tm_mon; -+ tm.tm_mday = alrm->time.tm_mday; - tm.tm_hour = alrm->time.tm_hour; - tm.tm_min = alrm->time.tm_min; - tm.tm_sec = alrm->time.tm_sec; -diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c -index 5f8844c..5f2eddb 100644 ---- a/drivers/rtc/rtc-cmos.c -+++ b/drivers/rtc/rtc-cmos.c -@@ -34,11 +34,11 @@ - #include - #include - #include --#include - #include - #include - #include - #include -+#include - - /* this is for "generic access to PC-style RTC" using CMOS_READ/CMOS_WRITE */ - #include -@@ -377,6 +377,51 @@ static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t) - return 0; - } - -+/* -+ * Do not disable RTC alarm on shutdown - workaround for b0rked BIOSes. -+ */ -+static bool alarm_disable_quirk; -+ -+static int __init set_alarm_disable_quirk(const struct dmi_system_id *id) -+{ -+ alarm_disable_quirk = true; -+ pr_info("rtc-cmos: BIOS has alarm-disable quirk. "); -+ pr_info("RTC alarms disabled\n"); -+ return 0; -+} -+ -+static const struct dmi_system_id rtc_quirks[] __initconst = { -+ /* https://bugzilla.novell.com/show_bug.cgi?id=805740 */ -+ { -+ .callback = set_alarm_disable_quirk, -+ .ident = "IBM Truman", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), -+ DMI_MATCH(DMI_PRODUCT_NAME, "4852570"), -+ }, -+ }, -+ /* https://bugzilla.novell.com/show_bug.cgi?id=812592 */ -+ { -+ .callback = set_alarm_disable_quirk, -+ .ident = "Gigabyte GA-990XA-UD3", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, -+ "Gigabyte Technology Co., Ltd."), -+ DMI_MATCH(DMI_PRODUCT_NAME, "GA-990XA-UD3"), -+ }, -+ }, -+ /* http://permalink.gmane.org/gmane.linux.kernel/1604474 */ -+ { -+ .callback = set_alarm_disable_quirk, -+ .ident = "Toshiba Satellite L300", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), -+ DMI_MATCH(DMI_PRODUCT_NAME, "Satellite L300"), -+ }, -+ }, -+ {} -+}; -+ - static int cmos_alarm_irq_enable(struct device *dev, unsigned int enabled) - { - struct cmos_rtc *cmos = dev_get_drvdata(dev); -@@ -385,6 +430,9 @@ static int cmos_alarm_irq_enable(struct device *dev, unsigned int enabled) - if (!is_valid_irq(cmos->irq)) - return -EINVAL; - -+ if (alarm_disable_quirk) -+ return 0; -+ - spin_lock_irqsave(&rtc_lock, flags); - - if (enabled) -@@ -1166,6 +1214,8 @@ static int __init cmos_init(void) - platform_driver_registered = true; - } - -+ dmi_check_system(rtc_quirks); -+ - if (retval == 0) - return 0; - -diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c -index f027c06..65ef56f 100644 ---- a/drivers/rtc/rtc-pl031.c -+++ b/drivers/rtc/rtc-pl031.c -@@ -44,6 +44,7 @@ - #define RTC_YMR 0x34 /* Year match register */ - #define RTC_YLR 0x38 /* Year data load register */ - -+#define RTC_CR_EN (1 << 0) /* counter enable bit */ - #define RTC_CR_CWEN (1 << 26) /* Clockwatch enable bit */ - - #define RTC_TCR_EN (1 << 1) /* Periodic timer enable bit */ -@@ -312,7 +313,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id) - int ret; - struct pl031_local *ldata; - struct rtc_class_ops *ops = id->data; -- unsigned long time; -+ unsigned long time, data; - - ret = amba_request_regions(adev, NULL); - if (ret) -@@ -339,10 +340,13 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id) - dev_dbg(&adev->dev, "designer ID = 0x%02x\n", ldata->hw_designer); - dev_dbg(&adev->dev, "revision = 0x%01x\n", ldata->hw_revision); - -+ data = readl(ldata->base + RTC_CR); - /* Enable the clockwatch on ST Variants */ - if (ldata->hw_designer == AMBA_VENDOR_ST) -- writel(readl(ldata->base + RTC_CR) | RTC_CR_CWEN, -- ldata->base + RTC_CR); -+ data |= RTC_CR_CWEN; -+ else -+ data |= RTC_CR_EN; -+ writel(data, ldata->base + RTC_CR); - - /* - * On ST PL031 variants, the RTC reset value does not provide correct -diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c -index 8334dad..be56590 100644 ---- a/drivers/s390/net/qeth_core_main.c -+++ b/drivers/s390/net/qeth_core_main.c -@@ -4357,7 +4357,7 @@ int qeth_snmp_command(struct qeth_card *card, char __user *udata) - struct qeth_cmd_buffer *iob; - struct qeth_ipa_cmd *cmd; - struct qeth_snmp_ureq *ureq; -- int req_len; -+ unsigned int req_len; - struct qeth_arp_query_info qinfo = {0, }; - int rc = 0; - -@@ -4373,6 +4373,10 @@ int qeth_snmp_command(struct qeth_card *card, char __user *udata) - /* skip 4 bytes (data_len struct member) to get req_len */ - if (copy_from_user(&req_len, udata + sizeof(int), sizeof(int))) - return -EFAULT; -+ if (req_len > (QETH_BUFSIZE - IPA_PDU_HEADER_SIZE - -+ sizeof(struct qeth_ipacmd_hdr) - -+ sizeof(struct qeth_ipacmd_setadpparms_hdr))) -+ return -EINVAL; - ureq = memdup_user(udata, req_len + sizeof(struct qeth_snmp_ureq_hdr)); - if (IS_ERR(ureq)) { - QETH_CARD_TEXT(card, 2, "snmpnome"); -diff --git a/drivers/sbus/char/bbc_envctrl.c b/drivers/sbus/char/bbc_envctrl.c -index 160e751..0787b97 100644 ---- a/drivers/sbus/char/bbc_envctrl.c -+++ b/drivers/sbus/char/bbc_envctrl.c -@@ -452,6 +452,9 @@ static void attach_one_temp(struct bbc_i2c_bus *bp, struct platform_device *op, - if (!tp) - return; - -+ INIT_LIST_HEAD(&tp->bp_list); -+ INIT_LIST_HEAD(&tp->glob_list); -+ - tp->client = bbc_i2c_attach(bp, op); - if (!tp->client) { - kfree(tp); -@@ -497,6 +500,9 @@ static void attach_one_fan(struct bbc_i2c_bus *bp, struct platform_device *op, - if (!fp) - return; - -+ INIT_LIST_HEAD(&fp->bp_list); -+ INIT_LIST_HEAD(&fp->glob_list); -+ - fp->client = bbc_i2c_attach(bp, op); - if (!fp->client) { - kfree(fp); -diff --git a/drivers/sbus/char/bbc_i2c.c b/drivers/sbus/char/bbc_i2c.c -index 5426682..7179f72 100644 ---- a/drivers/sbus/char/bbc_i2c.c -+++ b/drivers/sbus/char/bbc_i2c.c -@@ -301,13 +301,18 @@ static struct bbc_i2c_bus * __init attach_one_i2c(struct platform_device *op, in - if (!bp) - return NULL; - -+ INIT_LIST_HEAD(&bp->temps); -+ INIT_LIST_HEAD(&bp->fans); -+ - bp->i2c_control_regs = of_ioremap(&op->resource[0], 0, 0x2, "bbc_i2c_regs"); - if (!bp->i2c_control_regs) - goto fail; - -- bp->i2c_bussel_reg = of_ioremap(&op->resource[1], 0, 0x1, "bbc_i2c_bussel"); -- if (!bp->i2c_bussel_reg) -- goto fail; -+ if (op->num_resources == 2) { -+ bp->i2c_bussel_reg = of_ioremap(&op->resource[1], 0, 0x1, "bbc_i2c_bussel"); -+ if (!bp->i2c_bussel_reg) -+ goto fail; -+ } - - bp->waiting = 0; - init_waitqueue_head(&bp->wq); -diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c -index 0bd38da..05fbc3d 100644 ---- a/drivers/scsi/aacraid/commctrl.c -+++ b/drivers/scsi/aacraid/commctrl.c -@@ -508,7 +508,8 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) - goto cleanup; - } - -- if (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr))) { -+ if ((fibsize < (sizeof(struct user_aac_srb) - sizeof(struct user_sgentry))) || -+ (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr)))) { - rcode = -EINVAL; - goto cleanup; - } -diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c -index 0d279c44..e9313f8 100644 ---- a/drivers/scsi/aacraid/linit.c -+++ b/drivers/scsi/aacraid/linit.c -@@ -777,6 +777,8 @@ static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned long - static int aac_compat_ioctl(struct scsi_device *sdev, int cmd, void __user *arg) - { - struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata; -+ if (!capable(CAP_SYS_RAWIO)) -+ return -EPERM; - return aac_compat_do_ioctl(dev, cmd, (unsigned long)arg); - } - -diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c -index cbde1dc..937561f 100644 ---- a/drivers/scsi/arcmsr/arcmsr_hba.c -+++ b/drivers/scsi/arcmsr/arcmsr_hba.c -@@ -2500,16 +2500,15 @@ static int arcmsr_polling_ccbdone(struct AdapterControlBlock *acb, - static int arcmsr_iop_confirm(struct AdapterControlBlock *acb) - { - uint32_t cdb_phyaddr, cdb_phyaddr_hi32; -- dma_addr_t dma_coherent_handle; -+ - /* - ******************************************************************** - ** here we need to tell iop 331 our freeccb.HighPart - ** if freeccb.HighPart is not zero - ******************************************************************** - */ -- dma_coherent_handle = acb->dma_coherent_handle; -- cdb_phyaddr = (uint32_t)(dma_coherent_handle); -- cdb_phyaddr_hi32 = (uint32_t)((cdb_phyaddr >> 16) >> 16); -+ cdb_phyaddr = lower_32_bits(acb->dma_coherent_handle); -+ cdb_phyaddr_hi32 = upper_32_bits(acb->dma_coherent_handle); - acb->cdb_phyaddr_hi32 = cdb_phyaddr_hi32; - /* - *********************************************************************** -diff --git a/drivers/scsi/bfa/bfad.c b/drivers/scsi/bfa/bfad.c -index 404fd10..e991c61 100644 ---- a/drivers/scsi/bfa/bfad.c -+++ b/drivers/scsi/bfa/bfad.c -@@ -1615,7 +1615,7 @@ bfad_read_firmware(struct pci_dev *pdev, u32 **bfi_image, - static u32 * - bfad_load_fwimg(struct pci_dev *pdev) - { -- if (pdev->device == BFA_PCI_DEVICE_ID_CT2) { -+ if (bfa_asic_id_ct2(pdev->device)) { - if (bfi_image_ct2_size == 0) - bfad_read_firmware(pdev, &bfi_image_ct2, - &bfi_image_ct2_size, BFAD_FW_FILE_CT2); -@@ -1625,12 +1625,14 @@ bfad_load_fwimg(struct pci_dev *pdev) - bfad_read_firmware(pdev, &bfi_image_ct, - &bfi_image_ct_size, BFAD_FW_FILE_CT); - return bfi_image_ct; -- } else { -+ } else if (bfa_asic_id_cb(pdev->device)) { - if (bfi_image_cb_size == 0) - bfad_read_firmware(pdev, &bfi_image_cb, - &bfi_image_cb_size, BFAD_FW_FILE_CB); - return bfi_image_cb; - } -+ -+ return NULL; - } - - static void -diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c -index b0fefc4..bc88cab 100644 ---- a/drivers/scsi/hpsa.c -+++ b/drivers/scsi/hpsa.c -@@ -99,6 +99,15 @@ static const struct pci_device_id hpsa_pci_device_id[] = { - {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSF, 0x103C, 0x3354}, - {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSF, 0x103C, 0x3355}, - {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSF, 0x103C, 0x3356}, -+ {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSH, 0x103C, 0x1920}, -+ {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSH, 0x103C, 0x1921}, -+ {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSH, 0x103C, 0x1922}, -+ {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSH, 0x103C, 0x1923}, -+ {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSH, 0x103C, 0x1924}, -+ {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSH, 0x103C, 0x1925}, -+ {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSH, 0x103C, 0x1926}, -+ {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSH, 0x103C, 0x1928}, -+ {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSF, 0x103C, 0x334d}, - {PCI_VENDOR_ID_HP, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, - PCI_CLASS_STORAGE_RAID << 8, 0xffff << 8, 0}, - {0,} -@@ -118,13 +127,22 @@ static struct board_type products[] = { - {0x3249103C, "Smart Array P812", &SA5_access}, - {0x324a103C, "Smart Array P712m", &SA5_access}, - {0x324b103C, "Smart Array P711m", &SA5_access}, -- {0x3350103C, "Smart Array", &SA5_access}, -- {0x3351103C, "Smart Array", &SA5_access}, -- {0x3352103C, "Smart Array", &SA5_access}, -- {0x3353103C, "Smart Array", &SA5_access}, -- {0x3354103C, "Smart Array", &SA5_access}, -- {0x3355103C, "Smart Array", &SA5_access}, -- {0x3356103C, "Smart Array", &SA5_access}, -+ {0x3350103C, "Smart Array P222", &SA5_access}, -+ {0x3351103C, "Smart Array P420", &SA5_access}, -+ {0x3352103C, "Smart Array P421", &SA5_access}, -+ {0x3353103C, "Smart Array P822", &SA5_access}, -+ {0x3354103C, "Smart Array P420i", &SA5_access}, -+ {0x3355103C, "Smart Array P220i", &SA5_access}, -+ {0x3356103C, "Smart Array P721m", &SA5_access}, -+ {0x1920103C, "Smart Array", &SA5_access}, -+ {0x1921103C, "Smart Array", &SA5_access}, -+ {0x1922103C, "Smart Array", &SA5_access}, -+ {0x1923103C, "Smart Array", &SA5_access}, -+ {0x1924103C, "Smart Array", &SA5_access}, -+ {0x1925103C, "Smart Array", &SA5_access}, -+ {0x1926103C, "Smart Array", &SA5_access}, -+ {0x1928103C, "Smart Array", &SA5_access}, -+ {0x334d103C, "Smart Array P822se", &SA5_access}, - {0xFFFF103C, "Unknown Smart Array", &SA5_access}, - }; - -@@ -1219,7 +1237,7 @@ static void complete_scsi_command(struct CommandList *cp) - "has check condition: aborted command: " - "ASC: 0x%x, ASCQ: 0x%x\n", - cp, asc, ascq); -- cmd->result = DID_SOFT_ERROR << 16; -+ cmd->result |= DID_SOFT_ERROR << 16; - break; - } - /* Must be some other type of check condition */ -@@ -4466,7 +4484,7 @@ static int __devinit hpsa_init_one(struct pci_dev *pdev, - hpsa_hba_inquiry(h); - hpsa_register_scsi(h); /* hook ourselves into SCSI subsystem */ - start_controller_lockup_detector(h); -- return 1; -+ return 0; - - clean4: - hpsa_free_sg_chain_blocks(h); -diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c -index 337e8b3..ac58ee3 100644 ---- a/drivers/scsi/ibmvscsi/ibmvscsi.c -+++ b/drivers/scsi/ibmvscsi/ibmvscsi.c -@@ -484,7 +484,8 @@ static void purge_requests(struct ibmvscsi_host_data *hostdata, int error_code) - evt->hostdata->dev); - if (evt->cmnd_done) - evt->cmnd_done(evt->cmnd); -- } else if (evt->done) -+ } else if (evt->done && evt->crq.format != VIOSRP_MAD_FORMAT && -+ evt->iu.srp.login_req.opcode != SRP_LOGIN_REQ) - evt->done(evt); - free_event_struct(&evt->hostdata->pool, evt); - spin_lock_irqsave(hostdata->host->host_lock, flags); -diff --git a/drivers/scsi/isci/host.h b/drivers/scsi/isci/host.h -index adbad69..15bd1a4 100644 ---- a/drivers/scsi/isci/host.h -+++ b/drivers/scsi/isci/host.h -@@ -310,9 +310,8 @@ static inline struct isci_pci_info *to_pci_info(struct pci_dev *pdev) - } - - #define for_each_isci_host(id, ihost, pdev) \ -- for (id = 0, ihost = to_pci_info(pdev)->hosts[id]; \ -- id < ARRAY_SIZE(to_pci_info(pdev)->hosts) && ihost; \ -- ihost = to_pci_info(pdev)->hosts[++id]) -+ for (id = 0; id < SCI_MAX_CONTROLLERS && \ -+ (ihost = to_pci_info(pdev)->hosts[id]); id++) - - static inline enum isci_status isci_host_get_state(struct isci_host *isci_host) - { -diff --git a/drivers/scsi/isci/port_config.c b/drivers/scsi/isci/port_config.c -index 6d1e954..b81f34d 100644 ---- a/drivers/scsi/isci/port_config.c -+++ b/drivers/scsi/isci/port_config.c -@@ -619,13 +619,6 @@ static void sci_apc_agent_link_up(struct isci_host *ihost, - SCIC_SDS_APC_WAIT_LINK_UP_NOTIFICATION); - } else { - /* the phy is already the part of the port */ -- u32 port_state = iport->sm.current_state_id; -- -- /* if the PORT'S state is resetting then the link up is from -- * port hard reset in this case, we need to tell the port -- * that link up is recieved -- */ -- BUG_ON(port_state != SCI_PORT_RESETTING); - port_agent->phy_ready_mask |= 1 << phy_index; - sci_port_link_up(iport, iphy); - } -diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c -index 374254e..b53becf 100644 ---- a/drivers/scsi/isci/task.c -+++ b/drivers/scsi/isci/task.c -@@ -956,6 +956,7 @@ int isci_task_abort_task(struct sas_task *task) - int ret = TMF_RESP_FUNC_FAILED; - unsigned long flags; - int perform_termination = 0; -+ int target_done_already = 0; - - /* Get the isci_request reference from the task. Note that - * this check does not depend on the pending request list -@@ -970,9 +971,11 @@ int isci_task_abort_task(struct sas_task *task) - /* If task is already done, the request isn't valid */ - if (!(task->task_state_flags & SAS_TASK_STATE_DONE) && - (task->task_state_flags & SAS_TASK_AT_INITIATOR) && -- old_request) -+ old_request) { - isci_device = isci_lookup_device(task->dev); -- -+ target_done_already = test_bit(IREQ_COMPLETE_IN_TARGET, -+ &old_request->flags); -+ } - spin_unlock(&task->task_state_lock); - spin_unlock_irqrestore(&isci_host->scic_lock, flags); - -@@ -1031,7 +1034,7 @@ int isci_task_abort_task(struct sas_task *task) - } - if (task->task_proto == SAS_PROTOCOL_SMP || - sas_protocol_ata(task->task_proto) || -- test_bit(IREQ_COMPLETE_IN_TARGET, &old_request->flags)) { -+ target_done_already) { - - spin_unlock_irqrestore(&isci_host->scic_lock, flags); - -@@ -1312,7 +1315,7 @@ int isci_task_I_T_nexus_reset(struct domain_device *dev) - /* XXX: need to cleanup any ireqs targeting this - * domain_device - */ -- ret = TMF_RESP_FUNC_COMPLETE; -+ ret = -ENODEV; - goto out; - } - -diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c -index 82c3fd4..1243d2f 100644 ---- a/drivers/scsi/libiscsi.c -+++ b/drivers/scsi/libiscsi.c -@@ -718,11 +718,21 @@ __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, - return NULL; - } - -+ if (data_size > ISCSI_DEF_MAX_RECV_SEG_LEN) { -+ iscsi_conn_printk(KERN_ERR, conn, "Invalid buffer len of %u for login task. Max len is %u\n", data_size, ISCSI_DEF_MAX_RECV_SEG_LEN); -+ return NULL; -+ } -+ - task = conn->login_task; - } else { - if (session->state != ISCSI_STATE_LOGGED_IN) - return NULL; - -+ if (data_size != 0) { -+ iscsi_conn_printk(KERN_ERR, conn, "Can not send data buffer of len %u for op 0x%x\n", data_size, opcode); -+ return NULL; -+ } -+ - BUG_ON(conn->c_stage == ISCSI_CONN_INITIAL_STAGE); - BUG_ON(conn->c_stage == ISCSI_CONN_STOPPED); - -diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c -index 722b3ea..ec96c5f 100644 ---- a/drivers/scsi/libsas/sas_ata.c -+++ b/drivers/scsi/libsas/sas_ata.c -@@ -211,7 +211,7 @@ static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc) - qc->tf.nsect = 0; - } - -- ata_tf_to_fis(&qc->tf, 1, 0, (u8*)&task->ata_task.fis); -+ ata_tf_to_fis(&qc->tf, qc->dev->link->pmp, 1, (u8 *)&task->ata_task.fis); - task->uldd_task = qc; - if (ata_is_atapi(qc->tf.protocol)) { - memcpy(task->ata_task.atapi_packet, qc->cdb, qc->dev->cdb_len); -diff --git a/drivers/scsi/megaraid/megaraid_mm.c b/drivers/scsi/megaraid/megaraid_mm.c -index 25506c7..9bec171 100644 ---- a/drivers/scsi/megaraid/megaraid_mm.c -+++ b/drivers/scsi/megaraid/megaraid_mm.c -@@ -486,6 +486,8 @@ mimd_to_kioc(mimd_t __user *umimd, mraid_mmadp_t *adp, uioc_t *kioc) - - pthru32->dataxferaddr = kioc->buf_paddr; - if (kioc->data_dir & UIOC_WR) { -+ if (pthru32->dataxferlen > kioc->xferlen) -+ return -EINVAL; - if (copy_from_user(kioc->buf_vaddr, kioc->user_data, - pthru32->dataxferlen)) { - return (-EFAULT); -diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h -index e5f416f..1a7955a 100644 ---- a/drivers/scsi/megaraid/megaraid_sas.h -+++ b/drivers/scsi/megaraid/megaraid_sas.h -@@ -1294,7 +1294,6 @@ struct megasas_instance { - u32 *reply_queue; - dma_addr_t reply_queue_h; - -- unsigned long base_addr; - struct megasas_register_set __iomem *reg_set; - - struct megasas_pd_list pd_list[MEGASAS_MAX_PD]; -diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c -index 7926162..6188700 100644 ---- a/drivers/scsi/megaraid/megaraid_sas_base.c -+++ b/drivers/scsi/megaraid/megaraid_sas_base.c -@@ -3445,6 +3445,7 @@ static int megasas_init_fw(struct megasas_instance *instance) - u32 max_sectors_1; - u32 max_sectors_2; - u32 tmp_sectors, msix_enable; -+ resource_size_t base_addr; - struct megasas_register_set __iomem *reg_set; - struct megasas_ctrl_info *ctrl_info; - unsigned long bar_list; -@@ -3453,14 +3454,14 @@ static int megasas_init_fw(struct megasas_instance *instance) - /* Find first memory bar */ - bar_list = pci_select_bars(instance->pdev, IORESOURCE_MEM); - instance->bar = find_first_bit(&bar_list, sizeof(unsigned long)); -- instance->base_addr = pci_resource_start(instance->pdev, instance->bar); - if (pci_request_selected_regions(instance->pdev, instance->bar, - "megasas: LSI")) { - printk(KERN_DEBUG "megasas: IO memory region busy!\n"); - return -EBUSY; - } - -- instance->reg_set = ioremap_nocache(instance->base_addr, 8192); -+ base_addr = pci_resource_start(instance->pdev, instance->bar); -+ instance->reg_set = ioremap_nocache(base_addr, 8192); - - if (!instance->reg_set) { - printk(KERN_DEBUG "megasas: Failed to map IO mem\n"); -diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c -index db79362..f98cae7 100644 ---- a/drivers/scsi/mpt2sas/mpt2sas_base.c -+++ b/drivers/scsi/mpt2sas/mpt2sas_base.c -@@ -80,10 +80,6 @@ static int msix_disable = -1; - module_param(msix_disable, int, 0); - MODULE_PARM_DESC(msix_disable, " disable msix routed interrupts (default=0)"); - --static int missing_delay[2] = {-1, -1}; --module_param_array(missing_delay, int, NULL, 0); --MODULE_PARM_DESC(missing_delay, " device missing delay , io missing delay"); -- - static int mpt2sas_fwfault_debug; - MODULE_PARM_DESC(mpt2sas_fwfault_debug, " enable detection of firmware fault " - "and halt firmware - (default=0)"); -@@ -2168,7 +2164,7 @@ _base_display_ioc_capabilities(struct MPT2SAS_ADAPTER *ioc) - } - - /** -- * _base_update_missing_delay - change the missing delay timers -+ * mpt2sas_base_update_missing_delay - change the missing delay timers - * @ioc: per adapter object - * @device_missing_delay: amount of time till device is reported missing - * @io_missing_delay: interval IO is returned when there is a missing device -@@ -2179,8 +2175,8 @@ _base_display_ioc_capabilities(struct MPT2SAS_ADAPTER *ioc) - * delay, as well as the io missing delay. This should be called at driver - * load time. - */ --static void --_base_update_missing_delay(struct MPT2SAS_ADAPTER *ioc, -+void -+mpt2sas_base_update_missing_delay(struct MPT2SAS_ADAPTER *ioc, - u16 device_missing_delay, u8 io_missing_delay) - { - u16 dmd, dmd_new, dmd_orignal; -@@ -4371,9 +4367,6 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) - if (r) - goto out_free_resources; - -- if (missing_delay[0] != -1 && missing_delay[1] != -1) -- _base_update_missing_delay(ioc, missing_delay[0], -- missing_delay[1]); - - return 0; - -diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.h b/drivers/scsi/mpt2sas/mpt2sas_base.h -index c7459fd..04968be 100644 ---- a/drivers/scsi/mpt2sas/mpt2sas_base.h -+++ b/drivers/scsi/mpt2sas/mpt2sas_base.h -@@ -1047,6 +1047,9 @@ void mpt2sas_base_validate_event_type(struct MPT2SAS_ADAPTER *ioc, u32 *event_ty - - void mpt2sas_halt_firmware(struct MPT2SAS_ADAPTER *ioc); - -+void mpt2sas_base_update_missing_delay(struct MPT2SAS_ADAPTER *ioc, -+ u16 device_missing_delay, u8 io_missing_delay); -+ - int mpt2sas_port_enable(struct MPT2SAS_ADAPTER *ioc); - - /* scsih shared API */ -diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c -index 35a05d1d..a16bc61 100644 ---- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c -+++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c -@@ -101,6 +101,10 @@ static ushort max_sectors = 0xFFFF; - module_param(max_sectors, ushort, 0); - MODULE_PARM_DESC(max_sectors, "max sectors, range 64 to 32767 default=32767"); - -+static int missing_delay[2] = {-1, -1}; -+module_param_array(missing_delay, int, NULL, 0); -+MODULE_PARM_DESC(missing_delay, " device missing delay , io missing delay"); -+ - /* scsi-mid layer global parmeter is max_report_luns, which is 511 */ - #define MPT2SAS_MAX_LUN (16895) - static int max_lun = MPT2SAS_MAX_LUN; -@@ -7039,11 +7043,14 @@ _scsih_scan_for_devices_after_reset(struct MPT2SAS_ADAPTER *ioc) - struct _sas_device *sas_device; - struct _sas_node *expander_device; - static struct _raid_device *raid_device; -+ u8 retry_count; - - printk(MPT2SAS_INFO_FMT "scan devices: start\n", ioc->name); - - _scsih_sas_host_refresh(ioc); - -+ printk(MPT2SAS_INFO_FMT "\tscan devices: expanders start\n", -+ ioc->name); - /* expanders */ - handle = 0xFFFF; - while (!(mpt2sas_config_get_expander_pg0(ioc, &mpi_reply, &expander_pg0, -@@ -7052,19 +7059,39 @@ _scsih_scan_for_devices_after_reset(struct MPT2SAS_ADAPTER *ioc) - MPI2_IOCSTATUS_MASK; - if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) - break; -+ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { -+ printk(MPT2SAS_INFO_FMT "\tbreak from expander scan: " -+ "ioc_status(0x%04x), loginfo(0x%08x)\n", -+ ioc->name, ioc_status, -+ le32_to_cpu(mpi_reply.IOCLogInfo)); -+ break; -+ } - handle = le16_to_cpu(expander_pg0.DevHandle); - expander_device = mpt2sas_scsih_expander_find_by_sas_address( - ioc, le64_to_cpu(expander_pg0.SASAddress)); - if (expander_device) - _scsih_refresh_expander_links(ioc, expander_device, - handle); -- else -+ else { -+ printk(MPT2SAS_INFO_FMT "\tBEFORE adding expander: " -+ "handle (0x%04x), sas_addr(0x%016llx)\n", -+ ioc->name, handle, (unsigned long long) -+ le64_to_cpu(expander_pg0.SASAddress)); - _scsih_expander_add(ioc, handle); -+ printk(MPT2SAS_INFO_FMT "\tAFTER adding expander: " -+ "handle (0x%04x), sas_addr(0x%016llx)\n", -+ ioc->name, handle, (unsigned long long) -+ le64_to_cpu(expander_pg0.SASAddress)); -+ } - } - -+ printk(MPT2SAS_INFO_FMT "\tscan devices: expanders complete\n", -+ ioc->name); -+ - if (!ioc->ir_firmware) - goto skip_to_sas; - -+ printk(MPT2SAS_INFO_FMT "\tscan devices phys disk start\n", ioc->name); - /* phys disk */ - phys_disk_num = 0xFF; - while (!(mpt2sas_config_get_phys_disk_pg0(ioc, &mpi_reply, -@@ -7074,6 +7101,13 @@ _scsih_scan_for_devices_after_reset(struct MPT2SAS_ADAPTER *ioc) - MPI2_IOCSTATUS_MASK; - if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) - break; -+ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { -+ printk(MPT2SAS_INFO_FMT "\tbreak from phys disk scan:" -+ "ioc_status(0x%04x), loginfo(0x%08x)\n", -+ ioc->name, ioc_status, -+ le32_to_cpu(mpi_reply.IOCLogInfo)); -+ break; -+ } - phys_disk_num = pd_pg0.PhysDiskNum; - handle = le16_to_cpu(pd_pg0.DevHandle); - sas_device = _scsih_sas_device_find_by_handle(ioc, handle); -@@ -7083,17 +7117,46 @@ _scsih_scan_for_devices_after_reset(struct MPT2SAS_ADAPTER *ioc) - &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, - handle) != 0) - continue; -+ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & -+ MPI2_IOCSTATUS_MASK; -+ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { -+ printk(MPT2SAS_INFO_FMT "\tbreak from phys disk scan " -+ "ioc_status(0x%04x), loginfo(0x%08x)\n", -+ ioc->name, ioc_status, -+ le32_to_cpu(mpi_reply.IOCLogInfo)); -+ break; -+ } - parent_handle = le16_to_cpu(sas_device_pg0.ParentDevHandle); - if (!_scsih_get_sas_address(ioc, parent_handle, - &sas_address)) { -+ printk(MPT2SAS_INFO_FMT "\tBEFORE adding phys disk: " -+ " handle (0x%04x), sas_addr(0x%016llx)\n", -+ ioc->name, handle, (unsigned long long) -+ le64_to_cpu(sas_device_pg0.SASAddress)); - mpt2sas_transport_update_links(ioc, sas_address, - handle, sas_device_pg0.PhyNum, - MPI2_SAS_NEG_LINK_RATE_1_5); - set_bit(handle, ioc->pd_handles); -- _scsih_add_device(ioc, handle, 0, 1); -+ retry_count = 0; -+ /* This will retry adding the end device. -+ * _scsih_add_device() will decide on retries and -+ * return "1" when it should be retried -+ */ -+ while (_scsih_add_device(ioc, handle, retry_count++, -+ 1)) { -+ ssleep(1); -+ } -+ printk(MPT2SAS_INFO_FMT "\tAFTER adding phys disk: " -+ " handle (0x%04x), sas_addr(0x%016llx)\n", -+ ioc->name, handle, (unsigned long long) -+ le64_to_cpu(sas_device_pg0.SASAddress)); - } - } - -+ printk(MPT2SAS_INFO_FMT "\tscan devices: phys disk complete\n", -+ ioc->name); -+ -+ printk(MPT2SAS_INFO_FMT "\tscan devices: volumes start\n", ioc->name); - /* volumes */ - handle = 0xFFFF; - while (!(mpt2sas_config_get_raid_volume_pg1(ioc, &mpi_reply, -@@ -7102,6 +7165,13 @@ _scsih_scan_for_devices_after_reset(struct MPT2SAS_ADAPTER *ioc) - MPI2_IOCSTATUS_MASK; - if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) - break; -+ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { -+ printk(MPT2SAS_INFO_FMT "\tbreak from volume scan: " -+ "ioc_status(0x%04x), loginfo(0x%08x)\n", -+ ioc->name, ioc_status, -+ le32_to_cpu(mpi_reply.IOCLogInfo)); -+ break; -+ } - handle = le16_to_cpu(volume_pg1.DevHandle); - raid_device = _scsih_raid_device_find_by_wwid(ioc, - le64_to_cpu(volume_pg1.WWID)); -@@ -7111,18 +7181,38 @@ _scsih_scan_for_devices_after_reset(struct MPT2SAS_ADAPTER *ioc) - &volume_pg0, MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, handle, - sizeof(Mpi2RaidVolPage0_t))) - continue; -+ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & -+ MPI2_IOCSTATUS_MASK; -+ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { -+ printk(MPT2SAS_INFO_FMT "\tbreak from volume scan: " -+ "ioc_status(0x%04x), loginfo(0x%08x)\n", -+ ioc->name, ioc_status, -+ le32_to_cpu(mpi_reply.IOCLogInfo)); -+ break; -+ } - if (volume_pg0.VolumeState == MPI2_RAID_VOL_STATE_OPTIMAL || - volume_pg0.VolumeState == MPI2_RAID_VOL_STATE_ONLINE || - volume_pg0.VolumeState == MPI2_RAID_VOL_STATE_DEGRADED) { - memset(&element, 0, sizeof(Mpi2EventIrConfigElement_t)); - element.ReasonCode = MPI2_EVENT_IR_CHANGE_RC_ADDED; - element.VolDevHandle = volume_pg1.DevHandle; -+ printk(MPT2SAS_INFO_FMT "\tBEFORE adding volume: " -+ " handle (0x%04x)\n", ioc->name, -+ volume_pg1.DevHandle); - _scsih_sas_volume_add(ioc, &element); -+ printk(MPT2SAS_INFO_FMT "\tAFTER adding volume: " -+ " handle (0x%04x)\n", ioc->name, -+ volume_pg1.DevHandle); - } - } - -+ printk(MPT2SAS_INFO_FMT "\tscan devices: volumes complete\n", -+ ioc->name); -+ - skip_to_sas: - -+ printk(MPT2SAS_INFO_FMT "\tscan devices: end devices start\n", -+ ioc->name); - /* sas devices */ - handle = 0xFFFF; - while (!(mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, -@@ -7132,6 +7222,13 @@ _scsih_scan_for_devices_after_reset(struct MPT2SAS_ADAPTER *ioc) - MPI2_IOCSTATUS_MASK; - if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) - break; -+ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { -+ printk(MPT2SAS_INFO_FMT "\tbreak from end device scan:" -+ " ioc_status(0x%04x), loginfo(0x%08x)\n", -+ ioc->name, ioc_status, -+ le32_to_cpu(mpi_reply.IOCLogInfo)); -+ break; -+ } - handle = le16_to_cpu(sas_device_pg0.DevHandle); - if (!(_scsih_is_end_device( - le32_to_cpu(sas_device_pg0.DeviceInfo)))) -@@ -7142,12 +7239,31 @@ _scsih_scan_for_devices_after_reset(struct MPT2SAS_ADAPTER *ioc) - continue; - parent_handle = le16_to_cpu(sas_device_pg0.ParentDevHandle); - if (!_scsih_get_sas_address(ioc, parent_handle, &sas_address)) { -+ printk(MPT2SAS_INFO_FMT "\tBEFORE adding end device: " -+ "handle (0x%04x), sas_addr(0x%016llx)\n", -+ ioc->name, handle, (unsigned long long) -+ le64_to_cpu(sas_device_pg0.SASAddress)); - mpt2sas_transport_update_links(ioc, sas_address, handle, - sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5); -- _scsih_add_device(ioc, handle, 0, 0); -+ retry_count = 0; -+ /* This will retry adding the end device. -+ * _scsih_add_device() will decide on retries and -+ * return "1" when it should be retried -+ */ -+ while (_scsih_add_device(ioc, handle, retry_count++, -+ 0)) { -+ ssleep(1); -+ } -+ printk(MPT2SAS_INFO_FMT "\tAFTER adding end device: " -+ "handle (0x%04x), sas_addr(0x%016llx)\n", -+ ioc->name, handle, (unsigned long long) -+ le64_to_cpu(sas_device_pg0.SASAddress)); - } - } - -+ printk(MPT2SAS_INFO_FMT "\tscan devices: end devices complete\n", -+ ioc->name); -+ - printk(MPT2SAS_INFO_FMT "scan devices: complete\n", ioc->name); - } - -@@ -7239,7 +7355,9 @@ _firmware_event_work(struct work_struct *work) - case MPT2SAS_PORT_ENABLE_COMPLETE: - ioc->start_scan = 0; - -- -+ if (missing_delay[0] != -1 && missing_delay[1] != -1) -+ mpt2sas_base_update_missing_delay(ioc, missing_delay[0], -+ missing_delay[1]); - - dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "port enable: complete " - "from worker thread\n", ioc->name)); -@@ -8086,7 +8204,6 @@ _scsih_suspend(struct pci_dev *pdev, pm_message_t state) - - mpt2sas_base_free_resources(ioc); - pci_save_state(pdev); -- pci_disable_device(pdev); - pci_set_power_state(pdev, device_state); - return 0; - } -diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h -index a244303..09bedb7 100644 ---- a/drivers/scsi/qla2xxx/qla_def.h -+++ b/drivers/scsi/qla2xxx/qla_def.h -@@ -2600,8 +2600,7 @@ struct qla_hw_data { - IS_QLA25XX(ha) || IS_QLA81XX(ha) || \ - IS_QLA82XX(ha) || IS_QLA83XX(ha)) - #define IS_MSIX_NACK_CAPABLE(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha)) --#define IS_NOPOLLING_TYPE(ha) ((IS_QLA25XX(ha) || IS_QLA81XX(ha) || \ -- IS_QLA83XX(ha)) && (ha)->flags.msix_enabled) -+#define IS_NOPOLLING_TYPE(ha) (IS_QLA81XX(ha) && (ha)->flags.msix_enabled) - #define IS_FAC_REQUIRED(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha)) - #define IS_NOCACHE_VPD_TYPE(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha)) - #define IS_ALOGIO_CAPABLE(ha) (IS_QLA23XX(ha) || IS_FWI2_CAPABLE(ha)) -diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c -index b3f0b0f..dcc39b6 100644 ---- a/drivers/scsi/scsi_error.c -+++ b/drivers/scsi/scsi_error.c -@@ -916,6 +916,15 @@ int scsi_eh_get_sense(struct list_head *work_q, - SCSI_SENSE_VALID(scmd)) - continue; - -+ if (status_byte(scmd->result) != CHECK_CONDITION) -+ /* -+ * don't request sense if there's no check condition -+ * status because the error we're processing isn't one -+ * that has a sense code (and some devices get -+ * confused by sense requests out of the blue) -+ */ -+ continue; -+ - SCSI_LOG_ERROR_RECOVERY(2, scmd_printk(KERN_INFO, scmd, - "%s: requesting sense\n", - current->comm)); -diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c -index 099e4b3..fd01f77 100644 ---- a/drivers/scsi/scsi_lib.c -+++ b/drivers/scsi/scsi_lib.c -@@ -794,6 +794,14 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) - scsi_next_command(cmd); - return; - } -+ } else if (blk_rq_bytes(req) == 0 && result && !sense_deferred) { -+ /* -+ * Certain non BLOCK_PC requests are commands that don't -+ * actually transfer anything (FLUSH), so cannot use -+ * good_bytes != blk_rq_bytes(req) as the signal for an error. -+ * This sets the error explicitly for the problem case. -+ */ -+ error = __scsi_error_from_host_byte(cmd, result); - } - - /* no bidi support for !REQ_TYPE_BLOCK_PC yet */ -diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c -index f9986cc..446c023 100644 ---- a/drivers/scsi/storvsc_drv.c -+++ b/drivers/scsi/storvsc_drv.c -@@ -1131,6 +1131,9 @@ static void storvsc_device_destroy(struct scsi_device *sdevice) - { - struct stor_mem_pools *memp = sdevice->hostdata; - -+ if (!memp) -+ return; -+ - mempool_destroy(memp->request_mempool); - kmem_cache_destroy(memp->request_pool); - kfree(memp); -diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c -index d92fe40..6b349e3 100644 ---- a/drivers/scsi/sym53c8xx_2/sym_hipd.c -+++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c -@@ -3000,7 +3000,11 @@ sym_dequeue_from_squeue(struct sym_hcb *np, int i, int target, int lun, int task - if ((target == -1 || cp->target == target) && - (lun == -1 || cp->lun == lun) && - (task == -1 || cp->tag == task)) { -+#ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING - sym_set_cam_status(cp->cmd, DID_SOFT_ERROR); -+#else -+ sym_set_cam_status(cp->cmd, DID_REQUEUE); -+#endif - sym_remque(&cp->link_ccbq); - sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq); - } -diff --git a/drivers/staging/bcm/Bcmchar.c b/drivers/staging/bcm/Bcmchar.c -index cf30592..c0d612f 100644 ---- a/drivers/staging/bcm/Bcmchar.c -+++ b/drivers/staging/bcm/Bcmchar.c -@@ -1957,6 +1957,7 @@ static long bcm_char_ioctl(struct file *filp, UINT cmd, ULONG arg) - - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Called IOCTL_BCM_GET_DEVICE_DRIVER_INFO\n"); - -+ memset(&DevInfo, 0, sizeof(DevInfo)); - DevInfo.MaxRDMBufferSize = BUFFER_4K; - DevInfo.u32DSDStartOffset = EEPROM_CALPARAM_START; - DevInfo.u32RxAlignmentCorrection = 0; -diff --git a/drivers/staging/bcm/InterfaceInit.c b/drivers/staging/bcm/InterfaceInit.c -index 8e3c586..e0f40ae 100644 ---- a/drivers/staging/bcm/InterfaceInit.c -+++ b/drivers/staging/bcm/InterfaceInit.c -@@ -4,10 +4,12 @@ static struct usb_device_id InterfaceUsbtable[] = { - { USB_DEVICE(BCM_USB_VENDOR_ID_T3, BCM_USB_PRODUCT_ID_T3) }, - { USB_DEVICE(BCM_USB_VENDOR_ID_T3, BCM_USB_PRODUCT_ID_T3B) }, - { USB_DEVICE(BCM_USB_VENDOR_ID_T3, BCM_USB_PRODUCT_ID_T3L) }, -- { USB_DEVICE(BCM_USB_VENDOR_ID_T3, BCM_USB_PRODUCT_ID_SM250) }, -+ { USB_DEVICE(BCM_USB_VENDOR_ID_T3, BCM_USB_PRODUCT_ID_SYM) }, - { USB_DEVICE(BCM_USB_VENDOR_ID_ZTE, BCM_USB_PRODUCT_ID_226) }, - { USB_DEVICE(BCM_USB_VENDOR_ID_FOXCONN, BCM_USB_PRODUCT_ID_1901) }, - { USB_DEVICE(BCM_USB_VENDOR_ID_ZTE, BCM_USB_PRODUCT_ID_ZTE_TU25) }, -+ { USB_DEVICE(BCM_USB_VENDOR_ID_ZTE, BCM_USB_PRODUCT_ID_ZTE_226) }, -+ { USB_DEVICE(BCM_USB_VENDOR_ID_ZTE, BCM_USB_PRODUCT_ID_ZTE_326) }, - { } - }; - MODULE_DEVICE_TABLE(usb, InterfaceUsbtable); -diff --git a/drivers/staging/bcm/InterfaceInit.h b/drivers/staging/bcm/InterfaceInit.h -index 058315a..6fa4f09 100644 ---- a/drivers/staging/bcm/InterfaceInit.h -+++ b/drivers/staging/bcm/InterfaceInit.h -@@ -8,10 +8,11 @@ - #define BCM_USB_PRODUCT_ID_T3 0x0300 - #define BCM_USB_PRODUCT_ID_T3B 0x0210 - #define BCM_USB_PRODUCT_ID_T3L 0x0220 --#define BCM_USB_PRODUCT_ID_SM250 0xbccd - #define BCM_USB_PRODUCT_ID_SYM 0x15E - #define BCM_USB_PRODUCT_ID_1901 0xe017 --#define BCM_USB_PRODUCT_ID_226 0x0132 -+#define BCM_USB_PRODUCT_ID_226 0x0132 /* not sure if this is valid */ -+#define BCM_USB_PRODUCT_ID_ZTE_226 0x172 -+#define BCM_USB_PRODUCT_ID_ZTE_326 0x173 /* ZTE AX326 */ - #define BCM_USB_PRODUCT_ID_ZTE_TU25 0x0007 - - #define BCM_USB_MINOR_BASE 192 -diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c -index 50dc93e..fff2757 100644 ---- a/drivers/staging/comedi/comedi_fops.c -+++ b/drivers/staging/comedi/comedi_fops.c -@@ -1078,22 +1078,19 @@ static int do_cmd_ioctl(struct comedi_device *dev, - DPRINTK("subdevice busy\n"); - return -EBUSY; - } -- s->busy = file; - - /* make sure channel/gain list isn't too long */ - if (user_cmd.chanlist_len > s->len_chanlist) { - DPRINTK("channel/gain list too long %u > %d\n", - user_cmd.chanlist_len, s->len_chanlist); -- ret = -EINVAL; -- goto cleanup; -+ return -EINVAL; - } - - /* make sure channel/gain list isn't too short */ - if (user_cmd.chanlist_len < 1) { - DPRINTK("channel/gain list too short %u < 1\n", - user_cmd.chanlist_len); -- ret = -EINVAL; -- goto cleanup; -+ return -EINVAL; - } - - async->cmd = user_cmd; -@@ -1103,8 +1100,7 @@ static int do_cmd_ioctl(struct comedi_device *dev, - kmalloc(async->cmd.chanlist_len * sizeof(int), GFP_KERNEL); - if (!async->cmd.chanlist) { - DPRINTK("allocation failed\n"); -- ret = -ENOMEM; -- goto cleanup; -+ return -ENOMEM; - } - - if (copy_from_user(async->cmd.chanlist, user_cmd.chanlist, -@@ -1156,6 +1152,9 @@ static int do_cmd_ioctl(struct comedi_device *dev, - - comedi_set_subdevice_runflags(s, ~0, SRF_USER | SRF_RUNNING); - -+ /* set s->busy _after_ setting SRF_RUNNING flag to avoid race with -+ * comedi_read() or comedi_write() */ -+ s->busy = file; - ret = s->do_cmd(dev, s); - if (ret == 0) - return 0; -@@ -1658,6 +1657,7 @@ static ssize_t comedi_write(struct file *file, const char __user *buf, - - if (!(comedi_get_subdevice_runflags(s) & SRF_RUNNING)) { - if (count == 0) { -+ mutex_lock(&dev->mutex); - if (comedi_get_subdevice_runflags(s) & - SRF_ERROR) { - retval = -EPIPE; -@@ -1665,6 +1665,7 @@ static ssize_t comedi_write(struct file *file, const char __user *buf, - retval = 0; - } - do_become_nonbusy(dev, s); -+ mutex_unlock(&dev->mutex); - } - break; - } -@@ -1779,6 +1780,7 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes, - - if (n == 0) { - if (!(comedi_get_subdevice_runflags(s) & SRF_RUNNING)) { -+ mutex_lock(&dev->mutex); - do_become_nonbusy(dev, s); - if (comedi_get_subdevice_runflags(s) & - SRF_ERROR) { -@@ -1786,6 +1788,7 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes, - } else { - retval = 0; - } -+ mutex_unlock(&dev->mutex); - break; - } - if (file->f_flags & O_NONBLOCK) { -@@ -1823,9 +1826,11 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes, - buf += n; - break; /* makes device work like a pipe */ - } -- if (!(comedi_get_subdevice_runflags(s) & (SRF_ERROR | SRF_RUNNING)) && -- async->buf_read_count - async->buf_write_count == 0) { -- do_become_nonbusy(dev, s); -+ if (!(comedi_get_subdevice_runflags(s) & (SRF_ERROR | SRF_RUNNING))) { -+ mutex_lock(&dev->mutex); -+ if (async->buf_read_count - async->buf_write_count == 0) -+ do_become_nonbusy(dev, s); -+ mutex_unlock(&dev->mutex); - } - set_current_state(TASK_RUNNING); - remove_wait_queue(&async->wait_head, &wait); -diff --git a/drivers/staging/comedi/drivers/cb_pcidio.c b/drivers/staging/comedi/drivers/cb_pcidio.c -index 8f32152..453ea2d 100644 ---- a/drivers/staging/comedi/drivers/cb_pcidio.c -+++ b/drivers/staging/comedi/drivers/cb_pcidio.c -@@ -56,10 +56,6 @@ struct pcidio_board { - const char *name; /* name of the board */ - int dev_id; - int n_8255; /* number of 8255 chips on board */ -- -- /* indices of base address regions */ -- int pcicontroler_badrindex; -- int dioregs_badrindex; - }; - - static const struct pcidio_board pcidio_boards[] = { -@@ -67,22 +63,16 @@ static const struct pcidio_board pcidio_boards[] = { - .name = "pci-dio24", - .dev_id = 0x0028, - .n_8255 = 1, -- .pcicontroler_badrindex = 1, -- .dioregs_badrindex = 2, - }, - { - .name = "pci-dio24h", - .dev_id = 0x0014, - .n_8255 = 1, -- .pcicontroler_badrindex = 1, -- .dioregs_badrindex = 2, - }, - { - .name = "pci-dio48h", - .dev_id = 0x000b, - .n_8255 = 2, -- .pcicontroler_badrindex = 0, -- .dioregs_badrindex = 1, - }, - }; - -@@ -239,10 +229,15 @@ static int pcidio_attach(struct comedi_device *dev, struct comedi_devconfig *it) - if (comedi_pci_enable(pcidev, thisboard->name)) - return -EIO; - -- devpriv->dio_reg_base -- = -+ /* -+ * Use PCI BAR 2 region if non-zero length, else use PCI BAR 1 region. -+ * PCI BAR 1 is only used for older PCI-DIO48H boards. At some point -+ * the PCI-DIO48H was redesigned to use the same PCI interface chip -+ * (and same PCI BAR region) as the other boards. -+ */ -+ devpriv->dio_reg_base = - pci_resource_start(devpriv->pci_dev, -- pcidio_boards[index].dioregs_badrindex); -+ (pci_resource_len(pcidev, 2) ? 2 : 1)); - - /* - * Allocate the subdevice structures. alloc_subdevice() is a -diff --git a/drivers/staging/comedi/drivers/das08.c b/drivers/staging/comedi/drivers/das08.c -index d2dd75e..e16d1f3 100644 ---- a/drivers/staging/comedi/drivers/das08.c -+++ b/drivers/staging/comedi/drivers/das08.c -@@ -385,7 +385,7 @@ static const struct das08_board_struct das08_boards[] = { - .ai = das08_ai_rinsn, - .ai_nbits = 16, - .ai_pg = das08_pg_none, -- .ai_encoding = das08_encode12, -+ .ai_encoding = das08_encode16, - .ao = das08jr_ao_winsn, - .ao_nbits = 16, - .di = das08jr_di_rbits, -diff --git a/drivers/staging/comedi/drivers/pcmuio.c b/drivers/staging/comedi/drivers/pcmuio.c -index 661ba2e..6e936c5 100644 ---- a/drivers/staging/comedi/drivers/pcmuio.c -+++ b/drivers/staging/comedi/drivers/pcmuio.c -@@ -464,13 +464,13 @@ static int pcmuio_detach(struct comedi_device *dev) - if (dev->iobase) - release_region(dev->iobase, ASIC_IOSIZE * thisboard->num_asics); - -- for (i = 0; i < MAX_ASICS; ++i) { -- if (devpriv->asics[i].irq) -- free_irq(devpriv->asics[i].irq, dev); -- } -- -- if (devpriv && devpriv->sprivs) -+ if (devpriv) { -+ for (i = 0; i < MAX_ASICS; ++i) { -+ if (devpriv->asics[i].irq) -+ free_irq(devpriv->asics[i].irq, dev); -+ } - kfree(devpriv->sprivs); -+ } - - return 0; - } -diff --git a/drivers/staging/comedi/drivers/ssv_dnp.c b/drivers/staging/comedi/drivers/ssv_dnp.c -index 526de2e..0316780 100644 ---- a/drivers/staging/comedi/drivers/ssv_dnp.c -+++ b/drivers/staging/comedi/drivers/ssv_dnp.c -@@ -251,11 +251,11 @@ static int dnp_dio_insn_bits(struct comedi_device *dev, - - /* on return, data[1] contains the value of the digital input lines. */ - outb(PADR, CSCIR); -- data[0] = inb(CSCDR); -+ data[1] = inb(CSCDR); - outb(PBDR, CSCIR); -- data[0] += inb(CSCDR) << 8; -+ data[1] += inb(CSCDR) << 8; - outb(PCDR, CSCIR); -- data[0] += ((inb(CSCDR) & 0xF0) << 12); -+ data[1] += ((inb(CSCDR) & 0xF0) << 12); - - return 2; - -diff --git a/drivers/staging/et131x/et131x.c b/drivers/staging/et131x/et131x.c -index 886f565..6a271e9 100644 ---- a/drivers/staging/et131x/et131x.c -+++ b/drivers/staging/et131x/et131x.c -@@ -1478,22 +1478,16 @@ static int et131x_mii_read(struct et131x_adapter *adapter, u8 reg, u16 *value) - * - * Return 0 on success, errno on failure (as defined in errno.h) - */ --static int et131x_mii_write(struct et131x_adapter *adapter, u8 reg, u16 value) -+static int et131x_mii_write(struct et131x_adapter *adapter, u8 addr, u8 reg, -+ u16 value) - { - struct mac_regs __iomem *mac = &adapter->regs->mac; -- struct phy_device *phydev = adapter->phydev; - int status = 0; -- u8 addr; - u32 delay = 0; - u32 mii_addr; - u32 mii_cmd; - u32 mii_indicator; - -- if (!phydev) -- return -EIO; -- -- addr = phydev->addr; -- - /* Save a local copy of the registers we are dealing with so we can - * set them back - */ -@@ -1550,6 +1544,7 @@ static void et1310_phy_access_mii_bit(struct et131x_adapter *adapter, - { - u16 reg; - u16 mask = 0x0001 << bitnum; -+ struct phy_device *phydev = adapter->phydev; - - /* Read the requested register */ - et131x_mii_read(adapter, regnum, ®); -@@ -1560,11 +1555,11 @@ static void et1310_phy_access_mii_bit(struct et131x_adapter *adapter, - break; - - case TRUEPHY_BIT_SET: -- et131x_mii_write(adapter, regnum, reg | mask); -+ et131x_mii_write(adapter, phydev->addr, regnum, reg | mask); - break; - - case TRUEPHY_BIT_CLEAR: -- et131x_mii_write(adapter, regnum, reg & ~mask); -+ et131x_mii_write(adapter, phydev->addr, regnum, reg & ~mask); - break; - - default: -@@ -1715,17 +1710,7 @@ static int et131x_mdio_write(struct mii_bus *bus, int phy_addr, int reg, u16 val - struct net_device *netdev = bus->priv; - struct et131x_adapter *adapter = netdev_priv(netdev); - -- return et131x_mii_write(adapter, reg, value); --} -- --static int et131x_mdio_reset(struct mii_bus *bus) --{ -- struct net_device *netdev = bus->priv; -- struct et131x_adapter *adapter = netdev_priv(netdev); -- -- et131x_mii_write(adapter, MII_BMCR, BMCR_RESET); -- -- return 0; -+ return et131x_mii_write(adapter, phy_addr, reg, value); - } - - /** -@@ -1741,12 +1726,13 @@ static int et131x_mdio_reset(struct mii_bus *bus) - static void et1310_phy_power_down(struct et131x_adapter *adapter, bool down) - { - u16 data; -+ struct phy_device *phydev = adapter->phydev; - - et131x_mii_read(adapter, MII_BMCR, &data); - data &= ~BMCR_PDOWN; - if (down) - data |= BMCR_PDOWN; -- et131x_mii_write(adapter, MII_BMCR, data); -+ et131x_mii_write(adapter, phydev->addr, MII_BMCR, data); - } - - /** -@@ -1759,6 +1745,7 @@ static void et131x_xcvr_init(struct et131x_adapter *adapter) - u16 imr; - u16 isr; - u16 lcr2; -+ struct phy_device *phydev = adapter->phydev; - - et131x_mii_read(adapter, PHY_INTERRUPT_STATUS, &isr); - et131x_mii_read(adapter, PHY_INTERRUPT_MASK, &imr); -@@ -1770,7 +1757,7 @@ static void et131x_xcvr_init(struct et131x_adapter *adapter) - ET_PHY_INT_MASK_LINKSTAT & - ET_PHY_INT_MASK_ENABLE); - -- et131x_mii_write(adapter, PHY_INTERRUPT_MASK, imr); -+ et131x_mii_write(adapter, phydev->addr, PHY_INTERRUPT_MASK, imr); - - /* Set the LED behavior such that LED 1 indicates speed (off = - * 10Mbits, blink = 100Mbits, on = 1000Mbits) and LED 2 indicates -@@ -1791,7 +1778,7 @@ static void et131x_xcvr_init(struct et131x_adapter *adapter) - else - lcr2 |= (LED_VAL_LINKON << LED_TXRX_SHIFT); - -- et131x_mii_write(adapter, PHY_LED_2, lcr2); -+ et131x_mii_write(adapter, phydev->addr, PHY_LED_2, lcr2); - } - } - -@@ -4202,14 +4189,14 @@ static void et131x_adjust_link(struct net_device *netdev) - - et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG, - ®ister18); -- et131x_mii_write(adapter, PHY_MPHY_CONTROL_REG, -- register18 | 0x4); -- et131x_mii_write(adapter, PHY_INDEX_REG, -+ et131x_mii_write(adapter, phydev->addr, -+ PHY_MPHY_CONTROL_REG, register18 | 0x4); -+ et131x_mii_write(adapter, phydev->addr, PHY_INDEX_REG, - register18 | 0x8402); -- et131x_mii_write(adapter, PHY_DATA_REG, -+ et131x_mii_write(adapter, phydev->addr, PHY_DATA_REG, - register18 | 511); -- et131x_mii_write(adapter, PHY_MPHY_CONTROL_REG, -- register18); -+ et131x_mii_write(adapter, phydev->addr, -+ PHY_MPHY_CONTROL_REG, register18); - } - - et1310_config_flow_control(adapter); -@@ -4221,7 +4208,8 @@ static void et131x_adjust_link(struct net_device *netdev) - et131x_mii_read(adapter, PHY_CONFIG, ®); - reg &= ~ET_PHY_CONFIG_TX_FIFO_DEPTH; - reg |= ET_PHY_CONFIG_FIFO_DEPTH_32; -- et131x_mii_write(adapter, PHY_CONFIG, reg); -+ et131x_mii_write(adapter, phydev->addr, PHY_CONFIG, -+ reg); - } - - et131x_set_rx_dma_timer(adapter); -@@ -4254,14 +4242,17 @@ static void et131x_adjust_link(struct net_device *netdev) - - et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG, - ®ister18); -- et131x_mii_write(adapter, PHY_MPHY_CONTROL_REG, -- register18 | 0x4); -- et131x_mii_write(adapter, PHY_INDEX_REG, -- register18 | 0x8402); -- et131x_mii_write(adapter, PHY_DATA_REG, -- register18 | 511); -- et131x_mii_write(adapter, PHY_MPHY_CONTROL_REG, -- register18); -+ et131x_mii_write(adapter, phydev->addr, -+ PHY_MPHY_CONTROL_REG, -+ register18 | 0x4); -+ et131x_mii_write(adapter, phydev->addr, -+ PHY_INDEX_REG, -+ register18 | 0x8402); -+ et131x_mii_write(adapter, phydev->addr, -+ PHY_DATA_REG, register18 | 511); -+ et131x_mii_write(adapter, phydev->addr, -+ PHY_MPHY_CONTROL_REG, -+ register18); - } - - /* Free the packets being actively sent & stopped */ -@@ -5343,10 +5334,6 @@ static int __devinit et131x_pci_setup(struct pci_dev *pdev, - /* Copy address into the net_device struct */ - memcpy(netdev->dev_addr, adapter->addr, ETH_ALEN); - -- /* Init variable for counting how long we do not have link status */ -- adapter->boot_coma = 0; -- et1310_disable_phy_coma(adapter); -- - rc = -ENOMEM; - - /* Setup the mii_bus struct */ -@@ -5362,7 +5349,6 @@ static int __devinit et131x_pci_setup(struct pci_dev *pdev, - adapter->mii_bus->priv = netdev; - adapter->mii_bus->read = et131x_mdio_read; - adapter->mii_bus->write = et131x_mdio_write; -- adapter->mii_bus->reset = et131x_mdio_reset; - adapter->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); - if (!adapter->mii_bus->irq) { - dev_err(&pdev->dev, "mii_bus irq allocation failed\n"); -@@ -5387,6 +5373,10 @@ static int __devinit et131x_pci_setup(struct pci_dev *pdev, - /* Setup et1310 as per the documentation */ - et131x_adapter_setup(adapter); - -+ /* Init variable for counting how long we do not have link status */ -+ adapter->boot_coma = 0; -+ et1310_disable_phy_coma(adapter); -+ - /* We can enable interrupts now - * - * NOTE - Because registration of interrupt handler is done in the -diff --git a/drivers/staging/iio/adc/ad799x_core.c b/drivers/staging/iio/adc/ad799x_core.c -index a845866..0cad467 100644 ---- a/drivers/staging/iio/adc/ad799x_core.c -+++ b/drivers/staging/iio/adc/ad799x_core.c -@@ -873,7 +873,8 @@ static int __devinit ad799x_probe(struct i2c_client *client, - return 0; - - error_free_irq: -- free_irq(client->irq, indio_dev); -+ if (client->irq > 0) -+ free_irq(client->irq, indio_dev); - error_cleanup_ring: - ad799x_ring_cleanup(indio_dev); - error_disable_reg: -diff --git a/drivers/staging/line6/pcm.c b/drivers/staging/line6/pcm.c -index 90d2d44..3f71e9e 100644 ---- a/drivers/staging/line6/pcm.c -+++ b/drivers/staging/line6/pcm.c -@@ -378,8 +378,11 @@ static int snd_line6_pcm_free(struct snd_device *device) - */ - static void pcm_disconnect_substream(struct snd_pcm_substream *substream) - { -- if (substream->runtime && snd_pcm_running(substream)) -+ if (substream->runtime && snd_pcm_running(substream)) { -+ snd_pcm_stream_lock_irq(substream); - snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED); -+ snd_pcm_stream_unlock_irq(substream); -+ } - } - - /* -diff --git a/drivers/staging/media/lirc/lirc_zilog.c b/drivers/staging/media/lirc/lirc_zilog.c -index 76ea4a8..56a96d3 100644 ---- a/drivers/staging/media/lirc/lirc_zilog.c -+++ b/drivers/staging/media/lirc/lirc_zilog.c -@@ -61,6 +61,9 @@ - #include - #include - -+/* Max transfer size done by I2C transfer functions */ -+#define MAX_XFER_SIZE 64 -+ - struct IR; - - struct IR_rx { -@@ -942,7 +945,14 @@ static ssize_t read(struct file *filep, char *outbuf, size_t n, loff_t *ppos) - schedule(); - set_current_state(TASK_INTERRUPTIBLE); - } else { -- unsigned char buf[rbuf->chunk_size]; -+ unsigned char buf[MAX_XFER_SIZE]; -+ -+ if (rbuf->chunk_size > sizeof(buf)) { -+ zilog_error("chunk_size is too big (%d)!\n", -+ rbuf->chunk_size); -+ ret = -EINVAL; -+ break; -+ } - m = lirc_buffer_read(rbuf, buf); - if (m == rbuf->chunk_size) { - ret = copy_to_user((void *)outbuf+written, buf, -diff --git a/drivers/staging/octeon/ethernet-tx.c b/drivers/staging/octeon/ethernet-tx.c -index 91a97b3..5877b2c 100644 ---- a/drivers/staging/octeon/ethernet-tx.c -+++ b/drivers/staging/octeon/ethernet-tx.c -@@ -345,7 +345,7 @@ int cvm_oct_xmit(struct sk_buff *skb, struct net_device *dev) - } - if (unlikely - (skb->truesize != -- sizeof(*skb) + skb_end_pointer(skb) - skb->head)) { -+ sizeof(*skb) + skb_end_offset(skb))) { - /* - printk("TX buffer truesize has been changed\n"); - */ -diff --git a/drivers/staging/ozwpan/ozcdev.c b/drivers/staging/ozwpan/ozcdev.c -index 1c380d6..1c92451 100644 ---- a/drivers/staging/ozwpan/ozcdev.c -+++ b/drivers/staging/ozwpan/ozcdev.c -@@ -153,6 +153,9 @@ ssize_t oz_cdev_write(struct file *filp, const char __user *buf, size_t count, - struct oz_app_hdr *app_hdr; - struct oz_serial_ctx *ctx; - -+ if (count > sizeof(ei->data) - sizeof(*elt) - sizeof(*app_hdr)) -+ return -EINVAL; -+ - spin_lock_bh(&g_cdev.lock); - pd = g_cdev.active_pd; - if (pd) -diff --git a/drivers/staging/rtl8712/rtl871x_recv.c b/drivers/staging/rtl8712/rtl871x_recv.c -index 5b03b40..79f3b97 100644 ---- a/drivers/staging/rtl8712/rtl871x_recv.c -+++ b/drivers/staging/rtl8712/rtl871x_recv.c -@@ -253,7 +253,7 @@ union recv_frame *r8712_portctrl(struct _adapter *adapter, - struct sta_info *psta; - struct sta_priv *pstapriv; - union recv_frame *prtnframe; -- u16 ether_type = 0; -+ u16 ether_type; - - pstapriv = &adapter->stapriv; - ptr = get_recvframe_data(precv_frame); -@@ -262,15 +262,14 @@ union recv_frame *r8712_portctrl(struct _adapter *adapter, - psta = r8712_get_stainfo(pstapriv, psta_addr); - auth_alg = adapter->securitypriv.AuthAlgrthm; - if (auth_alg == 2) { -+ /* get ether_type */ -+ ptr = ptr + pfhdr->attrib.hdrlen + LLC_HEADER_SIZE; -+ memcpy(ðer_type, ptr, 2); -+ ether_type = ntohs((unsigned short)ether_type); -+ - if ((psta != NULL) && (psta->ieee8021x_blocked)) { - /* blocked - * only accept EAPOL frame */ -- prtnframe = precv_frame; -- /*get ether_type */ -- ptr = ptr + pfhdr->attrib.hdrlen + -- pfhdr->attrib.iv_len + LLC_HEADER_SIZE; -- memcpy(ðer_type, ptr, 2); -- ether_type = ntohs((unsigned short)ether_type); - if (ether_type == 0x888e) - prtnframe = precv_frame; - else { -diff --git a/drivers/staging/rtl8712/usb_intf.c b/drivers/staging/rtl8712/usb_intf.c -index 7b3ae00..1b1bf38 100644 ---- a/drivers/staging/rtl8712/usb_intf.c -+++ b/drivers/staging/rtl8712/usb_intf.c -@@ -361,6 +361,10 @@ static u8 key_2char2num(u8 hch, u8 lch) - return (hex_to_bin(hch) << 4) | hex_to_bin(lch); - } - -+static const struct device_type wlan_type = { -+ .name = "wlan", -+}; -+ - /* - * drv_init() - a device potentially for us - * -@@ -396,6 +400,7 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf, - padapter->pusb_intf = pusb_intf; - usb_set_intfdata(pusb_intf, pnetdev); - SET_NETDEV_DEV(pnetdev, &pusb_intf->dev); -+ pnetdev->dev.type = &wlan_type; - /* step 2. */ - padapter->dvobj_init = &r8712_usb_dvobj_init; - padapter->dvobj_deinit = &r8712_usb_dvobj_deinit; -diff --git a/drivers/staging/serqt_usb2/serqt_usb2.c b/drivers/staging/serqt_usb2/serqt_usb2.c -index ae1d815..a85d5c9 100644 ---- a/drivers/staging/serqt_usb2/serqt_usb2.c -+++ b/drivers/staging/serqt_usb2/serqt_usb2.c -@@ -771,7 +771,7 @@ static int qt_startup(struct usb_serial *serial) - goto startup_error; - } - -- switch (serial->dev->descriptor.idProduct) { -+ switch (le16_to_cpu(serial->dev->descriptor.idProduct)) { - case QUATECH_DSU100: - case QUATECH_QSU100: - case QUATECH_ESU100A: -diff --git a/drivers/staging/speakup/i18n.c b/drivers/staging/speakup/i18n.c -index c211943..7656014 100644 ---- a/drivers/staging/speakup/i18n.c -+++ b/drivers/staging/speakup/i18n.c -@@ -390,7 +390,7 @@ static struct msg_group_t all_groups[] = { - - static const int num_groups = sizeof(all_groups) / sizeof(struct msg_group_t); - --char *msg_get(enum msg_index_t index) -+char *spk_msg_get(enum msg_index_t index) - { - char *ch; - -@@ -540,7 +540,7 @@ static int fmt_validate(char *template, char *user) - * -EINVAL - Invalid format specifiers in formatted message or illegal index. - * -ENOMEM - Unable to allocate memory. - */ --ssize_t msg_set(enum msg_index_t index, char *text, size_t length) -+ssize_t spk_msg_set(enum msg_index_t index, char *text, size_t length) - { - int rc = 0; - char *newstr = NULL; -@@ -575,7 +575,7 @@ ssize_t msg_set(enum msg_index_t index, char *text, size_t length) - * Find a message group, given its name. Return a pointer to the structure - * if found, or NULL otherwise. - */ --struct msg_group_t *find_msg_group(const char *group_name) -+struct msg_group_t *spk_find_msg_group(const char *group_name) - { - struct msg_group_t *group = NULL; - int i; -@@ -589,7 +589,7 @@ struct msg_group_t *find_msg_group(const char *group_name) - return group; - } - --void reset_msg_group(struct msg_group_t *group) -+void spk_reset_msg_group(struct msg_group_t *group) - { - unsigned long flags; - enum msg_index_t i; -@@ -605,14 +605,14 @@ void reset_msg_group(struct msg_group_t *group) - } - - /* Called at initialization time, to establish default messages. */ --void initialize_msgs(void) -+void spk_initialize_msgs(void) - { - memcpy(speakup_msgs, speakup_default_msgs, - sizeof(speakup_default_msgs)); - } - - /* Free user-supplied strings when module is unloaded: */ --void free_user_msgs(void) -+void spk_free_user_msgs(void) - { - enum msg_index_t index; - unsigned long flags; -diff --git a/drivers/staging/speakup/i18n.h b/drivers/staging/speakup/i18n.h -index 65caa80..dd338f4 100644 ---- a/drivers/staging/speakup/i18n.h -+++ b/drivers/staging/speakup/i18n.h -@@ -218,11 +218,11 @@ struct msg_group_t { - enum msg_index_t end; - }; - --extern char *msg_get(enum msg_index_t index); --extern ssize_t msg_set(enum msg_index_t index, char *text, size_t length); --extern struct msg_group_t *find_msg_group(const char *group_name); --extern void reset_msg_group(struct msg_group_t *group); --extern void initialize_msgs(void); --extern void free_user_msgs(void); -+extern char *spk_msg_get(enum msg_index_t index); -+extern ssize_t spk_msg_set(enum msg_index_t index, char *text, size_t length); -+extern struct msg_group_t *spk_find_msg_group(const char *group_name); -+extern void spk_reset_msg_group(struct msg_group_t *group); -+extern void spk_initialize_msgs(void); -+extern void spk_free_user_msgs(void); - - #endif -diff --git a/drivers/staging/speakup/keyhelp.c b/drivers/staging/speakup/keyhelp.c -index 170f388..4c584ec 100644 ---- a/drivers/staging/speakup/keyhelp.c -+++ b/drivers/staging/speakup/keyhelp.c -@@ -115,10 +115,10 @@ static void say_key(int key) - key &= 0xff; - for (i = 0; i < 6; i++) { - if (state & masks[i]) -- synth_printf(" %s", msg_get(MSG_STATES_START + i)); -+ synth_printf(" %s", spk_msg_get(MSG_STATES_START + i)); - } - if ((key > 0) && (key <= num_key_names)) -- synth_printf(" %s\n", msg_get(MSG_KEYNAMES_START + (key - 1))); -+ synth_printf(" %s\n", spk_msg_get(MSG_KEYNAMES_START + (key - 1))); - } - - static int help_init(void) -@@ -126,9 +126,9 @@ static int help_init(void) - char start = SPACE; - int i; - int num_funcs = MSG_FUNCNAMES_END - MSG_FUNCNAMES_START + 1; --state_tbl = our_keys[0]+SHIFT_TBL_SIZE+2; -+state_tbl = spk_our_keys[0]+SHIFT_TBL_SIZE+2; - for (i = 0; i < num_funcs; i++) { -- char *cur_funcname = msg_get(MSG_FUNCNAMES_START + i); -+ char *cur_funcname = spk_msg_get(MSG_FUNCNAMES_START + i); - if (start == *cur_funcname) - continue; - start = *cur_funcname; -@@ -137,7 +137,7 @@ state_tbl = our_keys[0]+SHIFT_TBL_SIZE+2; - return 0; - } - --int handle_help(struct vc_data *vc, u_char type, u_char ch, u_short key) -+int spk_handle_help(struct vc_data *vc, u_char type, u_char ch, u_short key) - { - int i, n; - char *name; -@@ -147,15 +147,15 @@ int handle_help(struct vc_data *vc, u_char type, u_char ch, u_short key) - help_init(); - if (type == KT_LATIN) { - if (ch == SPACE) { -- special_handler = NULL; -- synth_printf("%s\n", msg_get(MSG_LEAVING_HELP)); -+ spk_special_handler = NULL; -+ synth_printf("%s\n", spk_msg_get(MSG_LEAVING_HELP)); - return 1; - } - ch |= 32; /* lower case */ - if (ch < 'a' || ch > 'z') - return -1; - if (letter_offsets[ch-'a'] == -1) { -- synth_printf(msg_get(MSG_NO_COMMAND), ch); -+ synth_printf(spk_msg_get(MSG_NO_COMMAND), ch); - synth_printf("\n"); - return 1; - } -@@ -169,47 +169,47 @@ int handle_help(struct vc_data *vc, u_char type, u_char ch, u_short key) - cur_item--; - else - return -1; -- } else if (type == KT_SPKUP && ch == SPEAKUP_HELP && !special_handler) { -- special_handler = handle_help; -- synth_printf("%s\n", msg_get(MSG_HELP_INFO)); -+ } else if (type == KT_SPKUP && ch == SPEAKUP_HELP && !spk_special_handler) { -+ spk_special_handler = spk_handle_help; -+ synth_printf("%s\n", spk_msg_get(MSG_HELP_INFO)); - build_key_data(); /* rebuild each time in case new mapping */ - return 1; - } else { - name = NULL; - if ((type != KT_SPKUP) && (key > 0) && (key <= num_key_names)) { - synth_printf("%s\n", -- msg_get(MSG_KEYNAMES_START + key-1)); -+ spk_msg_get(MSG_KEYNAMES_START + key-1)); - return 1; - } - for (i = 0; funcvals[i] != 0 && !name; i++) { - if (ch == funcvals[i]) -- name = msg_get(MSG_FUNCNAMES_START + i); -+ name = spk_msg_get(MSG_FUNCNAMES_START + i); - } - if (!name) - return -1; -- kp = our_keys[key]+1; -+ kp = spk_our_keys[key]+1; - for (i = 0; i < nstates; i++) { - if (ch == kp[i]) - break; - } - key += (state_tbl[i] << 8); - say_key(key); -- synth_printf(msg_get(MSG_KEYDESC), name); -+ synth_printf(spk_msg_get(MSG_KEYDESC), name); - synth_printf("\n"); - return 1; - } -- name = msg_get(MSG_FUNCNAMES_START + cur_item); -+ name = spk_msg_get(MSG_FUNCNAMES_START + cur_item); - func = funcvals[cur_item]; - synth_printf("%s", name); - if (key_offsets[func] == 0) { -- synth_printf(" %s\n", msg_get(MSG_IS_UNASSIGNED)); -+ synth_printf(" %s\n", spk_msg_get(MSG_IS_UNASSIGNED)); - return 1; - } - p_keys = key_data + key_offsets[func]; - for (n = 0; p_keys[n]; n++) { - val = p_keys[n]; - if (n > 0) -- synth_printf("%s ", msg_get(MSG_DISJUNCTION)); -+ synth_printf("%s ", spk_msg_get(MSG_DISJUNCTION)); - say_key(val); - } - return 1; -diff --git a/drivers/staging/speakup/kobjects.c b/drivers/staging/speakup/kobjects.c -index 2093896..86387f4 100644 ---- a/drivers/staging/speakup/kobjects.c -+++ b/drivers/staging/speakup/kobjects.c -@@ -41,7 +41,7 @@ static ssize_t chars_chartab_show(struct kobject *kobj, - break; - if (strcmp("characters", attr->attr.name) == 0) { - len = scnprintf(buf_pointer, bufsize, "%d\t%s\n", -- i, characters[i]); -+ i, spk_characters[i]); - } else { /* show chartab entry */ - if (IS_TYPE(i, B_CTL)) - cp = "B_CTL"; -@@ -185,12 +185,12 @@ static ssize_t chars_chartab_store(struct kobject *kobj, - outptr[desc_length] = '\0'; - - if (do_characters) { -- if (characters[index] != default_chars[index]) -- kfree(characters[index]); -- characters[index] = desc; -+ if (spk_characters[index] != spk_default_chars[index]) -+ kfree(spk_characters[index]); -+ spk_characters[index] = desc; - used++; - } else { -- charclass = chartab_get_value(keyword); -+ charclass = spk_chartab_get_value(keyword); - if (charclass == 0) { - rejected++; - cp = linefeed + 1; -@@ -206,9 +206,9 @@ static ssize_t chars_chartab_store(struct kobject *kobj, - - if (reset) { - if (do_characters) -- reset_default_chars(); -+ spk_reset_default_chars(); - else -- reset_default_chartab(); -+ spk_reset_default_chartab(); - } - - spk_unlock(flags); -@@ -232,7 +232,7 @@ static ssize_t keymap_show(struct kobject *kobj, struct kobj_attribute *attr, - u_char ch; - unsigned long flags; - spk_lock(flags); -- cp1 = key_buf + SHIFT_TBL_SIZE; -+ cp1 = spk_key_buf + SHIFT_TBL_SIZE; - num_keys = (int)(*cp1); - nstates = (int)cp1[1]; - cp += sprintf(cp, "%d, %d, %d,\n", KEY_MAP_VER, num_keys, nstates); -@@ -271,7 +271,7 @@ static ssize_t keymap_store(struct kobject *kobj, struct kobj_attribute *attr, - return -ENOMEM; - } - if (strchr("dDrR", *in_buff)) { -- set_key_info(key_defaults, key_buf); -+ spk_set_key_info(spk_key_defaults, spk_key_buf); - pr_info("keymap set to default values\n"); - kfree(in_buff); - spk_unlock(flags); -@@ -282,14 +282,14 @@ static ssize_t keymap_store(struct kobject *kobj, struct kobj_attribute *attr, - cp = in_buff; - cp1 = (u_char *)in_buff; - for (i = 0; i < 3; i++) { -- cp = s2uchar(cp, cp1); -+ cp = spk_s2uchar(cp, cp1); - cp1++; - } - i = (int)cp1[-2]+1; - i *= (int)cp1[-1]+1; - i += 2; /* 0 and last map ver */ - if (cp1[-3] != KEY_MAP_VER || cp1[-1] > 10 || -- i+SHIFT_TBL_SIZE+4 >= sizeof(key_buf)) { -+ i+SHIFT_TBL_SIZE+4 >= sizeof(spk_key_buf)) { - pr_warn("i %d %d %d %d\n", i, - (int)cp1[-3], (int)cp1[-2], (int)cp1[-1]); - kfree(in_buff); -@@ -297,7 +297,7 @@ static ssize_t keymap_store(struct kobject *kobj, struct kobj_attribute *attr, - return -EINVAL; - } - while (--i >= 0) { -- cp = s2uchar(cp, cp1); -+ cp = spk_s2uchar(cp, cp1); - cp1++; - if (!(*cp)) - break; -@@ -307,8 +307,8 @@ static ssize_t keymap_store(struct kobject *kobj, struct kobj_attribute *attr, - pr_warn("end %d %d %d %d\n", i, - (int)cp1[-3], (int)cp1[-2], (int)cp1[-1]); - } else { -- if (set_key_info(in_buff, key_buf)) { -- set_key_info(key_defaults, key_buf); -+ if (spk_set_key_info(in_buff, spk_key_buf)) { -+ spk_set_key_info(spk_key_defaults, spk_key_buf); - ret = -EINVAL; - pr_warn("set key failed\n"); - } -@@ -343,7 +343,7 @@ static ssize_t silent_store(struct kobject *kobj, struct kobj_attribute *attr, - spk_lock(flags); - if (ch&2) { - shut = 1; -- do_flush(); -+ spk_do_flush(); - } else { - shut = 0; - } -@@ -388,7 +388,7 @@ static ssize_t synth_store(struct kobject *kobj, struct kobj_attribute *attr, - if (new_synth_name[len - 1] == '\n') - len--; - new_synth_name[len] = '\0'; -- strlwr(new_synth_name); -+ spk_strlwr(new_synth_name); - if ((synth != NULL) && (!strcmp(new_synth_name, synth->name))) { - pr_warn("%s already in use\n", new_synth_name); - } else if (synth_init(new_synth_name) != 0) { -@@ -417,7 +417,7 @@ static ssize_t synth_direct_store(struct kobject *kobj, - bytes = min_t(size_t, len, 250); - strncpy(tmp, ptr, bytes); - tmp[bytes] = '\0'; -- xlate(tmp); -+ spk_xlate(tmp); - synth_printf("%s", tmp); - ptr += bytes; - len -= bytes; -@@ -455,14 +455,14 @@ static ssize_t punc_show(struct kobject *kobj, struct kobj_attribute *attr, - short mask; - unsigned long flags; - -- p_header = var_header_by_name(attr->attr.name); -+ p_header = spk_var_header_by_name(attr->attr.name); - if (p_header == NULL) { - pr_warn("p_header is null, attr->attr.name is %s\n", - attr->attr.name); - return -EINVAL; - } - -- var = get_punc_var(p_header->var_id); -+ var = spk_get_punc_var(p_header->var_id); - if (var == NULL) { - pr_warn("var is null, p_header->var_id is %i\n", - p_header->var_id); -@@ -470,7 +470,7 @@ static ssize_t punc_show(struct kobject *kobj, struct kobj_attribute *attr, - } - - spk_lock(flags); -- pb = (struct st_bits_data *) &punc_info[var->value]; -+ pb = (struct st_bits_data *) &spk_punc_info[var->value]; - mask = pb->mask; - for (i = 33; i < 128; i++) { - if (!(spk_chartab[i]&mask)) -@@ -497,14 +497,14 @@ static ssize_t punc_store(struct kobject *kobj, struct kobj_attribute *attr, - if (x < 1 || x > 99) - return -EINVAL; - -- p_header = var_header_by_name(attr->attr.name); -+ p_header = spk_var_header_by_name(attr->attr.name); - if (p_header == NULL) { - pr_warn("p_header is null, attr->attr.name is %s\n", - attr->attr.name); - return -EINVAL; - } - -- var = get_punc_var(p_header->var_id); -+ var = spk_get_punc_var(p_header->var_id); - if (var == NULL) { - pr_warn("var is null, p_header->var_id is %i\n", - p_header->var_id); -@@ -520,9 +520,9 @@ static ssize_t punc_store(struct kobject *kobj, struct kobj_attribute *attr, - spk_lock(flags); - - if (*punc_buf == 'd' || *punc_buf == 'r') -- x = set_mask_bits(0, var->value, 3); -+ x = spk_set_mask_bits(0, var->value, 3); - else -- x = set_mask_bits(punc_buf, var->value, 3); -+ x = spk_set_mask_bits(punc_buf, var->value, 3); - - spk_unlock(flags); - return count; -@@ -542,7 +542,7 @@ ssize_t spk_var_show(struct kobject *kobj, struct kobj_attribute *attr, - char ch; - unsigned long flags; - -- param = var_header_by_name(attr->attr.name); -+ param = spk_var_header_by_name(attr->attr.name); - if (param == NULL) - return -EINVAL; - -@@ -599,13 +599,13 @@ ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr, - int value; - unsigned long flags; - -- param = var_header_by_name(attr->attr.name); -+ param = spk_var_header_by_name(attr->attr.name); - if (param == NULL) - return -EINVAL; - if (param->data == NULL) - return 0; - ret = 0; -- cp = xlate((char *) buf); -+ cp = spk_xlate((char *) buf); - - spk_lock(flags); - switch (param->var_type) { -@@ -618,7 +618,7 @@ ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr, - else - len = E_SET; - speakup_s2i(cp, &value); -- ret = set_num_var(value, param, len); -+ ret = spk_set_num_var(value, param, len); - if (ret == E_RANGE) { - var_data = param->data; - pr_warn("value for %s out of range, expect %d to %d\n", -@@ -636,7 +636,7 @@ ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr, - } - cp = (char *) buf; - cp[len] = '\0'; -- ret = set_string_var(buf, param, len); -+ ret = spk_set_string_var(buf, param, len); - if (ret == E_TOOLONG) - pr_warn("value too long for %s\n", - attr->attr.name); -@@ -652,19 +652,19 @@ ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr, - */ - if (strcmp(attr->attr.name, "voice") == 0) { - if (synth && synth->default_pitch) { -- param = var_header_by_name("pitch"); -+ param = spk_var_header_by_name("pitch"); - if (param) { -- set_num_var(synth->default_pitch[value], param, -+ spk_set_num_var(synth->default_pitch[value], param, - E_NEW_DEFAULT); -- set_num_var(0, param, E_DEFAULT); -+ spk_set_num_var(0, param, E_DEFAULT); - } - } - if (synth && synth->default_vol) { -- param = var_header_by_name("vol"); -+ param = spk_var_header_by_name("vol"); - if (param) { -- set_num_var(synth->default_vol[value], param, -+ spk_set_num_var(synth->default_vol[value], param, - E_NEW_DEFAULT); -- set_num_var(0, param, E_DEFAULT); -+ spk_set_num_var(0, param, E_DEFAULT); - } - } - } -@@ -694,7 +694,7 @@ static ssize_t message_show_helper(char *buf, enum msg_index_t first, - if (bufsize <= 1) - break; - printed = scnprintf(buf_pointer, bufsize, "%d\t%s\n", -- index, msg_get(cursor)); -+ index, spk_msg_get(cursor)); - buf_pointer += printed; - bufsize -= printed; - } -@@ -788,7 +788,7 @@ static ssize_t message_store_helper(const char *buf, size_t count, - continue; - } - -- msg_stored = msg_set(curmessage, temp, desc_length); -+ msg_stored = spk_msg_set(curmessage, temp, desc_length); - if (msg_stored < 0) { - retval = msg_stored; - if (msg_stored == -ENOMEM) -@@ -802,7 +802,7 @@ static ssize_t message_store_helper(const char *buf, size_t count, - } - - if (reset) -- reset_msg_group(group); -+ spk_reset_msg_group(group); - - report_msg_status(reset, received, used, rejected, group->name); - return retval; -@@ -812,7 +812,7 @@ static ssize_t message_show(struct kobject *kobj, - struct kobj_attribute *attr, char *buf) - { - ssize_t retval = 0; -- struct msg_group_t *group = find_msg_group(attr->attr.name); -+ struct msg_group_t *group = spk_find_msg_group(attr->attr.name); - unsigned long flags; - - BUG_ON(!group); -@@ -826,7 +826,7 @@ static ssize_t message_store(struct kobject *kobj, struct kobj_attribute *attr, - const char *buf, size_t count) - { - ssize_t retval = 0; -- struct msg_group_t *group = find_msg_group(attr->attr.name); -+ struct msg_group_t *group = spk_find_msg_group(attr->attr.name); - - BUG_ON(!group); - retval = message_store_helper(buf, count, group); -diff --git a/drivers/staging/speakup/main.c b/drivers/staging/speakup/main.c -index 40e2488..192218a 100644 ---- a/drivers/staging/speakup/main.c -+++ b/drivers/staging/speakup/main.c -@@ -65,23 +65,23 @@ MODULE_VERSION(SPEAKUP_VERSION); - - char *synth_name; - module_param_named(synth, synth_name, charp, S_IRUGO); --module_param_named(quiet, quiet_boot, bool, S_IRUGO); -+module_param_named(quiet, spk_quiet_boot, bool, S_IRUGO); - - MODULE_PARM_DESC(synth, "Synth to start if speakup is built in."); - MODULE_PARM_DESC(quiet, "Do not announce when the synthesizer is found."); - --special_func special_handler; -+special_func spk_special_handler; - --short pitch_shift, synth_flags; -+short spk_pitch_shift, synth_flags; - static char buf[256]; --int attrib_bleep, bleeps, bleep_time = 10; --int no_intr, spell_delay; --int key_echo, say_word_ctl; --int say_ctrl, bell_pos; --short punc_mask; --int punc_level, reading_punc; --char str_caps_start[MAXVARLEN + 1] = "\0", str_caps_stop[MAXVARLEN + 1] = "\0"; --const struct st_bits_data punc_info[] = { -+int spk_attrib_bleep, spk_bleeps, spk_bleep_time = 10; -+int spk_no_intr, spk_spell_delay; -+int spk_key_echo, spk_say_word_ctl; -+int spk_say_ctrl, spk_bell_pos; -+short spk_punc_mask; -+int spk_punc_level, spk_reading_punc; -+char spk_str_caps_start[MAXVARLEN + 1] = "\0", spk_str_caps_stop[MAXVARLEN + 1] = "\0"; -+const struct st_bits_data spk_punc_info[] = { - {"none", "", 0}, - {"some", "/$%&@", SOME}, - {"most", "$%&#()=+*/@^<>|\\", MOST}, -@@ -95,9 +95,9 @@ const struct st_bits_data punc_info[] = { - - static char mark_cut_flag; - #define MAX_KEY 160 --u_char *our_keys[MAX_KEY], *shift_table; --u_char key_buf[600]; --const u_char key_defaults[] = { -+u_char *spk_our_keys[MAX_KEY], *spk_shift_table; -+u_char spk_key_buf[600]; -+const u_char spk_key_defaults[] = { - #include "speakupmap.h" - }; - -@@ -129,9 +129,9 @@ static char *phonetic[] = { - /* array of 256 char pointers (one for each character description) - * initialized to default_chars and user selectable via - * /proc/speakup/characters */ --char *characters[256]; -+char *spk_characters[256]; - --char *default_chars[256] = { -+char *spk_default_chars[256] = { - /*000*/ "null", "^a", "^b", "^c", "^d", "^e", "^f", "^g", - /*008*/ "^h", "^i", "^j", "^k", "^l", "^m", "^n", "^o", - /*016*/ "^p", "^q", "^r", "^s", "^t", "^u", "^v", "^w", -@@ -238,7 +238,7 @@ static u_short default_chartab[256] = { - }; - - struct task_struct *speakup_task; --struct bleep unprocessed_sound; -+struct bleep spk_unprocessed_sound; - static int spk_keydown; - static u_char spk_lastkey, spk_close_press, keymap_flags; - static u_char last_keycode, this_speakup_key; -@@ -282,13 +282,13 @@ static void bleep(u_short val) - 350, 370, 392, 414, 440, 466, 491, 523, 554, 587, 619, 659 - }; - short freq; -- int time = bleep_time; -+ int time = spk_bleep_time; - freq = vals[val % 12]; - if (val > 11) - freq *= (1 << (val / 12)); -- unprocessed_sound.freq = freq; -- unprocessed_sound.jiffies = msecs_to_jiffies(time); -- unprocessed_sound.active = 1; -+ spk_unprocessed_sound.freq = freq; -+ spk_unprocessed_sound.jiffies = msecs_to_jiffies(time); -+ spk_unprocessed_sound.active = 1; - /* We can only have 1 active sound at a time. */ - } - -@@ -300,7 +300,7 @@ static void speakup_shut_up(struct vc_data *vc) - spk_parked &= 0xfe; - speakup_date(vc); - if (synth != NULL) -- do_flush(); -+ spk_do_flush(); - } - - static void speech_kill(struct vc_data *vc) -@@ -313,9 +313,9 @@ static void speech_kill(struct vc_data *vc) - if (val == 2 || spk_killed) { - /* dead */ - spk_shut_up &= ~0x40; -- synth_printf("%s\n", msg_get(MSG_IAM_ALIVE)); -+ synth_printf("%s\n", spk_msg_get(MSG_IAM_ALIVE)); - } else { -- synth_printf("%s\n", msg_get(MSG_YOU_KILLED_SPEAKUP)); -+ synth_printf("%s\n", spk_msg_get(MSG_YOU_KILLED_SPEAKUP)); - spk_shut_up |= 0x40; - } - } -@@ -324,10 +324,10 @@ static void speakup_off(struct vc_data *vc) - { - if (spk_shut_up & 0x80) { - spk_shut_up &= 0x7f; -- synth_printf("%s\n", msg_get(MSG_HEY_THATS_BETTER)); -+ synth_printf("%s\n", spk_msg_get(MSG_HEY_THATS_BETTER)); - } else { - spk_shut_up |= 0x80; -- synth_printf("%s\n", msg_get(MSG_YOU_TURNED_ME_OFF)); -+ synth_printf("%s\n", spk_msg_get(MSG_YOU_TURNED_ME_OFF)); - } - speakup_date(vc); - } -@@ -336,10 +336,10 @@ static void speakup_parked(struct vc_data *vc) - { - if (spk_parked & 0x80) { - spk_parked = 0; -- synth_printf("%s\n", msg_get(MSG_UNPARKED)); -+ synth_printf("%s\n", spk_msg_get(MSG_UNPARKED)); - } else { - spk_parked |= 0x80; -- synth_printf("%s\n", msg_get(MSG_PARKED)); -+ synth_printf("%s\n", spk_msg_get(MSG_PARKED)); - } - } - -@@ -350,16 +350,16 @@ static void speakup_cut(struct vc_data *vc) - - if (!mark_cut_flag) { - mark_cut_flag = 1; -- xs = (u_short) spk_x; -- ys = (u_short) spk_y; -+ spk_xs = (u_short) spk_x; -+ spk_ys = (u_short) spk_y; - spk_sel_cons = vc; -- synth_printf("%s\n", msg_get(MSG_MARK)); -+ synth_printf("%s\n", spk_msg_get(MSG_MARK)); - return; - } -- xe = (u_short) spk_x; -- ye = (u_short) spk_y; -+ spk_xe = (u_short) spk_x; -+ spk_ye = (u_short) spk_y; - mark_cut_flag = 0; -- synth_printf("%s\n", msg_get(MSG_CUT)); -+ synth_printf("%s\n", spk_msg_get(MSG_CUT)); - - speakup_clear_selection(); - ret = speakup_set_selection(tty); -@@ -383,9 +383,9 @@ static void speakup_paste(struct vc_data *vc) - { - if (mark_cut_flag) { - mark_cut_flag = 0; -- synth_printf("%s\n", msg_get(MSG_MARK_CLEARED)); -+ synth_printf("%s\n", spk_msg_get(MSG_MARK_CLEARED)); - } else { -- synth_printf("%s\n", msg_get(MSG_PASTE)); -+ synth_printf("%s\n", spk_msg_get(MSG_PASTE)); - speakup_paste_selection(tty); - } - } -@@ -395,16 +395,16 @@ static void say_attributes(struct vc_data *vc) - int fg = spk_attr & 0x0f; - int bg = spk_attr >> 4; - if (fg > 8) { -- synth_printf("%s ", msg_get(MSG_BRIGHT)); -+ synth_printf("%s ", spk_msg_get(MSG_BRIGHT)); - fg -= 8; - } -- synth_printf("%s", msg_get(MSG_COLORS_START + fg)); -+ synth_printf("%s", spk_msg_get(MSG_COLORS_START + fg)); - if (bg > 7) { -- synth_printf(" %s ", msg_get(MSG_ON_BLINKING)); -+ synth_printf(" %s ", spk_msg_get(MSG_ON_BLINKING)); - bg -= 8; - } else -- synth_printf(" %s ", msg_get(MSG_ON)); -- synth_printf("%s\n", msg_get(MSG_COLORS_START + bg)); -+ synth_printf(" %s ", spk_msg_get(MSG_ON)); -+ synth_printf("%s\n", spk_msg_get(MSG_COLORS_START + bg)); - } - - enum { -@@ -417,24 +417,24 @@ enum { - - static void announce_edge(struct vc_data *vc, int msg_id) - { -- if (bleeps & 1) -+ if (spk_bleeps & 1) - bleep(spk_y); -- if ((bleeps & 2) && (msg_id < edge_quiet)) -- synth_printf("%s\n", msg_get(MSG_EDGE_MSGS_START + msg_id - 1)); -+ if ((spk_bleeps & 2) && (msg_id < edge_quiet)) -+ synth_printf("%s\n", spk_msg_get(MSG_EDGE_MSGS_START + msg_id - 1)); - } - - static void speak_char(u_char ch) - { -- char *cp = characters[ch]; -- struct var_t *direct = get_var(DIRECT); -+ char *cp = spk_characters[ch]; -+ struct var_t *direct = spk_get_var(DIRECT); - if (direct && direct->u.n.value) { - if (IS_CHAR(ch, B_CAP)) { -- pitch_shift++; -- synth_printf("%s", str_caps_start); -+ spk_pitch_shift++; -+ synth_printf("%s", spk_str_caps_start); - } - synth_printf("%c", ch); - if (IS_CHAR(ch, B_CAP)) -- synth_printf("%s", str_caps_stop); -+ synth_printf("%s", spk_str_caps_stop); - return; - } - if (cp == NULL) { -@@ -443,13 +443,13 @@ static void speak_char(u_char ch) - } - synth_buffer_add(SPACE); - if (IS_CHAR(ch, B_CAP)) { -- pitch_shift++; -- synth_printf("%s", str_caps_start); -+ spk_pitch_shift++; -+ synth_printf("%s", spk_str_caps_start); - synth_printf("%s", cp); -- synth_printf("%s", str_caps_stop); -+ synth_printf("%s", spk_str_caps_stop); - } else { - if (*cp == '^') { -- synth_printf("%s", msg_get(MSG_CTRL)); -+ synth_printf("%s", spk_msg_get(MSG_CTRL)); - cp++; - } - synth_printf("%s", cp); -@@ -479,9 +479,9 @@ static void say_char(struct vc_data *vc) - spk_old_attr = spk_attr; - ch = get_char(vc, (u_short *) spk_pos, &spk_attr); - if (spk_attr != spk_old_attr) { -- if (attrib_bleep & 1) -+ if (spk_attrib_bleep & 1) - bleep(spk_y); -- if (attrib_bleep & 2) -+ if (spk_attrib_bleep & 2) - say_attributes(vc); - } - speak_char(ch & 0xff); -@@ -497,7 +497,7 @@ static void say_phonetic_char(struct vc_data *vc) - synth_printf("%s\n", phonetic[--ch]); - } else { - if (IS_CHAR(ch, B_NUM)) -- synth_printf("%s ", msg_get(MSG_NUMBER)); -+ synth_printf("%s ", spk_msg_get(MSG_NUMBER)); - speak_char(ch); - } - } -@@ -527,8 +527,8 @@ static void say_next_char(struct vc_data *vc) - } - - /* get_word - will first check to see if the character under the -- * reading cursor is a space and if say_word_ctl is true it will -- * return the word space. If say_word_ctl is not set it will check to -+ * reading cursor is a space and if spk_say_word_ctl is true it will -+ * return the word space. If spk_say_word_ctl is not set it will check to - * see if there is a word starting on the next position to the right - * and return that word if it exists. If it does not exist it will - * move left to the beginning of any previous word on the line or the -@@ -544,9 +544,9 @@ static u_long get_word(struct vc_data *vc) - ch = (char)get_char(vc, (u_short *) tmp_pos, &temp); - - /* decided to take out the sayword if on a space (mis-information */ -- if (say_word_ctl && ch == SPACE) { -+ if (spk_say_word_ctl && ch == SPACE) { - *buf = '\0'; -- synth_printf("%s\n", msg_get(MSG_SPACE)); -+ synth_printf("%s\n", spk_msg_get(MSG_SPACE)); - return 0; - } else if ((tmpx < vc->vc_cols - 2) - && (ch == SPACE || ch == 0 || IS_WDLM(ch)) -@@ -582,13 +582,13 @@ static u_long get_word(struct vc_data *vc) - static void say_word(struct vc_data *vc) - { - u_long cnt = get_word(vc); -- u_short saved_punc_mask = punc_mask; -+ u_short saved_punc_mask = spk_punc_mask; - if (cnt == 0) - return; -- punc_mask = PUNC; -+ spk_punc_mask = PUNC; - buf[cnt++] = SPACE; - spkup_write(buf, cnt); -- punc_mask = saved_punc_mask; -+ spk_punc_mask = saved_punc_mask; - } - - static void say_prev_word(struct vc_data *vc) -@@ -686,22 +686,22 @@ static void say_next_word(struct vc_data *vc) - static void spell_word(struct vc_data *vc) - { - static char *delay_str[] = { "", ",", ".", ". .", ". . ." }; -- char *cp = buf, *str_cap = str_caps_stop; -- char *cp1, *last_cap = str_caps_stop; -+ char *cp = buf, *str_cap = spk_str_caps_stop; -+ char *cp1, *last_cap = spk_str_caps_stop; - u_char ch; - if (!get_word(vc)) - return; - while ((ch = (u_char) *cp)) { - if (cp != buf) -- synth_printf(" %s ", delay_str[spell_delay]); -+ synth_printf(" %s ", delay_str[spk_spell_delay]); - if (IS_CHAR(ch, B_CAP)) { -- str_cap = str_caps_start; -- if (*str_caps_stop) -- pitch_shift++; -+ str_cap = spk_str_caps_start; -+ if (*spk_str_caps_stop) -+ spk_pitch_shift++; - else /* synth has no pitch */ -- last_cap = str_caps_stop; -+ last_cap = spk_str_caps_stop; - } else -- str_cap = str_caps_stop; -+ str_cap = spk_str_caps_stop; - if (str_cap != last_cap) { - synth_printf("%s", str_cap); - last_cap = str_cap; -@@ -711,17 +711,17 @@ static void spell_word(struct vc_data *vc) - ch &= 31; - cp1 = phonetic[--ch]; - } else { -- cp1 = characters[ch]; -+ cp1 = spk_characters[ch]; - if (*cp1 == '^') { -- synth_printf("%s", msg_get(MSG_CTRL)); -+ synth_printf("%s", spk_msg_get(MSG_CTRL)); - cp1++; - } - } - synth_printf("%s", cp1); - cp++; - } -- if (str_cap != str_caps_stop) -- synth_printf("%s", str_caps_stop); -+ if (str_cap != spk_str_caps_stop) -+ synth_printf("%s", spk_str_caps_stop); - } - - static int get_line(struct vc_data *vc) -@@ -746,9 +746,9 @@ static void say_line(struct vc_data *vc) - { - int i = get_line(vc); - char *cp; -- u_short saved_punc_mask = punc_mask; -+ u_short saved_punc_mask = spk_punc_mask; - if (i == 0) { -- synth_printf("%s\n", msg_get(MSG_BLANK)); -+ synth_printf("%s\n", spk_msg_get(MSG_BLANK)); - return; - } - buf[i++] = '\n'; -@@ -758,9 +758,9 @@ static void say_line(struct vc_data *vc) - cp++; - synth_printf("%d, ", (cp - buf) + 1); - } -- punc_mask = punc_masks[reading_punc]; -+ spk_punc_mask = spk_punc_masks[spk_reading_punc]; - spkup_write(buf, i); -- punc_mask = saved_punc_mask; -+ spk_punc_mask = saved_punc_mask; - } - - static void say_prev_line(struct vc_data *vc) -@@ -792,7 +792,7 @@ static int say_from_to(struct vc_data *vc, u_long from, u_long to, - { - int i = 0; - u_char tmp; -- u_short saved_punc_mask = punc_mask; -+ u_short saved_punc_mask = spk_punc_mask; - spk_old_attr = spk_attr; - spk_attr = get_attributes((u_short *) from); - while (from < to) { -@@ -809,10 +809,10 @@ static int say_from_to(struct vc_data *vc, u_long from, u_long to, - if (i < 1) - return i; - if (read_punc) -- punc_mask = punc_info[reading_punc].mask; -+ spk_punc_mask = spk_punc_info[spk_reading_punc].mask; - spkup_write(buf, i); - if (read_punc) -- punc_mask = saved_punc_mask; -+ spk_punc_mask = saved_punc_mask; - return i - 1; - } - -@@ -824,7 +824,7 @@ static void say_line_from_to(struct vc_data *vc, u_long from, u_long to, - start += from * 2; - if (say_from_to(vc, start, end, read_punc) <= 0) - if (cursor_track != read_all_mode) -- synth_printf("%s\n", msg_get(MSG_BLANK)); -+ synth_printf("%s\n", spk_msg_get(MSG_BLANK)); - } - - /* Sentence Reading Commands */ -@@ -924,7 +924,7 @@ static void speakup_win_say(struct vc_data *vc) - { - u_long start, end, from, to; - if (win_start < 2) { -- synth_printf("%s\n", msg_get(MSG_NO_WINDOW)); -+ synth_printf("%s\n", spk_msg_get(MSG_NO_WINDOW)); - return; - } - start = vc->vc_origin + (win_top * vc->vc_size_row); -@@ -975,7 +975,7 @@ static void say_first_char(struct vc_data *vc) - u_char ch; - spk_parked |= 0x01; - if (len == 0) { -- synth_printf("%s\n", msg_get(MSG_BLANK)); -+ synth_printf("%s\n", spk_msg_get(MSG_BLANK)); - return; - } - for (i = 0; i < len; i++) -@@ -994,7 +994,7 @@ static void say_last_char(struct vc_data *vc) - u_char ch; - spk_parked |= 0x01; - if (len == 0) { -- synth_printf("%s\n", msg_get(MSG_BLANK)); -+ synth_printf("%s\n", spk_msg_get(MSG_BLANK)); - return; - } - ch = buf[--len]; -@@ -1006,7 +1006,7 @@ static void say_last_char(struct vc_data *vc) - - static void say_position(struct vc_data *vc) - { -- synth_printf(msg_get(MSG_POS_INFO), spk_y + 1, spk_x + 1, -+ synth_printf(spk_msg_get(MSG_POS_INFO), spk_y + 1, spk_x + 1, - vc->vc_num + 1); - synth_printf("\n"); - } -@@ -1017,7 +1017,7 @@ static void say_char_num(struct vc_data *vc) - u_char tmp; - u_short ch = get_char(vc, (u_short *) spk_pos, &tmp); - ch &= 0xff; -- synth_printf(msg_get(MSG_CHAR_INFO), ch, ch); -+ synth_printf(spk_msg_get(MSG_CHAR_INFO), ch, ch); - } - - /* these are stub functions to keep keyboard.c happy. */ -@@ -1066,7 +1066,7 @@ static void spkup_write(const char *in_buf, int count) - } else { - if ((last_type & CH_RPT) && rep_count > 2) { - synth_printf(" "); -- synth_printf(msg_get(MSG_REPEAT_DESC), -+ synth_printf(spk_msg_get(MSG_REPEAT_DESC), - ++rep_count); - synth_printf(" "); - } -@@ -1074,7 +1074,7 @@ static void spkup_write(const char *in_buf, int count) - } - if (ch == spk_lastkey) { - rep_count = 0; -- if (key_echo == 1 && ch >= MINECHOCHAR) -+ if (spk_key_echo == 1 && ch >= MINECHOCHAR) - speak_char(ch); - } else if (char_type & B_ALPHA) { - if ((synth_flags & SF_DEC) && (last_type & PUNC)) -@@ -1083,7 +1083,7 @@ static void spkup_write(const char *in_buf, int count) - } else if (char_type & B_NUM) { - rep_count = 0; - synth_printf("%c", ch); -- } else if (char_type & punc_mask) { -+ } else if (char_type & spk_punc_mask) { - speak_char(ch); - char_type &= ~PUNC; /* for dec nospell processing */ - } else if (char_type & SYNTH_OK) { -@@ -1111,7 +1111,7 @@ static void spkup_write(const char *in_buf, int count) - if (in_count > 2 && rep_count > 2) { - if (last_type & CH_RPT) { - synth_printf(" "); -- synth_printf(msg_get(MSG_REPEAT_DESC2), ++rep_count); -+ synth_printf(spk_msg_get(MSG_REPEAT_DESC2), ++rep_count); - synth_printf(" "); - } - rep_count = 0; -@@ -1135,22 +1135,22 @@ static void do_handle_shift(struct vc_data *vc, u_char value, char up_flag) - case KVAL(K_SHIFT): - del_timer(&cursor_timer); - spk_shut_up &= 0xfe; -- do_flush(); -+ spk_do_flush(); - read_all_doc(vc); - break; - case KVAL(K_CTRL): - del_timer(&cursor_timer); - cursor_track = prev_cursor_track; - spk_shut_up &= 0xfe; -- do_flush(); -+ spk_do_flush(); - break; - } - } else { - spk_shut_up &= 0xfe; -- do_flush(); -+ spk_do_flush(); - } -- if (say_ctrl && value < NUM_CTL_LABELS) -- synth_printf("%s", msg_get(MSG_CTL_START + value)); -+ if (spk_say_ctrl && value < NUM_CTL_LABELS) -+ synth_printf("%s", spk_msg_get(MSG_CTL_START + value)); - spk_unlock(flags); - } - -@@ -1171,12 +1171,12 @@ static void do_handle_latin(struct vc_data *vc, u_char value, char up_flag) - spk_lastkey = value; - spk_keydown++; - spk_parked &= 0xfe; -- if (key_echo == 2 && value >= MINECHOCHAR) -+ if (spk_key_echo == 2 && value >= MINECHOCHAR) - speak_char(value); - spk_unlock(flags); - } - --int set_key_info(const u_char *key_info, u_char *k_buffer) -+int spk_set_key_info(const u_char *key_info, u_char *k_buffer) - { - int i = 0, states, key_data_len; - const u_char *cp = key_info; -@@ -1188,12 +1188,12 @@ int set_key_info(const u_char *key_info, u_char *k_buffer) - num_keys = *cp; - states = (int)cp[1]; - key_data_len = (states + 1) * (num_keys + 1); -- if (key_data_len + SHIFT_TBL_SIZE + 4 >= sizeof(key_buf)) -+ if (key_data_len + SHIFT_TBL_SIZE + 4 >= sizeof(spk_key_buf)) - return -2; - memset(k_buffer, 0, SHIFT_TBL_SIZE); -- memset(our_keys, 0, sizeof(our_keys)); -- shift_table = k_buffer; -- our_keys[0] = shift_table; -+ memset(spk_our_keys, 0, sizeof(spk_our_keys)); -+ spk_shift_table = k_buffer; -+ spk_our_keys[0] = spk_shift_table; - cp1 += SHIFT_TBL_SIZE; - memcpy(cp1, cp, key_data_len + 3); - /* get num_keys, states and data */ -@@ -1202,13 +1202,13 @@ int set_key_info(const u_char *key_info, u_char *k_buffer) - ch = *cp1++; - if (ch >= SHIFT_TBL_SIZE) - return -3; -- shift_table[ch] = i; -+ spk_shift_table[ch] = i; - } - keymap_flags = *cp1++; - while ((ch = *cp1)) { - if (ch >= MAX_KEY) - return -4; -- our_keys[ch] = cp1; -+ spk_our_keys[ch] = cp1; - cp1 += states + 1; - } - return 0; -@@ -1237,24 +1237,24 @@ static void toggle_cursoring(struct vc_data *vc) - cursor_track = prev_cursor_track; - if (++cursor_track >= CT_Max) - cursor_track = 0; -- synth_printf("%s\n", msg_get(MSG_CURSOR_MSGS_START + cursor_track)); -+ synth_printf("%s\n", spk_msg_get(MSG_CURSOR_MSGS_START + cursor_track)); - } - --void reset_default_chars(void) -+void spk_reset_default_chars(void) - { - int i; - - /* First, free any non-default */ - for (i = 0; i < 256; i++) { -- if ((characters[i] != NULL) -- && (characters[i] != default_chars[i])) -- kfree(characters[i]); -+ if ((spk_characters[i] != NULL) -+ && (spk_characters[i] != spk_default_chars[i])) -+ kfree(spk_characters[i]); - } - -- memcpy(characters, default_chars, sizeof(default_chars)); -+ memcpy(spk_characters, spk_default_chars, sizeof(spk_default_chars)); - } - --void reset_default_chartab(void) -+void spk_reset_default_chartab(void) - { - memcpy(spk_chartab, default_chartab, sizeof(default_chartab)); - } -@@ -1267,8 +1267,8 @@ static int edit_bits(struct vc_data *vc, u_char type, u_char ch, u_short key) - if (type != KT_LATIN || (ch_type & B_NUM) || ch < SPACE) - return -1; - if (ch == SPACE) { -- synth_printf("%s\n", msg_get(MSG_EDIT_DONE)); -- special_handler = NULL; -+ synth_printf("%s\n", spk_msg_get(MSG_EDIT_DONE)); -+ spk_special_handler = NULL; - return 1; - } - if (mask < PUNC && !(ch_type & PUNC)) -@@ -1276,8 +1276,8 @@ static int edit_bits(struct vc_data *vc, u_char type, u_char ch, u_short key) - spk_chartab[ch] ^= mask; - speak_char(ch); - synth_printf(" %s\n", -- (spk_chartab[ch] & mask) ? msg_get(MSG_ON) : -- msg_get(MSG_OFF)); -+ (spk_chartab[ch] & mask) ? spk_msg_get(MSG_ON) : -+ spk_msg_get(MSG_OFF)); - return 1; - } - -@@ -1346,7 +1346,7 @@ static void read_all_doc(struct vc_data *vc) - if (cursor_track != read_all_mode) - prev_cursor_track = cursor_track; - cursor_track = read_all_mode; -- reset_index_count(0); -+ spk_reset_index_count(0); - if (get_sentence_buf(vc, 0) == -1) - kbd_fakekey2(vc, RA_DOWN_ARROW); - else { -@@ -1361,7 +1361,7 @@ static void stop_read_all(struct vc_data *vc) - del_timer(&cursor_timer); - cursor_track = prev_cursor_track; - spk_shut_up &= 0xfe; -- do_flush(); -+ spk_do_flush(); - } - - static void start_read_all_timer(struct vc_data *vc, int command) -@@ -1370,7 +1370,7 @@ static void start_read_all_timer(struct vc_data *vc, int command) - - cursor_con = vc->vc_num; - read_all_key = command; -- cursor_timeout = get_var(CURSOR_TIME); -+ cursor_timeout = spk_get_var(CURSOR_TIME); - mod_timer(&cursor_timer, - jiffies + msecs_to_jiffies(cursor_timeout->u.n.value)); - } -@@ -1382,9 +1382,9 @@ static void handle_cursor_read_all(struct vc_data *vc, int command) - switch (command) { - case RA_NEXT_SENT: - /* Get Current Sentence */ -- get_index_count(&indcount, &sentcount); -+ spk_get_index_count(&indcount, &sentcount); - /*printk("%d %d ", indcount, sentcount); */ -- reset_index_count(sentcount + 1); -+ spk_reset_index_count(sentcount + 1); - if (indcount == 1) { - if (!say_sentence_num(sentcount + 1, 0)) { - kbd_fakekey2(vc, RA_FIND_NEXT_SENT); -@@ -1395,7 +1395,7 @@ static void handle_cursor_read_all(struct vc_data *vc, int command) - sn = 0; - if (!say_sentence_num(sentcount + 1, 1)) { - sn = 1; -- reset_index_count(sn); -+ spk_reset_index_count(sn); - } else - synth_insert_next_index(0); - if (!say_sentence_num(sn, 0)) { -@@ -1437,7 +1437,7 @@ static void handle_cursor_read_all(struct vc_data *vc, int command) - case RA_FIND_PREV_SENT: - break; - case RA_TIMER: -- get_index_count(&indcount, &sentcount); -+ spk_get_index_count(&indcount, &sentcount); - if (indcount < 2) - kbd_fakekey2(vc, RA_DOWN_ARROW); - else -@@ -1458,7 +1458,7 @@ static int pre_handle_cursor(struct vc_data *vc, u_char value, char up_flag) - } - del_timer(&cursor_timer); - spk_shut_up &= 0xfe; -- do_flush(); -+ spk_do_flush(); - start_read_all_timer(vc, value + 1); - spk_unlock(flags); - return NOTIFY_STOP; -@@ -1479,8 +1479,8 @@ static void do_handle_cursor(struct vc_data *vc, u_char value, char up_flag) - return; - } - spk_shut_up &= 0xfe; -- if (no_intr) -- do_flush(); -+ if (spk_no_intr) -+ spk_do_flush(); - /* the key press flushes if !no_inter but we want to flush on cursor - * moves regardless of no_inter state */ - is_cursor = value + 1; -@@ -1491,7 +1491,7 @@ static void do_handle_cursor(struct vc_data *vc, u_char value, char up_flag) - cursor_con = vc->vc_num; - if (cursor_track == CT_Highlight) - reset_highlight_buffers(vc); -- cursor_timeout = get_var(CURSOR_TIME); -+ cursor_timeout = spk_get_var(CURSOR_TIME); - mod_timer(&cursor_timer, - jiffies + msecs_to_jiffies(cursor_timeout->u.n.value)); - spk_unlock(flags); -@@ -1603,7 +1603,7 @@ static int speak_highlight(struct vc_data *vc) - if (speakup_console[vc_num]->ht.ry[hc] != vc->vc_y) - return 0; - spk_parked |= 0x01; -- do_flush(); -+ spk_do_flush(); - spkup_write(speakup_console[vc_num]->ht.highbuf[hc], - speakup_console[vc_num]->ht.highsize[hc]); - spk_pos = spk_cp = speakup_console[vc_num]->ht.rpos[hc]; -@@ -1685,7 +1685,7 @@ static void speakup_con_write(struct vc_data *vc, const char *str, int len) - if (!spk_trylock(flags)) - /* Speakup output, discard */ - return; -- if (bell_pos && spk_keydown && (vc->vc_x == bell_pos - 1)) -+ if (spk_bell_pos && spk_keydown && (vc->vc_x == spk_bell_pos - 1)) - bleep(3); - if ((is_cursor) || (cursor_track == read_all_mode)) { - if (cursor_track == CT_Highlight) -@@ -1726,19 +1726,19 @@ static void do_handle_spec(struct vc_data *vc, u_char value, char up_flag) - return; - spk_lock(flags); - spk_shut_up &= 0xfe; -- if (no_intr) -- do_flush(); -+ if (spk_no_intr) -+ spk_do_flush(); - switch (value) { - case KVAL(K_CAPS): -- label = msg_get(MSG_KEYNAME_CAPSLOCK); -+ label = spk_msg_get(MSG_KEYNAME_CAPSLOCK); - on_off = vt_get_leds(fg_console, VC_CAPSLOCK); - break; - case KVAL(K_NUM): -- label = msg_get(MSG_KEYNAME_NUMLOCK); -+ label = spk_msg_get(MSG_KEYNAME_NUMLOCK); - on_off = vt_get_leds(fg_console, VC_NUMLOCK); - break; - case KVAL(K_HOLD): -- label = msg_get(MSG_KEYNAME_SCROLLLOCK); -+ label = spk_msg_get(MSG_KEYNAME_SCROLLLOCK); - on_off = vt_get_leds(fg_console, VC_SCROLLOCK); - if (speakup_console[vc->vc_num]) - speakup_console[vc->vc_num]->tty_stopped = on_off; -@@ -1750,7 +1750,7 @@ static void do_handle_spec(struct vc_data *vc, u_char value, char up_flag) - } - if (on_off < 2) - synth_printf("%s %s\n", -- label, msg_get(MSG_STATUS_START + on_off)); -+ label, spk_msg_get(MSG_STATUS_START + on_off)); - spk_unlock(flags); - } - -@@ -1764,13 +1764,13 @@ static int inc_dec_var(u_char value) - int var_id = (int)value - VAR_START; - int how = (var_id & 1) ? E_INC : E_DEC; - var_id = var_id / 2 + FIRST_SET_VAR; -- p_header = get_var_header(var_id); -+ p_header = spk_get_var_header(var_id); - if (p_header == NULL) - return -1; - if (p_header->var_type != VAR_NUM) - return -1; - var_data = p_header->data; -- if (set_num_var(1, p_header, how) != 0) -+ if (spk_set_num_var(1, p_header, how) != 0) - return -1; - if (!spk_close_press) { - for (pn = p_header->name; *pn; pn++) { -@@ -1790,18 +1790,18 @@ static void speakup_win_set(struct vc_data *vc) - { - char info[40]; - if (win_start > 1) { -- synth_printf("%s\n", msg_get(MSG_WINDOW_ALREADY_SET)); -+ synth_printf("%s\n", spk_msg_get(MSG_WINDOW_ALREADY_SET)); - return; - } - if (spk_x < win_left || spk_y < win_top) { -- synth_printf("%s\n", msg_get(MSG_END_BEFORE_START)); -+ synth_printf("%s\n", spk_msg_get(MSG_END_BEFORE_START)); - return; - } - if (win_start && spk_x == win_left && spk_y == win_top) { - win_left = 0; - win_right = vc->vc_cols - 1; - win_bottom = spk_y; -- snprintf(info, sizeof(info), msg_get(MSG_WINDOW_LINE), -+ snprintf(info, sizeof(info), spk_msg_get(MSG_WINDOW_LINE), - (int)win_top + 1); - } else { - if (!win_start) { -@@ -1811,8 +1811,8 @@ static void speakup_win_set(struct vc_data *vc) - win_bottom = spk_y; - win_right = spk_x; - } -- snprintf(info, sizeof(info), msg_get(MSG_WINDOW_BOUNDARY), -- (win_start) ? msg_get(MSG_END) : msg_get(MSG_START), -+ snprintf(info, sizeof(info), spk_msg_get(MSG_WINDOW_BOUNDARY), -+ (win_start) ? spk_msg_get(MSG_END) : spk_msg_get(MSG_START), - (int)spk_y + 1, (int)spk_x + 1); - } - synth_printf("%s\n", info); -@@ -1824,32 +1824,32 @@ static void speakup_win_clear(struct vc_data *vc) - win_top = win_bottom = 0; - win_left = win_right = 0; - win_start = 0; -- synth_printf("%s\n", msg_get(MSG_WINDOW_CLEARED)); -+ synth_printf("%s\n", spk_msg_get(MSG_WINDOW_CLEARED)); - } - - static void speakup_win_enable(struct vc_data *vc) - { - if (win_start < 2) { -- synth_printf("%s\n", msg_get(MSG_NO_WINDOW)); -+ synth_printf("%s\n", spk_msg_get(MSG_NO_WINDOW)); - return; - } - win_enabled ^= 1; - if (win_enabled) -- synth_printf("%s\n", msg_get(MSG_WINDOW_SILENCED)); -+ synth_printf("%s\n", spk_msg_get(MSG_WINDOW_SILENCED)); - else -- synth_printf("%s\n", msg_get(MSG_WINDOW_SILENCE_DISABLED)); -+ synth_printf("%s\n", spk_msg_get(MSG_WINDOW_SILENCE_DISABLED)); - } - - static void speakup_bits(struct vc_data *vc) - { - int val = this_speakup_key - (FIRST_EDIT_BITS - 1); -- if (special_handler != NULL || val < 1 || val > 6) { -- synth_printf("%s\n", msg_get(MSG_ERROR)); -+ if (spk_special_handler != NULL || val < 1 || val > 6) { -+ synth_printf("%s\n", spk_msg_get(MSG_ERROR)); - return; - } -- pb_edit = &punc_info[val]; -- synth_printf(msg_get(MSG_EDIT_PROMPT), pb_edit->name); -- special_handler = edit_bits; -+ pb_edit = &spk_punc_info[val]; -+ synth_printf(spk_msg_get(MSG_EDIT_PROMPT), pb_edit->name); -+ spk_special_handler = edit_bits; - } - - static int handle_goto(struct vc_data *vc, u_char type, u_char ch, u_short key) -@@ -1887,9 +1887,9 @@ static int handle_goto(struct vc_data *vc, u_char type, u_char ch, u_short key) - if (ch < 'x' || ch > 'y') { - oops: - if (!spk_killed) -- synth_printf(" %s\n", msg_get(MSG_GOTO_CANCELED)); -+ synth_printf(" %s\n", spk_msg_get(MSG_GOTO_CANCELED)); - goto_buf[num = 0] = '\0'; -- special_handler = NULL; -+ spk_special_handler = NULL; - return 1; - } - cp = speakup_s2i(goto_buf, &go_pos); -@@ -1917,7 +1917,7 @@ static int handle_goto(struct vc_data *vc, u_char type, u_char ch, u_short key) - } - goto_buf[num = 0] = '\0'; - do_goto: -- special_handler = NULL; -+ spk_special_handler = NULL; - spk_parked |= 0x01; - if (goto_x) { - spk_pos -= spk_x * 2; -@@ -1934,18 +1934,18 @@ static int handle_goto(struct vc_data *vc, u_char type, u_char ch, u_short key) - - static void speakup_goto(struct vc_data *vc) - { -- if (special_handler != NULL) { -- synth_printf("%s\n", msg_get(MSG_ERROR)); -+ if (spk_special_handler != NULL) { -+ synth_printf("%s\n", spk_msg_get(MSG_ERROR)); - return; - } -- synth_printf("%s\n", msg_get(MSG_GOTO)); -- special_handler = handle_goto; -+ synth_printf("%s\n", spk_msg_get(MSG_GOTO)); -+ spk_special_handler = handle_goto; - return; - } - - static void speakup_help(struct vc_data *vc) - { -- handle_help(vc, KT_SPKUP, SPEAKUP_HELP, 0); -+ spk_handle_help(vc, KT_SPKUP, SPEAKUP_HELP, 0); - } - - static void do_nothing(struct vc_data *vc) -@@ -1992,7 +1992,7 @@ static void do_spkup(struct vc_data *vc, u_char value) - spk_shut_up &= 0xfe; - this_speakup_key = value; - if (value < SPKUP_MAX_FUNC && spkup_handler[value]) { -- do_flush(); -+ spk_do_flush(); - (*spkup_handler[value]) (vc); - } else { - if (inc_dec_var(value) < 0) -@@ -2032,7 +2032,7 @@ speakup_key(struct vc_data *vc, int shift_state, int keycode, u_short keysym, - } - if (keycode >= MAX_KEY) - goto no_map; -- key_info = our_keys[keycode]; -+ key_info = spk_our_keys[keycode]; - if (key_info == 0) - goto no_map; - /* Check valid read all mode keys */ -@@ -2051,7 +2051,7 @@ speakup_key(struct vc_data *vc, int shift_state, int keycode, u_short keysym, - } - } - shift_info = (shift_state & 0x0f) + key_speakup; -- offset = shift_table[shift_info]; -+ offset = spk_shift_table[shift_info]; - if (offset) { - new_key = key_info[offset]; - if (new_key) { -@@ -2062,7 +2062,7 @@ speakup_key(struct vc_data *vc, int shift_state, int keycode, u_short keysym, - if (up_flag || spk_killed) - goto out; - spk_shut_up &= 0xfe; -- do_flush(); -+ spk_do_flush(); - goto out; - } - if (up_flag) -@@ -2070,7 +2070,7 @@ speakup_key(struct vc_data *vc, int shift_state, int keycode, u_short keysym, - if (last_keycode == keycode && - last_spk_jiffy + MAX_DELAY > jiffies) { - spk_close_press = 1; -- offset = shift_table[shift_info + 32]; -+ offset = spk_shift_table[shift_info + 32]; - /* double press? */ - if (offset && key_info[offset]) - new_key = key_info[offset]; -@@ -2082,7 +2082,7 @@ speakup_key(struct vc_data *vc, int shift_state, int keycode, u_short keysym, - } - } - no_map: -- if (type == KT_SPKUP && special_handler == NULL) { -+ if (type == KT_SPKUP && spk_special_handler == NULL) { - do_spkup(vc, new_key); - spk_close_press = 0; - ret = 1; -@@ -2096,9 +2096,9 @@ speakup_key(struct vc_data *vc, int shift_state, int keycode, u_short keysym, - || (value == KVAL(K_LEFT)) - || (value == KVAL(K_RIGHT)); - if ((cursor_track != read_all_mode) || !kh) -- if (!no_intr) -- do_flush(); -- if (special_handler) { -+ if (!spk_no_intr) -+ spk_do_flush(); -+ if (spk_special_handler) { - if (type == KT_SPEC && value == 1) { - value = '\n'; - type = KT_LATIN; -@@ -2106,7 +2106,7 @@ speakup_key(struct vc_data *vc, int shift_state, int keycode, u_short keysym, - type = KT_LATIN; - else if (value == 0x7f) - value = 8; /* make del = backspace */ -- ret = (*special_handler) (vc, type, value, keycode); -+ ret = (*spk_special_handler) (vc, type, value, keycode); - spk_close_press = 0; - if (ret < 0) - bleep(9); -@@ -2219,6 +2219,7 @@ static void __exit speakup_exit(void) - unregister_keyboard_notifier(&keyboard_notifier_block); - unregister_vt_notifier(&vt_notifier_block); - speakup_unregister_devsynth(); -+ speakup_cancel_paste(); - del_timer(&cursor_timer); - kthread_stop(speakup_task); - speakup_task = NULL; -@@ -2237,11 +2238,11 @@ static void __exit speakup_exit(void) - speakup_unregister_var(i); - - for (i = 0; i < 256; i++) { -- if (characters[i] != default_chars[i]) -- kfree(characters[i]); -+ if (spk_characters[i] != spk_default_chars[i]) -+ kfree(spk_characters[i]); - } - -- free_user_msgs(); -+ spk_free_user_msgs(); - } - - /* call by: module_init() */ -@@ -2254,20 +2255,20 @@ static int __init speakup_init(void) - struct var_t *var; - - /* These first few initializations cannot fail. */ -- initialize_msgs(); /* Initialize arrays for i18n. */ -- reset_default_chars(); -- reset_default_chartab(); -- strlwr(synth_name); -+ spk_initialize_msgs(); /* Initialize arrays for i18n. */ -+ spk_reset_default_chars(); -+ spk_reset_default_chartab(); -+ spk_strlwr(synth_name); - spk_vars[0].u.n.high = vc->vc_cols; - for (var = spk_vars; var->var_id != MAXVARS; var++) - speakup_register_var(var); - for (var = synth_time_vars; - (var->var_id >= 0) && (var->var_id < MAXVARS); var++) - speakup_register_var(var); -- for (i = 1; punc_info[i].mask != 0; i++) -- set_mask_bits(0, i, 2); -+ for (i = 1; spk_punc_info[i].mask != 0; i++) -+ spk_set_mask_bits(0, i, 2); - -- set_key_info(key_defaults, key_buf); -+ spk_set_key_info(spk_key_defaults, spk_key_buf); - - /* From here on out, initializations can fail. */ - err = speakup_add_virtual_keyboard(); -@@ -2290,7 +2291,7 @@ static int __init speakup_init(void) - goto error_kobjects; - } - -- if (quiet_boot) -+ if (spk_quiet_boot) - spk_shut_up |= 0x01; - - err = speakup_kobj_init(); -@@ -2352,11 +2353,11 @@ static int __init speakup_init(void) - speakup_unregister_var(i); - - for (i = 0; i < 256; i++) { -- if (characters[i] != default_chars[i]) -- kfree(characters[i]); -+ if (spk_characters[i] != spk_default_chars[i]) -+ kfree(spk_characters[i]); - } - -- free_user_msgs(); -+ spk_free_user_msgs(); - - out: - return err; -diff --git a/drivers/staging/speakup/selection.c b/drivers/staging/speakup/selection.c -index fe1f405..7eb602c 100644 ---- a/drivers/staging/speakup/selection.c -+++ b/drivers/staging/speakup/selection.c -@@ -3,6 +3,8 @@ - #include - #include - #include -+#include -+#include - - #include "speakup.h" - -@@ -10,7 +12,7 @@ - /* Don't take this from : 011-015 on the screen aren't spaces */ - #define ishardspace(c) ((c) == ' ') - --unsigned short xs, ys, xe, ye; /* our region points */ -+unsigned short spk_xs, spk_ys, spk_xe, spk_ye; /* our region points */ - - /* Variables for selection control. */ - /* must not be disallocated */ -@@ -51,12 +53,12 @@ int speakup_set_selection(struct tty_struct *tty) - int i, ps, pe; - struct vc_data *vc = vc_cons[fg_console].d; - -- xs = limit(xs, vc->vc_cols - 1); -- ys = limit(ys, vc->vc_rows - 1); -- xe = limit(xe, vc->vc_cols - 1); -- ye = limit(ye, vc->vc_rows - 1); -- ps = ys * vc->vc_size_row + (xs << 1); -- pe = ye * vc->vc_size_row + (xe << 1); -+ spk_xs = limit(spk_xs, vc->vc_cols - 1); -+ spk_ys = limit(spk_ys, vc->vc_rows - 1); -+ spk_xe = limit(spk_xe, vc->vc_cols - 1); -+ spk_ye = limit(spk_ye, vc->vc_rows - 1); -+ ps = spk_ys * vc->vc_size_row + (spk_xs << 1); -+ pe = spk_ye * vc->vc_size_row + (spk_xe << 1); - - if (ps > pe) { - /* make sel_start <= sel_end */ -@@ -121,20 +123,24 @@ int speakup_set_selection(struct tty_struct *tty) - return 0; - } - --/* TODO: move to some helper thread, probably. That'd fix having to check for -- * in_atomic(). */ --int speakup_paste_selection(struct tty_struct *tty) -+struct speakup_paste_work { -+ struct work_struct work; -+ struct tty_struct *tty; -+}; -+ -+static void __speakup_paste_selection(struct work_struct *work) - { -+ struct speakup_paste_work *spw = -+ container_of(work, struct speakup_paste_work, work); -+ struct tty_struct *tty = xchg(&spw->tty, NULL); - struct vc_data *vc = (struct vc_data *) tty->driver_data; - int pasted = 0, count; - DECLARE_WAITQUEUE(wait, current); -+ - add_wait_queue(&vc->paste_wait, &wait); - while (sel_buffer && sel_buffer_lth > pasted) { - set_current_state(TASK_INTERRUPTIBLE); - if (test_bit(TTY_THROTTLED, &tty->flags)) { -- if (in_atomic()) -- /* if we are in an interrupt handler, abort */ -- break; - schedule(); - continue; - } -@@ -146,6 +152,26 @@ int speakup_paste_selection(struct tty_struct *tty) - } - remove_wait_queue(&vc->paste_wait, &wait); - current->state = TASK_RUNNING; -+ tty_kref_put(tty); -+} -+ -+static struct speakup_paste_work speakup_paste_work = { -+ .work = __WORK_INITIALIZER(speakup_paste_work.work, -+ __speakup_paste_selection) -+}; -+ -+int speakup_paste_selection(struct tty_struct *tty) -+{ -+ if (cmpxchg(&speakup_paste_work.tty, NULL, tty) != NULL) -+ return -EBUSY; -+ -+ tty_kref_get(tty); -+ schedule_work_on(WORK_CPU_UNBOUND, &speakup_paste_work.work); - return 0; - } - -+void speakup_cancel_paste(void) -+{ -+ cancel_work_sync(&speakup_paste_work.work); -+ tty_kref_put(speakup_paste_work.tty); -+} -diff --git a/drivers/staging/speakup/serialio.c b/drivers/staging/speakup/serialio.c -index a97d3d5..e4d27aa 100644 ---- a/drivers/staging/speakup/serialio.c -+++ b/drivers/staging/speakup/serialio.c -@@ -116,7 +116,7 @@ static void start_serial_interrupt(int irq) - outb(1, speakup_info.port_tts + UART_FCR); /* Turn FIFO On */ - } - --void stop_serial_interrupt(void) -+void spk_stop_serial_interrupt(void) - { - if (speakup_info.port_tts == 0) - return; -@@ -130,7 +130,7 @@ void stop_serial_interrupt(void) - free_irq(serstate->irq, (void *) synth_readbuf_handler); - } - --int wait_for_xmitr(void) -+int spk_wait_for_xmitr(void) - { - int tmout = SPK_XMITR_TIMEOUT; - if ((synth->alive) && (timeouts >= NUM_DISABLE_TIMEOUTS)) { -@@ -195,7 +195,7 @@ EXPORT_SYMBOL_GPL(spk_serial_in_nowait); - - int spk_serial_out(const char ch) - { -- if (synth->alive && wait_for_xmitr()) { -+ if (synth->alive && spk_wait_for_xmitr()) { - outb_p(ch, speakup_info.port_tts); - return 1; - } -diff --git a/drivers/staging/speakup/speakup.h b/drivers/staging/speakup/speakup.h -index e66579e..cfbd88c 100644 ---- a/drivers/staging/speakup/speakup.h -+++ b/drivers/staging/speakup/speakup.h -@@ -50,75 +50,76 @@ - #define E_UNDEF -1 - - extern int speakup_thread(void *data); --extern void reset_default_chars(void); --extern void reset_default_chartab(void); -+extern void spk_reset_default_chars(void); -+extern void spk_reset_default_chartab(void); - extern void synth_start(void); - void synth_insert_next_index(int sent_num); --void reset_index_count(int sc); --void get_index_count(int *linecount, int *sentcount); --extern int set_key_info(const u_char *key_info, u_char *k_buffer); --extern char *strlwr(char *s); -+void spk_reset_index_count(int sc); -+void spk_get_index_count(int *linecount, int *sentcount); -+extern int spk_set_key_info(const u_char *key_info, u_char *k_buffer); -+extern char *spk_strlwr(char *s); - extern char *speakup_s2i(char *start, int *dest); --extern char *s2uchar(char *start, char *dest); --extern char *xlate(char *s); -+extern char *spk_s2uchar(char *start, char *dest); -+extern char *spk_xlate(char *s); - extern int speakup_kobj_init(void); - extern void speakup_kobj_exit(void); --extern int chartab_get_value(char *keyword); -+extern int spk_chartab_get_value(char *keyword); - extern void speakup_register_var(struct var_t *var); - extern void speakup_unregister_var(enum var_id_t var_id); --extern struct st_var_header *get_var_header(enum var_id_t var_id); --extern struct st_var_header *var_header_by_name(const char *name); --extern struct punc_var_t *get_punc_var(enum var_id_t var_id); --extern int set_num_var(int val, struct st_var_header *var, int how); --extern int set_string_var(const char *page, struct st_var_header *var, int len); --extern int set_mask_bits(const char *input, const int which, const int how); --extern special_func special_handler; --extern int handle_help(struct vc_data *vc, u_char type, u_char ch, u_short key); -+extern struct st_var_header *spk_get_var_header(enum var_id_t var_id); -+extern struct st_var_header *spk_var_header_by_name(const char *name); -+extern struct punc_var_t *spk_get_punc_var(enum var_id_t var_id); -+extern int spk_set_num_var(int val, struct st_var_header *var, int how); -+extern int spk_set_string_var(const char *page, struct st_var_header *var, int len); -+extern int spk_set_mask_bits(const char *input, const int which, const int how); -+extern special_func spk_special_handler; -+extern int spk_handle_help(struct vc_data *vc, u_char type, u_char ch, u_short key); - extern int synth_init(char *name); - extern void synth_release(void); - --extern void do_flush(void); -+extern void spk_do_flush(void); - extern void speakup_start_ttys(void); - extern void synth_buffer_add(char ch); - extern void synth_buffer_clear(void); - extern void speakup_clear_selection(void); - extern int speakup_set_selection(struct tty_struct *tty); - extern int speakup_paste_selection(struct tty_struct *tty); -+extern void speakup_cancel_paste(void); - extern void speakup_register_devsynth(void); - extern void speakup_unregister_devsynth(void); - extern void synth_write(const char *buf, size_t count); - extern int synth_supports_indexing(void); - - extern struct vc_data *spk_sel_cons; --extern unsigned short xs, ys, xe, ye; /* our region points */ -+extern unsigned short spk_xs, spk_ys, spk_xe, spk_ye; /* our region points */ - - extern wait_queue_head_t speakup_event; - extern struct kobject *speakup_kobj; - extern struct task_struct *speakup_task; --extern const u_char key_defaults[]; -+extern const u_char spk_key_defaults[]; - - /* Protect speakup synthesizer list */ - extern struct mutex spk_mutex; - extern struct st_spk_t *speakup_console[]; - extern struct spk_synth *synth; --extern char pitch_buff[]; --extern u_char *our_keys[]; --extern short punc_masks[]; --extern char str_caps_start[], str_caps_stop[]; --extern const struct st_bits_data punc_info[]; --extern u_char key_buf[600]; --extern char *characters[]; --extern char *default_chars[]; -+extern char spk_pitch_buff[]; -+extern u_char *spk_our_keys[]; -+extern short spk_punc_masks[]; -+extern char spk_str_caps_start[], spk_str_caps_stop[]; -+extern const struct st_bits_data spk_punc_info[]; -+extern u_char spk_key_buf[600]; -+extern char *spk_characters[]; -+extern char *spk_default_chars[]; - extern u_short spk_chartab[]; --extern int no_intr, say_ctrl, say_word_ctl, punc_level; --extern int reading_punc, attrib_bleep, bleeps; --extern int bleep_time, bell_pos; --extern int spell_delay, key_echo; --extern short punc_mask; --extern short pitch_shift, synth_flags; --extern bool quiet_boot; -+extern int spk_no_intr, spk_say_ctrl, spk_say_word_ctl, spk_punc_level; -+extern int spk_reading_punc, spk_attrib_bleep, spk_bleeps; -+extern int spk_bleep_time, spk_bell_pos; -+extern int spk_spell_delay, spk_key_echo; -+extern short spk_punc_mask; -+extern short spk_pitch_shift, synth_flags; -+extern bool spk_quiet_boot; - extern char *synth_name; --extern struct bleep unprocessed_sound; -+extern struct bleep spk_unprocessed_sound; - - /* Prototypes from fakekey.c. */ - int speakup_add_virtual_keyboard(void); -diff --git a/drivers/staging/speakup/speakup_acntpc.c b/drivers/staging/speakup/speakup_acntpc.c -index bbe28b6..1c1f0d5 100644 ---- a/drivers/staging/speakup/speakup_acntpc.c -+++ b/drivers/staging/speakup/speakup_acntpc.c -@@ -182,9 +182,9 @@ static void do_catch_up(struct spk_synth *synth) - struct var_t *full_time; - struct var_t *jiffy_delta; - -- jiffy_delta = get_var(JIFFY); -- delay_time = get_var(DELAY); -- full_time = get_var(FULL); -+ jiffy_delta = spk_get_var(JIFFY); -+ delay_time = spk_get_var(DELAY); -+ full_time = spk_get_var(FULL); - - spk_lock(flags); - jiffy_delta_val = jiffy_delta->u.n.value; -diff --git a/drivers/staging/speakup/speakup_acntsa.c b/drivers/staging/speakup/speakup_acntsa.c -index 590fa6b..22a8b72 100644 ---- a/drivers/staging/speakup/speakup_acntsa.c -+++ b/drivers/staging/speakup/speakup_acntsa.c -@@ -128,7 +128,7 @@ static int synth_probe(struct spk_synth *synth) - { - int failed; - -- failed = serial_synth_probe(synth); -+ failed = spk_serial_synth_probe(synth); - if (failed == 0) { - spk_synth_immediate(synth, "\033=R\r"); - mdelay(100); -diff --git a/drivers/staging/speakup/speakup_apollo.c b/drivers/staging/speakup/speakup_apollo.c -index 00d5ced..3e450cc 100644 ---- a/drivers/staging/speakup/speakup_apollo.c -+++ b/drivers/staging/speakup/speakup_apollo.c -@@ -112,7 +112,7 @@ static struct spk_synth synth_apollo = { - .startup = SYNTH_START, - .checkval = SYNTH_CHECK, - .vars = vars, -- .probe = serial_synth_probe, -+ .probe = spk_serial_synth_probe, - .release = spk_serial_release, - .synth_immediate = spk_synth_immediate, - .catch_up = do_catch_up, -@@ -145,9 +145,9 @@ static void do_catch_up(struct spk_synth *synth) - int delay_time_val = 0; - int jiffy_delta_val = 0; - -- jiffy_delta = get_var(JIFFY); -- delay_time = get_var(DELAY); -- full_time = get_var(FULL); -+ jiffy_delta = spk_get_var(JIFFY); -+ delay_time = spk_get_var(DELAY); -+ full_time = spk_get_var(FULL); - spk_lock(flags); - jiffy_delta_val = jiffy_delta->u.n.value; - spk_unlock(flags); -diff --git a/drivers/staging/speakup/speakup_audptr.c b/drivers/staging/speakup/speakup_audptr.c -index 94e5099..3508aee 100644 ---- a/drivers/staging/speakup/speakup_audptr.c -+++ b/drivers/staging/speakup/speakup_audptr.c -@@ -162,7 +162,7 @@ static int synth_probe(struct spk_synth *synth) - { - int failed = 0; - -- failed = serial_synth_probe(synth); -+ failed = spk_serial_synth_probe(synth); - if (failed == 0) - synth_version(synth); - synth->alive = !failed; -diff --git a/drivers/staging/speakup/speakup_bns.c b/drivers/staging/speakup/speakup_bns.c -index 43e5b54..4bfe3d4 100644 ---- a/drivers/staging/speakup/speakup_bns.c -+++ b/drivers/staging/speakup/speakup_bns.c -@@ -100,7 +100,7 @@ static struct spk_synth synth_bns = { - .startup = SYNTH_START, - .checkval = SYNTH_CHECK, - .vars = vars, -- .probe = serial_synth_probe, -+ .probe = spk_serial_synth_probe, - .release = spk_serial_release, - .synth_immediate = spk_synth_immediate, - .catch_up = spk_do_catch_up, -diff --git a/drivers/staging/speakup/speakup_decext.c b/drivers/staging/speakup/speakup_decext.c -index b4ef915..d39a0de 100644 ---- a/drivers/staging/speakup/speakup_decext.c -+++ b/drivers/staging/speakup/speakup_decext.c -@@ -130,7 +130,7 @@ static struct spk_synth synth_decext = { - .startup = SYNTH_START, - .checkval = SYNTH_CHECK, - .vars = vars, -- .probe = serial_synth_probe, -+ .probe = spk_serial_synth_probe, - .release = spk_serial_release, - .synth_immediate = spk_synth_immediate, - .catch_up = do_catch_up, -@@ -162,8 +162,8 @@ static void do_catch_up(struct spk_synth *synth) - int jiffy_delta_val = 0; - int delay_time_val = 0; - -- jiffy_delta = get_var(JIFFY); -- delay_time = get_var(DELAY); -+ jiffy_delta = spk_get_var(JIFFY); -+ delay_time = spk_get_var(DELAY); - - spk_lock(flags); - jiffy_delta_val = jiffy_delta->u.n.value; -diff --git a/drivers/staging/speakup/speakup_decpc.c b/drivers/staging/speakup/speakup_decpc.c -index de25527..cda6b0f 100644 ---- a/drivers/staging/speakup/speakup_decpc.c -+++ b/drivers/staging/speakup/speakup_decpc.c -@@ -375,8 +375,8 @@ static void do_catch_up(struct spk_synth *synth) - int jiffy_delta_val; - int delay_time_val; - -- jiffy_delta = get_var(JIFFY); -- delay_time = get_var(DELAY); -+ jiffy_delta = spk_get_var(JIFFY); -+ delay_time = spk_get_var(DELAY); - spk_lock(flags); - jiffy_delta_val = jiffy_delta->u.n.value; - spk_unlock(flags); -diff --git a/drivers/staging/speakup/speakup_dectlk.c b/drivers/staging/speakup/speakup_dectlk.c -index daff3b9..0dd2eb9 100644 ---- a/drivers/staging/speakup/speakup_dectlk.c -+++ b/drivers/staging/speakup/speakup_dectlk.c -@@ -134,7 +134,7 @@ static struct spk_synth synth_dectlk = { - .vars = vars, - .default_pitch = ap_defaults, - .default_vol = g5_defaults, -- .probe = serial_synth_probe, -+ .probe = spk_serial_synth_probe, - .release = spk_serial_release, - .synth_immediate = spk_synth_immediate, - .catch_up = do_catch_up, -@@ -214,8 +214,8 @@ static void do_catch_up(struct spk_synth *synth) - int jiffy_delta_val; - int delay_time_val; - -- jiffy_delta = get_var(JIFFY); -- delay_time = get_var(DELAY); -+ jiffy_delta = spk_get_var(JIFFY); -+ delay_time = spk_get_var(DELAY); - spk_lock(flags); - jiffy_delta_val = jiffy_delta->u.n.value; - spk_unlock(flags); -diff --git a/drivers/staging/speakup/speakup_dtlk.c b/drivers/staging/speakup/speakup_dtlk.c -index 97bc476..a9cefbd 100644 ---- a/drivers/staging/speakup/speakup_dtlk.c -+++ b/drivers/staging/speakup/speakup_dtlk.c -@@ -198,8 +198,8 @@ static void do_catch_up(struct spk_synth *synth) - int jiffy_delta_val; - int delay_time_val; - -- jiffy_delta = get_var(JIFFY); -- delay_time = get_var(DELAY); -+ jiffy_delta = spk_get_var(JIFFY); -+ delay_time = spk_get_var(DELAY); - spk_lock(flags); - jiffy_delta_val = jiffy_delta->u.n.value; - spk_unlock(flags); -diff --git a/drivers/staging/speakup/speakup_dummy.c b/drivers/staging/speakup/speakup_dummy.c -index c20f411..4a24b9c 100644 ---- a/drivers/staging/speakup/speakup_dummy.c -+++ b/drivers/staging/speakup/speakup_dummy.c -@@ -102,7 +102,7 @@ static struct spk_synth synth_dummy = { - .startup = SYNTH_START, - .checkval = SYNTH_CHECK, - .vars = vars, -- .probe = serial_synth_probe, -+ .probe = spk_serial_synth_probe, - .release = spk_serial_release, - .synth_immediate = spk_synth_immediate, - .catch_up = spk_do_catch_up, -diff --git a/drivers/staging/speakup/speakup_keypc.c b/drivers/staging/speakup/speakup_keypc.c -index 496e014..feb5f22 100644 ---- a/drivers/staging/speakup/speakup_keypc.c -+++ b/drivers/staging/speakup/speakup_keypc.c -@@ -184,9 +184,9 @@ static void do_catch_up(struct spk_synth *synth) - int full_time_val; - int jiffy_delta_val; - -- jiffy_delta = get_var(JIFFY); -- delay_time = get_var(DELAY); -- full_time = get_var(FULL); -+ jiffy_delta = spk_get_var(JIFFY); -+ delay_time = spk_get_var(DELAY); -+ full_time = spk_get_var(FULL); - spk_lock(flags); - jiffy_delta_val = jiffy_delta->u.n.value; - spk_unlock(flags); -diff --git a/drivers/staging/speakup/speakup_ltlk.c b/drivers/staging/speakup/speakup_ltlk.c -index 971de1a..326f94d 100644 ---- a/drivers/staging/speakup/speakup_ltlk.c -+++ b/drivers/staging/speakup/speakup_ltlk.c -@@ -161,7 +161,7 @@ static int synth_probe(struct spk_synth *synth) - { - int failed = 0; - -- failed = serial_synth_probe(synth); -+ failed = spk_serial_synth_probe(synth); - if (failed == 0) - synth_interrogate(synth); - synth->alive = !failed; -diff --git a/drivers/staging/speakup/speakup_soft.c b/drivers/staging/speakup/speakup_soft.c -index b5130c8..e2f5c81 100644 ---- a/drivers/staging/speakup/speakup_soft.c -+++ b/drivers/staging/speakup/speakup_soft.c -@@ -46,7 +46,7 @@ static int misc_registered; - static struct var_t vars[] = { - { CAPS_START, .u.s = {"\x01+3p" } }, - { CAPS_STOP, .u.s = {"\x01-3p" } }, -- { RATE, .u.n = {"\x01%ds", 5, 0, 9, 0, 0, NULL } }, -+ { RATE, .u.n = {"\x01%ds", 2, 0, 9, 0, 0, NULL } }, - { PITCH, .u.n = {"\x01%dp", 5, 0, 9, 0, 0, NULL } }, - { VOL, .u.n = {"\x01%dv", 5, 0, 9, 0, 0, NULL } }, - { TONE, .u.n = {"\x01%dx", 1, 0, 2, 0, 0, NULL } }, -diff --git a/drivers/staging/speakup/speakup_spkout.c b/drivers/staging/speakup/speakup_spkout.c -index 9a3a80d..e74f856 100644 ---- a/drivers/staging/speakup/speakup_spkout.c -+++ b/drivers/staging/speakup/speakup_spkout.c -@@ -107,7 +107,7 @@ static struct spk_synth synth_spkout = { - .startup = SYNTH_START, - .checkval = SYNTH_CHECK, - .vars = vars, -- .probe = serial_synth_probe, -+ .probe = spk_serial_synth_probe, - .release = spk_serial_release, - .synth_immediate = spk_synth_immediate, - .catch_up = spk_do_catch_up, -diff --git a/drivers/staging/speakup/speakup_txprt.c b/drivers/staging/speakup/speakup_txprt.c -index 5d5bf7c..5a29b9f 100644 ---- a/drivers/staging/speakup/speakup_txprt.c -+++ b/drivers/staging/speakup/speakup_txprt.c -@@ -100,7 +100,7 @@ static struct spk_synth synth_txprt = { - .startup = SYNTH_START, - .checkval = SYNTH_CHECK, - .vars = vars, -- .probe = serial_synth_probe, -+ .probe = spk_serial_synth_probe, - .release = spk_serial_release, - .synth_immediate = spk_synth_immediate, - .catch_up = spk_do_catch_up, -diff --git a/drivers/staging/speakup/spk_priv.h b/drivers/staging/speakup/spk_priv.h -index a47c5b7..303105b 100644 ---- a/drivers/staging/speakup/spk_priv.h -+++ b/drivers/staging/speakup/spk_priv.h -@@ -45,8 +45,8 @@ - #define KT_SPKUP 15 - - extern const struct old_serial_port *spk_serial_init(int index); --extern void stop_serial_interrupt(void); --extern int wait_for_xmitr(void); -+extern void spk_stop_serial_interrupt(void); -+extern int spk_wait_for_xmitr(void); - extern unsigned char spk_serial_in(void); - extern unsigned char spk_serial_in_nowait(void); - extern int spk_serial_out(const char ch); -@@ -55,13 +55,13 @@ extern void spk_serial_release(void); - extern char synth_buffer_getc(void); - extern char synth_buffer_peek(void); - extern int synth_buffer_empty(void); --extern struct var_t *get_var(enum var_id_t var_id); -+extern struct var_t *spk_get_var(enum var_id_t var_id); - extern ssize_t spk_var_show(struct kobject *kobj, struct kobj_attribute *attr, - char *buf); - extern ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr, - const char *buf, size_t count); - --extern int serial_synth_probe(struct spk_synth *synth); -+extern int spk_serial_synth_probe(struct spk_synth *synth); - extern const char *spk_synth_immediate(struct spk_synth *synth, const char *buff); - extern void spk_do_catch_up(struct spk_synth *synth); - extern void spk_synth_flush(struct spk_synth *synth); -diff --git a/drivers/staging/speakup/synth.c b/drivers/staging/speakup/synth.c -index 5710fc5..33efbd3 100644 ---- a/drivers/staging/speakup/synth.c -+++ b/drivers/staging/speakup/synth.c -@@ -20,9 +20,9 @@ - #define MAXSYNTHS 16 /* Max number of synths in array. */ - static struct spk_synth *synths[MAXSYNTHS]; - struct spk_synth *synth; --char pitch_buff[32] = ""; -+char spk_pitch_buff[32] = ""; - static int module_status; --bool quiet_boot; -+bool spk_quiet_boot; - - struct speakup_info_t speakup_info = { - .spinlock = __SPIN_LOCK_UNLOCKED(speakup_info.spinlock), -@@ -32,7 +32,7 @@ EXPORT_SYMBOL_GPL(speakup_info); - - static int do_synth_init(struct spk_synth *in_synth); - --int serial_synth_probe(struct spk_synth *synth) -+int spk_serial_synth_probe(struct spk_synth *synth) - { - const struct old_serial_port *ser; - int failed = 0; -@@ -59,7 +59,7 @@ int serial_synth_probe(struct spk_synth *synth) - synth->alive = 1; - return 0; - } --EXPORT_SYMBOL_GPL(serial_synth_probe); -+EXPORT_SYMBOL_GPL(spk_serial_synth_probe); - - /* Main loop of the progression thread: keep eating from the buffer - * and push to the serial port, waiting as needed -@@ -79,9 +79,9 @@ void spk_do_catch_up(struct spk_synth *synth) - int delay_time_val; - int full_time_val; - -- jiffy_delta = get_var(JIFFY); -- full_time = get_var(FULL); -- delay_time = get_var(DELAY); -+ jiffy_delta = spk_get_var(JIFFY); -+ full_time = spk_get_var(FULL); -+ delay_time = spk_get_var(DELAY); - - spk_lock(flags); - jiffy_delta_val = jiffy_delta->u.n.value; -@@ -139,7 +139,7 @@ const char *spk_synth_immediate(struct spk_synth *synth, const char *buff) - while ((ch = *buff)) { - if (ch == '\n') - ch = synth->procspeech; -- if (wait_for_xmitr()) -+ if (spk_wait_for_xmitr()) - outb(ch, speakup_info.port_tts); - else - return buff; -@@ -166,7 +166,7 @@ int spk_synth_is_alive_restart(struct spk_synth *synth) - { - if (synth->alive) - return 1; -- if (!synth->alive && wait_for_xmitr() > 0) { -+ if (!synth->alive && spk_wait_for_xmitr() > 0) { - /* restart */ - synth->alive = 1; - synth_printf("%s", synth->init); -@@ -192,20 +192,20 @@ void synth_start(void) - synth_buffer_clear(); - return; - } -- trigger_time = get_var(TRIGGER); -+ trigger_time = spk_get_var(TRIGGER); - if (!timer_pending(&thread_timer)) - mod_timer(&thread_timer, jiffies + - msecs_to_jiffies(trigger_time->u.n.value)); - } - --void do_flush(void) -+void spk_do_flush(void) - { - speakup_info.flushing = 1; - synth_buffer_clear(); - if (synth->alive) { -- if (pitch_shift) { -- synth_printf("%s", pitch_buff); -- pitch_shift = 0; -+ if (spk_pitch_shift) { -+ synth_printf("%s", spk_pitch_buff); -+ spk_pitch_shift = 0; - } - } - wake_up_interruptible_all(&speakup_event); -@@ -241,7 +241,7 @@ EXPORT_SYMBOL_GPL(synth_printf); - static int index_count; - static int sentence_count; - --void reset_index_count(int sc) -+void spk_reset_index_count(int sc) - { - static int first = 1; - if (first) -@@ -277,7 +277,7 @@ void synth_insert_next_index(int sent_num) - } - } - --void get_index_count(int *linecount, int *sentcount) -+void spk_get_index_count(int *linecount, int *sentcount) - { - int ind = synth->get_index(); - if (ind) { -@@ -384,7 +384,7 @@ static int do_synth_init(struct spk_synth *in_synth) - for (var = synth->vars; - (var->var_id >= 0) && (var->var_id < MAXVARS); var++) - speakup_register_var(var); -- if (!quiet_boot) -+ if (!spk_quiet_boot) - synth_printf("%s found\n", synth->long_name); - if (synth->attributes.name - && sysfs_create_group(speakup_kobj, &(synth->attributes)) < 0) -@@ -412,7 +412,7 @@ void synth_release(void) - sysfs_remove_group(speakup_kobj, &(synth->attributes)); - for (var = synth->vars; var->var_id != MAXVARS; var++) - speakup_unregister_var(var->var_id); -- stop_serial_interrupt(); -+ spk_stop_serial_interrupt(); - synth->release(); - synth = NULL; - } -@@ -460,4 +460,4 @@ void synth_remove(struct spk_synth *in_synth) - } - EXPORT_SYMBOL_GPL(synth_remove); - --short punc_masks[] = { 0, SOME, MOST, PUNC, PUNC|B_SYM }; -+short spk_punc_masks[] = { 0, SOME, MOST, PUNC, PUNC|B_SYM }; -diff --git a/drivers/staging/speakup/thread.c b/drivers/staging/speakup/thread.c -index 103c5c8..42fa660 100644 ---- a/drivers/staging/speakup/thread.c -+++ b/drivers/staging/speakup/thread.c -@@ -23,8 +23,8 @@ int speakup_thread(void *data) - DEFINE_WAIT(wait); - while (1) { - spk_lock(flags); -- our_sound = unprocessed_sound; -- unprocessed_sound.active = 0; -+ our_sound = spk_unprocessed_sound; -+ spk_unprocessed_sound.active = 0; - prepare_to_wait(&speakup_event, &wait, - TASK_INTERRUPTIBLE); - should_break = kthread_should_stop() || -diff --git a/drivers/staging/speakup/varhandlers.c b/drivers/staging/speakup/varhandlers.c -index ab7de93..f8c1e45 100644 ---- a/drivers/staging/speakup/varhandlers.c -+++ b/drivers/staging/speakup/varhandlers.c -@@ -16,24 +16,24 @@ static struct st_var_header var_headers[] = { - { "ex_num", EXNUMBER, VAR_PROC, NULL, NULL }, - { "characters", CHARS, VAR_PROC, NULL, NULL }, - { "synth_direct", SYNTH_DIRECT, VAR_PROC, NULL, NULL }, -- { "caps_start", CAPS_START, VAR_STRING, str_caps_start, NULL }, -- { "caps_stop", CAPS_STOP, VAR_STRING, str_caps_stop, NULL }, -+ { "caps_start", CAPS_START, VAR_STRING, spk_str_caps_start, NULL }, -+ { "caps_stop", CAPS_STOP, VAR_STRING, spk_str_caps_stop, NULL }, - { "delay_time", DELAY, VAR_TIME, NULL, NULL }, - { "trigger_time", TRIGGER, VAR_TIME, NULL, NULL }, - { "jiffy_delta", JIFFY, VAR_TIME, NULL, NULL }, - { "full_time", FULL, VAR_TIME, NULL, NULL }, -- { "spell_delay", SPELL_DELAY, VAR_NUM, &spell_delay, NULL }, -- { "bleeps", BLEEPS, VAR_NUM, &bleeps, NULL }, -- { "attrib_bleep", ATTRIB_BLEEP, VAR_NUM, &attrib_bleep, NULL }, -- { "bleep_time", BLEEP_TIME, VAR_TIME, &bleep_time, NULL }, -+ { "spell_delay", SPELL_DELAY, VAR_NUM, &spk_spell_delay, NULL }, -+ { "bleeps", BLEEPS, VAR_NUM, &spk_bleeps, NULL }, -+ { "attrib_bleep", ATTRIB_BLEEP, VAR_NUM, &spk_attrib_bleep, NULL }, -+ { "bleep_time", BLEEP_TIME, VAR_TIME, &spk_bleep_time, NULL }, - { "cursor_time", CURSOR_TIME, VAR_TIME, NULL, NULL }, -- { "punc_level", PUNC_LEVEL, VAR_NUM, &punc_level, NULL }, -- { "reading_punc", READING_PUNC, VAR_NUM, &reading_punc, NULL }, -- { "say_control", SAY_CONTROL, VAR_NUM, &say_ctrl, NULL }, -- { "say_word_ctl", SAY_WORD_CTL, VAR_NUM, &say_word_ctl, NULL }, -- { "no_interrupt", NO_INTERRUPT, VAR_NUM, &no_intr, NULL }, -- { "key_echo", KEY_ECHO, VAR_NUM, &key_echo, NULL }, -- { "bell_pos", BELL_POS, VAR_NUM, &bell_pos, NULL }, -+ { "punc_level", PUNC_LEVEL, VAR_NUM, &spk_punc_level, NULL }, -+ { "reading_punc", READING_PUNC, VAR_NUM, &spk_reading_punc, NULL }, -+ { "say_control", SAY_CONTROL, VAR_NUM, &spk_say_ctrl, NULL }, -+ { "say_word_ctl", SAY_WORD_CTL, VAR_NUM, &spk_say_word_ctl, NULL }, -+ { "no_interrupt", NO_INTERRUPT, VAR_NUM, &spk_no_intr, NULL }, -+ { "key_echo", KEY_ECHO, VAR_NUM, &spk_key_echo, NULL }, -+ { "bell_pos", BELL_POS, VAR_NUM, &spk_bell_pos, NULL }, - { "rate", RATE, VAR_NUM, NULL, NULL }, - { "pitch", PITCH, VAR_NUM, NULL, NULL }, - { "vol", VOL, VAR_NUM, NULL, NULL }, -@@ -58,7 +58,7 @@ static struct punc_var_t punc_vars[] = { - { -1, -1 }, - }; - --int chartab_get_value(char *keyword) -+int spk_chartab_get_value(char *keyword) - { - int value = 0; - -@@ -103,11 +103,11 @@ void speakup_register_var(struct var_t *var) - p_header->data = var; - switch (p_header->var_type) { - case VAR_STRING: -- set_string_var(nothing, p_header, 0); -+ spk_set_string_var(nothing, p_header, 0); - break; - case VAR_NUM: - case VAR_TIME: -- set_num_var(0, p_header, E_DEFAULT); -+ spk_set_num_var(0, p_header, E_DEFAULT); - break; - default: - break; -@@ -123,7 +123,7 @@ void speakup_unregister_var(enum var_id_t var_id) - p_header->data = NULL; - } - --struct st_var_header *get_var_header(enum var_id_t var_id) -+struct st_var_header *spk_get_var_header(enum var_id_t var_id) - { - struct st_var_header *p_header; - if (var_id < 0 || var_id >= MAXVARS) -@@ -134,7 +134,7 @@ struct st_var_header *get_var_header(enum var_id_t var_id) - return p_header; - } - --struct st_var_header *var_header_by_name(const char *name) -+struct st_var_header *spk_var_header_by_name(const char *name) - { - int i; - struct st_var_header *where = NULL; -@@ -151,15 +151,15 @@ struct st_var_header *var_header_by_name(const char *name) - return where; - } - --struct var_t *get_var(enum var_id_t var_id) -+struct var_t *spk_get_var(enum var_id_t var_id) - { - BUG_ON(var_id < 0 || var_id >= MAXVARS); - BUG_ON(!var_ptrs[var_id]); - return var_ptrs[var_id]->data; - } --EXPORT_SYMBOL_GPL(get_var); -+EXPORT_SYMBOL_GPL(spk_get_var); - --struct punc_var_t *get_punc_var(enum var_id_t var_id) -+struct punc_var_t *spk_get_punc_var(enum var_id_t var_id) - { - struct punc_var_t *rv = NULL; - struct punc_var_t *where; -@@ -175,7 +175,7 @@ struct punc_var_t *get_punc_var(enum var_id_t var_id) - } - - /* handlers for setting vars */ --int set_num_var(int input, struct st_var_header *var, int how) -+int spk_set_num_var(int input, struct st_var_header *var, int how) - { - int val; - short ret = 0; -@@ -217,7 +217,7 @@ int set_num_var(int input, struct st_var_header *var, int how) - if (p_val != NULL) - *p_val = val; - if (var->var_id == PUNC_LEVEL) { -- punc_mask = punc_masks[val]; -+ spk_punc_mask = spk_punc_masks[val]; - return ret; - } - if (var_data->u.n.multiplier != 0) -@@ -232,7 +232,7 @@ int set_num_var(int input, struct st_var_header *var, int how) - if (!var_data->u.n.synth_fmt) - return ret; - if (var->var_id == PITCH) -- cp = pitch_buff; -+ cp = spk_pitch_buff; - else - cp = buf; - if (!var_data->u.n.out_str) -@@ -244,7 +244,7 @@ int set_num_var(int input, struct st_var_header *var, int how) - return ret; - } - --int set_string_var(const char *page, struct st_var_header *var, int len) -+int spk_set_string_var(const char *page, struct st_var_header *var, int len) - { - int ret = 0; - struct var_t *var_data = var->data; -@@ -267,21 +267,21 @@ int set_string_var(const char *page, struct st_var_header *var, int len) - return ret; - } - --/* set_mask_bits sets or clears the punc/delim/repeat bits, -+/* spk_set_mask_bits sets or clears the punc/delim/repeat bits, - * if input is null uses the defaults. - * values for how: 0 clears bits of chars supplied, - * 1 clears allk, 2 sets bits for chars */ --int set_mask_bits(const char *input, const int which, const int how) -+int spk_set_mask_bits(const char *input, const int which, const int how) - { - u_char *cp; -- short mask = punc_info[which].mask; -+ short mask = spk_punc_info[which].mask; - if (how&1) { -- for (cp = (u_char *)punc_info[3].value; *cp; cp++) -+ for (cp = (u_char *)spk_punc_info[3].value; *cp; cp++) - spk_chartab[*cp] &= ~mask; - } - cp = (u_char *)input; - if (cp == 0) -- cp = punc_info[which].value; -+ cp = spk_punc_info[which].value; - else { - for ( ; *cp; cp++) { - if (*cp < SPACE) -@@ -308,7 +308,7 @@ int set_mask_bits(const char *input, const int which, const int how) - return 0; - } - --char *strlwr(char *s) -+char *spk_strlwr(char *s) - { - char *p; - if (s == NULL) -@@ -341,7 +341,7 @@ char *speakup_s2i(char *start, int *dest) - return start; - } - --char *s2uchar(char *start, char *dest) -+char *spk_s2uchar(char *start, char *dest) - { - int val = 0; - while (*start && *start <= SPACE) -@@ -357,7 +357,7 @@ char *s2uchar(char *start, char *dest) - return start; - } - --char *xlate(char *s) -+char *spk_xlate(char *s) - { - static const char finds[] = "nrtvafe"; - static const char subs[] = "\n\r\t\013\001\014\033"; -diff --git a/drivers/staging/tidspbridge/Kconfig b/drivers/staging/tidspbridge/Kconfig -index 0dd479f..f67c78e 100644 ---- a/drivers/staging/tidspbridge/Kconfig -+++ b/drivers/staging/tidspbridge/Kconfig -@@ -4,7 +4,7 @@ - - menuconfig TIDSPBRIDGE - tristate "DSP Bridge driver" -- depends on ARCH_OMAP3 -+ depends on ARCH_OMAP3 && BROKEN - select OMAP_MBOX_FWK - help - DSP/BIOS Bridge is designed for platforms that contain a GPP and -diff --git a/drivers/staging/tidspbridge/core/dsp-clock.c b/drivers/staging/tidspbridge/core/dsp-clock.c -index c7df34e..f825814 100644 ---- a/drivers/staging/tidspbridge/core/dsp-clock.c -+++ b/drivers/staging/tidspbridge/core/dsp-clock.c -@@ -213,7 +213,7 @@ int dsp_clk_enable(enum dsp_clk_id clk_id) - case GPT_CLK: - status = omap_dm_timer_start(timer[clk_id - 1]); - break; --#ifdef CONFIG_OMAP_MCBSP -+#ifdef CONFIG_SND_OMAP_SOC_MCBSP - case MCBSP_CLK: - omap_mcbsp_request(MCBSP_ID(clk_id)); - omap2_mcbsp_set_clks_src(MCBSP_ID(clk_id), MCBSP_CLKS_PAD_SRC); -@@ -289,7 +289,7 @@ int dsp_clk_disable(enum dsp_clk_id clk_id) - case GPT_CLK: - status = omap_dm_timer_stop(timer[clk_id - 1]); - break; --#ifdef CONFIG_OMAP_MCBSP -+#ifdef CONFIG_SND_OMAP_SOC_MCBSP - case MCBSP_CLK: - omap2_mcbsp_set_clks_src(MCBSP_ID(clk_id), MCBSP_CLKS_PRCM_SRC); - omap_mcbsp_free(MCBSP_ID(clk_id)); -diff --git a/drivers/staging/vt6656/baseband.c b/drivers/staging/vt6656/baseband.c -index 06f27f6..4034281 100644 ---- a/drivers/staging/vt6656/baseband.c -+++ b/drivers/staging/vt6656/baseband.c -@@ -976,6 +976,7 @@ BOOL BBbVT3184Init(PSDevice pDevice) - PBYTE pbyAgc; - WORD wLengthAgc; - BYTE abyArray[256]; -+ u8 data; - - ntStatus = CONTROLnsRequestIn(pDevice, - MESSAGE_TYPE_READ, -@@ -1144,6 +1145,16 @@ else { - ControlvWriteByte(pDevice,MESSAGE_REQUEST_BBREG,0x0D,0x01); - - RFbRFTableDownload(pDevice); -+ -+ /* Fix for TX USB resets from vendors driver */ -+ CONTROLnsRequestIn(pDevice, MESSAGE_TYPE_READ, USB_REG4, -+ MESSAGE_REQUEST_MEM, sizeof(data), &data); -+ -+ data |= 0x2; -+ -+ CONTROLnsRequestOut(pDevice, MESSAGE_TYPE_WRITE, USB_REG4, -+ MESSAGE_REQUEST_MEM, sizeof(data), &data); -+ - return TRUE;//ntStatus; - } - -@@ -1623,7 +1634,6 @@ BBvUpdatePreEDThreshold( - - if( bScanning ) - { // need Max sensitivity //RSSI -69, -70,.... -- if(pDevice->byBBPreEDIndex == 0) break; - pDevice->byBBPreEDIndex = 0; - ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xC9, 0x00); //CR201(0xC9) - ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xCE, 0x30); //CR206(0xCE) -@@ -1766,7 +1776,6 @@ BBvUpdatePreEDThreshold( - - if( bScanning ) - { // need Max sensitivity //RSSI -69, -70, ... -- if(pDevice->byBBPreEDIndex == 0) break; - pDevice->byBBPreEDIndex = 0; - ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xC9, 0x00); //CR201(0xC9) - ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xCE, 0x24); //CR206(0xCE) -@@ -1918,7 +1927,6 @@ BBvUpdatePreEDThreshold( - case RF_VT3342A0: //RobertYu:20060627, testing table - if( bScanning ) - { // need Max sensitivity //RSSI -67, -68, ... -- if(pDevice->byBBPreEDIndex == 0) break; - pDevice->byBBPreEDIndex = 0; - ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xC9, 0x00); //CR201(0xC9) - ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xCE, 0x38); //CR206(0xCE) -diff --git a/drivers/staging/vt6656/rndis.h b/drivers/staging/vt6656/rndis.h -index fccf7e9..dcf7bf5 100644 ---- a/drivers/staging/vt6656/rndis.h -+++ b/drivers/staging/vt6656/rndis.h -@@ -69,6 +69,7 @@ - - #define VIAUSB20_PACKET_HEADER 0x04 - -+#define USB_REG4 0x604 - - /*--------------------- Export Classes ----------------------------*/ - -diff --git a/drivers/staging/wlags49_h2/wl_priv.c b/drivers/staging/wlags49_h2/wl_priv.c -index f30e5ee..ff459b2 100644 ---- a/drivers/staging/wlags49_h2/wl_priv.c -+++ b/drivers/staging/wlags49_h2/wl_priv.c -@@ -570,6 +570,7 @@ int wvlan_uil_put_info( struct uilreq *urq, struct wl_private *lp ) - ltv_t *pLtv; - bool_t ltvAllocated = FALSE; - ENCSTRCT sEncryption; -+ size_t len; - - #ifdef USE_WDS - hcf_16 hcfPort = HCF_PORT_0; -@@ -686,7 +687,8 @@ int wvlan_uil_put_info( struct uilreq *urq, struct wl_private *lp ) - break; - case CFG_CNF_OWN_NAME: - memset( lp->StationName, 0, sizeof( lp->StationName )); -- memcpy( (void *)lp->StationName, (void *)&pLtv->u.u8[2], (size_t)pLtv->u.u16[0]); -+ len = min_t(size_t, pLtv->u.u16[0], sizeof(lp->StationName)); -+ strlcpy(lp->StationName, &pLtv->u.u8[2], len); - pLtv->u.u16[0] = CNV_INT_TO_LITTLE( pLtv->u.u16[0] ); - break; - case CFG_CNF_LOAD_BALANCING: -@@ -1800,6 +1802,7 @@ int wvlan_set_station_nickname(struct net_device *dev, - { - struct wl_private *lp = wl_priv(dev); - unsigned long flags; -+ size_t len; - int ret = 0; - /*------------------------------------------------------------------------*/ - -@@ -1810,8 +1813,8 @@ int wvlan_set_station_nickname(struct net_device *dev, - wl_lock(lp, &flags); - - memset( lp->StationName, 0, sizeof( lp->StationName )); -- -- memcpy( lp->StationName, extra, wrqu->data.length); -+ len = min_t(size_t, wrqu->data.length, sizeof(lp->StationName)); -+ strlcpy(lp->StationName, extra, len); - - /* Commit the adapter parameters */ - wl_apply( lp ); -diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c -index a493049..2e7e5a8 100644 ---- a/drivers/target/iscsi/iscsi_target.c -+++ b/drivers/target/iscsi/iscsi_target.c -@@ -50,7 +50,7 @@ - static LIST_HEAD(g_tiqn_list); - static LIST_HEAD(g_np_list); - static DEFINE_SPINLOCK(tiqn_lock); --static DEFINE_SPINLOCK(np_lock); -+static DEFINE_MUTEX(np_lock); - - static struct idr tiqn_idr; - struct idr sess_idr; -@@ -262,6 +262,9 @@ int iscsit_deaccess_np(struct iscsi_np *np, struct iscsi_portal_group *tpg) - return 0; - } - -+/* -+ * Called with mutex np_lock held -+ */ - static struct iscsi_np *iscsit_get_np( - struct __kernel_sockaddr_storage *sockaddr, - int network_transport) -@@ -272,11 +275,10 @@ static struct iscsi_np *iscsit_get_np( - int ip_match = 0; - u16 port; - -- spin_lock_bh(&np_lock); - list_for_each_entry(np, &g_np_list, np_list) { -- spin_lock(&np->np_thread_lock); -+ spin_lock_bh(&np->np_thread_lock); - if (np->np_thread_state != ISCSI_NP_THREAD_ACTIVE) { -- spin_unlock(&np->np_thread_lock); -+ spin_unlock_bh(&np->np_thread_lock); - continue; - } - -@@ -309,13 +311,11 @@ static struct iscsi_np *iscsit_get_np( - * while iscsi_tpg_add_network_portal() is called. - */ - np->np_exports++; -- spin_unlock(&np->np_thread_lock); -- spin_unlock_bh(&np_lock); -+ spin_unlock_bh(&np->np_thread_lock); - return np; - } -- spin_unlock(&np->np_thread_lock); -+ spin_unlock_bh(&np->np_thread_lock); - } -- spin_unlock_bh(&np_lock); - - return NULL; - } -@@ -329,16 +329,22 @@ struct iscsi_np *iscsit_add_np( - struct sockaddr_in6 *sock_in6; - struct iscsi_np *np; - int ret; -+ -+ mutex_lock(&np_lock); -+ - /* - * Locate the existing struct iscsi_np if already active.. - */ - np = iscsit_get_np(sockaddr, network_transport); -- if (np) -+ if (np) { -+ mutex_unlock(&np_lock); - return np; -+ } - - np = kzalloc(sizeof(struct iscsi_np), GFP_KERNEL); - if (!np) { - pr_err("Unable to allocate memory for struct iscsi_np\n"); -+ mutex_unlock(&np_lock); - return ERR_PTR(-ENOMEM); - } - -@@ -361,6 +367,7 @@ struct iscsi_np *iscsit_add_np( - ret = iscsi_target_setup_login_socket(np, sockaddr); - if (ret != 0) { - kfree(np); -+ mutex_unlock(&np_lock); - return ERR_PTR(ret); - } - -@@ -369,6 +376,7 @@ struct iscsi_np *iscsit_add_np( - pr_err("Unable to create kthread: iscsi_np\n"); - ret = PTR_ERR(np->np_thread); - kfree(np); -+ mutex_unlock(&np_lock); - return ERR_PTR(ret); - } - /* -@@ -379,10 +387,10 @@ struct iscsi_np *iscsit_add_np( - * point because iscsi_np has not been added to g_np_list yet. - */ - np->np_exports = 1; -+ np->np_thread_state = ISCSI_NP_THREAD_ACTIVE; - -- spin_lock_bh(&np_lock); - list_add_tail(&np->np_list, &g_np_list); -- spin_unlock_bh(&np_lock); -+ mutex_unlock(&np_lock); - - pr_debug("CORE[0] - Added Network Portal: %s:%hu on %s\n", - np->np_ip, np->np_port, (np->np_network_transport == ISCSI_TCP) ? -@@ -453,9 +461,9 @@ int iscsit_del_np(struct iscsi_np *np) - } - iscsit_del_np_comm(np); - -- spin_lock_bh(&np_lock); -+ mutex_lock(&np_lock); - list_del(&np->np_list); -- spin_unlock_bh(&np_lock); -+ mutex_unlock(&np_lock); - - pr_debug("CORE[0] - Removed Network Portal: %s:%hu on %s\n", - np->np_ip, np->np_port, (np->np_network_transport == ISCSI_TCP) ? -@@ -2339,6 +2347,7 @@ static void iscsit_build_conn_drop_async_message(struct iscsi_conn *conn) - { - struct iscsi_cmd *cmd; - struct iscsi_conn *conn_p; -+ bool found = false; - - /* - * Only send a Asynchronous Message on connections whos network -@@ -2347,11 +2356,12 @@ static void iscsit_build_conn_drop_async_message(struct iscsi_conn *conn) - list_for_each_entry(conn_p, &conn->sess->sess_conn_list, conn_list) { - if (conn_p->conn_state == TARG_CONN_STATE_LOGGED_IN) { - iscsit_inc_conn_usage_count(conn_p); -+ found = true; - break; - } - } - -- if (!conn_p) -+ if (!found) - return; - - cmd = iscsit_allocate_cmd(conn_p, GFP_ATOMIC); -@@ -4282,6 +4292,7 @@ static void iscsit_logout_post_handler_diffcid( - { - struct iscsi_conn *l_conn; - struct iscsi_session *sess = conn->sess; -+ bool conn_found = false; - - if (!sess) - return; -@@ -4290,12 +4301,13 @@ static void iscsit_logout_post_handler_diffcid( - list_for_each_entry(l_conn, &sess->sess_conn_list, conn_list) { - if (l_conn->cid == cid) { - iscsit_inc_conn_usage_count(l_conn); -+ conn_found = true; - break; - } - } - spin_unlock_bh(&sess->conn_lock); - -- if (!l_conn) -+ if (!conn_found) - return; - - if (l_conn->sock) -diff --git a/drivers/target/iscsi/iscsi_target_auth.c b/drivers/target/iscsi/iscsi_target_auth.c -index a0fc7b9..cbb04f3 100644 ---- a/drivers/target/iscsi/iscsi_target_auth.c -+++ b/drivers/target/iscsi/iscsi_target_auth.c -@@ -174,6 +174,7 @@ static int chap_server_compute_md5( - unsigned char client_digest[MD5_SIGNATURE_SIZE]; - unsigned char server_digest[MD5_SIGNATURE_SIZE]; - unsigned char chap_n[MAX_CHAP_N_SIZE], chap_r[MAX_RESPONSE_LENGTH]; -+ size_t compare_len; - struct iscsi_chap *chap = conn->auth_protocol; - struct crypto_hash *tfm; - struct hash_desc desc; -@@ -212,7 +213,9 @@ static int chap_server_compute_md5( - goto out; - } - -- if (memcmp(chap_n, auth->userid, strlen(auth->userid)) != 0) { -+ /* Include the terminating NULL in the compare */ -+ compare_len = strlen(auth->userid) + 1; -+ if (strncmp(chap_n, auth->userid, compare_len) != 0) { - pr_err("CHAP_N values do not match!\n"); - goto out; - } -@@ -339,6 +342,16 @@ static int chap_server_compute_md5( - goto out; - } - /* -+ * During mutual authentication, the CHAP_C generated by the -+ * initiator must not match the original CHAP_C generated by -+ * the target. -+ */ -+ if (!memcmp(challenge_binhex, chap->challenge, CHAP_CHALLENGE_LENGTH)) { -+ pr_err("initiator CHAP_C matches target CHAP_C, failing" -+ " login attempt\n"); -+ goto out; -+ } -+ /* - * Generate CHAP_N and CHAP_R for mutual authentication. - */ - tfm = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC); -diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c -index 3cb7a4f..bc7d08f 100644 ---- a/drivers/target/iscsi/iscsi_target_login.c -+++ b/drivers/target/iscsi/iscsi_target_login.c -@@ -131,13 +131,13 @@ int iscsi_check_for_session_reinstatement(struct iscsi_conn *conn) - - initiatorname_param = iscsi_find_param_from_key( - INITIATORNAME, conn->param_list); -- if (!initiatorname_param) -- return -1; -- - sessiontype_param = iscsi_find_param_from_key( - SESSIONTYPE, conn->param_list); -- if (!sessiontype_param) -+ if (!initiatorname_param || !sessiontype_param) { -+ iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR, -+ ISCSI_LOGIN_STATUS_MISSING_FIELDS); - return -1; -+ } - - sessiontype = (strncmp(sessiontype_param->value, NORMAL, 6)) ? 1 : 0; - -diff --git a/drivers/target/iscsi/iscsi_target_nego.c b/drivers/target/iscsi/iscsi_target_nego.c -index 2dba448..89f8909 100644 ---- a/drivers/target/iscsi/iscsi_target_nego.c -+++ b/drivers/target/iscsi/iscsi_target_nego.c -@@ -89,7 +89,7 @@ int extract_param( - if (len < 0) - return -1; - -- if (len > max_length) { -+ if (len >= max_length) { - pr_err("Length of input: %d exceeds max_length:" - " %d\n", len, max_length); - return -1; -@@ -628,8 +628,11 @@ static int iscsi_target_handle_csg_one(struct iscsi_conn *conn, struct iscsi_log - login->req_buf, - payload_length, - conn->param_list); -- if (ret < 0) -+ if (ret < 0) { -+ iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR, -+ ISCSI_LOGIN_STATUS_INIT_ERR); - return -1; -+ } - - if (login->first_request) - if (iscsi_target_check_first_request(conn, login) < 0) -@@ -644,8 +647,11 @@ static int iscsi_target_handle_csg_one(struct iscsi_conn *conn, struct iscsi_log - login->rsp_buf, - &login->rsp_length, - conn->param_list); -- if (ret < 0) -+ if (ret < 0) { -+ iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR, -+ ISCSI_LOGIN_STATUS_INIT_ERR); - return -1; -+ } - - if (!login->auth_complete && - ISCSI_TPG_ATTRIB(ISCSI_TPG_C(conn))->authentication) { -diff --git a/drivers/target/iscsi/iscsi_target_parameters.c b/drivers/target/iscsi/iscsi_target_parameters.c -index 8a8ff23..ed4abad 100644 ---- a/drivers/target/iscsi/iscsi_target_parameters.c -+++ b/drivers/target/iscsi/iscsi_target_parameters.c -@@ -552,7 +552,7 @@ int iscsi_copy_param_list( - param_list = kzalloc(sizeof(struct iscsi_param_list), GFP_KERNEL); - if (!param_list) { - pr_err("Unable to allocate memory for struct iscsi_param_list.\n"); -- goto err_out; -+ return -1; - } - INIT_LIST_HEAD(¶m_list->param_list); - INIT_LIST_HEAD(¶m_list->extra_response_list); -diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c -index aa3c106..b10f585 100644 ---- a/drivers/target/target_core_alua.c -+++ b/drivers/target/target_core_alua.c -@@ -394,7 +394,7 @@ static inline int core_alua_state_standby( - case SEND_DIAGNOSTIC: - return 0; - case MAINTENANCE_IN: -- switch (cdb[1]) { -+ switch (cdb[1] & 0x1f) { - case MI_REPORT_TARGET_PGS: - return 0; - default: -@@ -437,7 +437,7 @@ static inline int core_alua_state_unavailable( - case REPORT_LUNS: - return 0; - case MAINTENANCE_IN: -- switch (cdb[1]) { -+ switch (cdb[1] & 0x1f) { - case MI_REPORT_TARGET_PGS: - return 0; - default: -@@ -478,7 +478,7 @@ static inline int core_alua_state_transition( - case REPORT_LUNS: - return 0; - case MAINTENANCE_IN: -- switch (cdb[1]) { -+ switch (cdb[1] & 0x1f) { - case MI_REPORT_TARGET_PGS: - return 0; - default: -diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c -index f286955..f44459a 100644 ---- a/drivers/target/target_core_file.c -+++ b/drivers/target/target_core_file.c -@@ -133,21 +133,24 @@ static struct se_device *fd_create_virtdevice( - ret = PTR_ERR(dev_p); - goto fail; - } --#if 0 -- if (di->no_create_file) -- flags = O_RDWR | O_LARGEFILE; -- else -- flags = O_RDWR | O_CREAT | O_LARGEFILE; --#else -- flags = O_RDWR | O_CREAT | O_LARGEFILE; --#endif --/* flags |= O_DIRECT; */ - /* -- * If fd_buffered_io=1 has not been set explicitly (the default), -- * use O_SYNC to force FILEIO writes to disk. -+ * Use O_DSYNC by default instead of O_SYNC to forgo syncing -+ * of pure timestamp updates. -+ */ -+ flags = O_RDWR | O_CREAT | O_LARGEFILE | O_DSYNC; -+ /* -+ * Optionally allow fd_buffered_io=1 to be enabled for people -+ * who want use the fs buffer cache as an WriteCache mechanism. -+ * -+ * This means that in event of a hard failure, there is a risk -+ * of silent data-loss if the SCSI client has *not* performed a -+ * forced unit access (FUA) write, or issued SYNCHRONIZE_CACHE -+ * to write-out the entire device cache. - */ -- if (!(fd_dev->fbd_flags & FDBD_USE_BUFFERED_IO)) -- flags |= O_SYNC; -+ if (fd_dev->fbd_flags & FDBD_HAS_BUFFERED_IO_WCE) { -+ pr_debug("FILEIO: Disabling O_DSYNC, using buffered FILEIO\n"); -+ flags &= ~O_DSYNC; -+ } - - file = filp_open(dev_p, flags, 0600); - if (IS_ERR(file)) { -@@ -215,6 +218,12 @@ static struct se_device *fd_create_virtdevice( - if (!dev) - goto fail; - -+ if (fd_dev->fbd_flags & FDBD_HAS_BUFFERED_IO_WCE) { -+ pr_debug("FILEIO: Forcing setting of emulate_write_cache=1" -+ " with FDBD_HAS_BUFFERED_IO_WCE\n"); -+ dev->se_sub_dev->se_dev_attrib.emulate_write_cache = 1; -+ } -+ - fd_dev->fd_dev_id = fd_host->fd_host_dev_id_count++; - fd_dev->fd_queue_depth = dev->queue_depth; - -@@ -290,7 +299,7 @@ static int fd_do_readv(struct se_task *task) - - for_each_sg(task->task_sg, sg, task->task_sg_nents, i) { - iov[i].iov_len = sg->length; -- iov[i].iov_base = sg_virt(sg); -+ iov[i].iov_base = kmap(sg_page(sg)) + sg->offset; - } - - old_fs = get_fs(); -@@ -298,6 +307,8 @@ static int fd_do_readv(struct se_task *task) - ret = vfs_readv(fd, &iov[0], task->task_sg_nents, &pos); - set_fs(old_fs); - -+ for_each_sg(task->task_sg, sg, task->task_sg_nents, i) -+ kunmap(sg_page(sg)); - kfree(iov); - /* - * Return zeros and GOOD status even if the READ did not return -@@ -343,7 +354,7 @@ static int fd_do_writev(struct se_task *task) - - for_each_sg(task->task_sg, sg, task->task_sg_nents, i) { - iov[i].iov_len = sg->length; -- iov[i].iov_base = sg_virt(sg); -+ iov[i].iov_base = kmap(sg_page(sg)) + sg->offset; - } - - old_fs = get_fs(); -@@ -351,6 +362,9 @@ static int fd_do_writev(struct se_task *task) - ret = vfs_writev(fd, &iov[0], task->task_sg_nents, &pos); - set_fs(old_fs); - -+ for_each_sg(task->task_sg, sg, task->task_sg_nents, i) -+ kunmap(sg_page(sg)); -+ - kfree(iov); - - if (ret < 0 || ret != task->task_size) { -@@ -399,26 +413,6 @@ static void fd_emulate_sync_cache(struct se_task *task) - transport_complete_sync_cache(cmd, ret == 0); - } - --/* -- * WRITE Force Unit Access (FUA) emulation on a per struct se_task -- * LBA range basis.. -- */ --static void fd_emulate_write_fua(struct se_cmd *cmd, struct se_task *task) --{ -- struct se_device *dev = cmd->se_dev; -- struct fd_dev *fd_dev = dev->dev_ptr; -- loff_t start = task->task_lba * dev->se_sub_dev->se_dev_attrib.block_size; -- loff_t end = start + task->task_size; -- int ret; -- -- pr_debug("FILEIO: FUA WRITE LBA: %llu, bytes: %u\n", -- task->task_lba, task->task_size); -- -- ret = vfs_fsync_range(fd_dev->fd_file, start, end, 1); -- if (ret != 0) -- pr_err("FILEIO: vfs_fsync_range() failed: %d\n", ret); --} -- - static int fd_do_task(struct se_task *task) - { - struct se_cmd *cmd = task->task_se_cmd; -@@ -433,19 +427,21 @@ static int fd_do_task(struct se_task *task) - ret = fd_do_readv(task); - } else { - ret = fd_do_writev(task); -- -+ /* -+ * Perform implict vfs_fsync_range() for fd_do_writev() ops -+ * for SCSI WRITEs with Forced Unit Access (FUA) set. -+ * Allow this to happen independent of WCE=0 setting. -+ */ - if (ret > 0 && -- dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0 && - dev->se_sub_dev->se_dev_attrib.emulate_fua_write > 0 && - (cmd->se_cmd_flags & SCF_FUA)) { -- /* -- * We might need to be a bit smarter here -- * and return some sense data to let the initiator -- * know the FUA WRITE cache sync failed..? -- */ -- fd_emulate_write_fua(cmd, task); -- } -+ struct fd_dev *fd_dev = dev->dev_ptr; -+ loff_t start = task->task_lba * -+ dev->se_sub_dev->se_dev_attrib.block_size; -+ loff_t end = start + task->task_size; - -+ vfs_fsync_range(fd_dev->fd_file, start, end, 1); -+ } - } - - if (ret < 0) { -@@ -544,7 +540,7 @@ static ssize_t fd_set_configfs_dev_params( - pr_debug("FILEIO: Using buffered I/O" - " operations for struct fd_dev\n"); - -- fd_dev->fbd_flags |= FDBD_USE_BUFFERED_IO; -+ fd_dev->fbd_flags |= FDBD_HAS_BUFFERED_IO_WCE; - break; - default: - break; -@@ -579,8 +575,8 @@ static ssize_t fd_show_configfs_dev_params( - bl = sprintf(b + bl, "TCM FILEIO ID: %u", fd_dev->fd_dev_id); - bl += sprintf(b + bl, " File: %s Size: %llu Mode: %s\n", - fd_dev->fd_dev_name, fd_dev->fd_dev_size, -- (fd_dev->fbd_flags & FDBD_USE_BUFFERED_IO) ? -- "Buffered" : "Synchronous"); -+ (fd_dev->fbd_flags & FDBD_HAS_BUFFERED_IO_WCE) ? -+ "Buffered-WCE" : "O_DSYNC"); - return bl; - } - -diff --git a/drivers/target/target_core_file.h b/drivers/target/target_core_file.h -index 59e6e73..6b1b6a9 100644 ---- a/drivers/target/target_core_file.h -+++ b/drivers/target/target_core_file.h -@@ -18,7 +18,7 @@ struct fd_request { - - #define FBDF_HAS_PATH 0x01 - #define FBDF_HAS_SIZE 0x02 --#define FDBD_USE_BUFFERED_IO 0x04 -+#define FDBD_HAS_BUFFERED_IO_WCE 0x04 - - struct fd_dev { - u32 fbd_flags; -diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c -index d084ba3..d34577d 100644 ---- a/drivers/target/target_core_pscsi.c -+++ b/drivers/target/target_core_pscsi.c -@@ -128,10 +128,10 @@ static int pscsi_pmode_enable_hba(struct se_hba *hba, unsigned long mode_flag) - * pSCSI Host ID and enable for phba mode - */ - sh = scsi_host_lookup(phv->phv_host_id); -- if (IS_ERR(sh)) { -+ if (!sh) { - pr_err("pSCSI: Unable to locate SCSI Host for" - " phv_host_id: %d\n", phv->phv_host_id); -- return PTR_ERR(sh); -+ return -EINVAL; - } - - phv->phv_lld_host = sh; -@@ -562,10 +562,10 @@ static struct se_device *pscsi_create_virtdevice( - sh = phv->phv_lld_host; - } else { - sh = scsi_host_lookup(pdv->pdv_host_id); -- if (IS_ERR(sh)) { -+ if (!sh) { - pr_err("pSCSI: Unable to locate" - " pdv_host_id: %d\n", pdv->pdv_host_id); -- return ERR_CAST(sh); -+ return ERR_PTR(-EINVAL); - } - } - } else { -diff --git a/drivers/target/target_core_rd.c b/drivers/target/target_core_rd.c -index 8b68f7b..fa4e21b 100644 ---- a/drivers/target/target_core_rd.c -+++ b/drivers/target/target_core_rd.c -@@ -177,7 +177,7 @@ static int rd_build_device_space(struct rd_dev *rd_dev) - - 1; - - for (j = 0; j < sg_per_table; j++) { -- pg = alloc_pages(GFP_KERNEL, 0); -+ pg = alloc_pages(GFP_KERNEL | __GFP_ZERO, 0); - if (!pg) { - pr_err("Unable to allocate scatterlist" - " pages for struct rd_dev_sg_table\n"); -diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c -index 5362428..712999c7 100644 ---- a/drivers/target/target_core_transport.c -+++ b/drivers/target/target_core_transport.c -@@ -1458,6 +1458,7 @@ static inline void transport_generic_prepare_cdb( - case VERIFY_16: /* SBC - VRProtect */ - case WRITE_VERIFY: /* SBC - VRProtect */ - case WRITE_VERIFY_12: /* SBC - VRProtect */ -+ case MAINTENANCE_IN: /* SPC - Parameter Data Format for SA RTPG */ - break; - default: - cdb[1] &= 0x1f; /* clear logical unit number */ -@@ -2815,7 +2816,7 @@ static int transport_generic_cmd_sequencer( - /* - * Check for emulated MI_REPORT_TARGET_PGS. - */ -- if (cdb[1] == MI_REPORT_TARGET_PGS && -+ if ((cdb[1] & 0x1f) == MI_REPORT_TARGET_PGS && - su_dev->t10_alua.alua_type == SPC3_ALUA_EMULATED) { - cmd->execute_task = - target_emulate_report_target_port_groups; -@@ -4706,7 +4707,7 @@ int transport_send_check_condition_and_sense( - /* ILLEGAL REQUEST */ - buffer[offset+SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; - /* LOGICAL UNIT COMMUNICATION FAILURE */ -- buffer[offset+SPC_ASC_KEY_OFFSET] = 0x80; -+ buffer[offset+SPC_ASC_KEY_OFFSET] = 0x08; - break; - } - /* -diff --git a/drivers/target/tcm_fc/tfc_sess.c b/drivers/target/tcm_fc/tfc_sess.c -index 9249998..5ac8d56 100644 ---- a/drivers/target/tcm_fc/tfc_sess.c -+++ b/drivers/target/tcm_fc/tfc_sess.c -@@ -69,6 +69,7 @@ static struct ft_tport *ft_tport_create(struct fc_lport *lport) - - if (tport) { - tport->tpg = tpg; -+ tpg->tport = tport; - return tport; - } - -diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c -index 8880adf..1da617f 100644 ---- a/drivers/tty/hvc/hvc_console.c -+++ b/drivers/tty/hvc/hvc_console.c -@@ -31,6 +31,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -70,6 +71,9 @@ static struct task_struct *hvc_task; - /* Picks up late kicks after list walk but before schedule() */ - static int hvc_kicked; - -+/* hvc_init is triggered from hvc_alloc, i.e. only when actually used */ -+static atomic_t hvc_needs_init __read_mostly = ATOMIC_INIT(-1); -+ - static int hvc_init(void); - - #ifdef CONFIG_MAGIC_SYSRQ -@@ -186,7 +190,7 @@ static struct tty_driver *hvc_console_device(struct console *c, int *index) - return hvc_driver; - } - --static int __init hvc_console_setup(struct console *co, char *options) -+static int hvc_console_setup(struct console *co, char *options) - { - if (co->index < 0 || co->index >= MAX_NR_HVC_CONSOLES) - return -ENODEV; -@@ -825,7 +829,7 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data, - int i; - - /* We wait until a driver actually comes along */ -- if (!hvc_driver) { -+ if (atomic_inc_not_zero(&hvc_needs_init)) { - int err = hvc_init(); - if (err) - return ERR_PTR(err); -diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c -index 4a418e4..53ff37b 100644 ---- a/drivers/tty/n_gsm.c -+++ b/drivers/tty/n_gsm.c -@@ -108,7 +108,7 @@ struct gsm_mux_net { - */ - - struct gsm_msg { -- struct gsm_msg *next; -+ struct list_head list; - u8 addr; /* DLCI address + flags */ - u8 ctrl; /* Control byte + flags */ - unsigned int len; /* Length of data block (can be zero) */ -@@ -245,8 +245,7 @@ struct gsm_mux { - unsigned int tx_bytes; /* TX data outstanding */ - #define TX_THRESH_HI 8192 - #define TX_THRESH_LO 2048 -- struct gsm_msg *tx_head; /* Pending data packets */ -- struct gsm_msg *tx_tail; -+ struct list_head tx_list; /* Pending data packets */ - - /* Control messages */ - struct timer_list t2_timer; /* Retransmit timer for commands */ -@@ -663,7 +662,7 @@ static struct gsm_msg *gsm_data_alloc(struct gsm_mux *gsm, u8 addr, int len, - m->len = len; - m->addr = addr; - m->ctrl = ctrl; -- m->next = NULL; -+ INIT_LIST_HEAD(&m->list); - return m; - } - -@@ -673,22 +672,21 @@ static struct gsm_msg *gsm_data_alloc(struct gsm_mux *gsm, u8 addr, int len, - * - * The tty device has called us to indicate that room has appeared in - * the transmit queue. Ram more data into the pipe if we have any -+ * If we have been flow-stopped by a CMD_FCOFF, then we can only -+ * send messages on DLCI0 until CMD_FCON - * - * FIXME: lock against link layer control transmissions - */ - - static void gsm_data_kick(struct gsm_mux *gsm) - { -- struct gsm_msg *msg = gsm->tx_head; -+ struct gsm_msg *msg, *nmsg; - int len; - int skip_sof = 0; - -- /* FIXME: We need to apply this solely to data messages */ -- if (gsm->constipated) -- return; -- -- while (gsm->tx_head != NULL) { -- msg = gsm->tx_head; -+ list_for_each_entry_safe(msg, nmsg, &gsm->tx_list, list) { -+ if (gsm->constipated && msg->addr) -+ continue; - if (gsm->encoding != 0) { - gsm->txframe[0] = GSM1_SOF; - len = gsm_stuff_frame(msg->data, -@@ -711,14 +709,13 @@ static void gsm_data_kick(struct gsm_mux *gsm) - len - skip_sof) < 0) - break; - /* FIXME: Can eliminate one SOF in many more cases */ -- gsm->tx_head = msg->next; -- if (gsm->tx_head == NULL) -- gsm->tx_tail = NULL; - gsm->tx_bytes -= msg->len; -- kfree(msg); - /* For a burst of frames skip the extra SOF within the - burst */ - skip_sof = 1; -+ -+ list_del(&msg->list); -+ kfree(msg); - } - } - -@@ -768,11 +765,7 @@ static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg) - msg->data = dp; - - /* Add to the actual output queue */ -- if (gsm->tx_tail) -- gsm->tx_tail->next = msg; -- else -- gsm->tx_head = msg; -- gsm->tx_tail = msg; -+ list_add_tail(&msg->list, &gsm->tx_list); - gsm->tx_bytes += msg->len; - gsm_data_kick(gsm); - } -@@ -886,7 +879,7 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm, - if (len > gsm->mtu) { - if (dlci->adaption == 3) { - /* Over long frame, bin it */ -- kfree_skb(dlci->skb); -+ dev_kfree_skb_any(dlci->skb); - dlci->skb = NULL; - return 0; - } -@@ -915,7 +908,7 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm, - skb_pull(dlci->skb, len); - __gsm_data_queue(dlci, msg); - if (last) { -- kfree_skb(dlci->skb); -+ dev_kfree_skb_any(dlci->skb); - dlci->skb = NULL; - } - return size; -@@ -976,6 +969,9 @@ static void gsm_dlci_data_kick(struct gsm_dlci *dlci) - unsigned long flags; - int sweep; - -+ if (dlci->constipated) -+ return; -+ - spin_lock_irqsave(&dlci->gsm->tx_lock, flags); - /* If we have nothing running then we need to fire up */ - sweep = (dlci->gsm->tx_bytes < TX_THRESH_LO); -@@ -1033,6 +1029,7 @@ static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci, - { - int mlines = 0; - u8 brk = 0; -+ int fc; - - /* The modem status command can either contain one octet (v.24 signals) - or two octets (v.24 signals + break signals). The length field will -@@ -1044,19 +1041,21 @@ static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci, - else { - brk = modem & 0x7f; - modem = (modem >> 7) & 0x7f; -- }; -+ } - - /* Flow control/ready to communicate */ -- if (modem & MDM_FC) { -+ fc = (modem & MDM_FC) || !(modem & MDM_RTR); -+ if (fc && !dlci->constipated) { - /* Need to throttle our output on this device */ - dlci->constipated = 1; -- } -- if (modem & MDM_RTC) { -- mlines |= TIOCM_DSR | TIOCM_DTR; -+ } else if (!fc && dlci->constipated) { - dlci->constipated = 0; - gsm_dlci_data_kick(dlci); - } -+ - /* Map modem bits */ -+ if (modem & MDM_RTC) -+ mlines |= TIOCM_DSR | TIOCM_DTR; - if (modem & MDM_RTR) - mlines |= TIOCM_RTS | TIOCM_CTS; - if (modem & MDM_IC) -@@ -1091,6 +1090,7 @@ static void gsm_control_modem(struct gsm_mux *gsm, u8 *data, int clen) - { - unsigned int addr = 0; - unsigned int modem = 0; -+ unsigned int brk = 0; - struct gsm_dlci *dlci; - int len = clen; - u8 *dp = data; -@@ -1117,6 +1117,16 @@ static void gsm_control_modem(struct gsm_mux *gsm, u8 *data, int clen) - if (len == 0) - return; - } -+ len--; -+ if (len > 0) { -+ while (gsm_read_ea(&brk, *dp++) == 0) { -+ len--; -+ if (len == 0) -+ return; -+ } -+ modem <<= 7; -+ modem |= (brk & 0x7f); -+ } - tty = tty_port_tty_get(&dlci->port); - gsm_process_modem(tty, dlci, modem, clen); - if (tty) { -@@ -1214,19 +1224,19 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command, - gsm_control_reply(gsm, CMD_TEST, data, clen); - break; - case CMD_FCON: -- /* Modem wants us to STFU */ -- gsm->constipated = 1; -- gsm_control_reply(gsm, CMD_FCON, NULL, 0); -- break; -- case CMD_FCOFF: - /* Modem can accept data again */ - gsm->constipated = 0; -- gsm_control_reply(gsm, CMD_FCOFF, NULL, 0); -+ gsm_control_reply(gsm, CMD_FCON, NULL, 0); - /* Kick the link in case it is idling */ - spin_lock_irqsave(&gsm->tx_lock, flags); - gsm_data_kick(gsm); - spin_unlock_irqrestore(&gsm->tx_lock, flags); - break; -+ case CMD_FCOFF: -+ /* Modem wants us to STFU */ -+ gsm->constipated = 1; -+ gsm_control_reply(gsm, CMD_FCOFF, NULL, 0); -+ break; - case CMD_MSC: - /* Out of band modem line change indicator for a DLCI */ - gsm_control_modem(gsm, data, clen); -@@ -1678,7 +1688,7 @@ static void gsm_dlci_free(struct kref *ref) - dlci->gsm->dlci[dlci->addr] = NULL; - kfifo_free(dlci->fifo); - while ((dlci->skb = skb_dequeue(&dlci->skb_list))) -- kfree_skb(dlci->skb); -+ dev_kfree_skb(dlci->skb); - kfree(dlci); - } - -@@ -2029,7 +2039,7 @@ void gsm_cleanup_mux(struct gsm_mux *gsm) - { - int i; - struct gsm_dlci *dlci = gsm->dlci[0]; -- struct gsm_msg *txq; -+ struct gsm_msg *txq, *ntxq; - struct gsm_control *gc; - - gsm->dead = 1; -@@ -2064,11 +2074,9 @@ void gsm_cleanup_mux(struct gsm_mux *gsm) - if (gsm->dlci[i]) - gsm_dlci_release(gsm->dlci[i]); - /* Now wipe the queues */ -- for (txq = gsm->tx_head; txq != NULL; txq = gsm->tx_head) { -- gsm->tx_head = txq->next; -+ list_for_each_entry_safe(txq, ntxq, &gsm->tx_list, list) - kfree(txq); -- } -- gsm->tx_tail = NULL; -+ INIT_LIST_HEAD(&gsm->tx_list); - } - EXPORT_SYMBOL_GPL(gsm_cleanup_mux); - -@@ -2179,6 +2187,7 @@ struct gsm_mux *gsm_alloc_mux(void) - } - spin_lock_init(&gsm->lock); - kref_init(&gsm->ref); -+ INIT_LIST_HEAD(&gsm->tx_list); - - gsm->t1 = T1; - gsm->t2 = T2; -@@ -2295,7 +2304,7 @@ static void gsmld_receive_buf(struct tty_struct *tty, const unsigned char *cp, - gsm->error(gsm, *dp, flags); - break; - default: -- WARN_ONCE("%s: unknown flag %d\n", -+ WARN_ONCE(1, "%s: unknown flag %d\n", - tty_name(tty, buf), flags); - break; - } -diff --git a/drivers/tty/serial/8250/8250.c b/drivers/tty/serial/8250/8250.c -index d537431..5fe2191 100644 ---- a/drivers/tty/serial/8250/8250.c -+++ b/drivers/tty/serial/8250/8250.c -@@ -282,6 +282,33 @@ static const struct serial8250_config uart_config[] = { - .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, - .flags = UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR, - }, -+ [PORT_BRCM_TRUMANAGE] = { -+ .name = "TruManage", -+ .fifo_size = 1, -+ .tx_loadsz = 1024, -+ .flags = UART_CAP_HFIFO, -+ }, -+ [PORT_ALTR_16550_F32] = { -+ .name = "Altera 16550 FIFO32", -+ .fifo_size = 32, -+ .tx_loadsz = 32, -+ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, -+ .flags = UART_CAP_FIFO | UART_CAP_AFE, -+ }, -+ [PORT_ALTR_16550_F64] = { -+ .name = "Altera 16550 FIFO64", -+ .fifo_size = 64, -+ .tx_loadsz = 64, -+ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, -+ .flags = UART_CAP_FIFO | UART_CAP_AFE, -+ }, -+ [PORT_ALTR_16550_F128] = { -+ .name = "Altera 16550 FIFO128", -+ .fifo_size = 128, -+ .tx_loadsz = 128, -+ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, -+ .flags = UART_CAP_FIFO | UART_CAP_AFE, -+ }, - }; - - #if defined(CONFIG_MIPS_ALCHEMY) -@@ -1470,6 +1497,11 @@ void serial8250_tx_chars(struct uart_8250_port *up) - port->icount.tx++; - if (uart_circ_empty(xmit)) - break; -+ if (up->capabilities & UART_CAP_HFIFO) { -+ if ((serial_port_in(port, UART_LSR) & BOTH_EMPTY) != -+ BOTH_EMPTY) -+ break; -+ } - } while (--count > 0); - - if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) -@@ -2641,7 +2673,7 @@ serial8250_verify_port(struct uart_port *port, struct serial_struct *ser) - if (ser->irq >= nr_irqs || ser->irq < 0 || - ser->baud_base < 9600 || ser->type < PORT_UNKNOWN || - ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS || -- ser->type == PORT_STARTECH) -+ ser->type == PORT_STARTECH || uart_config[ser->type].name == NULL) - return -EINVAL; - return 0; - } -@@ -2651,7 +2683,7 @@ serial8250_type(struct uart_port *port) - { - int type = port->type; - -- if (type >= ARRAY_SIZE(uart_config)) -+ if (type >= ARRAY_SIZE(uart_config) || uart_config[type].name == NULL) - type = 0; - return uart_config[type].name; - } -diff --git a/drivers/tty/serial/8250/8250.h b/drivers/tty/serial/8250/8250.h -index 2868a1d..b37147c 100644 ---- a/drivers/tty/serial/8250/8250.h -+++ b/drivers/tty/serial/8250/8250.h -@@ -69,6 +69,7 @@ struct serial8250_config { - #define UART_CAP_AFE (1 << 11) /* MCR-based hw flow control */ - #define UART_CAP_UUE (1 << 12) /* UART needs IER bit 6 set (Xscale) */ - #define UART_CAP_RTOIE (1 << 13) /* UART needs IER bit 4 set (Xscale, Tegra) */ -+#define UART_CAP_HFIFO (1 << 14) /* UART has a "hidden" FIFO */ - - #define UART_BUG_QUOT (1 << 0) /* UART has buggy quot LSB */ - #define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */ -diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c -index 40747fe..d53f396 100644 ---- a/drivers/tty/serial/8250/8250_pci.c -+++ b/drivers/tty/serial/8250/8250_pci.c -@@ -1077,6 +1077,18 @@ pci_omegapci_setup(struct serial_private *priv, - return setup_port(priv, port, 2, idx * 8, 0); - } - -+static int -+pci_brcm_trumanage_setup(struct serial_private *priv, -+ const struct pciserial_board *board, -+ struct uart_port *port, int idx) -+{ -+ int ret = pci_default_setup(priv, board, port, idx); -+ -+ port->type = PORT_BRCM_TRUMANAGE; -+ port->flags = (port->flags | UPF_FIXED_PORT | UPF_FIXED_TYPE); -+ return ret; -+} -+ - static int skip_tx_en_setup(struct serial_private *priv, - const struct pciserial_board *board, - struct uart_port *port, int idx) -@@ -1142,6 +1154,7 @@ pci_xr17c154_setup(struct serial_private *priv, - #define PCI_DEVICE_ID_TITAN_800E 0xA014 - #define PCI_DEVICE_ID_TITAN_200EI 0xA016 - #define PCI_DEVICE_ID_TITAN_200EISI 0xA017 -+#define PCI_DEVICE_ID_TITAN_200V3 0xA306 - #define PCI_DEVICE_ID_TITAN_400V3 0xA310 - #define PCI_DEVICE_ID_TITAN_410V3 0xA312 - #define PCI_DEVICE_ID_TITAN_800V3 0xA314 -@@ -1150,9 +1163,11 @@ pci_xr17c154_setup(struct serial_private *priv, - #define PCIE_DEVICE_ID_NEO_2_OX_IBM 0x00F6 - #define PCI_DEVICE_ID_PLX_CRONYX_OMEGA 0xc001 - #define PCI_DEVICE_ID_INTEL_PATSBURG_KT 0x1d3d -+#define PCI_DEVICE_ID_BROADCOM_TRUMANAGE 0x160a - - /* Unknown vendors/cards - this should not be in linux/pci_ids.h */ - #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 -+#define PCI_SUBDEVICE_ID_UNKNOWN_0x1588 0x1588 - - /* - * Master list of serial port init/setup/exit quirks. -@@ -1424,15 +1439,6 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = { - }, - { - .vendor = PCI_VENDOR_ID_PLX, -- .device = PCI_DEVICE_ID_PLX_9050, -- .subvendor = PCI_VENDOR_ID_PLX, -- .subdevice = PCI_SUBDEVICE_ID_UNKNOWN_0x1584, -- .init = pci_plx9050_init, -- .setup = pci_default_setup, -- .exit = __devexit_p(pci_plx9050_exit), -- }, -- { -- .vendor = PCI_VENDOR_ID_PLX, - .device = PCI_DEVICE_ID_PLX_ROMULUS, - .subvendor = PCI_VENDOR_ID_PLX, - .subdevice = PCI_DEVICE_ID_PLX_ROMULUS, -@@ -1691,6 +1697,17 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = { - .setup = pci_omegapci_setup, - }, - /* -+ * Broadcom TruManage (NetXtreme) -+ */ -+ { -+ .vendor = PCI_VENDOR_ID_BROADCOM, -+ .device = PCI_DEVICE_ID_BROADCOM_TRUMANAGE, -+ .subvendor = PCI_ANY_ID, -+ .subdevice = PCI_ANY_ID, -+ .setup = pci_brcm_trumanage_setup, -+ }, -+ -+ /* - * Default "match everything" terminator entry - */ - { -@@ -1879,6 +1896,7 @@ enum pci_board_num_t { - pbn_ce4100_1_115200, - pbn_omegapci, - pbn_NETMOS9900_2s_115200, -+ pbn_brcm_trumanage, - }; - - /* -@@ -2585,6 +2603,12 @@ static struct pciserial_board pci_boards[] __devinitdata = { - .num_ports = 2, - .base_baud = 115200, - }, -+ [pbn_brcm_trumanage] = { -+ .flags = FL_BASE0, -+ .num_ports = 1, -+ .reg_shift = 2, -+ .base_baud = 115200, -+ }, - }; - - static const struct pci_device_id softmodem_blacklist[] = { -@@ -3108,7 +3132,12 @@ static struct pci_device_id serial_pci_tbl[] = { - { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, - PCI_VENDOR_ID_PLX, - PCI_SUBDEVICE_ID_UNKNOWN_0x1584, 0, 0, -- pbn_b0_4_115200 }, -+ pbn_b2_4_115200 }, -+ /* Unknown card - subdevice 0x1588 */ -+ { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, -+ PCI_VENDOR_ID_PLX, -+ PCI_SUBDEVICE_ID_UNKNOWN_0x1588, 0, 0, -+ pbn_b2_8_115200 }, - { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, - PCI_SUBVENDOR_ID_KEYSPAN, - PCI_SUBDEVICE_ID_KEYSPAN_SX2, 0, 0, -@@ -3456,6 +3485,9 @@ static struct pci_device_id serial_pci_tbl[] = { - { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200EISI, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, - pbn_oxsemi_2_4000000 }, -+ { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200V3, -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, -+ pbn_b0_bt_2_921600 }, - { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400V3, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, - pbn_b0_4_921600 }, -@@ -4139,6 +4171,13 @@ static struct pci_device_id serial_pci_tbl[] = { - pbn_omegapci }, - - /* -+ * Broadcom TruManage -+ */ -+ { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BROADCOM_TRUMANAGE, -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, -+ pbn_brcm_trumanage }, -+ -+ /* - * These entries match devices with class COMMUNICATION_SERIAL, - * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL - */ -diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c -index ed7cd37..ff58d28 100644 ---- a/drivers/tty/serial/atmel_serial.c -+++ b/drivers/tty/serial/atmel_serial.c -@@ -1022,12 +1022,24 @@ static int atmel_startup(struct uart_port *port) - static void atmel_shutdown(struct uart_port *port) - { - struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); -+ - /* -- * Ensure everything is stopped. -+ * Clear out any scheduled tasklets before -+ * we destroy the buffers -+ */ -+ tasklet_kill(&atmel_port->tasklet); -+ -+ /* -+ * Ensure everything is stopped and -+ * disable all interrupts, port and break condition. - */ - atmel_stop_rx(port); - atmel_stop_tx(port); - -+ UART_PUT_CR(port, ATMEL_US_RSTSTA); -+ UART_PUT_IDR(port, -1); -+ -+ - /* - * Shut-down the DMA. - */ -@@ -1054,12 +1066,6 @@ static void atmel_shutdown(struct uart_port *port) - } - - /* -- * Disable all interrupts, port and break condition. -- */ -- UART_PUT_CR(port, ATMEL_US_RSTSTA); -- UART_PUT_IDR(port, -1); -- -- /* - * Free the interrupt - */ - free_irq(port->irq, port); -diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c -index 0de7ed78..88620e1 100644 ---- a/drivers/tty/serial/imx.c -+++ b/drivers/tty/serial/imx.c -@@ -131,6 +131,7 @@ - #define UCR4_OREN (1<<1) /* Receiver overrun interrupt enable */ - #define UCR4_DREN (1<<0) /* Recv data ready interrupt enable */ - #define UFCR_RXTL_SHF 0 /* Receiver trigger level shift */ -+#define UFCR_DCEDTE (1<<6) /* DCE/DTE mode select */ - #define UFCR_RFDIV (7<<7) /* Reference freq divider mask */ - #define UFCR_RFDIV_REG(x) (((x) < 7 ? 6 - (x) : 6) << 7) - #define UFCR_TXTL_SHF 10 /* Transmitter trigger level shift */ -@@ -666,22 +667,11 @@ static void imx_break_ctl(struct uart_port *port, int break_state) - static int imx_setup_ufcr(struct imx_port *sport, unsigned int mode) - { - unsigned int val; -- unsigned int ufcr_rfdiv; -- -- /* set receiver / transmitter trigger level. -- * RFDIV is set such way to satisfy requested uartclk value -- */ -- val = TXTL << 10 | RXTL; -- ufcr_rfdiv = (clk_get_rate(sport->clk) + sport->port.uartclk / 2) -- / sport->port.uartclk; -- -- if(!ufcr_rfdiv) -- ufcr_rfdiv = 1; -- -- val |= UFCR_RFDIV_REG(ufcr_rfdiv); - -+ /* set receiver / transmitter trigger level */ -+ val = readl(sport->port.membase + UFCR) & (UFCR_RFDIV | UFCR_DCEDTE); -+ val |= TXTL << UFCR_TXTL_SHF | RXTL; - writel(val, sport->port.membase + UFCR); -- - return 0; - } - -diff --git a/drivers/tty/serial/of_serial.c b/drivers/tty/serial/of_serial.c -index e8c9cee..6563cad 100644 ---- a/drivers/tty/serial/of_serial.c -+++ b/drivers/tty/serial/of_serial.c -@@ -182,6 +182,12 @@ static struct of_device_id __devinitdata of_platform_serial_table[] = { - { .compatible = "ns16750", .data = (void *)PORT_16750, }, - { .compatible = "ns16850", .data = (void *)PORT_16850, }, - { .compatible = "nvidia,tegra20-uart", .data = (void *)PORT_TEGRA, }, -+ { .compatible = "altr,16550-FIFO32", -+ .data = (void *)PORT_ALTR_16550_F32, }, -+ { .compatible = "altr,16550-FIFO64", -+ .data = (void *)PORT_ALTR_16550_F64, }, -+ { .compatible = "altr,16550-FIFO128", -+ .data = (void *)PORT_ALTR_16550_F128, }, - #ifdef CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL - { .compatible = "ibm,qpace-nwp-serial", - .data = (void *)PORT_NWPSERIAL, }, -diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c -index 2e99f79..e78d2a6 100644 ---- a/drivers/tty/serial/pch_uart.c -+++ b/drivers/tty/serial/pch_uart.c -@@ -646,11 +646,12 @@ static int dma_push_rx(struct eg20t_port *priv, int size) - dev_warn(port->dev, "Rx overrun: dropping %u bytes\n", - size - room); - if (!room) -- return room; -+ goto out; - - tty_insert_flip_string(tty, sg_virt(&priv->sg_rx), size); - - port->icount.rx += room; -+out: - tty_kref_put(tty); - - return room; -@@ -1064,6 +1065,8 @@ static void pch_uart_err_ir(struct eg20t_port *priv, unsigned int lsr) - if (tty == NULL) { - for (i = 0; error_msg[i] != NULL; i++) - dev_err(&priv->pdev->dev, error_msg[i]); -+ } else { -+ tty_kref_put(tty); - } - } - -diff --git a/drivers/tty/serial/pmac_zilog.c b/drivers/tty/serial/pmac_zilog.c -index 333c8d0..3f93c47 100644 ---- a/drivers/tty/serial/pmac_zilog.c -+++ b/drivers/tty/serial/pmac_zilog.c -@@ -2051,6 +2051,9 @@ static int __init pmz_console_init(void) - /* Probe ports */ - pmz_probe(); - -+ if (pmz_ports_count == 0) -+ return -ENODEV; -+ - /* TODO: Autoprobe console based on OF */ - /* pmz_console.index = i; */ - register_console(&pmz_console); -diff --git a/drivers/tty/serial/sunsab.c b/drivers/tty/serial/sunsab.c -index f0d93eb..c9549aa 100644 ---- a/drivers/tty/serial/sunsab.c -+++ b/drivers/tty/serial/sunsab.c -@@ -157,6 +157,15 @@ receive_chars(struct uart_sunsab_port *up, - (up->port.line == up->port.cons->index)) - saw_console_brk = 1; - -+ if (count == 0) { -+ if (unlikely(stat->sreg.isr1 & SAB82532_ISR1_BRK)) { -+ stat->sreg.isr0 &= ~(SAB82532_ISR0_PERR | -+ SAB82532_ISR0_FERR); -+ up->port.icount.brk++; -+ uart_handle_break(&up->port); -+ } -+ } -+ - for (i = 0; i < count; i++) { - unsigned char ch = buf[i], flag; - -diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c -index 24b18cb..57f8f53 100644 ---- a/drivers/tty/tty_buffer.c -+++ b/drivers/tty/tty_buffer.c -@@ -114,11 +114,14 @@ static void __tty_buffer_flush(struct tty_struct *tty) - { - struct tty_buffer *thead; - -- while ((thead = tty->buf.head) != NULL) { -- tty->buf.head = thead->next; -- tty_buffer_free(tty, thead); -+ if (tty->buf.head == NULL) -+ return; -+ while ((thead = tty->buf.head->next) != NULL) { -+ tty_buffer_free(tty, tty->buf.head); -+ tty->buf.head = thead; - } -- tty->buf.tail = NULL; -+ WARN_ON(tty->buf.head != tty->buf.tail); -+ tty->buf.head->read = tty->buf.head->commit; - } - - /** -diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c -index e411f18..2f2540f 100644 ---- a/drivers/usb/class/cdc-acm.c -+++ b/drivers/usb/class/cdc-acm.c -@@ -123,13 +123,23 @@ static void acm_release_minor(struct acm *acm) - static int acm_ctrl_msg(struct acm *acm, int request, int value, - void *buf, int len) - { -- int retval = usb_control_msg(acm->dev, usb_sndctrlpipe(acm->dev, 0), -+ int retval; -+ -+ retval = usb_autopm_get_interface(acm->control); -+ if (retval) -+ return retval; -+ -+ retval = usb_control_msg(acm->dev, usb_sndctrlpipe(acm->dev, 0), - request, USB_RT_ACM, value, - acm->control->altsetting[0].desc.bInterfaceNumber, - buf, len, 5000); -+ - dev_dbg(&acm->control->dev, - "%s - rq 0x%02x, val %#x, len %#x, result %d\n", - __func__, request, value, len, retval); -+ -+ usb_autopm_put_interface(acm->control); -+ - return retval < 0 ? retval : 0; - } - -@@ -234,12 +244,9 @@ static int acm_write_start(struct acm *acm, int wbn) - acm->susp_count); - usb_autopm_get_interface_async(acm->control); - if (acm->susp_count) { -- if (!acm->delayed_wb) -- acm->delayed_wb = wb; -- else -- usb_autopm_put_interface_async(acm->control); -+ usb_anchor_urb(wb->urb, &acm->delayed); - spin_unlock_irqrestore(&acm->write_lock, flags); -- return 0; /* A white lie */ -+ return 0; - } - usb_mark_last_busy(acm->dev); - -@@ -535,6 +542,7 @@ static int acm_port_activate(struct tty_port *port, struct tty_struct *tty) - { - struct acm *acm = container_of(port, struct acm, port); - int retval = -ENODEV; -+ int i; - - dev_dbg(&acm->control->dev, "%s\n", __func__); - -@@ -583,6 +591,8 @@ static int acm_port_activate(struct tty_port *port, struct tty_struct *tty) - return 0; - - error_submit_read_urbs: -+ for (i = 0; i < acm->rx_buflimit; i++) -+ usb_kill_urb(acm->read_urbs[i]); - acm->ctrlout = 0; - acm_set_control(acm, acm->ctrlout); - error_set_control: -@@ -610,21 +620,35 @@ static void acm_port_destruct(struct tty_port *port) - static void acm_port_shutdown(struct tty_port *port) - { - struct acm *acm = container_of(port, struct acm, port); -+ struct urb *urb; -+ struct acm_wb *wb; - int i; -+ int pm_err; - - dev_dbg(&acm->control->dev, "%s\n", __func__); - - mutex_lock(&acm->mutex); - if (!acm->disconnected) { -- usb_autopm_get_interface(acm->control); -+ pm_err = usb_autopm_get_interface(acm->control); - acm_set_control(acm, acm->ctrlout = 0); -+ -+ for (;;) { -+ urb = usb_get_from_anchor(&acm->delayed); -+ if (!urb) -+ break; -+ wb = urb->context; -+ wb->use = 0; -+ usb_autopm_put_interface_async(acm->control); -+ } -+ - usb_kill_urb(acm->ctrlurb); - for (i = 0; i < ACM_NW; i++) - usb_kill_urb(acm->wb[i].urb); - for (i = 0; i < acm->rx_buflimit; i++) - usb_kill_urb(acm->read_urbs[i]); - acm->control->needs_remote_wakeup = 0; -- usb_autopm_put_interface(acm->control); -+ if (!pm_err) -+ usb_autopm_put_interface(acm->control); - } - mutex_unlock(&acm->mutex); - } -@@ -1211,6 +1235,7 @@ static int acm_probe(struct usb_interface *intf, - acm->bInterval = epread->bInterval; - tty_port_init(&acm->port); - acm->port.ops = &acm_port_ops; -+ init_usb_anchor(&acm->delayed); - - buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); - if (!buf) { -@@ -1441,18 +1466,15 @@ static int acm_suspend(struct usb_interface *intf, pm_message_t message) - struct acm *acm = usb_get_intfdata(intf); - int cnt; - -+ spin_lock_irq(&acm->read_lock); -+ spin_lock(&acm->write_lock); - if (PMSG_IS_AUTO(message)) { -- int b; -- -- spin_lock_irq(&acm->write_lock); -- b = acm->transmitting; -- spin_unlock_irq(&acm->write_lock); -- if (b) -+ if (acm->transmitting) { -+ spin_unlock(&acm->write_lock); -+ spin_unlock_irq(&acm->read_lock); - return -EBUSY; -+ } - } -- -- spin_lock_irq(&acm->read_lock); -- spin_lock(&acm->write_lock); - cnt = acm->susp_count++; - spin_unlock(&acm->write_lock); - spin_unlock_irq(&acm->read_lock); -@@ -1460,8 +1482,7 @@ static int acm_suspend(struct usb_interface *intf, pm_message_t message) - if (cnt) - return 0; - -- if (test_bit(ASYNCB_INITIALIZED, &acm->port.flags)) -- stop_data_traffic(acm); -+ stop_data_traffic(acm); - - return 0; - } -@@ -1469,29 +1490,24 @@ static int acm_suspend(struct usb_interface *intf, pm_message_t message) - static int acm_resume(struct usb_interface *intf) - { - struct acm *acm = usb_get_intfdata(intf); -- struct acm_wb *wb; -+ struct urb *urb; - int rv = 0; -- int cnt; - - spin_lock_irq(&acm->read_lock); -- acm->susp_count -= 1; -- cnt = acm->susp_count; -- spin_unlock_irq(&acm->read_lock); -+ spin_lock(&acm->write_lock); - -- if (cnt) -- return 0; -+ if (--acm->susp_count) -+ goto out; - - if (test_bit(ASYNCB_INITIALIZED, &acm->port.flags)) { -- rv = usb_submit_urb(acm->ctrlurb, GFP_NOIO); -- -- spin_lock_irq(&acm->write_lock); -- if (acm->delayed_wb) { -- wb = acm->delayed_wb; -- acm->delayed_wb = NULL; -- spin_unlock_irq(&acm->write_lock); -- acm_start_wb(acm, wb); -- } else { -- spin_unlock_irq(&acm->write_lock); -+ rv = usb_submit_urb(acm->ctrlurb, GFP_ATOMIC); -+ -+ for (;;) { -+ urb = usb_get_from_anchor(&acm->delayed); -+ if (!urb) -+ break; -+ -+ acm_start_wb(acm, urb->context); - } - - /* -@@ -1499,12 +1515,14 @@ static int acm_resume(struct usb_interface *intf) - * do the write path at all cost - */ - if (rv < 0) -- goto err_out; -+ goto out; - -- rv = acm_submit_read_urbs(acm, GFP_NOIO); -+ rv = acm_submit_read_urbs(acm, GFP_ATOMIC); - } -+out: -+ spin_unlock(&acm->write_lock); -+ spin_unlock_irq(&acm->read_lock); - --err_out: - return rv; - } - -@@ -1542,6 +1560,8 @@ static int acm_reset_resume(struct usb_interface *intf) - - static const struct usb_device_id acm_ids[] = { - /* quirky and broken devices */ -+ { USB_DEVICE(0x17ef, 0x7000), /* Lenovo USB modem */ -+ .driver_info = NO_UNION_NORMAL, },/* has no union descriptor */ - { USB_DEVICE(0x0870, 0x0001), /* Metricom GS Modem */ - .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ - }, -@@ -1585,13 +1605,27 @@ static const struct usb_device_id acm_ids[] = { - }, - /* Motorola H24 HSPA module: */ - { USB_DEVICE(0x22b8, 0x2d91) }, /* modem */ -- { USB_DEVICE(0x22b8, 0x2d92) }, /* modem + diagnostics */ -- { USB_DEVICE(0x22b8, 0x2d93) }, /* modem + AT port */ -- { USB_DEVICE(0x22b8, 0x2d95) }, /* modem + AT port + diagnostics */ -- { USB_DEVICE(0x22b8, 0x2d96) }, /* modem + NMEA */ -- { USB_DEVICE(0x22b8, 0x2d97) }, /* modem + diagnostics + NMEA */ -- { USB_DEVICE(0x22b8, 0x2d99) }, /* modem + AT port + NMEA */ -- { USB_DEVICE(0x22b8, 0x2d9a) }, /* modem + AT port + diagnostics + NMEA */ -+ { USB_DEVICE(0x22b8, 0x2d92), /* modem + diagnostics */ -+ .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ -+ }, -+ { USB_DEVICE(0x22b8, 0x2d93), /* modem + AT port */ -+ .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ -+ }, -+ { USB_DEVICE(0x22b8, 0x2d95), /* modem + AT port + diagnostics */ -+ .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ -+ }, -+ { USB_DEVICE(0x22b8, 0x2d96), /* modem + NMEA */ -+ .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ -+ }, -+ { USB_DEVICE(0x22b8, 0x2d97), /* modem + diagnostics + NMEA */ -+ .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ -+ }, -+ { USB_DEVICE(0x22b8, 0x2d99), /* modem + AT port + NMEA */ -+ .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ -+ }, -+ { USB_DEVICE(0x22b8, 0x2d9a), /* modem + AT port + diagnostics + NMEA */ -+ .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ -+ }, - - { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */ - .driver_info = NO_UNION_NORMAL, /* union descriptor misplaced on -diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h -index 35ef887..9614780 100644 ---- a/drivers/usb/class/cdc-acm.h -+++ b/drivers/usb/class/cdc-acm.h -@@ -117,7 +117,7 @@ struct acm { - unsigned int throttled:1; /* actually throttled */ - unsigned int throttle_req:1; /* throttle requested */ - u8 bInterval; -- struct acm_wb *delayed_wb; /* write queued for a device about to be woken */ -+ struct usb_anchor delayed; /* writes queued for a device about to be woken */ - }; - - #define CDC_DATA_INTERFACE_TYPE 0x0a -diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c -index 1434ee9..e5fa34e 100644 ---- a/drivers/usb/class/cdc-wdm.c -+++ b/drivers/usb/class/cdc-wdm.c -@@ -822,13 +822,11 @@ static int wdm_manage_power(struct usb_interface *intf, int on) - { - /* need autopm_get/put here to ensure the usbcore sees the new value */ - int rv = usb_autopm_get_interface(intf); -- if (rv < 0) -- goto err; - - intf->needs_remote_wakeup = on; -- usb_autopm_put_interface(intf); --err: -- return rv; -+ if (!rv) -+ usb_autopm_put_interface(intf); -+ return 0; - } - - static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id) -diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c -index 78609d3..6ed7e7c 100644 ---- a/drivers/usb/core/config.c -+++ b/drivers/usb/core/config.c -@@ -651,10 +651,6 @@ void usb_destroy_configuration(struct usb_device *dev) - * - * hub-only!! ... and only in reset path, or usb_new_device() - * (used by real hubs and virtual root hubs) -- * -- * NOTE: if this is a WUSB device and is not authorized, we skip the -- * whole thing. A non-authorized USB device has no -- * configurations. - */ - int usb_get_configuration(struct usb_device *dev) - { -@@ -666,8 +662,6 @@ int usb_get_configuration(struct usb_device *dev) - struct usb_config_descriptor *desc; - - cfgno = 0; -- if (dev->authorized == 0) /* Not really an error */ -- goto out_not_authorized; - result = -ENOMEM; - if (ncfg > USB_MAXCONFIG) { - dev_warn(ddev, "too many configurations: %d, " -@@ -749,7 +743,6 @@ int usb_get_configuration(struct usb_device *dev) - - err: - kfree(desc); --out_not_authorized: - dev->descriptor.bNumConfigurations = cfgno; - err2: - if (result == -ENOMEM) -diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c -index 2382640..71f6bd7 100644 ---- a/drivers/usb/core/driver.c -+++ b/drivers/usb/core/driver.c -@@ -911,8 +911,7 @@ EXPORT_SYMBOL_GPL(usb_deregister); - * it doesn't support pre_reset/post_reset/reset_resume or - * because it doesn't support suspend/resume. - * -- * The caller must hold @intf's device's lock, but not its pm_mutex -- * and not @intf->dev.sem. -+ * The caller must hold @intf's device's lock, but not @intf's lock. - */ - void usb_forced_unbind_intf(struct usb_interface *intf) - { -@@ -925,16 +924,37 @@ void usb_forced_unbind_intf(struct usb_interface *intf) - intf->needs_binding = 1; - } - -+/* -+ * Unbind drivers for @udev's marked interfaces. These interfaces have -+ * the needs_binding flag set, for example by usb_resume_interface(). -+ * -+ * The caller must hold @udev's device lock. -+ */ -+static void unbind_marked_interfaces(struct usb_device *udev) -+{ -+ struct usb_host_config *config; -+ int i; -+ struct usb_interface *intf; -+ -+ config = udev->actconfig; -+ if (config) { -+ for (i = 0; i < config->desc.bNumInterfaces; ++i) { -+ intf = config->interface[i]; -+ if (intf->dev.driver && intf->needs_binding) -+ usb_forced_unbind_intf(intf); -+ } -+ } -+} -+ - /* Delayed forced unbinding of a USB interface driver and scan - * for rebinding. - * -- * The caller must hold @intf's device's lock, but not its pm_mutex -- * and not @intf->dev.sem. -+ * The caller must hold @intf's device's lock, but not @intf's lock. - * - * Note: Rebinds will be skipped if a system sleep transition is in - * progress and the PM "complete" callback hasn't occurred yet. - */ --void usb_rebind_intf(struct usb_interface *intf) -+static void usb_rebind_intf(struct usb_interface *intf) - { - int rc; - -@@ -951,68 +971,66 @@ void usb_rebind_intf(struct usb_interface *intf) - } - } - --#ifdef CONFIG_PM -- --/* Unbind drivers for @udev's interfaces that don't support suspend/resume -- * There is no check for reset_resume here because it can be determined -- * only during resume whether reset_resume is needed. -+/* -+ * Rebind drivers to @udev's marked interfaces. These interfaces have -+ * the needs_binding flag set. - * - * The caller must hold @udev's device lock. - */ --static void unbind_no_pm_drivers_interfaces(struct usb_device *udev) -+static void rebind_marked_interfaces(struct usb_device *udev) - { - struct usb_host_config *config; - int i; - struct usb_interface *intf; -- struct usb_driver *drv; - - config = udev->actconfig; - if (config) { - for (i = 0; i < config->desc.bNumInterfaces; ++i) { - intf = config->interface[i]; -- -- if (intf->dev.driver) { -- drv = to_usb_driver(intf->dev.driver); -- if (!drv->suspend || !drv->resume) -- usb_forced_unbind_intf(intf); -- } -+ if (intf->needs_binding) -+ usb_rebind_intf(intf); - } - } - } - --/* Unbind drivers for @udev's interfaces that failed to support reset-resume. -- * These interfaces have the needs_binding flag set by usb_resume_interface(). -+/* -+ * Unbind all of @udev's marked interfaces and then rebind all of them. -+ * This ordering is necessary because some drivers claim several interfaces -+ * when they are first probed. - * - * The caller must hold @udev's device lock. - */ --static void unbind_no_reset_resume_drivers_interfaces(struct usb_device *udev) -+void usb_unbind_and_rebind_marked_interfaces(struct usb_device *udev) - { -- struct usb_host_config *config; -- int i; -- struct usb_interface *intf; -- -- config = udev->actconfig; -- if (config) { -- for (i = 0; i < config->desc.bNumInterfaces; ++i) { -- intf = config->interface[i]; -- if (intf->dev.driver && intf->needs_binding) -- usb_forced_unbind_intf(intf); -- } -- } -+ unbind_marked_interfaces(udev); -+ rebind_marked_interfaces(udev); - } - --static void do_rebind_interfaces(struct usb_device *udev) -+#ifdef CONFIG_PM -+ -+/* Unbind drivers for @udev's interfaces that don't support suspend/resume -+ * There is no check for reset_resume here because it can be determined -+ * only during resume whether reset_resume is needed. -+ * -+ * The caller must hold @udev's device lock. -+ */ -+static void unbind_no_pm_drivers_interfaces(struct usb_device *udev) - { - struct usb_host_config *config; - int i; - struct usb_interface *intf; -+ struct usb_driver *drv; - - config = udev->actconfig; - if (config) { - for (i = 0; i < config->desc.bNumInterfaces; ++i) { - intf = config->interface[i]; -- if (intf->needs_binding) -- usb_rebind_intf(intf); -+ -+ if (intf->dev.driver) { -+ drv = to_usb_driver(intf->dev.driver); -+ if (!drv->suspend || !drv->resume) -+ usb_forced_unbind_intf(intf); -+ } - } - } - } -@@ -1390,7 +1408,7 @@ int usb_resume_complete(struct device *dev) - * whose needs_binding flag is set - */ - if (udev->state != USB_STATE_NOTATTACHED) -- do_rebind_interfaces(udev); -+ rebind_marked_interfaces(udev); - return 0; - } - -@@ -1421,7 +1439,7 @@ int usb_resume(struct device *dev, pm_message_t msg) - pm_runtime_disable(dev); - pm_runtime_set_active(dev); - pm_runtime_enable(dev); -- unbind_no_reset_resume_drivers_interfaces(udev); -+ unbind_marked_interfaces(udev); - } - - /* Avoid PM error messages for devices disconnected while suspended -@@ -1756,10 +1774,13 @@ int usb_runtime_suspend(struct device *dev) - if (status == -EAGAIN || status == -EBUSY) - usb_mark_last_busy(udev); - -- /* The PM core reacts badly unless the return code is 0, -- * -EAGAIN, or -EBUSY, so always return -EBUSY on an error. -+ /* -+ * The PM core reacts badly unless the return code is 0, -+ * -EAGAIN, or -EBUSY, so always return -EBUSY on an error -+ * (except for root hubs, because they don't suspend through -+ * an upstream port like other USB devices). - */ -- if (status != 0) -+ if (status != 0 && udev->parent) - return -EBUSY; - return status; - } -diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c -index 2b487d4..50ebe6c 100644 ---- a/drivers/usb/core/hcd-pci.c -+++ b/drivers/usb/core/hcd-pci.c -@@ -71,7 +71,7 @@ static void companion_common(struct pci_dev *pdev, struct usb_hcd *hcd, - continue; - - companion_hcd = pci_get_drvdata(companion); -- if (!companion_hcd) -+ if (!companion_hcd || !companion_hcd->self.root_hub) - continue; - - /* For SET_HS_COMPANION, store a pointer to the EHCI bus in -diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c -index 950ce29..48aefff 100644 ---- a/drivers/usb/core/hub.c -+++ b/drivers/usb/core/hub.c -@@ -953,6 +953,11 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) - clear_port_feature(hub->hdev, port1, - USB_PORT_FEAT_C_ENABLE); - } -+ if (portchange & USB_PORT_STAT_C_RESET) { -+ need_debounce_delay = true; -+ clear_port_feature(hub->hdev, port1, -+ USB_PORT_FEAT_C_RESET); -+ } - if ((portchange & USB_PORT_STAT_C_BH_RESET) && - hub_is_superspeed(hub->hdev)) { - need_debounce_delay = true; -@@ -1373,6 +1378,7 @@ static int hub_configure(struct usb_hub *hub, - return 0; - - fail: -+ hdev->maxchild = 0; - dev_err (hub_dev, "config failed, %s (err %d)\n", - message, ret); - /* hub_disconnect() frees urb and descriptor */ -@@ -1433,8 +1439,19 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) - desc = intf->cur_altsetting; - hdev = interface_to_usbdev(intf); - -- /* Hubs have proper suspend/resume support. */ -- usb_enable_autosuspend(hdev); -+ /* -+ * Hubs have proper suspend/resume support, except for root hubs -+ * where the controller driver doesn't have bus_suspend and -+ * bus_resume methods. -+ */ -+ if (hdev->parent) { /* normal device */ -+ usb_enable_autosuspend(hdev); -+ } else { /* root hub */ -+ const struct hc_driver *drv = bus_to_hcd(hdev->bus)->driver; -+ -+ if (drv->bus_suspend && drv->bus_resume) -+ usb_enable_autosuspend(hdev); -+ } - - if (hdev->level == MAX_TOPO_LEVEL) { - dev_err(&intf->dev, -@@ -2005,18 +2022,13 @@ static int usb_enumerate_device(struct usb_device *udev) - goto fail; - } - } -- if (udev->wusb == 1 && udev->authorized == 0) { -- udev->product = kstrdup("n/a (unauthorized)", GFP_KERNEL); -- udev->manufacturer = kstrdup("n/a (unauthorized)", GFP_KERNEL); -- udev->serial = kstrdup("n/a (unauthorized)", GFP_KERNEL); -- } -- else { -- /* read the standard strings and cache them if present */ -- udev->product = usb_cache_string(udev, udev->descriptor.iProduct); -- udev->manufacturer = usb_cache_string(udev, -- udev->descriptor.iManufacturer); -- udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber); -- } -+ -+ /* read the standard strings and cache them if present */ -+ udev->product = usb_cache_string(udev, udev->descriptor.iProduct); -+ udev->manufacturer = usb_cache_string(udev, -+ udev->descriptor.iManufacturer); -+ udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber); -+ - err = usb_enumerate_device_otg(udev); - fail: - return err; -@@ -2170,16 +2182,6 @@ int usb_deauthorize_device(struct usb_device *usb_dev) - usb_dev->authorized = 0; - usb_set_configuration(usb_dev, -1); - -- kfree(usb_dev->product); -- usb_dev->product = kstrdup("n/a (unauthorized)", GFP_KERNEL); -- kfree(usb_dev->manufacturer); -- usb_dev->manufacturer = kstrdup("n/a (unauthorized)", GFP_KERNEL); -- kfree(usb_dev->serial); -- usb_dev->serial = kstrdup("n/a (unauthorized)", GFP_KERNEL); -- -- usb_destroy_configuration(usb_dev); -- usb_dev->descriptor.bNumConfigurations = 0; -- - out_unauthorized: - usb_unlock_device(usb_dev); - return 0; -@@ -2207,17 +2209,7 @@ int usb_authorize_device(struct usb_device *usb_dev) - goto error_device_descriptor; - } - -- kfree(usb_dev->product); -- usb_dev->product = NULL; -- kfree(usb_dev->manufacturer); -- usb_dev->manufacturer = NULL; -- kfree(usb_dev->serial); -- usb_dev->serial = NULL; -- - usb_dev->authorized = 1; -- result = usb_enumerate_device(usb_dev); -- if (result < 0) -- goto error_enumerate; - /* Choose and set the configuration. This registers the interfaces - * with the driver core and lets interface drivers bind to them. - */ -@@ -2233,7 +2225,6 @@ int usb_authorize_device(struct usb_device *usb_dev) - } - dev_info(&usb_dev->dev, "authorized to connect\n"); - --error_enumerate: - error_device_descriptor: - usb_autosuspend_device(usb_dev); - error_autoresume: -@@ -3889,9 +3880,10 @@ static void hub_events(void) - - hub = list_entry(tmp, struct usb_hub, event_list); - kref_get(&hub->kref); -+ hdev = hub->hdev; -+ usb_get_dev(hdev); - spin_unlock_irq(&hub_event_lock); - -- hdev = hub->hdev; - hub_dev = hub->intfdev; - intf = to_usb_interface(hub_dev); - dev_dbg(hub_dev, "state %d ports %d chg %04x evt %04x\n", -@@ -4210,8 +4202,9 @@ static void hub_events(void) - hub->hdev->children[i - 1]; - - dev_dbg(hub_dev, "warm reset port %d\n", i); -- if (!udev || !(portstatus & -- USB_PORT_STAT_CONNECTION)) { -+ if (!udev || -+ !(portstatus & USB_PORT_STAT_CONNECTION) || -+ udev->state == USB_STATE_NOTATTACHED) { - status = hub_port_reset(hub, i, - NULL, HUB_BH_RESET_TIME, - true); -@@ -4378,6 +4371,7 @@ static void hub_events(void) - usb_autopm_put_interface(intf); - loop_disconnected: - usb_unlock_device(hdev); -+ usb_put_dev(hdev); - kref_put(&hub->kref, hub_release); - - } /* end while (1) */ -@@ -4587,6 +4581,12 @@ static int usb_reset_and_verify_device(struct usb_device *udev) - } - parent_hub = hdev_to_hub(parent_hdev); - -+ /* Disable USB2 hardware LPM. -+ * It will be re-enabled by the enumeration process. -+ */ -+ if (udev->usb2_hw_lpm_enabled == 1) -+ usb_set_usb2_hardware_lpm(udev, 0); -+ - set_bit(port1, parent_hub->busy_bits); - for (i = 0; i < SET_CONFIG_TRIES; ++i) { - -@@ -4750,10 +4750,11 @@ int usb_reset_device(struct usb_device *udev) - else if (cintf->condition == - USB_INTERFACE_BOUND) - rebind = 1; -+ if (rebind) -+ cintf->needs_binding = 1; - } -- if (ret == 0 && rebind) -- usb_rebind_intf(cintf); - } -+ usb_unbind_and_rebind_marked_interfaces(udev); - } - - usb_autosuspend_device(udev); -diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c -index 5e88cce..5e8e69d 100644 ---- a/drivers/usb/core/quirks.c -+++ b/drivers/usb/core/quirks.c -@@ -38,6 +38,9 @@ static const struct usb_device_id usb_quirk_list[] = { - /* Creative SB Audigy 2 NX */ - { USB_DEVICE(0x041e, 0x3020), .driver_info = USB_QUIRK_RESET_RESUME }, - -+ /* Microsoft LifeCam-VX700 v2.0 */ -+ { USB_DEVICE(0x045e, 0x0770), .driver_info = USB_QUIRK_RESET_RESUME }, -+ - /* Logitech Webcam C200 */ - { USB_DEVICE(0x046d, 0x0802), .driver_info = USB_QUIRK_RESET_RESUME }, - -@@ -119,6 +122,9 @@ static const struct usb_device_id usb_quirk_list[] = { - /* Alcor Micro Corp. Hub */ - { USB_DEVICE(0x058f, 0x9254), .driver_info = USB_QUIRK_RESET_RESUME }, - -+ /* MicroTouch Systems touchscreen */ -+ { USB_DEVICE(0x0596, 0x051e), .driver_info = USB_QUIRK_RESET_RESUME }, -+ - /* appletouch */ - { USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME }, - -@@ -152,6 +158,9 @@ static const struct usb_device_id usb_quirk_list[] = { - /* Broadcom BCM92035DGROM BT dongle */ - { USB_DEVICE(0x0a5c, 0x2021), .driver_info = USB_QUIRK_RESET_RESUME }, - -+ /* MAYA44USB sound device */ -+ { USB_DEVICE(0x0a92, 0x0091), .driver_info = USB_QUIRK_RESET_RESUME }, -+ - /* Action Semiconductor flash disk */ - { USB_DEVICE(0x10d6, 0x2200), .driver_info = - USB_QUIRK_STRING_FETCH_255 }, -diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h -index 4f40547..3ce064d 100644 ---- a/drivers/usb/core/usb.h -+++ b/drivers/usb/core/usb.h -@@ -38,7 +38,7 @@ extern void usb_kick_khubd(struct usb_device *dev); - extern int usb_match_device(struct usb_device *dev, - const struct usb_device_id *id); - extern void usb_forced_unbind_intf(struct usb_interface *intf); --extern void usb_rebind_intf(struct usb_interface *intf); -+extern void usb_unbind_and_rebind_marked_interfaces(struct usb_device *udev); - - extern int usb_hub_claim_port(struct usb_device *hdev, unsigned port, - void *owner); -diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c -index 2031096..e0d591f 100644 ---- a/drivers/usb/dwc3/core.c -+++ b/drivers/usb/dwc3/core.c -@@ -739,8 +739,6 @@ static int __devexit dwc3_remove(struct platform_device *pdev) - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - -- pm_runtime_disable(&pdev->dev); -- - dwc3_debugfs_exit(dwc); - - switch (dwc->mode) { -@@ -762,6 +760,9 @@ static int __devexit dwc3_remove(struct platform_device *pdev) - - dwc3_core_exit(dwc); - -+ pm_runtime_put(&pdev->dev); -+ pm_runtime_disable(&pdev->dev); -+ - return 0; - } - -diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h -index 402c0e2..1606376 100644 ---- a/drivers/usb/dwc3/core.h -+++ b/drivers/usb/dwc3/core.h -@@ -895,15 +895,15 @@ struct dwc3_event_depevt { - * 12 - VndrDevTstRcved - * @reserved15_12: Reserved, not used - * @event_info: Information about this event -- * @reserved31_24: Reserved, not used -+ * @reserved31_25: Reserved, not used - */ - struct dwc3_event_devt { - u32 one_bit:1; - u32 device_event:7; - u32 type:4; - u32 reserved15_12:4; -- u32 event_info:8; -- u32 reserved31_24:8; -+ u32 event_info:9; -+ u32 reserved31_25:7; - } __packed; - - /** -diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c -index a9ca9ad..4f31fcb 100644 ---- a/drivers/usb/dwc3/dwc3-pci.c -+++ b/drivers/usb/dwc3/dwc3-pci.c -@@ -47,6 +47,8 @@ - /* FIXME define these in */ - #define PCI_VENDOR_ID_SYNOPSYS 0x16c3 - #define PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3 0xabcd -+#define PCI_DEVICE_ID_INTEL_BYT 0x0f37 -+#define PCI_DEVICE_ID_INTEL_MRFLD 0x119e - - struct dwc3_pci { - struct device *dev; -@@ -155,6 +157,8 @@ static DEFINE_PCI_DEVICE_TABLE(dwc3_pci_id_table) = { - PCI_DEVICE(PCI_VENDOR_ID_SYNOPSYS, - PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3), - }, -+ { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT), }, -+ { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MRFLD), }, - { } /* Terminating Entry */ - }; - MODULE_DEVICE_TABLE(pci, dwc3_pci_id_table); -diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c -index e05481a..a860254 100644 ---- a/drivers/usb/dwc3/gadget.c -+++ b/drivers/usb/dwc3/gadget.c -@@ -692,6 +692,10 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep) - - dwc3_remove_requests(dwc, dep); - -+ /* make sure HW endpoint isn't stalled */ -+ if (dep->flags & DWC3_EP_STALL) -+ __dwc3_gadget_ep_set_halt(dep, 0); -+ - reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); - reg &= ~DWC3_DALEPENA_EP(dep->number); - dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); -@@ -2039,11 +2043,19 @@ static void dwc3_gadget_free_endpoints(struct dwc3 *dwc) - dep = dwc->eps[epnum]; - if (!dep) - continue; -- -- dwc3_free_trb_pool(dep); -- -- if (epnum != 0 && epnum != 1) -+ /* -+ * Physical endpoints 0 and 1 are special; they form the -+ * bi-directional USB endpoint 0. -+ * -+ * For those two physical endpoints, we don't allocate a TRB -+ * pool nor do we add them the endpoints list. Due to that, we -+ * shouldn't do these two operations otherwise we would end up -+ * with all sorts of bugs when removing dwc3.ko. -+ */ -+ if (epnum != 0 && epnum != 1) { -+ dwc3_free_trb_pool(dep); - list_del(&dep->endpoint.ep_list); -+ } - - kfree(dep); - } -diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c -index be6952e..bf5671c 100644 ---- a/drivers/usb/gadget/at91_udc.c -+++ b/drivers/usb/gadget/at91_udc.c -@@ -1741,16 +1741,6 @@ static int __devinit at91udc_probe(struct platform_device *pdev) - return -ENODEV; - } - -- if (pdev->num_resources != 2) { -- DBG("invalid num_resources\n"); -- return -ENODEV; -- } -- if ((pdev->resource[0].flags != IORESOURCE_MEM) -- || (pdev->resource[1].flags != IORESOURCE_IRQ)) { -- DBG("invalid resource type\n"); -- return -ENODEV; -- } -- - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) - return -ENXIO; -diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c -index 8283dbd..03fe354 100644 ---- a/drivers/usb/gadget/composite.c -+++ b/drivers/usb/gadget/composite.c -@@ -593,6 +593,7 @@ static void reset_config(struct usb_composite_dev *cdev) - bitmap_zero(f->endpoints, 32); - } - cdev->config = NULL; -+ cdev->delayed_status = 0; - } - - static int set_config(struct usb_composite_dev *cdev, -diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c -index 22a48a7..9913bb8e 100644 ---- a/drivers/usb/gadget/f_fs.c -+++ b/drivers/usb/gadget/f_fs.c -@@ -1426,11 +1426,13 @@ static int functionfs_bind(struct ffs_data *ffs, struct usb_composite_dev *cdev) - ffs->ep0req->context = ffs; - - lang = ffs->stringtabs; -- for (lang = ffs->stringtabs; *lang; ++lang) { -- struct usb_string *str = (*lang)->strings; -- int id = first_id; -- for (; str->s; ++id, ++str) -- str->id = id; -+ if (lang) { -+ for (; *lang; ++lang) { -+ struct usb_string *str = (*lang)->strings; -+ int id = first_id; -+ for (; str->s; ++id, ++str) -+ str->id = id; -+ } - } - - ffs->gadget = cdev->gadget; -diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c -index ae13a10..0a7ca0d 100644 ---- a/drivers/usb/gadget/inode.c -+++ b/drivers/usb/gadget/inode.c -@@ -1493,7 +1493,7 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) - } - break; - --#ifndef CONFIG_USB_GADGET_PXA25X -+#ifndef CONFIG_USB_PXA25X - /* PXA automagically handles this request too */ - case USB_REQ_GET_CONFIGURATION: - if (ctrl->bRequestType != 0x80) -diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c -index 0909783..3302c27 100644 ---- a/drivers/usb/host/ehci-pci.c -+++ b/drivers/usb/host/ehci-pci.c -@@ -549,7 +549,7 @@ static struct pci_driver ehci_pci_driver = { - .remove = usb_hcd_pci_remove, - .shutdown = usb_hcd_pci_shutdown, - --#ifdef CONFIG_PM_SLEEP -+#ifdef CONFIG_PM - .driver = { - .pm = &usb_hcd_pci_pm_ops - }, -diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c -index b029be2..2b9acd6 100644 ---- a/drivers/usb/host/ehci-q.c -+++ b/drivers/usb/host/ehci-q.c -@@ -264,18 +264,14 @@ ehci_urb_done(struct ehci_hcd *ehci, struct urb *urb, int status) - __releases(ehci->lock) - __acquires(ehci->lock) - { -- if (likely (urb->hcpriv != NULL)) { -- struct ehci_qh *qh = (struct ehci_qh *) urb->hcpriv; -- -- /* S-mask in a QH means it's an interrupt urb */ -- if ((qh->hw->hw_info2 & cpu_to_hc32(ehci, QH_SMASK)) != 0) { -- -- /* ... update hc-wide periodic stats (for usbfs) */ -- ehci_to_hcd(ehci)->self.bandwidth_int_reqs--; -- } -- qh_put (qh); -+ if (usb_pipetype(urb->pipe) == PIPE_INTERRUPT) { -+ /* ... update hc-wide periodic stats */ -+ ehci_to_hcd(ehci)->self.bandwidth_int_reqs--; - } - -+ if (usb_pipetype(urb->pipe) != PIPE_ISOCHRONOUS) -+ qh_put((struct ehci_qh *) urb->hcpriv); -+ - if (unlikely(urb->unlinked)) { - COUNT(ehci->stats.unlink); - } else { -diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c -index a60679c..34655d0 100644 ---- a/drivers/usb/host/ehci-sched.c -+++ b/drivers/usb/host/ehci-sched.c -@@ -1684,7 +1684,7 @@ itd_link_urb ( - - /* don't need that schedule data any more */ - iso_sched_free (stream, iso_sched); -- urb->hcpriv = NULL; -+ urb->hcpriv = stream; - - timer_action (ehci, TIMER_IO_WATCHDOG); - return enable_periodic(ehci); -@@ -2094,7 +2094,7 @@ sitd_link_urb ( - - /* don't need that schedule data any more */ - iso_sched_free (stream, sched); -- urb->hcpriv = NULL; -+ urb->hcpriv = stream; - - timer_action (ehci, TIMER_IO_WATCHDOG); - return enable_periodic(ehci); -diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c -index 1843bb6..6847b93 100644 ---- a/drivers/usb/host/ohci-pci.c -+++ b/drivers/usb/host/ohci-pci.c -@@ -414,7 +414,7 @@ static struct pci_driver ohci_pci_driver = { - .remove = usb_hcd_pci_remove, - .shutdown = usb_hcd_pci_shutdown, - --#ifdef CONFIG_PM_SLEEP -+#ifdef CONFIG_PM - .driver = { - .pm = &usb_hcd_pci_pm_ops - }, -diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c -index 7893351..90dcf54 100644 ---- a/drivers/usb/host/pci-quirks.c -+++ b/drivers/usb/host/pci-quirks.c -@@ -555,6 +555,14 @@ static const struct dmi_system_id __devinitconst ehci_dmi_nohandoff_table[] = { - DMI_MATCH(DMI_BIOS_VERSION, "Lucid-"), - }, - }, -+ { -+ /* HASEE E200 */ -+ .matches = { -+ DMI_MATCH(DMI_BOARD_VENDOR, "HASEE"), -+ DMI_MATCH(DMI_BOARD_NAME, "E210"), -+ DMI_MATCH(DMI_BIOS_VERSION, "6.00"), -+ }, -+ }, - { } - }; - -@@ -564,9 +572,14 @@ static void __devinit ehci_bios_handoff(struct pci_dev *pdev, - { - int try_handoff = 1, tried_handoff = 0; - -- /* The Pegatron Lucid tablet sporadically waits for 98 seconds trying -- * the handoff on its unused controller. Skip it. */ -- if (pdev->vendor == 0x8086 && pdev->device == 0x283a) { -+ /* -+ * The Pegatron Lucid tablet sporadically waits for 98 seconds trying -+ * the handoff on its unused controller. Skip it. -+ * -+ * The HASEE E200 hangs when the semaphore is set (bugzilla #77021). -+ */ -+ if (pdev->vendor == 0x8086 && (pdev->device == 0x283a || -+ pdev->device == 0x27cc)) { - if (dmi_check_system(ehci_dmi_nohandoff_table)) - try_handoff = 0; - } -diff --git a/drivers/usb/host/uhci-pci.c b/drivers/usb/host/uhci-pci.c -index c300bd2f7..0f228c4 100644 ---- a/drivers/usb/host/uhci-pci.c -+++ b/drivers/usb/host/uhci-pci.c -@@ -293,7 +293,7 @@ static struct pci_driver uhci_pci_driver = { - .remove = usb_hcd_pci_remove, - .shutdown = uhci_shutdown, - --#ifdef CONFIG_PM_SLEEP -+#ifdef CONFIG_PM - .driver = { - .pm = &usb_hcd_pci_pm_ops - }, -diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c -index 4d410b9..46b1af8 100644 ---- a/drivers/usb/host/xhci-hub.c -+++ b/drivers/usb/host/xhci-hub.c -@@ -617,7 +617,8 @@ static int xhci_ehset_single_step_set_feature(struct usb_hcd *hcd, int port) - } - - /* Updates Link Status for super Speed port */ --static void xhci_hub_report_link_state(u32 *status, u32 status_reg) -+static void xhci_hub_report_link_state(struct xhci_hcd *xhci, -+ u32 *status, u32 status_reg) - { - u32 pls = status_reg & PORT_PLS_MASK; - -@@ -656,7 +657,8 @@ static void xhci_hub_report_link_state(u32 *status, u32 status_reg) - * in which sometimes the port enters compliance mode - * caused by a delay on the host-device negotiation. - */ -- if (pls == USB_SS_PORT_LS_COMP_MOD) -+ if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && -+ (pls == USB_SS_PORT_LS_COMP_MOD)) - pls |= USB_PORT_STAT_CONNECTION; - } - -@@ -835,7 +837,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, - } - /* Update Port Link State for super speed ports*/ - if (hcd->speed == HCD_USB3) { -- xhci_hub_report_link_state(&status, temp); -+ xhci_hub_report_link_state(xhci, &status, temp); - /* - * Verify if all USB3 Ports Have entered U0 already. - * Delete Compliance Mode Timer if so. -diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c -index 3347e9b..aa38b1f 100644 ---- a/drivers/usb/host/xhci-mem.c -+++ b/drivers/usb/host/xhci-mem.c -@@ -1812,6 +1812,16 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) - kfree(cur_cd); - } - -+ num_ports = HCS_MAX_PORTS(xhci->hcs_params1); -+ for (i = 0; i < num_ports && xhci->rh_bw; i++) { -+ struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table; -+ for (j = 0; j < XHCI_MAX_INTERVAL; j++) { -+ struct list_head *ep = &bwt->interval_bw[j].endpoints; -+ while (!list_empty(ep)) -+ list_del_init(ep->next); -+ } -+ } -+ - for (i = 1; i < MAX_HC_SLOTS; ++i) - xhci_free_virt_device(xhci, i); - -@@ -1852,16 +1862,6 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) - if (!xhci->rh_bw) - goto no_bw; - -- num_ports = HCS_MAX_PORTS(xhci->hcs_params1); -- for (i = 0; i < num_ports; i++) { -- struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table; -- for (j = 0; j < XHCI_MAX_INTERVAL; j++) { -- struct list_head *ep = &bwt->interval_bw[j].endpoints; -- while (!list_empty(ep)) -- list_del_init(ep->next); -- } -- } -- - for (i = 0; i < num_ports; i++) { - struct xhci_tt_bw_info *tt, *n; - list_for_each_entry_safe(tt, n, &xhci->rh_bw[i].tts, tt_list) { -diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c -index 8b1c27f..0e1f1f0 100644 ---- a/drivers/usb/host/xhci-pci.c -+++ b/drivers/usb/host/xhci-pci.c -@@ -87,6 +87,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) - /* AMD PLL quirk */ - if (pdev->vendor == PCI_VENDOR_ID_AMD && usb_amd_find_chipset_info()) - xhci->quirks |= XHCI_AMD_PLL_FIX; -+ -+ if (pdev->vendor == PCI_VENDOR_ID_AMD) -+ xhci->quirks |= XHCI_TRUST_TX_LENGTH; -+ - if (pdev->vendor == PCI_VENDOR_ID_INTEL && - pdev->device == PCI_DEVICE_ID_INTEL_PANTHERPOINT_XHCI) { - xhci->quirks |= XHCI_EP_LIMIT_QUIRK; -@@ -109,6 +113,9 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) - xhci_dbg(xhci, "QUIRK: Resetting on resume\n"); - xhci->quirks |= XHCI_TRUST_TX_LENGTH; - } -+ if (pdev->vendor == PCI_VENDOR_ID_RENESAS && -+ pdev->device == 0x0015) -+ xhci->quirks |= XHCI_RESET_ON_RESUME; - if (pdev->vendor == PCI_VENDOR_ID_VIA) - xhci->quirks |= XHCI_RESET_ON_RESUME; - } -@@ -330,7 +337,7 @@ static struct pci_driver xhci_pci_driver = { - /* suspend and resume implemented later */ - - .shutdown = usb_hcd_pci_shutdown, --#ifdef CONFIG_PM_SLEEP -+#ifdef CONFIG_PM - .driver = { - .pm = &usb_hcd_pci_pm_ops - }, -diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c -index 1e34a88..5cdb965 100644 ---- a/drivers/usb/host/xhci-ring.c -+++ b/drivers/usb/host/xhci-ring.c -@@ -2534,7 +2534,8 @@ static int handle_tx_event(struct xhci_hcd *xhci, - * last TRB of the previous TD. The command completion handle - * will take care the rest. - */ -- if (!event_seg && trb_comp_code == COMP_STOP_INVAL) { -+ if (!event_seg && (trb_comp_code == COMP_STOP || -+ trb_comp_code == COMP_STOP_INVAL)) { - ret = 0; - goto cleanup; - } -@@ -3738,7 +3739,7 @@ static unsigned int xhci_get_burst_count(struct xhci_hcd *xhci, - return 0; - - max_burst = urb->ep->ss_ep_comp.bMaxBurst; -- return roundup(total_packet_count, max_burst + 1) - 1; -+ return DIV_ROUND_UP(total_packet_count, max_burst + 1) - 1; - } - - /* -diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c -index 18d2573..1bef534 100644 ---- a/drivers/usb/host/xhci.c -+++ b/drivers/usb/host/xhci.c -@@ -315,6 +315,9 @@ static void xhci_cleanup_msix(struct xhci_hcd *xhci) - struct usb_hcd *hcd = xhci_to_hcd(xhci); - struct pci_dev *pdev = to_pci_dev(hcd->self.controller); - -+ if (xhci->quirks & XHCI_PLAT) -+ return; -+ - xhci_free_irq(xhci); - - if (xhci->msix_entries) { -@@ -958,7 +961,7 @@ int xhci_suspend(struct xhci_hcd *xhci) - */ - int xhci_resume(struct xhci_hcd *xhci, bool hibernated) - { -- u32 command, temp = 0; -+ u32 command, temp = 0, status; - struct usb_hcd *hcd = xhci_to_hcd(xhci); - struct usb_hcd *secondary_hcd; - int retval = 0; -@@ -1082,8 +1085,12 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) - - done: - if (retval == 0) { -- usb_hcd_resume_root_hub(hcd); -- usb_hcd_resume_root_hub(xhci->shared_hcd); -+ /* Resume root hubs only when have pending events. */ -+ status = readl(&xhci->op_regs->status); -+ if (status & STS_EINT) { -+ usb_hcd_resume_root_hub(hcd); -+ usb_hcd_resume_root_hub(xhci->shared_hcd); -+ } - } - - /* -diff --git a/drivers/usb/misc/adutux.c b/drivers/usb/misc/adutux.c -index 284b854..14d9142 100644 ---- a/drivers/usb/misc/adutux.c -+++ b/drivers/usb/misc/adutux.c -@@ -829,7 +829,7 @@ static int adu_probe(struct usb_interface *interface, - - /* let the user know what node this device is now attached to */ - dev_info(&interface->dev, "ADU%d %s now attached to /dev/usb/adutux%d\n", -- udev->descriptor.idProduct, dev->serial_number, -+ le16_to_cpu(udev->descriptor.idProduct), dev->serial_number, - (dev->minor - ADU_MINOR_BASE)); - exit: - dbg(2," %s : leave, return value %p (dev)", __func__, dev); -diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c -index 7af163d..f1bfd01 100644 ---- a/drivers/usb/misc/sisusbvga/sisusb.c -+++ b/drivers/usb/misc/sisusbvga/sisusb.c -@@ -3248,6 +3248,7 @@ static const struct usb_device_id sisusb_table[] = { - { USB_DEVICE(0x0711, 0x0918) }, - { USB_DEVICE(0x0711, 0x0920) }, - { USB_DEVICE(0x0711, 0x0950) }, -+ { USB_DEVICE(0x0711, 0x5200) }, - { USB_DEVICE(0x182d, 0x021c) }, - { USB_DEVICE(0x182d, 0x0269) }, - { } -diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c -index 055b84a..174be05 100644 ---- a/drivers/usb/misc/usbtest.c -+++ b/drivers/usb/misc/usbtest.c -@@ -7,9 +7,10 @@ - #include - #include - #include -- -+#include - #include - -+#define SIMPLE_IO_TIMEOUT 10000 /* in milliseconds */ - - /*-------------------------------------------------------------------------*/ - -@@ -355,6 +356,7 @@ static int simple_io( - int max = urb->transfer_buffer_length; - struct completion completion; - int retval = 0; -+ unsigned long expire; - - urb->context = &completion; - while (retval == 0 && iterations-- > 0) { -@@ -367,9 +369,15 @@ static int simple_io( - if (retval != 0) - break; - -- /* NOTE: no timeouts; can't be broken out of by interrupt */ -- wait_for_completion(&completion); -- retval = urb->status; -+ expire = msecs_to_jiffies(SIMPLE_IO_TIMEOUT); -+ if (!wait_for_completion_timeout(&completion, expire)) { -+ usb_kill_urb(urb); -+ retval = (urb->status == -ENOENT ? -+ -ETIMEDOUT : urb->status); -+ } else { -+ retval = urb->status; -+ } -+ - urb->dev = udev; - if (retval == 0 && usb_pipein(urb->pipe)) - retval = simple_check_buf(tdev, urb); -@@ -462,6 +470,14 @@ alloc_sglist(int nents, int max, int vary) - return sg; - } - -+static void sg_timeout(unsigned long _req) -+{ -+ struct usb_sg_request *req = (struct usb_sg_request *) _req; -+ -+ req->status = -ETIMEDOUT; -+ usb_sg_cancel(req); -+} -+ - static int perform_sglist( - struct usbtest_dev *tdev, - unsigned iterations, -@@ -473,6 +489,9 @@ static int perform_sglist( - { - struct usb_device *udev = testdev_to_usbdev(tdev); - int retval = 0; -+ struct timer_list sg_timer; -+ -+ setup_timer_on_stack(&sg_timer, sg_timeout, (unsigned long) req); - - while (retval == 0 && iterations-- > 0) { - retval = usb_sg_init(req, udev, pipe, -@@ -483,7 +502,10 @@ static int perform_sglist( - - if (retval) - break; -+ mod_timer(&sg_timer, jiffies + -+ msecs_to_jiffies(SIMPLE_IO_TIMEOUT)); - usb_sg_wait(req); -+ del_timer_sync(&sg_timer); - retval = req->status; - - /* FIXME check resulting data pattern */ -@@ -1135,6 +1157,11 @@ static int unlink1(struct usbtest_dev *dev, int pipe, int size, int async) - urb->context = &completion; - urb->complete = unlink1_callback; - -+ if (usb_pipeout(urb->pipe)) { -+ simple_fill_buf(urb); -+ urb->transfer_flags |= URB_ZERO_PACKET; -+ } -+ - /* keep the endpoint busy. there are lots of hc/hcd-internal - * states, and testing should get to all of them over time. - * -@@ -1265,6 +1292,11 @@ static int unlink_queued(struct usbtest_dev *dev, int pipe, unsigned num, - unlink_queued_callback, &ctx); - ctx.urbs[i]->transfer_dma = buf_dma; - ctx.urbs[i]->transfer_flags = URB_NO_TRANSFER_DMA_MAP; -+ -+ if (usb_pipeout(ctx.urbs[i]->pipe)) { -+ simple_fill_buf(ctx.urbs[i]); -+ ctx.urbs[i]->transfer_flags |= URB_ZERO_PACKET; -+ } - } - - /* Submit all the URBs and then unlink URBs num - 4 and num - 2. */ -diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c -index 95918da..49e3728 100644 ---- a/drivers/usb/musb/musb_gadget.c -+++ b/drivers/usb/musb/musb_gadget.c -@@ -401,7 +401,19 @@ static void txstate(struct musb *musb, struct musb_request *req) - csr |= (MUSB_TXCSR_DMAENAB - | MUSB_TXCSR_DMAMODE - | MUSB_TXCSR_MODE); -- if (!musb_ep->hb_mult) -+ /* -+ * Enable Autoset according to table -+ * below -+ * bulk_split hb_mult Autoset_Enable -+ * 0 0 Yes(Normal) -+ * 0 >0 No(High BW ISO) -+ * 1 0 Yes(HS bulk) -+ * 1 >0 Yes(FS bulk) -+ */ -+ if (!musb_ep->hb_mult || -+ (musb_ep->hb_mult && -+ can_bulk_split(musb, -+ musb_ep->type))) - csr |= MUSB_TXCSR_AUTOSET; - } - csr &= ~MUSB_TXCSR_P_UNDERRUN; -@@ -1100,11 +1112,15 @@ static int musb_gadget_enable(struct usb_ep *ep, - /* Set TXMAXP with the FIFO size of the endpoint - * to disable double buffering mode. - */ -- if (musb->double_buffer_not_ok) -+ if (musb->double_buffer_not_ok) { - musb_writew(regs, MUSB_TXMAXP, hw_ep->max_packet_sz_tx); -- else -+ } else { -+ if (can_bulk_split(musb, musb_ep->type)) -+ musb_ep->hb_mult = (hw_ep->max_packet_sz_tx / -+ musb_ep->packet_sz) - 1; - musb_writew(regs, MUSB_TXMAXP, musb_ep->packet_sz - | (musb_ep->hb_mult << 11)); -+ } - - csr = MUSB_TXCSR_MODE | MUSB_TXCSR_CLRDATATOG; - if (musb_readw(regs, MUSB_TXCSR) -diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c -index 31bfe60..9282703 100644 ---- a/drivers/usb/serial/ark3116.c -+++ b/drivers/usb/serial/ark3116.c -@@ -68,7 +68,6 @@ static int is_irda(struct usb_serial *serial) - } - - struct ark3116_private { -- wait_queue_head_t delta_msr_wait; - struct async_icount icount; - int irda; /* 1 for irda device */ - -@@ -148,7 +147,6 @@ static int ark3116_attach(struct usb_serial *serial) - if (!priv) - return -ENOMEM; - -- init_waitqueue_head(&priv->delta_msr_wait); - mutex_init(&priv->hw_lock); - spin_lock_init(&priv->status_lock); - -@@ -460,10 +458,14 @@ static int ark3116_ioctl(struct tty_struct *tty, - case TIOCMIWAIT: - for (;;) { - struct async_icount prev = priv->icount; -- interruptible_sleep_on(&priv->delta_msr_wait); -+ interruptible_sleep_on(&port->delta_msr_wait); - /* see if a signal did it */ - if (signal_pending(current)) - return -ERESTARTSYS; -+ -+ if (port->serial->disconnected) -+ return -EIO; -+ - if ((prev.rng == priv->icount.rng) && - (prev.dsr == priv->icount.dsr) && - (prev.dcd == priv->icount.dcd) && -@@ -584,7 +586,7 @@ static void ark3116_update_msr(struct usb_serial_port *port, __u8 msr) - priv->icount.dcd++; - if (msr & UART_MSR_TERI) - priv->icount.rng++; -- wake_up_interruptible(&priv->delta_msr_wait); -+ wake_up_interruptible(&port->delta_msr_wait); - } - } - -diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c -index aaab32d..a45594a 100644 ---- a/drivers/usb/serial/ch341.c -+++ b/drivers/usb/serial/ch341.c -@@ -82,7 +82,6 @@ MODULE_DEVICE_TABLE(usb, id_table); - - struct ch341_private { - spinlock_t lock; /* access lock */ -- wait_queue_head_t delta_msr_wait; /* wait queue for modem status */ - unsigned baud_rate; /* set baud rate */ - u8 line_control; /* set line control value RTS/DTR */ - u8 line_status; /* active status of modem control inputs */ -@@ -262,7 +261,6 @@ static int ch341_attach(struct usb_serial *serial) - return -ENOMEM; - - spin_lock_init(&priv->lock); -- init_waitqueue_head(&priv->delta_msr_wait); - priv->baud_rate = DEFAULT_BAUD_RATE; - priv->line_control = CH341_BIT_RTS | CH341_BIT_DTR; - -@@ -299,7 +297,7 @@ static void ch341_dtr_rts(struct usb_serial_port *port, int on) - priv->line_control &= ~(CH341_BIT_RTS | CH341_BIT_DTR); - spin_unlock_irqrestore(&priv->lock, flags); - ch341_set_handshake(port->serial->dev, priv->line_control); -- wake_up_interruptible(&priv->delta_msr_wait); -+ wake_up_interruptible(&port->delta_msr_wait); - } - - static void ch341_close(struct usb_serial_port *port) -@@ -502,7 +500,7 @@ static void ch341_read_int_callback(struct urb *urb) - tty_kref_put(tty); - } - -- wake_up_interruptible(&priv->delta_msr_wait); -+ wake_up_interruptible(&port->delta_msr_wait); - } - - exit: -@@ -528,11 +526,14 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) - spin_unlock_irqrestore(&priv->lock, flags); - - while (!multi_change) { -- interruptible_sleep_on(&priv->delta_msr_wait); -+ interruptible_sleep_on(&port->delta_msr_wait); - /* see if a signal did it */ - if (signal_pending(current)) - return -ERESTARTSYS; - -+ if (port->serial->disconnected) -+ return -EIO; -+ - spin_lock_irqsave(&priv->lock, flags); - status = priv->line_status; - multi_change = priv->multi_status_change; -diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c -index b53065b..ac33957 100644 ---- a/drivers/usb/serial/cp210x.c -+++ b/drivers/usb/serial/cp210x.c -@@ -110,6 +110,7 @@ static const struct usb_device_id id_table[] = { - { USB_DEVICE(0x10C4, 0x8218) }, /* Lipowsky Industrie Elektronik GmbH, HARP-1 */ - { USB_DEVICE(0x10C4, 0x822B) }, /* Modem EDGE(GSM) Comander 2 */ - { USB_DEVICE(0x10C4, 0x826B) }, /* Cygnal Integrated Products, Inc., Fasttrax GPS demonstration module */ -+ { USB_DEVICE(0x10C4, 0x8281) }, /* Nanotec Plug & Drive */ - { USB_DEVICE(0x10C4, 0x8293) }, /* Telegesis ETRX2USB */ - { USB_DEVICE(0x10C4, 0x82F9) }, /* Procyon AVS */ - { USB_DEVICE(0x10C4, 0x8341) }, /* Siemens MC35PU GPRS Modem */ -@@ -158,6 +159,7 @@ static const struct usb_device_id id_table[] = { - { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ - { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ - { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */ -+ { USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */ - { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */ - { USB_DEVICE(0x1E29, 0x0102) }, /* Festo CPX-USB */ - { USB_DEVICE(0x1E29, 0x0501) }, /* Festo CMSP */ -diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c -index 270bda8..b1b8467 100644 ---- a/drivers/usb/serial/cypress_m8.c -+++ b/drivers/usb/serial/cypress_m8.c -@@ -125,7 +125,6 @@ struct cypress_private { - int baud_rate; /* stores current baud rate in - integer form */ - int isthrottled; /* if throttled, discard reads */ -- wait_queue_head_t delta_msr_wait; /* used for TIOCMIWAIT */ - char prev_status, diff_status; /* used for TIOCMIWAIT */ - /* we pass a pointer to this as the argument sent to - cypress_set_termios old_termios */ -@@ -475,7 +474,6 @@ static int generic_startup(struct usb_serial *serial) - kfree(priv); - return -ENOMEM; - } -- init_waitqueue_head(&priv->delta_msr_wait); - - /* Skip reset for FRWD device. It is a workaound: - device hangs if it receives SET_CONFIGURE in Configured -@@ -919,12 +917,16 @@ static int cypress_ioctl(struct tty_struct *tty, - switch (cmd) { - /* This code comes from drivers/char/serial.c and ftdi_sio.c */ - case TIOCMIWAIT: -- while (priv != NULL) { -- interruptible_sleep_on(&priv->delta_msr_wait); -+ for (;;) { -+ interruptible_sleep_on(&port->delta_msr_wait); - /* see if a signal did it */ - if (signal_pending(current)) - return -ERESTARTSYS; -- else { -+ -+ if (port->serial->disconnected) -+ return -EIO; -+ -+ { - char diff = priv->diff_status; - if (diff == 0) - return -EIO; /* no change => error */ -@@ -1250,7 +1252,7 @@ static void cypress_read_int_callback(struct urb *urb) - if (priv->current_status != priv->prev_status) { - priv->diff_status |= priv->current_status ^ - priv->prev_status; -- wake_up_interruptible(&priv->delta_msr_wait); -+ wake_up_interruptible(&port->delta_msr_wait); - priv->prev_status = priv->current_status; - } - spin_unlock_irqrestore(&priv->lock, flags); -diff --git a/drivers/usb/serial/cypress_m8.h b/drivers/usb/serial/cypress_m8.h -index b461311..ce13e61 100644 ---- a/drivers/usb/serial/cypress_m8.h -+++ b/drivers/usb/serial/cypress_m8.h -@@ -63,7 +63,7 @@ - #define UART_DSR 0x20 /* data set ready - flow control - device to host */ - #define CONTROL_RTS 0x10 /* request to send - flow control - host to device */ - #define UART_CTS 0x10 /* clear to send - flow control - device to host */ --#define UART_RI 0x10 /* ring indicator - modem - device to host */ -+#define UART_RI 0x80 /* ring indicator - modem - device to host */ - #define UART_CD 0x40 /* carrier detect - modem - device to host */ - #define CYP_ERROR 0x08 /* received from input report - device to host */ - /* Note - the below has nothing to do with the "feature report" reset */ -diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c -index 3e4c27d..8425e9e 100644 ---- a/drivers/usb/serial/ftdi_sio.c -+++ b/drivers/usb/serial/ftdi_sio.c -@@ -74,9 +74,7 @@ struct ftdi_private { - int flags; /* some ASYNC_xxxx flags are supported */ - unsigned long last_dtr_rts; /* saved modem control outputs */ - struct async_icount icount; -- wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */ - char prev_status; /* Used for TIOCMIWAIT */ -- bool dev_gone; /* Used to abort TIOCMIWAIT */ - char transmit_empty; /* If transmitter is empty or not */ - struct usb_serial_port *port; - __u16 interface; /* FT2232C, FT2232H or FT4232H port interface -@@ -164,7 +162,9 @@ static struct usb_device_id id_table_combined [] = { - { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) }, -+ { USB_DEVICE(FTDI_VID, FTDI_BM_ATOM_NANO_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) }, -+ { USB_DEVICE(FTDI_VID, FTDI_EV3CON_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) }, -@@ -204,6 +204,8 @@ static struct usb_device_id id_table_combined [] = { - { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, - { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) }, -+ { USB_DEVICE(FTDI_VID, FTDI_TAGSYS_LP101_PID) }, -+ { USB_DEVICE(FTDI_VID, FTDI_TAGSYS_P200X_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) }, -@@ -590,6 +592,8 @@ static struct usb_device_id id_table_combined [] = { - { USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_TIAO_UMPA_PID), - .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, -+ { USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLXM_PID), -+ .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, - /* - * ELV devices: - */ -@@ -728,7 +732,8 @@ static struct usb_device_id id_table_combined [] = { - { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) }, -- { USB_DEVICE(TESTO_VID, TESTO_USB_INTERFACE_PID) }, -+ { USB_DEVICE(TESTO_VID, TESTO_1_PID) }, -+ { USB_DEVICE(TESTO_VID, TESTO_3_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_GAMMA_SCOUT_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13M_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) }, -@@ -745,6 +750,7 @@ static struct usb_device_id id_table_combined [] = { - { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID), - .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk }, - { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, -+ { USB_DEVICE(NOVITUS_VID, NOVITUS_BONO_E_PID) }, - { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S03_PID) }, - { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_59_PID) }, - { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57A_PID) }, -@@ -916,6 +922,46 @@ static struct usb_device_id id_table_combined [] = { - { USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) }, - /* Crucible Devices */ - { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) }, -+ { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) }, -+ /* Cressi Devices */ -+ { USB_DEVICE(FTDI_VID, FTDI_CRESSI_PID) }, -+ /* Brainboxes Devices */ -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_001_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_012_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_023_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_034_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_101_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_1_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_2_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_3_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_4_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_5_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_6_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_7_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_8_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_257_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_1_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_2_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_3_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_4_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_313_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_324_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_1_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_2_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_357_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_1_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_2_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_3_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_1_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_2_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_1_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_2_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_3_PID) }, -+ { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_4_PID) }, -+ /* ekey Devices */ -+ { USB_DEVICE(FTDI_VID, FTDI_EKEY_CONV_USB_PID) }, -+ /* GE Healthcare devices */ -+ { USB_DEVICE(GE_HEALTHCARE_VID, GE_HEALTHCARE_NEMO_TRACKER_PID) }, - { }, /* Optional parameter entry */ - { } /* Terminating entry */ - }; -@@ -1554,14 +1600,17 @@ static void ftdi_set_max_packet_size(struct usb_serial_port *port) - struct usb_device *udev = serial->dev; - - struct usb_interface *interface = serial->interface; -- struct usb_endpoint_descriptor *ep_desc = &interface->cur_altsetting->endpoint[1].desc; -+ struct usb_endpoint_descriptor *ep_desc; - - unsigned num_endpoints; -- int i; -+ unsigned i; - - num_endpoints = interface->cur_altsetting->desc.bNumEndpoints; - dev_info(&udev->dev, "Number of endpoints %d\n", num_endpoints); - -+ if (!num_endpoints) -+ return; -+ - /* NOTE: some customers have programmed FT232R/FT245R devices - * with an endpoint size of 0 - not good. In this case, we - * want to override the endpoint descriptor setting and use a -@@ -1740,10 +1789,8 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port) - kref_init(&priv->kref); - mutex_init(&priv->cfg_lock); - memset(&priv->icount, 0x00, sizeof(priv->icount)); -- init_waitqueue_head(&priv->delta_msr_wait); - - priv->flags = ASYNC_LOW_LATENCY; -- priv->dev_gone = false; - - if (quirk && quirk->port_probe) - quirk->port_probe(priv); -@@ -1853,8 +1900,11 @@ static int ftdi_8u2232c_probe(struct usb_serial *serial) - } - - /* -- * First and second port on STMCLiteadaptors is reserved for JTAG interface -- * and the forth port for pio -+ * First two ports on JTAG adaptors using an FT4232 such as STMicroelectronics's -+ * ST Micro Connect Lite are reserved for JTAG or other non-UART interfaces and -+ * can be accessed from userspace. -+ * The next two ports are enabled as UARTs by default, where port 2 is -+ * a conventional RS-232 UART. - */ - static int ftdi_stmclite_probe(struct usb_serial *serial) - { -@@ -1863,12 +1913,13 @@ static int ftdi_stmclite_probe(struct usb_serial *serial) - - dbg("%s", __func__); - -- if (interface == udev->actconfig->interface[2]) -- return 0; -- -- dev_info(&udev->dev, "Ignoring serial port reserved for JTAG\n"); -+ if (interface == udev->actconfig->interface[0] || -+ interface == udev->actconfig->interface[1]) { -+ dev_info(&udev->dev, "Ignoring serial port reserved for JTAG\n"); -+ return -ENODEV; -+ } - -- return -ENODEV; -+ return 0; - } - - /* -@@ -1902,8 +1953,7 @@ static int ftdi_sio_port_remove(struct usb_serial_port *port) - - dbg("%s", __func__); - -- priv->dev_gone = true; -- wake_up_interruptible_all(&priv->delta_msr_wait); -+ wake_up_interruptible(&port->delta_msr_wait); - - remove_sysfs_attrs(port); - -@@ -2058,7 +2108,7 @@ static int ftdi_process_packet(struct tty_struct *tty, - if (diff_status & FTDI_RS0_RLSD) - priv->icount.dcd++; - -- wake_up_interruptible_all(&priv->delta_msr_wait); -+ wake_up_interruptible(&port->delta_msr_wait); - priv->prev_status = status; - } - -@@ -2196,6 +2246,20 @@ static void ftdi_set_termios(struct tty_struct *tty, - termios->c_cflag |= CRTSCTS; - } - -+ /* -+ * All FTDI UART chips are limited to CS7/8. We won't pretend to -+ * support CS5/6 and revert the CSIZE setting instead. -+ */ -+ if ((C_CSIZE(tty) != CS8) && (C_CSIZE(tty) != CS7)) { -+ dev_warn(&port->dev, "requested CSIZE setting not supported\n"); -+ -+ termios->c_cflag &= ~CSIZE; -+ if (old_termios) -+ termios->c_cflag |= old_termios->c_cflag & CSIZE; -+ else -+ termios->c_cflag |= CS8; -+ } -+ - cflag = termios->c_cflag; - - if (!old_termios) -@@ -2232,13 +2296,16 @@ static void ftdi_set_termios(struct tty_struct *tty, - } else { - urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE; - } -- if (cflag & CSIZE) { -- switch (cflag & CSIZE) { -- case CS7: urb_value |= 7; dbg("Setting CS7"); break; -- case CS8: urb_value |= 8; dbg("Setting CS8"); break; -- default: -- dev_err(&port->dev, "CSIZE was set but not CS7-CS8\n"); -- } -+ switch (cflag & CSIZE) { -+ case CS7: -+ urb_value |= 7; -+ dev_dbg(&port->dev, "Setting CS7\n"); -+ break; -+ default: -+ case CS8: -+ urb_value |= 8; -+ dev_dbg(&port->dev, "Setting CS8\n"); -+ break; - } - - /* This is needed by the break command since it uses the same command -@@ -2461,11 +2528,15 @@ static int ftdi_ioctl(struct tty_struct *tty, - */ - case TIOCMIWAIT: - cprev = priv->icount; -- while (!priv->dev_gone) { -- interruptible_sleep_on(&priv->delta_msr_wait); -+ for (;;) { -+ interruptible_sleep_on(&port->delta_msr_wait); - /* see if a signal did it */ - if (signal_pending(current)) - return -ERESTARTSYS; -+ -+ if (port->serial->disconnected) -+ return -EIO; -+ - cnow = priv->icount; - if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || - ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || -@@ -2475,8 +2546,6 @@ static int ftdi_ioctl(struct tty_struct *tty, - } - cprev = cnow; - } -- return -EIO; -- break; - case TIOCSERGETLSR: - return get_lsr_info(port, (struct serial_struct __user *)arg); - break; -diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h -index 1b8af46..7628b91 100644 ---- a/drivers/usb/serial/ftdi_sio_ids.h -+++ b/drivers/usb/serial/ftdi_sio_ids.h -@@ -42,6 +42,8 @@ - /* www.candapter.com Ewert Energy Systems CANdapter device */ - #define FTDI_CANDAPTER_PID 0x9F80 /* Product Id */ - -+#define FTDI_BM_ATOM_NANO_PID 0xa559 /* Basic Micro ATOM Nano USB2Serial */ -+ - /* - * Texas Instruments XDS100v2 JTAG / BeagleBone A3 - * http://processors.wiki.ti.com/index.php/XDS100 -@@ -50,6 +52,7 @@ - #define TI_XDS100V2_PID 0xa6d0 - - #define FTDI_NXTCAM_PID 0xABB8 /* NXTCam for Mindstorms NXT */ -+#define FTDI_EV3CON_PID 0xABB9 /* Mindstorms EV3 Console Adapter */ - - /* US Interface Navigator (http://www.usinterface.com/) */ - #define FTDI_USINT_CAT_PID 0xb810 /* Navigator CAT and 2nd PTT lines */ -@@ -363,6 +366,12 @@ - /* Sprog II (Andrew Crosland's SprogII DCC interface) */ - #define FTDI_SPROG_II 0xF0C8 - -+/* -+ * Two of the Tagsys RFID Readers -+ */ -+#define FTDI_TAGSYS_LP101_PID 0xF0E9 /* Tagsys L-P101 RFID*/ -+#define FTDI_TAGSYS_P200X_PID 0xF0EE /* Tagsys Medio P200x RFID*/ -+ - /* an infrared receiver for user access control with IR tags */ - #define FTDI_PIEGROUP_PID 0xF208 /* Product Id */ - -@@ -531,6 +540,11 @@ - */ - #define FTDI_TIAO_UMPA_PID 0x8a98 /* TIAO/DIYGADGET USB Multi-Protocol Adapter */ - -+/* -+ * NovaTech product ids (FTDI_VID) -+ */ -+#define FTDI_NT_ORIONLXM_PID 0x7c90 /* OrionLXm Substation Automation Platform */ -+ - - /********************************/ - /** third-party VID/PID combos **/ -@@ -786,7 +800,8 @@ - * Submitted by Colin Leroy - */ - #define TESTO_VID 0x128D --#define TESTO_USB_INTERFACE_PID 0x0001 -+#define TESTO_1_PID 0x0001 -+#define TESTO_3_PID 0x0003 - - /* - * Mobility Electronics products. -@@ -813,6 +828,12 @@ - #define TELLDUS_TELLSTICK_PID 0x0C30 /* RF control dongle 433 MHz using FT232RL */ - - /* -+ * NOVITUS printers -+ */ -+#define NOVITUS_VID 0x1a28 -+#define NOVITUS_BONO_E_PID 0x6010 -+ -+/* - * RT Systems programming cables for various ham radios - */ - #define RTSYSTEMS_VID 0x2100 /* Vendor ID */ -@@ -1307,3 +1328,63 @@ - * Manufacturer: Crucible Technologies - */ - #define FTDI_CT_COMET_PID 0x8e08 -+ -+/* -+ * Product: Z3X Box -+ * Manufacturer: Smart GSM Team -+ */ -+#define FTDI_Z3X_PID 0x0011 -+ -+/* -+ * Product: Cressi PC Interface -+ * Manufacturer: Cressi -+ */ -+#define FTDI_CRESSI_PID 0x87d0 -+ -+/* -+ * Brainboxes devices -+ */ -+#define BRAINBOXES_VID 0x05d1 -+#define BRAINBOXES_VX_001_PID 0x1001 /* VX-001 ExpressCard 1 Port RS232 */ -+#define BRAINBOXES_VX_012_PID 0x1002 /* VX-012 ExpressCard 2 Port RS232 */ -+#define BRAINBOXES_VX_023_PID 0x1003 /* VX-023 ExpressCard 1 Port RS422/485 */ -+#define BRAINBOXES_VX_034_PID 0x1004 /* VX-034 ExpressCard 2 Port RS422/485 */ -+#define BRAINBOXES_US_101_PID 0x1011 /* US-101 1xRS232 */ -+#define BRAINBOXES_US_324_PID 0x1013 /* US-324 1xRS422/485 1Mbaud */ -+#define BRAINBOXES_US_606_1_PID 0x2001 /* US-606 6 Port RS232 Serial Port 1 and 2 */ -+#define BRAINBOXES_US_606_2_PID 0x2002 /* US-606 6 Port RS232 Serial Port 3 and 4 */ -+#define BRAINBOXES_US_606_3_PID 0x2003 /* US-606 6 Port RS232 Serial Port 4 and 6 */ -+#define BRAINBOXES_US_701_1_PID 0x2011 /* US-701 4xRS232 1Mbaud Port 1 and 2 */ -+#define BRAINBOXES_US_701_2_PID 0x2012 /* US-701 4xRS422 1Mbaud Port 3 and 4 */ -+#define BRAINBOXES_US_279_1_PID 0x2021 /* US-279 8xRS422 1Mbaud Port 1 and 2 */ -+#define BRAINBOXES_US_279_2_PID 0x2022 /* US-279 8xRS422 1Mbaud Port 3 and 4 */ -+#define BRAINBOXES_US_279_3_PID 0x2023 /* US-279 8xRS422 1Mbaud Port 5 and 6 */ -+#define BRAINBOXES_US_279_4_PID 0x2024 /* US-279 8xRS422 1Mbaud Port 7 and 8 */ -+#define BRAINBOXES_US_346_1_PID 0x3011 /* US-346 4xRS422/485 1Mbaud Port 1 and 2 */ -+#define BRAINBOXES_US_346_2_PID 0x3012 /* US-346 4xRS422/485 1Mbaud Port 3 and 4 */ -+#define BRAINBOXES_US_257_PID 0x5001 /* US-257 2xRS232 1Mbaud */ -+#define BRAINBOXES_US_313_PID 0x6001 /* US-313 2xRS422/485 1Mbaud */ -+#define BRAINBOXES_US_357_PID 0x7001 /* US_357 1xRS232/422/485 */ -+#define BRAINBOXES_US_842_1_PID 0x8001 /* US-842 8xRS422/485 1Mbaud Port 1 and 2 */ -+#define BRAINBOXES_US_842_2_PID 0x8002 /* US-842 8xRS422/485 1Mbaud Port 3 and 4 */ -+#define BRAINBOXES_US_842_3_PID 0x8003 /* US-842 8xRS422/485 1Mbaud Port 5 and 6 */ -+#define BRAINBOXES_US_842_4_PID 0x8004 /* US-842 8xRS422/485 1Mbaud Port 7 and 8 */ -+#define BRAINBOXES_US_160_1_PID 0x9001 /* US-160 16xRS232 1Mbaud Port 1 and 2 */ -+#define BRAINBOXES_US_160_2_PID 0x9002 /* US-160 16xRS232 1Mbaud Port 3 and 4 */ -+#define BRAINBOXES_US_160_3_PID 0x9003 /* US-160 16xRS232 1Mbaud Port 5 and 6 */ -+#define BRAINBOXES_US_160_4_PID 0x9004 /* US-160 16xRS232 1Mbaud Port 7 and 8 */ -+#define BRAINBOXES_US_160_5_PID 0x9005 /* US-160 16xRS232 1Mbaud Port 9 and 10 */ -+#define BRAINBOXES_US_160_6_PID 0x9006 /* US-160 16xRS232 1Mbaud Port 11 and 12 */ -+#define BRAINBOXES_US_160_7_PID 0x9007 /* US-160 16xRS232 1Mbaud Port 13 and 14 */ -+#define BRAINBOXES_US_160_8_PID 0x9008 /* US-160 16xRS232 1Mbaud Port 15 and 16 */ -+ -+/* -+ * ekey biometric systems GmbH (http://ekey.net/) -+ */ -+#define FTDI_EKEY_CONV_USB_PID 0xCB08 /* Converter USB */ -+ -+/* -+ * GE Healthcare devices -+ */ -+#define GE_HEALTHCARE_VID 0x1901 -+#define GE_HEALTHCARE_NEMO_TRACKER_PID 0x0015 -diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c -index 664deb6..546177f 100644 ---- a/drivers/usb/serial/generic.c -+++ b/drivers/usb/serial/generic.c -@@ -223,14 +223,7 @@ static int usb_serial_generic_write_start(struct usb_serial_port *port) - return result; - } - -- /* Try sending off another urb, unless in irq context (in which case -- * there will be no free urb). */ -- if (!in_irq()) -- goto retry; -- -- clear_bit_unlock(USB_SERIAL_WRITE_BUSY, &port->flags); -- -- return 0; -+ goto retry; /* try sending off another urb */ - } - - /** -diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c -index 323e872..32099d7 100644 ---- a/drivers/usb/serial/io_edgeport.c -+++ b/drivers/usb/serial/io_edgeport.c -@@ -114,7 +114,6 @@ struct edgeport_port { - wait_queue_head_t wait_chase; /* for handling sleeping while waiting for chase to finish */ - wait_queue_head_t wait_open; /* for handling sleeping while waiting for open to finish */ - wait_queue_head_t wait_command; /* for handling sleeping while waiting for command to finish */ -- wait_queue_head_t delta_msr_wait; /* for handling sleeping while waiting for msr change to happen */ - - struct async_icount icount; - struct usb_serial_port *port; /* loop back to the owner of this object */ -@@ -884,7 +883,6 @@ static int edge_open(struct tty_struct *tty, struct usb_serial_port *port) - /* initialize our wait queues */ - init_waitqueue_head(&edge_port->wait_open); - init_waitqueue_head(&edge_port->wait_chase); -- init_waitqueue_head(&edge_port->delta_msr_wait); - init_waitqueue_head(&edge_port->wait_command); - - /* initialize our icount structure */ -@@ -1701,13 +1699,17 @@ static int edge_ioctl(struct tty_struct *tty, - dbg("%s (%d) TIOCMIWAIT", __func__, port->number); - cprev = edge_port->icount; - while (1) { -- prepare_to_wait(&edge_port->delta_msr_wait, -+ prepare_to_wait(&port->delta_msr_wait, - &wait, TASK_INTERRUPTIBLE); - schedule(); -- finish_wait(&edge_port->delta_msr_wait, &wait); -+ finish_wait(&port->delta_msr_wait, &wait); - /* see if a signal did it */ - if (signal_pending(current)) - return -ERESTARTSYS; -+ -+ if (port->serial->disconnected) -+ return -EIO; -+ - cnow = edge_port->icount; - if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && - cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) -@@ -2088,7 +2090,7 @@ static void handle_new_msr(struct edgeport_port *edge_port, __u8 newMsr) - icount->dcd++; - if (newMsr & EDGEPORT_MSR_DELTA_RI) - icount->rng++; -- wake_up_interruptible(&edge_port->delta_msr_wait); -+ wake_up_interruptible(&edge_port->port->delta_msr_wait); - } - - /* Save the new modem status */ -diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c -index b68efdc..5175182 100644 ---- a/drivers/usb/serial/io_ti.c -+++ b/drivers/usb/serial/io_ti.c -@@ -29,6 +29,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -91,9 +92,6 @@ struct edgeport_port { - int close_pending; - int lsr_event; - struct async_icount icount; -- wait_queue_head_t delta_msr_wait; /* for handling sleeping while -- waiting for msr change to -- happen */ - struct edgeport_serial *edge_serial; - struct usb_serial_port *port; - __u8 bUartMode; /* Port type, 0: RS232, etc. */ -@@ -301,7 +299,7 @@ static int read_download_mem(struct usb_device *dev, int start_address, - { - int status = 0; - __u8 read_length; -- __be16 be_start_address; -+ u16 be_start_address; - - dbg("%s - @ %x for %d", __func__, start_address, length); - -@@ -318,10 +316,14 @@ static int read_download_mem(struct usb_device *dev, int start_address, - dbg("%s - @ %x for %d", __func__, - start_address, read_length); - } -- be_start_address = cpu_to_be16(start_address); -+ /* -+ * NOTE: Must use swab as wIndex is sent in little-endian -+ * byte order regardless of host byte order. -+ */ -+ be_start_address = swab16((u16)start_address); - status = ti_vread_sync(dev, UMPC_MEMORY_READ, - (__u16)address_type, -- (__force __u16)be_start_address, -+ be_start_address, - buffer, read_length); - - if (status) { -@@ -421,7 +423,7 @@ static int write_i2c_mem(struct edgeport_serial *serial, - { - int status = 0; - int write_length; -- __be16 be_start_address; -+ u16 be_start_address; - - /* We can only send a maximum of 1 aligned byte page at a time */ - -@@ -437,11 +439,16 @@ static int write_i2c_mem(struct edgeport_serial *serial, - usb_serial_debug_data(debug, &serial->serial->dev->dev, - __func__, write_length, buffer); - -- /* Write first page */ -- be_start_address = cpu_to_be16(start_address); -+ /* -+ * Write first page. -+ * -+ * NOTE: Must use swab as wIndex is sent in little-endian byte order -+ * regardless of host byte order. -+ */ -+ be_start_address = swab16((u16)start_address); - status = ti_vsend_sync(serial->serial->dev, - UMPC_MEMORY_WRITE, (__u16)address_type, -- (__force __u16)be_start_address, -+ be_start_address, - buffer, write_length); - if (status) { - dbg("%s - ERROR %d", __func__, status); -@@ -465,11 +472,16 @@ static int write_i2c_mem(struct edgeport_serial *serial, - usb_serial_debug_data(debug, &serial->serial->dev->dev, - __func__, write_length, buffer); - -- /* Write next page */ -- be_start_address = cpu_to_be16(start_address); -+ /* -+ * Write next page. -+ * -+ * NOTE: Must use swab as wIndex is sent in little-endian byte -+ * order regardless of host byte order. -+ */ -+ be_start_address = swab16((u16)start_address); - status = ti_vsend_sync(serial->serial->dev, UMPC_MEMORY_WRITE, - (__u16)address_type, -- (__force __u16)be_start_address, -+ be_start_address, - buffer, write_length); - if (status) { - dev_err(&serial->serial->dev->dev, "%s - ERROR %d\n", -@@ -676,8 +688,8 @@ static int get_descriptor_addr(struct edgeport_serial *serial, - if (rom_desc->Type == desc_type) - return start_address; - -- start_address = start_address + sizeof(struct ti_i2c_desc) -- + rom_desc->Size; -+ start_address = start_address + sizeof(struct ti_i2c_desc) + -+ le16_to_cpu(rom_desc->Size); - - } while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type); - -@@ -690,7 +702,7 @@ static int valid_csum(struct ti_i2c_desc *rom_desc, __u8 *buffer) - __u16 i; - __u8 cs = 0; - -- for (i = 0; i < rom_desc->Size; i++) -+ for (i = 0; i < le16_to_cpu(rom_desc->Size); i++) - cs = (__u8)(cs + buffer[i]); - - if (cs != rom_desc->CheckSum) { -@@ -744,7 +756,7 @@ static int check_i2c_image(struct edgeport_serial *serial) - break; - - if ((start_address + sizeof(struct ti_i2c_desc) + -- rom_desc->Size) > TI_MAX_I2C_SIZE) { -+ le16_to_cpu(rom_desc->Size)) > TI_MAX_I2C_SIZE) { - status = -ENODEV; - dbg("%s - structure too big, erroring out.", __func__); - break; -@@ -759,7 +771,8 @@ static int check_i2c_image(struct edgeport_serial *serial) - /* Read the descriptor data */ - status = read_rom(serial, start_address + - sizeof(struct ti_i2c_desc), -- rom_desc->Size, buffer); -+ le16_to_cpu(rom_desc->Size), -+ buffer); - if (status) - break; - -@@ -768,7 +781,7 @@ static int check_i2c_image(struct edgeport_serial *serial) - break; - } - start_address = start_address + sizeof(struct ti_i2c_desc) + -- rom_desc->Size; -+ le16_to_cpu(rom_desc->Size); - - } while ((rom_desc->Type != I2C_DESC_TYPE_ION) && - (start_address < TI_MAX_I2C_SIZE)); -@@ -807,7 +820,7 @@ static int get_manuf_info(struct edgeport_serial *serial, __u8 *buffer) - - /* Read the descriptor data */ - status = read_rom(serial, start_address+sizeof(struct ti_i2c_desc), -- rom_desc->Size, buffer); -+ le16_to_cpu(rom_desc->Size), buffer); - if (status) - goto exit; - -@@ -902,7 +915,7 @@ static int build_i2c_fw_hdr(__u8 *header, struct device *dev) - firmware_rec = (struct ti_i2c_firmware_rec*)i2c_header->Data; - - i2c_header->Type = I2C_DESC_TYPE_FIRMWARE_BLANK; -- i2c_header->Size = (__u16)buffer_size; -+ i2c_header->Size = cpu_to_le16(buffer_size); - i2c_header->CheckSum = cs; - firmware_rec->Ver_Major = OperationalMajorVersion; - firmware_rec->Ver_Minor = OperationalMinorVersion; -@@ -1549,7 +1562,7 @@ static void handle_new_msr(struct edgeport_port *edge_port, __u8 msr) - icount->dcd++; - if (msr & EDGEPORT_MSR_DELTA_RI) - icount->rng++; -- wake_up_interruptible(&edge_port->delta_msr_wait); -+ wake_up_interruptible(&edge_port->port->delta_msr_wait); - } - - /* Save the new modem status */ -@@ -1867,7 +1880,6 @@ static int edge_open(struct tty_struct *tty, struct usb_serial_port *port) - dev = port->serial->dev; - - memset(&(edge_port->icount), 0x00, sizeof(edge_port->icount)); -- init_waitqueue_head(&edge_port->delta_msr_wait); - - /* turn off loopback */ - status = ti_do_config(edge_port, UMPC_SET_CLR_LOOPBACK, 0); -@@ -2553,10 +2565,14 @@ static int edge_ioctl(struct tty_struct *tty, - dbg("%s - (%d) TIOCMIWAIT", __func__, port->number); - cprev = edge_port->icount; - while (1) { -- interruptible_sleep_on(&edge_port->delta_msr_wait); -+ interruptible_sleep_on(&port->delta_msr_wait); - /* see if a signal did it */ - if (signal_pending(current)) - return -ERESTARTSYS; -+ -+ if (port->serial->disconnected) -+ return -EIO; -+ - cnow = edge_port->icount; - if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && - cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) -diff --git a/drivers/usb/serial/io_usbvend.h b/drivers/usb/serial/io_usbvend.h -index 51f83fb..6f6a856 100644 ---- a/drivers/usb/serial/io_usbvend.h -+++ b/drivers/usb/serial/io_usbvend.h -@@ -594,7 +594,7 @@ struct edge_boot_descriptor { - - struct ti_i2c_desc { - __u8 Type; // Type of descriptor -- __u16 Size; // Size of data only not including header -+ __le16 Size; // Size of data only not including header - __u8 CheckSum; // Checksum (8 bit sum of data only) - __u8 Data[0]; // Data starts here - } __attribute__((packed)); -diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c -index 253bff6..66d806e 100644 ---- a/drivers/usb/serial/keyspan.c -+++ b/drivers/usb/serial/keyspan.c -@@ -2486,7 +2486,7 @@ static int keyspan_startup(struct usb_serial *serial) - if (d_details == NULL) { - dev_err(&serial->dev->dev, "%s - unknown product id %x\n", - __func__, le16_to_cpu(serial->dev->descriptor.idProduct)); -- return 1; -+ return -ENODEV; - } - - /* Setup private data for serial driver */ -diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c -index 933dd07..954fb86 100644 ---- a/drivers/usb/serial/mct_u232.c -+++ b/drivers/usb/serial/mct_u232.c -@@ -126,8 +126,6 @@ struct mct_u232_private { - unsigned char last_msr; /* Modem Status Register */ - unsigned int rx_flags; /* Throttling flags */ - struct async_icount icount; -- wait_queue_head_t msr_wait; /* for handling sleeping while waiting -- for msr change to happen */ - }; - - #define THROTTLED 0x01 -@@ -407,7 +405,6 @@ static int mct_u232_startup(struct usb_serial *serial) - if (!priv) - return -ENOMEM; - spin_lock_init(&priv->lock); -- init_waitqueue_head(&priv->msr_wait); - usb_set_serial_port_data(serial->port[0], priv); - - init_waitqueue_head(&serial->port[0]->write_wait); -@@ -631,7 +628,7 @@ static void mct_u232_read_int_callback(struct urb *urb) - tty_kref_put(tty); - } - #endif -- wake_up_interruptible(&priv->msr_wait); -+ wake_up_interruptible(&port->delta_msr_wait); - spin_unlock_irqrestore(&priv->lock, flags); - exit: - retval = usb_submit_urb(urb, GFP_ATOMIC); -@@ -852,13 +849,17 @@ static int mct_u232_ioctl(struct tty_struct *tty, - cprev = mct_u232_port->icount; - spin_unlock_irqrestore(&mct_u232_port->lock, flags); - for ( ; ; ) { -- prepare_to_wait(&mct_u232_port->msr_wait, -+ prepare_to_wait(&port->delta_msr_wait, - &wait, TASK_INTERRUPTIBLE); - schedule(); -- finish_wait(&mct_u232_port->msr_wait, &wait); -+ finish_wait(&port->delta_msr_wait, &wait); - /* see if a signal did it */ - if (signal_pending(current)) - return -ERESTARTSYS; -+ -+ if (port->serial->disconnected) -+ return -EIO; -+ - spin_lock_irqsave(&mct_u232_port->lock, flags); - cnow = mct_u232_port->icount; - spin_unlock_irqrestore(&mct_u232_port->lock, flags); -diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c -index c854235..947b866 100644 ---- a/drivers/usb/serial/mos7840.c -+++ b/drivers/usb/serial/mos7840.c -@@ -185,6 +185,10 @@ - #define URB_TRANSFER_BUFFER_SIZE 32 /* URB Size */ - - -+enum mos7840_flag { -+ MOS7840_FLAG_CTRL_BUSY, -+}; -+ - static const struct usb_device_id moschip_port_id_table[] = { - {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7840)}, - {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)}, -@@ -240,7 +244,6 @@ struct moschip_port { - char open; - char open_ports; - wait_queue_head_t wait_chase; /* for handling sleeping while waiting for chase to finish */ -- wait_queue_head_t delta_msr_wait; /* for handling sleeping while waiting for msr change to happen */ - int delta_msr_cond; - struct async_icount icount; - struct usb_serial_port *port; /* loop back to the owner of this object */ -@@ -259,6 +262,8 @@ struct moschip_port { - struct urb *write_urb_pool[NUM_URBS]; - char busy[NUM_URBS]; - bool read_urb_busy; -+ -+ unsigned long flags; - }; - - -@@ -453,6 +458,9 @@ static void mos7840_handle_new_msr(struct moschip_port *port, __u8 new_msr) - icount->rng++; - smp_wmb(); - } -+ -+ mos7840_port->delta_msr_cond = 1; -+ wake_up_interruptible(&port->port->delta_msr_wait); - } - } - -@@ -517,11 +525,11 @@ static void mos7840_control_callback(struct urb *urb) - /* this urb is terminated, clean up */ - dbg("%s - urb shutting down with status: %d", __func__, - status); -- return; -+ goto out; - default: - dbg("%s - nonzero urb status received: %d", __func__, - status); -- return; -+ goto out; - } - - dbg("%s urb buffer size is %d", __func__, urb->actual_length); -@@ -534,6 +542,8 @@ static void mos7840_control_callback(struct urb *urb) - mos7840_handle_new_msr(mos7840_port, regval); - else if (mos7840_port->MsrLsr == 1) - mos7840_handle_new_lsr(mos7840_port, regval); -+out: -+ clear_bit_unlock(MOS7840_FLAG_CTRL_BUSY, &mos7840_port->flags); - } - - static int mos7840_get_reg(struct moschip_port *mcs, __u16 Wval, __u16 reg, -@@ -544,6 +554,9 @@ static int mos7840_get_reg(struct moschip_port *mcs, __u16 Wval, __u16 reg, - unsigned char *buffer = mcs->ctrl_buf; - int ret; - -+ if (test_and_set_bit_lock(MOS7840_FLAG_CTRL_BUSY, &mcs->flags)) -+ return -EBUSY; -+ - dr->bRequestType = MCS_RD_RTYPE; - dr->bRequest = MCS_RDREQ; - dr->wValue = cpu_to_le16(Wval); /* 0 */ -@@ -555,6 +568,9 @@ static int mos7840_get_reg(struct moschip_port *mcs, __u16 Wval, __u16 reg, - mos7840_control_callback, mcs); - mcs->control_urb->transfer_buffer_length = 2; - ret = usb_submit_urb(mcs->control_urb, GFP_ATOMIC); -+ if (ret) -+ clear_bit_unlock(MOS7840_FLAG_CTRL_BUSY, &mcs->flags); -+ - return ret; - } - -@@ -921,20 +937,20 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) - status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data); - if (status < 0) { - dbg("Reading Spreg failed"); -- return -1; -+ goto err; - } - Data |= 0x80; - status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); - if (status < 0) { - dbg("writing Spreg failed"); -- return -1; -+ goto err; - } - - Data &= ~0x80; - status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); - if (status < 0) { - dbg("writing Spreg failed"); -- return -1; -+ goto err; - } - /* End of block to be checked */ - -@@ -943,7 +959,7 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) - &Data); - if (status < 0) { - dbg("Reading Controlreg failed"); -- return -1; -+ goto err; - } - Data |= 0x08; /* Driver done bit */ - Data |= 0x20; /* rx_disable */ -@@ -951,7 +967,7 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) - mos7840_port->ControlRegOffset, Data); - if (status < 0) { - dbg("writing Controlreg failed"); -- return -1; -+ goto err; - } - /* do register settings here */ - /* Set all regs to the device default values. */ -@@ -962,21 +978,21 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) - status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); - if (status < 0) { - dbg("disabling interrupts failed"); -- return -1; -+ goto err; - } - /* Set FIFO_CONTROL_REGISTER to the default value */ - Data = 0x00; - status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); - if (status < 0) { - dbg("Writing FIFO_CONTROL_REGISTER failed"); -- return -1; -+ goto err; - } - - Data = 0xcf; - status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); - if (status < 0) { - dbg("Writing FIFO_CONTROL_REGISTER failed"); -- return -1; -+ goto err; - } - - Data = 0x03; -@@ -1113,7 +1129,6 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) - - /* initialize our wait queues */ - init_waitqueue_head(&mos7840_port->wait_chase); -- init_waitqueue_head(&mos7840_port->delta_msr_wait); - - /* initialize our icount structure */ - memset(&(mos7840_port->icount), 0x00, sizeof(mos7840_port->icount)); -@@ -1133,7 +1148,15 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) - dbg ("%s leave", __func__); - - return 0; -- -+err: -+ for (j = 0; j < NUM_URBS; ++j) { -+ urb = mos7840_port->write_urb_pool[j]; -+ if (!urb) -+ continue; -+ kfree(urb->transfer_buffer); -+ usb_free_urb(urb); -+ } -+ return status; - } - - /***************************************************************************** -@@ -1664,7 +1687,11 @@ static int mos7840_tiocmget(struct tty_struct *tty) - return -ENODEV; - - status = mos7840_get_uart_reg(port, MODEM_STATUS_REGISTER, &msr); -+ if (status != 1) -+ return -EIO; - status = mos7840_get_uart_reg(port, MODEM_CONTROL_REGISTER, &mcr); -+ if (status != 1) -+ return -EIO; - result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0) - | ((mcr & MCR_RTS) ? TIOCM_RTS : 0) - | ((mcr & MCR_LOOPBACK) ? TIOCM_LOOP : 0) -@@ -1958,25 +1985,25 @@ static void mos7840_change_port_settings(struct tty_struct *tty, - iflag = tty->termios->c_iflag; - - /* Change the number of bits */ -- if (cflag & CSIZE) { -- switch (cflag & CSIZE) { -- case CS5: -- lData = LCR_BITS_5; -- break; -+ switch (cflag & CSIZE) { -+ case CS5: -+ lData = LCR_BITS_5; -+ break; - -- case CS6: -- lData = LCR_BITS_6; -- break; -+ case CS6: -+ lData = LCR_BITS_6; -+ break; - -- case CS7: -- lData = LCR_BITS_7; -- break; -- default: -- case CS8: -- lData = LCR_BITS_8; -- break; -- } -+ case CS7: -+ lData = LCR_BITS_7; -+ break; -+ -+ default: -+ case CS8: -+ lData = LCR_BITS_8; -+ break; - } -+ - /* Change the Parity bit */ - if (cflag & PARENB) { - if (cflag & PARODD) { -@@ -2070,8 +2097,6 @@ static void mos7840_change_port_settings(struct tty_struct *tty, - mos7840_port->read_urb_busy = false; - } - } -- wake_up(&mos7840_port->delta_msr_wait); -- mos7840_port->delta_msr_cond = 1; - dbg("mos7840_change_port_settings mos7840_port->shadowLCR is End %x", - mos7840_port->shadowLCR); - } -@@ -2280,13 +2305,18 @@ static int mos7840_ioctl(struct tty_struct *tty, - while (1) { - /* interruptible_sleep_on(&mos7840_port->delta_msr_wait); */ - mos7840_port->delta_msr_cond = 0; -- wait_event_interruptible(mos7840_port->delta_msr_wait, -- (mos7840_port-> -+ wait_event_interruptible(port->delta_msr_wait, -+ (port->serial->disconnected || -+ mos7840_port-> - delta_msr_cond == 1)); - - /* see if a signal did it */ - if (signal_pending(current)) - return -ERESTARTSYS; -+ -+ if (port->serial->disconnected) -+ return -EIO; -+ - cnow = mos7840_port->icount; - smp_rmb(); - if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && -diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c -index 9def72f..703ebe7 100644 ---- a/drivers/usb/serial/option.c -+++ b/drivers/usb/serial/option.c -@@ -85,6 +85,7 @@ static void option_instat_callback(struct urb *urb); - #define HUAWEI_PRODUCT_K4505 0x1464 - #define HUAWEI_PRODUCT_K3765 0x1465 - #define HUAWEI_PRODUCT_K4605 0x14C6 -+#define HUAWEI_PRODUCT_E173S6 0x1C07 - - #define QUANTA_VENDOR_ID 0x0408 - #define QUANTA_PRODUCT_Q101 0xEA02 -@@ -160,6 +161,7 @@ static void option_instat_callback(struct urb *urb); - #define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED 0x9000 - #define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED 0x9001 - #define NOVATELWIRELESS_PRODUCT_E362 0x9010 -+#define NOVATELWIRELESS_PRODUCT_E371 0x9011 - #define NOVATELWIRELESS_PRODUCT_G2 0xA010 - #define NOVATELWIRELESS_PRODUCT_MC551 0xB001 - -@@ -233,8 +235,31 @@ static void option_instat_callback(struct urb *urb); - #define QUALCOMM_VENDOR_ID 0x05C6 - - #define CMOTECH_VENDOR_ID 0x16d8 --#define CMOTECH_PRODUCT_6008 0x6008 --#define CMOTECH_PRODUCT_6280 0x6280 -+#define CMOTECH_PRODUCT_6001 0x6001 -+#define CMOTECH_PRODUCT_CMU_300 0x6002 -+#define CMOTECH_PRODUCT_6003 0x6003 -+#define CMOTECH_PRODUCT_6004 0x6004 -+#define CMOTECH_PRODUCT_6005 0x6005 -+#define CMOTECH_PRODUCT_CGU_628A 0x6006 -+#define CMOTECH_PRODUCT_CHE_628S 0x6007 -+#define CMOTECH_PRODUCT_CMU_301 0x6008 -+#define CMOTECH_PRODUCT_CHU_628 0x6280 -+#define CMOTECH_PRODUCT_CHU_628S 0x6281 -+#define CMOTECH_PRODUCT_CDU_680 0x6803 -+#define CMOTECH_PRODUCT_CDU_685A 0x6804 -+#define CMOTECH_PRODUCT_CHU_720S 0x7001 -+#define CMOTECH_PRODUCT_7002 0x7002 -+#define CMOTECH_PRODUCT_CHU_629K 0x7003 -+#define CMOTECH_PRODUCT_7004 0x7004 -+#define CMOTECH_PRODUCT_7005 0x7005 -+#define CMOTECH_PRODUCT_CGU_629 0x7006 -+#define CMOTECH_PRODUCT_CHU_629S 0x700a -+#define CMOTECH_PRODUCT_CHU_720I 0x7211 -+#define CMOTECH_PRODUCT_7212 0x7212 -+#define CMOTECH_PRODUCT_7213 0x7213 -+#define CMOTECH_PRODUCT_7251 0x7251 -+#define CMOTECH_PRODUCT_7252 0x7252 -+#define CMOTECH_PRODUCT_7253 0x7253 - - #define TELIT_VENDOR_ID 0x1bc7 - #define TELIT_PRODUCT_UC864E 0x1003 -@@ -242,6 +267,7 @@ static void option_instat_callback(struct urb *urb); - #define TELIT_PRODUCT_CC864_DUAL 0x1005 - #define TELIT_PRODUCT_CC864_SINGLE 0x1006 - #define TELIT_PRODUCT_DE910_DUAL 0x1010 -+#define TELIT_PRODUCT_UE910_V2 0x1012 - #define TELIT_PRODUCT_LE920 0x1200 - - /* ZTE PRODUCTS */ -@@ -290,6 +316,7 @@ static void option_instat_callback(struct urb *urb); - #define ALCATEL_PRODUCT_X060S_X200 0x0000 - #define ALCATEL_PRODUCT_X220_X500D 0x0017 - #define ALCATEL_PRODUCT_L100V 0x011e -+#define ALCATEL_PRODUCT_L800MA 0x0203 - - #define PIRELLI_VENDOR_ID 0x1266 - #define PIRELLI_PRODUCT_C100_1 0x1002 -@@ -324,9 +351,15 @@ static void option_instat_callback(struct urb *urb); - * It seems to contain a Qualcomm QSC6240/6290 chipset */ - #define FOUR_G_SYSTEMS_PRODUCT_W14 0x9603 - -+/* iBall 3.5G connect wireless modem */ -+#define IBALL_3_5G_CONNECT 0x9605 -+ - /* Zoom */ - #define ZOOM_PRODUCT_4597 0x9607 - -+/* SpeedUp SU9800 usb 3g modem */ -+#define SPEEDUP_PRODUCT_SU9800 0x9800 -+ - /* Haier products */ - #define HAIER_VENDOR_ID 0x201e - #define HAIER_PRODUCT_CE100 0x2009 -@@ -347,8 +380,13 @@ static void option_instat_callback(struct urb *urb); - /* Olivetti products */ - #define OLIVETTI_VENDOR_ID 0x0b3c - #define OLIVETTI_PRODUCT_OLICARD100 0xc000 -+#define OLIVETTI_PRODUCT_OLICARD120 0xc001 -+#define OLIVETTI_PRODUCT_OLICARD140 0xc002 - #define OLIVETTI_PRODUCT_OLICARD145 0xc003 -+#define OLIVETTI_PRODUCT_OLICARD155 0xc004 - #define OLIVETTI_PRODUCT_OLICARD200 0xc005 -+#define OLIVETTI_PRODUCT_OLICARD160 0xc00a -+#define OLIVETTI_PRODUCT_OLICARD500 0xc00b - - /* Celot products */ - #define CELOT_VENDOR_ID 0x211f -@@ -457,6 +495,14 @@ static void option_instat_callback(struct urb *urb); - #define CHANGHONG_VENDOR_ID 0x2077 - #define CHANGHONG_PRODUCT_CH690 0x7001 - -+/* Inovia */ -+#define INOVIA_VENDOR_ID 0x20a6 -+#define INOVIA_SEW858 0x1105 -+ -+/* VIA Telecom */ -+#define VIATELECOM_VENDOR_ID 0x15eb -+#define VIATELECOM_PRODUCT_CDS7 0x0001 -+ - /* some devices interfaces need special handling due to a number of reasons */ - enum option_blacklist_reason { - OPTION_BLACKLIST_NONE = 0, -@@ -506,6 +552,10 @@ static const struct option_blacklist_info huawei_cdc12_blacklist = { - .reserved = BIT(1) | BIT(2), - }; - -+static const struct option_blacklist_info net_intf0_blacklist = { -+ .reserved = BIT(0), -+}; -+ - static const struct option_blacklist_info net_intf1_blacklist = { - .reserved = BIT(1), - }; -@@ -582,6 +632,8 @@ static const struct usb_device_id option_ids[] = { - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c23, USB_CLASS_COMM, 0x02, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173, 0xff, 0xff, 0xff), - .driver_info = (kernel_ulong_t) &net_intf1_blacklist }, -+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173S6, 0xff, 0xff, 0xff), -+ .driver_info = (kernel_ulong_t) &net_intf1_blacklist }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1750, 0xff, 0xff, 0xff), - .driver_info = (kernel_ulong_t) &net_intf2_blacklist }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1441, USB_CLASS_COMM, 0x02, 0xff) }, -@@ -644,6 +696,10 @@ static const struct usb_device_id option_ids[] = { - { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6D) }, - { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6E) }, - { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6F) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x72) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x73) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x74) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x75) }, - { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x78) }, - { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x79) }, - { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x7A) }, -@@ -698,11 +754,247 @@ static const struct usb_device_id option_ids[] = { - { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6D) }, - { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6E) }, - { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6F) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x72) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x73) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x74) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x75) }, - { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x78) }, - { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x79) }, - { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7A) }, - { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7B) }, - { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7C) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x01) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x02) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x03) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x04) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x05) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x06) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x0A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x0B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x0D) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x0E) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x0F) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x10) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x12) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x13) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x14) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x15) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x17) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x18) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x19) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x1A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x1B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x1C) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x31) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x32) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x33) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x34) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x35) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x36) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x3A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x3B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x3D) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x3E) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x3F) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x48) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x49) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x4A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x4B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x4C) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x61) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x62) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x63) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x64) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x65) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x66) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6D) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6E) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6F) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x72) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x73) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x74) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x75) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x78) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x79) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x7A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x7B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x7C) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x01) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x02) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x03) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x04) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x05) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x06) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x0A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x0B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x0D) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x0E) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x0F) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x10) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x12) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x13) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x14) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x15) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x17) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x18) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x19) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x1A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x1B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x1C) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x31) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x32) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x33) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x34) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x35) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x36) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x3A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x3B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x3D) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x3E) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x3F) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x48) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x49) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x4A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x4B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x4C) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x61) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x62) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x63) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x64) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x65) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x66) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6D) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6E) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6F) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x72) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x73) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x74) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x75) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x78) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x79) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x7A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x7B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x7C) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x01) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x02) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x03) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x04) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x05) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x06) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x0A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x0B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x0D) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x0E) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x0F) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x10) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x12) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x13) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x14) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x15) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x17) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x18) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x19) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x1A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x1B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x1C) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x31) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x32) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x33) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x34) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x35) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x36) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x3A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x3B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x3D) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x3E) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x3F) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x48) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x49) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x4A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x4B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x4C) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x61) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x62) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x63) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x64) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x65) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x66) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6D) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6E) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6F) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x72) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x73) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x74) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x75) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x78) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x79) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x7A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x7B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x7C) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x01) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x02) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x03) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x04) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x05) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x06) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x0A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x0B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x0D) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x0E) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x0F) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x10) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x12) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x13) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x14) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x15) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x17) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x18) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x19) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x1A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x1B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x1C) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x31) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x32) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x33) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x34) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x35) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x36) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x3A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x3B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x3D) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x3E) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x3F) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x48) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x49) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x4A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x4B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x4C) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x61) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x62) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x63) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x64) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x65) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x66) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6D) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6E) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6F) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x72) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x73) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x74) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x75) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x78) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x79) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7A) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7B) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7C) }, - - - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, -@@ -745,6 +1037,7 @@ static const struct usb_device_id option_ids[] = { - /* Novatel Ovation MC551 a.k.a. Verizon USB551L */ - { USB_DEVICE_AND_INTERFACE_INFO(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC551, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_E362, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_E371, 0xff, 0xff, 0xff) }, - - { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01) }, - { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01A) }, -@@ -798,13 +1091,53 @@ static const struct usb_device_id option_ids[] = { - { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ - { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ - { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ -- { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ -- { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), -+ .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6004) }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6005) }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CGU_628A) }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHE_628S), -+ .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_301), -+ .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_628), -+ .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_628S) }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CDU_680) }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CDU_685A) }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_720S), -+ .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7002), -+ .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_629K), -+ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7004), -+ .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7005) }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CGU_629), -+ .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_629S), -+ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_720I), -+ .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7212), -+ .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7213), -+ .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7251), -+ .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7252), -+ .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, -+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7253), -+ .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, - { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, - { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, - { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_DUAL) }, - { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_SINGLE) }, - { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_DE910_DUAL) }, -+ { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UE910_V2) }, - { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920), - .driver_info = (kernel_ulong_t)&telit_le920_blacklist }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ -@@ -1126,7 +1459,8 @@ static const struct usb_device_id option_ids[] = { - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1267, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1268, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1269, 0xff, 0xff, 0xff) }, -- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1270, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1270, 0xff, 0xff, 0xff), -+ .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1271, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1272, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1273, 0xff, 0xff, 0xff) }, -@@ -1171,6 +1505,25 @@ static const struct usb_device_id option_ids[] = { - .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1426, 0xff, 0xff, 0xff), /* ZTE MF91 */ - .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1428, 0xff, 0xff, 0xff), /* Telewell TW-LTE 4G v2 */ -+ .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1533, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1534, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1535, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1545, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1546, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1547, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1565, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1566, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1567, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1589, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1590, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1591, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1592, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1594, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1596, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1598, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1600, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, - 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_k3765_z_blacklist }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) }, -@@ -1197,6 +1550,17 @@ static const struct usb_device_id option_ids[] = { - .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff), - .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffe9, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8b, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8c, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8d, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8e, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8f, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff90, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff91, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff92, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff93, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff94, 0xff, 0xff, 0xff) }, - - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, -@@ -1239,12 +1603,16 @@ static const struct usb_device_id option_ids[] = { - .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, - { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_L100V), - .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, -+ { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_L800MA), -+ .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, - { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, - { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, - { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14), - .driver_info = (kernel_ulong_t)&four_g_w14_blacklist - }, -+ { USB_DEVICE_INTERFACE_CLASS(LONGCHEER_VENDOR_ID, SPEEDUP_PRODUCT_SU9800, 0xff) }, - { USB_DEVICE(LONGCHEER_VENDOR_ID, ZOOM_PRODUCT_4597) }, -+ { USB_DEVICE(LONGCHEER_VENDOR_ID, IBALL_3_5G_CONNECT) }, - { USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) }, - /* Pirelli */ - { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_1)}, -@@ -1266,7 +1634,8 @@ static const struct usb_device_id option_ids[] = { - /* Cinterion */ - { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) }, - { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) }, -- { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8) }, -+ { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8), -+ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, - { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AHXX) }, - { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLXX), - .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, -@@ -1276,10 +1645,21 @@ static const struct usb_device_id option_ids[] = { - { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDMNET) }, - { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) }, /* HC28 enumerates with Siemens or Cinterion VID depending on FW revision */ - { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) }, -- -- { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) }, -+ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100), -+ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, -+ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD120), -+ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, -+ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD140), -+ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, - { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD145) }, -- { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD200) }, -+ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD155), -+ .driver_info = (kernel_ulong_t)&net_intf6_blacklist }, -+ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD200), -+ .driver_info = (kernel_ulong_t)&net_intf6_blacklist }, -+ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD160), -+ .driver_info = (kernel_ulong_t)&net_intf6_blacklist }, -+ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD500), -+ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, - { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ - { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ - { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM600) }, -@@ -1367,6 +1747,8 @@ static const struct usb_device_id option_ids[] = { - { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) }, - { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */ - { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */ -+ { USB_DEVICE(INOVIA_VENDOR_ID, INOVIA_SEW858) }, -+ { USB_DEVICE(VIATELECOM_VENDOR_ID, VIATELECOM_PRODUCT_CDS7) }, - { } /* Terminating entry */ - }; - MODULE_DEVICE_TABLE(usb, option_ids); -@@ -1569,6 +1951,7 @@ static int option_send_setup(struct usb_serial_port *port) - struct usb_wwan_port_private *portdata; - int ifNum = serial->interface->cur_altsetting->desc.bInterfaceNumber; - int val = 0; -+ int res; - dbg("%s", __func__); - - if (is_blacklisted(ifNum, OPTION_BLACKLIST_SENDSETUP, -@@ -1584,9 +1967,17 @@ static int option_send_setup(struct usb_serial_port *port) - if (portdata->rts_state) - val |= 0x02; - -- return usb_control_msg(serial->dev, -- usb_rcvctrlpipe(serial->dev, 0), -- 0x22, 0x21, val, ifNum, NULL, 0, USB_CTRL_SET_TIMEOUT); -+ res = usb_autopm_get_interface(serial->interface); -+ if (res) -+ return res; -+ -+ res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), -+ 0x22, 0x21, val, ifNum, NULL, -+ 0, USB_CTRL_SET_TIMEOUT); -+ -+ usb_autopm_put_interface(serial->interface); -+ -+ return res; - } - - MODULE_AUTHOR(DRIVER_AUTHOR); -diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c -index 5fdc33c..bddc9f1 100644 ---- a/drivers/usb/serial/oti6858.c -+++ b/drivers/usb/serial/oti6858.c -@@ -198,7 +198,6 @@ struct oti6858_private { - u8 setup_done; - struct delayed_work delayed_setup_work; - -- wait_queue_head_t intr_wait; - struct usb_serial_port *port; /* USB port with which associated */ - }; - -@@ -356,7 +355,6 @@ static int oti6858_startup(struct usb_serial *serial) - break; - - spin_lock_init(&priv->lock); -- init_waitqueue_head(&priv->intr_wait); - /* INIT_WORK(&priv->setup_work, setup_line, serial->port[i]); */ - /* INIT_WORK(&priv->write_work, send_data, serial->port[i]); */ - priv->port = port; -@@ -703,11 +701,15 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) - spin_unlock_irqrestore(&priv->lock, flags); - - while (1) { -- wait_event_interruptible(priv->intr_wait, -+ wait_event_interruptible(port->delta_msr_wait, -+ port->serial->disconnected || - priv->status.pin_state != prev); - if (signal_pending(current)) - return -ERESTARTSYS; - -+ if (port->serial->disconnected) -+ return -EIO; -+ - spin_lock_irqsave(&priv->lock, flags); - status = priv->status.pin_state & PIN_MASK; - spin_unlock_irqrestore(&priv->lock, flags); -@@ -819,7 +821,7 @@ static void oti6858_read_int_callback(struct urb *urb) - - if (!priv->transient) { - if (xs->pin_state != priv->status.pin_state) -- wake_up_interruptible(&priv->intr_wait); -+ wake_up_interruptible(&port->delta_msr_wait); - memcpy(&priv->status, xs, OTI6858_CTRL_PKT_SIZE); - } - -diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c -index a1a9062..3e450b4 100644 ---- a/drivers/usb/serial/pl2303.c -+++ b/drivers/usb/serial/pl2303.c -@@ -51,6 +51,7 @@ static const struct usb_device_id id_table[] = { - { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) }, - { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) }, - { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) }, -+ { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ZTEK) }, - { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, - { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) }, - { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) }, -@@ -86,6 +87,9 @@ static const struct usb_device_id id_table[] = { - { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) }, - { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) }, - { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, -+ { USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) }, -+ { USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) }, -+ { USB_DEVICE(HP_VENDOR_ID, HP_LCM960_PRODUCT_ID) }, - { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) }, - { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) }, - { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) }, -@@ -149,7 +153,6 @@ enum pl2303_type { - - struct pl2303_private { - spinlock_t lock; -- wait_queue_head_t delta_msr_wait; - u8 line_control; - u8 line_status; - enum pl2303_type type; -@@ -203,7 +206,6 @@ static int pl2303_startup(struct usb_serial *serial) - if (!priv) - goto cleanup; - spin_lock_init(&priv->lock); -- init_waitqueue_head(&priv->delta_msr_wait); - priv->type = type; - usb_set_serial_port_data(serial->port[i], priv); - } -@@ -271,7 +273,7 @@ static void pl2303_set_termios(struct tty_struct *tty, - serial settings even to the same values as before. Thus - we actually need to filter in this specific case */ - -- if (!tty_termios_hw_change(tty->termios, old_termios)) -+ if (old_termios && !tty_termios_hw_change(tty->termios, old_termios)) - return; - - cflag = tty->termios->c_cflag; -@@ -280,7 +282,8 @@ static void pl2303_set_termios(struct tty_struct *tty, - if (!buf) { - dev_err(&port->dev, "%s - out of memory.\n", __func__); - /* Report back no change occurred */ -- *tty->termios = *old_termios; -+ if (old_termios) -+ *tty->termios = *old_termios; - return; - } - -@@ -290,24 +293,22 @@ static void pl2303_set_termios(struct tty_struct *tty, - dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i, - buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); - -- if (cflag & CSIZE) { -- switch (cflag & CSIZE) { -- case CS5: -- buf[6] = 5; -- break; -- case CS6: -- buf[6] = 6; -- break; -- case CS7: -- buf[6] = 7; -- break; -- default: -- case CS8: -- buf[6] = 8; -- break; -- } -- dbg("%s - data bits = %d", __func__, buf[6]); -+ switch (cflag & CSIZE) { -+ case CS5: -+ buf[6] = 5; -+ break; -+ case CS6: -+ buf[6] = 6; -+ break; -+ case CS7: -+ buf[6] = 7; -+ break; -+ default: -+ case CS8: -+ buf[6] = 8; -+ break; - } -+ dbg("%s - data bits = %d", __func__, buf[6]); - - /* For reference buf[0]:buf[3] baud rate value */ - /* NOTE: Only the values defined in baud_sup are supported ! -@@ -420,7 +421,7 @@ static void pl2303_set_termios(struct tty_struct *tty, - control = priv->line_control; - if ((cflag & CBAUD) == B0) - priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS); -- else if ((old_termios->c_cflag & CBAUD) == B0) -+ else if (old_termios && (old_termios->c_cflag & CBAUD) == B0) - priv->line_control |= (CONTROL_DTR | CONTROL_RTS); - if (control != priv->line_control) { - control = priv->line_control; -@@ -481,7 +482,6 @@ static void pl2303_close(struct usb_serial_port *port) - - static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port) - { -- struct ktermios tmp_termios; - struct usb_serial *serial = port->serial; - struct pl2303_private *priv = usb_get_serial_port_data(port); - int result; -@@ -499,7 +499,7 @@ static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port) - - /* Setup termios */ - if (tty) -- pl2303_set_termios(tty, port, &tmp_termios); -+ pl2303_set_termios(tty, port, NULL); - - dbg("%s - submitting interrupt urb", __func__); - result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); -@@ -597,11 +597,14 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) - spin_unlock_irqrestore(&priv->lock, flags); - - while (1) { -- interruptible_sleep_on(&priv->delta_msr_wait); -+ interruptible_sleep_on(&port->delta_msr_wait); - /* see if a signal did it */ - if (signal_pending(current)) - return -ERESTARTSYS; - -+ if (port->serial->disconnected) -+ return -EIO; -+ - spin_lock_irqsave(&priv->lock, flags); - status = priv->line_status; - spin_unlock_irqrestore(&priv->lock, flags); -@@ -723,7 +726,7 @@ static void pl2303_update_line_status(struct usb_serial_port *port, - spin_unlock_irqrestore(&priv->lock, flags); - if (priv->line_status & UART_BREAK_ERROR) - usb_serial_handle_break(port); -- wake_up_interruptible(&priv->delta_msr_wait); -+ wake_up_interruptible(&port->delta_msr_wait); - - tty = tty_port_tty_get(&port->port); - if (!tty) -@@ -790,7 +793,7 @@ static void pl2303_process_read_urb(struct urb *urb) - line_status = priv->line_status; - priv->line_status &= ~UART_STATE_TRANSIENT_MASK; - spin_unlock_irqrestore(&priv->lock, flags); -- wake_up_interruptible(&priv->delta_msr_wait); -+ wake_up_interruptible(&port->delta_msr_wait); - - if (!urb->actual_length) - return; -diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h -index c38b8c0..71fd9da 100644 ---- a/drivers/usb/serial/pl2303.h -+++ b/drivers/usb/serial/pl2303.h -@@ -22,6 +22,7 @@ - #define PL2303_PRODUCT_ID_GPRS 0x0609 - #define PL2303_PRODUCT_ID_HCR331 0x331a - #define PL2303_PRODUCT_ID_MOTOROLA 0x0307 -+#define PL2303_PRODUCT_ID_ZTEK 0xe1f1 - - #define ATEN_VENDOR_ID 0x0557 - #define ATEN_VENDOR_ID2 0x0547 -@@ -121,8 +122,11 @@ - #define SUPERIAL_VENDOR_ID 0x5372 - #define SUPERIAL_PRODUCT_ID 0x2303 - --/* Hewlett-Packard LD220-HP POS Pole Display */ -+/* Hewlett-Packard POS Pole Displays */ - #define HP_VENDOR_ID 0x03f0 -+#define HP_LD960_PRODUCT_ID 0x0b39 -+#define HP_LCM220_PRODUCT_ID 0x3139 -+#define HP_LCM960_PRODUCT_ID 0x3239 - #define HP_LD220_PRODUCT_ID 0x3524 - - /* Cressi Edy (diving computer) PC interface */ -diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c -index 8ec15c2..e3ddec0 100644 ---- a/drivers/usb/serial/sierra.c -+++ b/drivers/usb/serial/sierra.c -@@ -59,6 +59,7 @@ struct sierra_intf_private { - spinlock_t susp_lock; - unsigned int suspended:1; - int in_flight; -+ unsigned int open_ports; - }; - - static int sierra_set_power_state(struct usb_device *udev, __u16 swiState) -@@ -295,17 +296,21 @@ static const struct usb_device_id id_table[] = { - { USB_DEVICE(0x1199, 0x68A2), /* Sierra Wireless MC77xx in QMI mode */ - .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist - }, -- { USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless Direct IP modems */ -+ /* Sierra Wireless Direct IP modems */ -+ { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x68A3, 0xFF, 0xFF, 0xFF), -+ .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist -+ }, -+ { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x68AA, 0xFF, 0xFF, 0xFF), - .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist - }, - /* AT&T Direct IP LTE modems */ - { USB_DEVICE_AND_INTERFACE_INFO(0x0F3D, 0x68AA, 0xFF, 0xFF, 0xFF), - .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist - }, -- { USB_DEVICE(0x0f3d, 0x68A3), /* Airprime/Sierra Wireless Direct IP modems */ -+ /* Airprime/Sierra Wireless Direct IP modems */ -+ { USB_DEVICE_AND_INTERFACE_INFO(0x0F3D, 0x68A3, 0xFF, 0xFF, 0xFF), - .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist - }, -- { USB_DEVICE(0x413C, 0x08133) }, /* Dell Computer Corp. Wireless 5720 VZW Mobile Broadband (EVDO Rev-A) Minicard GPS Port */ - - { } - }; -@@ -802,6 +807,7 @@ static void sierra_close(struct usb_serial_port *port) - struct usb_serial *serial = port->serial; - struct sierra_port_private *portdata; - struct sierra_intf_private *intfdata = port->serial->private; -+ struct urb *urb; - - - dev_dbg(&port->dev, "%s\n", __func__); -@@ -813,7 +819,6 @@ static void sierra_close(struct usb_serial_port *port) - if (serial->dev) { - mutex_lock(&serial->disc_mutex); - if (!serial->disconnected) { -- serial->interface->needs_remote_wakeup = 0; - /* odd error handling due to pm counters */ - if (!usb_autopm_get_interface(serial->interface)) - sierra_send_setup(port); -@@ -824,8 +829,21 @@ static void sierra_close(struct usb_serial_port *port) - mutex_unlock(&serial->disc_mutex); - spin_lock_irq(&intfdata->susp_lock); - portdata->opened = 0; -+ if (--intfdata->open_ports == 0) -+ serial->interface->needs_remote_wakeup = 0; - spin_unlock_irq(&intfdata->susp_lock); - -+ for (;;) { -+ urb = usb_get_from_anchor(&portdata->delayed); -+ if (!urb) -+ break; -+ kfree(urb->transfer_buffer); -+ usb_free_urb(urb); -+ usb_autopm_put_interface_async(serial->interface); -+ spin_lock(&portdata->lock); -+ portdata->outstanding_urbs--; -+ spin_unlock(&portdata->lock); -+ } - - /* Stop reading urbs */ - sierra_stop_rx_urbs(port); -@@ -868,23 +886,29 @@ static int sierra_open(struct tty_struct *tty, struct usb_serial_port *port) - usb_sndbulkpipe(serial->dev, endpoint) | USB_DIR_IN); - - err = sierra_submit_rx_urbs(port, GFP_KERNEL); -- if (err) { -- /* get rid of everything as in close */ -- sierra_close(port); -- /* restore balance for autopm */ -- if (!serial->disconnected) -- usb_autopm_put_interface(serial->interface); -- return err; -- } -+ if (err) -+ goto err_submit; -+ - sierra_send_setup(port); - -- serial->interface->needs_remote_wakeup = 1; - spin_lock_irq(&intfdata->susp_lock); - portdata->opened = 1; -+ if (++intfdata->open_ports == 1) -+ serial->interface->needs_remote_wakeup = 1; - spin_unlock_irq(&intfdata->susp_lock); - usb_autopm_put_interface(serial->interface); - - return 0; -+ -+err_submit: -+ sierra_stop_rx_urbs(port); -+ -+ for (i = 0; i < portdata->num_in_urbs; i++) { -+ sierra_release_urb(portdata->in_urbs[i]); -+ portdata->in_urbs[i] = NULL; -+ } -+ -+ return err; - } - - -@@ -995,6 +1019,7 @@ static void sierra_release(struct usb_serial *serial) - portdata = usb_get_serial_port_data(port); - if (!portdata) - continue; -+ usb_set_serial_port_data(port, NULL); - kfree(portdata); - } - kfree(serial->private); -@@ -1011,6 +1036,8 @@ static void stop_read_write_urbs(struct usb_serial *serial) - for (i = 0; i < serial->num_ports; ++i) { - port = serial->port[i]; - portdata = usb_get_serial_port_data(port); -+ if (!portdata) -+ continue; - sierra_stop_rx_urbs(port); - usb_kill_anchored_urbs(&portdata->active); - } -@@ -1053,6 +1080,9 @@ static int sierra_resume(struct usb_serial *serial) - port = serial->port[i]; - portdata = usb_get_serial_port_data(port); - -+ if (!portdata) -+ continue; -+ - while ((urb = usb_get_from_anchor(&portdata->delayed))) { - usb_anchor_urb(urb, &portdata->active); - intfdata->in_flight++; -@@ -1060,8 +1090,12 @@ static int sierra_resume(struct usb_serial *serial) - if (err < 0) { - intfdata->in_flight--; - usb_unanchor_urb(urb); -- usb_scuttle_anchored_urbs(&portdata->delayed); -- break; -+ kfree(urb->transfer_buffer); -+ usb_free_urb(urb); -+ spin_lock(&portdata->lock); -+ portdata->outstanding_urbs--; -+ spin_unlock(&portdata->lock); -+ continue; - } - } - -diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c -index f06c9a8..692da69 100644 ---- a/drivers/usb/serial/spcp8x5.c -+++ b/drivers/usb/serial/spcp8x5.c -@@ -162,7 +162,6 @@ static struct usb_driver spcp8x5_driver = { - struct spcp8x5_private { - spinlock_t lock; - enum spcp8x5_type type; -- wait_queue_head_t delta_msr_wait; - u8 line_control; - u8 line_status; - }; -@@ -196,7 +195,6 @@ static int spcp8x5_startup(struct usb_serial *serial) - goto cleanup; - - spin_lock_init(&priv->lock); -- init_waitqueue_head(&priv->delta_msr_wait); - priv->type = type; - usb_set_serial_port_data(serial->port[i] , priv); - } -@@ -339,7 +337,6 @@ static void spcp8x5_set_termios(struct tty_struct *tty, - struct spcp8x5_private *priv = usb_get_serial_port_data(port); - unsigned long flags; - unsigned int cflag = tty->termios->c_cflag; -- unsigned int old_cflag = old_termios->c_cflag; - unsigned short uartdata; - unsigned char buf[2] = {0, 0}; - int baud; -@@ -348,15 +345,15 @@ static void spcp8x5_set_termios(struct tty_struct *tty, - - - /* check that they really want us to change something */ -- if (!tty_termios_hw_change(tty->termios, old_termios)) -+ if (old_termios && !tty_termios_hw_change(tty->termios, old_termios)) - return; - - /* set DTR/RTS active */ - spin_lock_irqsave(&priv->lock, flags); - control = priv->line_control; -- if ((old_cflag & CBAUD) == B0) { -+ if (old_termios && (old_termios->c_cflag & CBAUD) == B0) { - priv->line_control |= MCR_DTR; -- if (!(old_cflag & CRTSCTS)) -+ if (!(old_termios->c_cflag & CRTSCTS)) - priv->line_control |= MCR_RTS; - } - if (control != priv->line_control) { -@@ -396,22 +393,20 @@ static void spcp8x5_set_termios(struct tty_struct *tty, - } - - /* Set Data Length : 00:5bit, 01:6bit, 10:7bit, 11:8bit */ -- if (cflag & CSIZE) { -- switch (cflag & CSIZE) { -- case CS5: -- buf[1] |= SET_UART_FORMAT_SIZE_5; -- break; -- case CS6: -- buf[1] |= SET_UART_FORMAT_SIZE_6; -- break; -- case CS7: -- buf[1] |= SET_UART_FORMAT_SIZE_7; -- break; -- default: -- case CS8: -- buf[1] |= SET_UART_FORMAT_SIZE_8; -- break; -- } -+ switch (cflag & CSIZE) { -+ case CS5: -+ buf[1] |= SET_UART_FORMAT_SIZE_5; -+ break; -+ case CS6: -+ buf[1] |= SET_UART_FORMAT_SIZE_6; -+ break; -+ case CS7: -+ buf[1] |= SET_UART_FORMAT_SIZE_7; -+ break; -+ default: -+ case CS8: -+ buf[1] |= SET_UART_FORMAT_SIZE_8; -+ break; - } - - /* Set Stop bit2 : 0:1bit 1:2bit */ -@@ -446,7 +441,6 @@ static void spcp8x5_set_termios(struct tty_struct *tty, - * status of the device. */ - static int spcp8x5_open(struct tty_struct *tty, struct usb_serial_port *port) - { -- struct ktermios tmp_termios; - struct usb_serial *serial = port->serial; - struct spcp8x5_private *priv = usb_get_serial_port_data(port); - int ret; -@@ -469,7 +463,7 @@ static int spcp8x5_open(struct tty_struct *tty, struct usb_serial_port *port) - - /* Setup termios */ - if (tty) -- spcp8x5_set_termios(tty, port, &tmp_termios); -+ spcp8x5_set_termios(tty, port, NULL); - - spcp8x5_get_msr(serial->dev, &status, priv->type); - -@@ -501,7 +495,7 @@ static void spcp8x5_process_read_urb(struct urb *urb) - priv->line_status &= ~UART_STATE_TRANSIENT_MASK; - spin_unlock_irqrestore(&priv->lock, flags); - /* wake up the wait for termios */ -- wake_up_interruptible(&priv->delta_msr_wait); -+ wake_up_interruptible(&port->delta_msr_wait); - - if (!urb->actual_length) - return; -@@ -551,12 +545,15 @@ static int spcp8x5_wait_modem_info(struct usb_serial_port *port, - - while (1) { - /* wake up in bulk read */ -- interruptible_sleep_on(&priv->delta_msr_wait); -+ interruptible_sleep_on(&port->delta_msr_wait); - - /* see if a signal did it */ - if (signal_pending(current)) - return -ERESTARTSYS; - -+ if (port->serial->disconnected) -+ return -EIO; -+ - spin_lock_irqsave(&priv->lock, flags); - status = priv->line_status; - spin_unlock_irqrestore(&priv->lock, flags); -diff --git a/drivers/usb/serial/ssu100.c b/drivers/usb/serial/ssu100.c -index b8db69d..d19fa6a 100644 ---- a/drivers/usb/serial/ssu100.c -+++ b/drivers/usb/serial/ssu100.c -@@ -77,7 +77,6 @@ struct ssu100_port_private { - spinlock_t status_lock; - u8 shadowLSR; - u8 shadowMSR; -- wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */ - struct async_icount icount; - }; - -@@ -386,8 +385,9 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) - spin_unlock_irqrestore(&priv->status_lock, flags); - - while (1) { -- wait_event_interruptible(priv->delta_msr_wait, -- ((priv->icount.rng != prev.rng) || -+ wait_event_interruptible(port->delta_msr_wait, -+ (port->serial->disconnected || -+ (priv->icount.rng != prev.rng) || - (priv->icount.dsr != prev.dsr) || - (priv->icount.dcd != prev.dcd) || - (priv->icount.cts != prev.cts))); -@@ -395,6 +395,9 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) - if (signal_pending(current)) - return -ERESTARTSYS; - -+ if (port->serial->disconnected) -+ return -EIO; -+ - spin_lock_irqsave(&priv->status_lock, flags); - cur = priv->icount; - spin_unlock_irqrestore(&priv->status_lock, flags); -@@ -477,7 +480,6 @@ static int ssu100_attach(struct usb_serial *serial) - } - - spin_lock_init(&priv->status_lock); -- init_waitqueue_head(&priv->delta_msr_wait); - usb_set_serial_port_data(port, priv); - - return ssu100_initdevice(serial->dev); -@@ -563,7 +565,7 @@ static void ssu100_update_msr(struct usb_serial_port *port, u8 msr) - priv->icount.dcd++; - if (msr & UART_MSR_TERI) - priv->icount.rng++; -- wake_up_interruptible(&priv->delta_msr_wait); -+ wake_up_interruptible(&port->delta_msr_wait); - } - } - -diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c -index a7492ba..2575779 100644 ---- a/drivers/usb/serial/ti_usb_3410_5052.c -+++ b/drivers/usb/serial/ti_usb_3410_5052.c -@@ -75,7 +75,6 @@ struct ti_port { - int tp_flags; - int tp_closing_wait;/* in .01 secs */ - struct async_icount tp_icount; -- wait_queue_head_t tp_msr_wait; /* wait for msr change */ - wait_queue_head_t tp_write_wait; - struct ti_device *tp_tdev; - struct usb_serial_port *tp_port; -@@ -210,6 +209,7 @@ static struct usb_device_id ti_id_table_combined[19+2*TI_EXTRA_VID_PID_COUNT+1] - { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) }, - { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) }, - { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_PRODUCT_ID) }, -+ { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_STRIP_PORT_ID) }, - { USB_DEVICE(TI_VENDOR_ID, FRI2_PRODUCT_ID) }, - { } - }; -@@ -429,7 +429,6 @@ static int ti_startup(struct usb_serial *serial) - tport->tp_uart_base_addr = (i == 0 ? - TI_UART1_BASE_ADDR : TI_UART2_BASE_ADDR); - tport->tp_closing_wait = closing_wait; -- init_waitqueue_head(&tport->tp_msr_wait); - init_waitqueue_head(&tport->tp_write_wait); - if (kfifo_alloc(&tport->write_fifo, TI_WRITE_BUF_SIZE, - GFP_KERNEL)) { -@@ -826,9 +825,13 @@ static int ti_ioctl(struct tty_struct *tty, - dbg("%s - (%d) TIOCMIWAIT", __func__, port->number); - cprev = tport->tp_icount; - while (1) { -- interruptible_sleep_on(&tport->tp_msr_wait); -+ interruptible_sleep_on(&port->delta_msr_wait); - if (signal_pending(current)) - return -ERESTARTSYS; -+ -+ if (port->serial->disconnected) -+ return -EIO; -+ - cnow = tport->tp_icount; - if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && - cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) -@@ -1457,7 +1460,7 @@ static void ti_handle_new_msr(struct ti_port *tport, __u8 msr) - icount->dcd++; - if (msr & TI_MSR_DELTA_RI) - icount->rng++; -- wake_up_interruptible(&tport->tp_msr_wait); -+ wake_up_interruptible(&tport->tp_port->delta_msr_wait); - spin_unlock_irqrestore(&tport->tp_lock, flags); - } - -@@ -1684,12 +1687,13 @@ static int ti_download_firmware(struct ti_device *tdev) - - dbg("%s\n", __func__); - /* try ID specific firmware first, then try generic firmware */ -- sprintf(buf, "ti_usb-v%04x-p%04x.fw", dev->descriptor.idVendor, -- dev->descriptor.idProduct); -+ sprintf(buf, "ti_usb-v%04x-p%04x.fw", -+ le16_to_cpu(dev->descriptor.idVendor), -+ le16_to_cpu(dev->descriptor.idProduct)); - if ((status = request_firmware(&fw_p, buf, &dev->dev)) != 0) { - buf[0] = '\0'; -- if (dev->descriptor.idVendor == MTS_VENDOR_ID) { -- switch (dev->descriptor.idProduct) { -+ if (le16_to_cpu(dev->descriptor.idVendor) == MTS_VENDOR_ID) { -+ switch (le16_to_cpu(dev->descriptor.idProduct)) { - case MTS_CDMA_PRODUCT_ID: - strcpy(buf, "mts_cdma.fw"); - break; -diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c -index 810695b..a08230e 100644 ---- a/drivers/usb/serial/usb-serial.c -+++ b/drivers/usb/serial/usb-serial.c -@@ -794,29 +794,37 @@ int usb_serial_probe(struct usb_interface *interface, - if (usb_endpoint_is_bulk_in(endpoint)) { - /* we found a bulk in endpoint */ - dbg("found bulk in on endpoint %d", i); -- bulk_in_endpoint[num_bulk_in] = endpoint; -- ++num_bulk_in; -+ if (num_bulk_in < MAX_NUM_PORTS) { -+ bulk_in_endpoint[num_bulk_in] = endpoint; -+ ++num_bulk_in; -+ } - } - - if (usb_endpoint_is_bulk_out(endpoint)) { - /* we found a bulk out endpoint */ - dbg("found bulk out on endpoint %d", i); -- bulk_out_endpoint[num_bulk_out] = endpoint; -- ++num_bulk_out; -+ if (num_bulk_out < MAX_NUM_PORTS) { -+ bulk_out_endpoint[num_bulk_out] = endpoint; -+ ++num_bulk_out; -+ } - } - - if (usb_endpoint_is_int_in(endpoint)) { - /* we found a interrupt in endpoint */ - dbg("found interrupt in on endpoint %d", i); -- interrupt_in_endpoint[num_interrupt_in] = endpoint; -- ++num_interrupt_in; -+ if (num_interrupt_in < MAX_NUM_PORTS) { -+ interrupt_in_endpoint[num_interrupt_in] = endpoint; -+ ++num_interrupt_in; -+ } - } - - if (usb_endpoint_is_int_out(endpoint)) { - /* we found an interrupt out endpoint */ - dbg("found interrupt out on endpoint %d", i); -- interrupt_out_endpoint[num_interrupt_out] = endpoint; -- ++num_interrupt_out; -+ if (num_interrupt_out < MAX_NUM_PORTS) { -+ interrupt_out_endpoint[num_interrupt_out] = endpoint; -+ ++num_interrupt_out; -+ } - } - } - -@@ -839,8 +847,10 @@ int usb_serial_probe(struct usb_interface *interface, - if (usb_endpoint_is_int_in(endpoint)) { - /* we found a interrupt in endpoint */ - dbg("found interrupt in for Prolific device on separate interface"); -- interrupt_in_endpoint[num_interrupt_in] = endpoint; -- ++num_interrupt_in; -+ if (num_interrupt_in < MAX_NUM_PORTS) { -+ interrupt_in_endpoint[num_interrupt_in] = endpoint; -+ ++num_interrupt_in; -+ } - } - } - } -@@ -879,6 +889,11 @@ int usb_serial_probe(struct usb_interface *interface, - num_ports = type->num_ports; - } - -+ if (num_ports > MAX_NUM_PORTS) { -+ dev_warn(&interface->dev, "too many ports requested: %d\n", num_ports); -+ num_ports = MAX_NUM_PORTS; -+ } -+ - serial->num_ports = num_ports; - serial->num_bulk_in = num_bulk_in; - serial->num_bulk_out = num_bulk_out; -@@ -908,6 +923,7 @@ int usb_serial_probe(struct usb_interface *interface, - port->port.ops = &serial_port_ops; - port->serial = serial; - spin_lock_init(&port->lock); -+ init_waitqueue_head(&port->delta_msr_wait); - /* Keep this for private driver use for the moment but - should probably go away */ - INIT_WORK(&port->work, usb_serial_port_work); -diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c -index 49f3a85..1f05022 100644 ---- a/drivers/usb/serial/usb_wwan.c -+++ b/drivers/usb/serial/usb_wwan.c -@@ -236,8 +236,10 @@ int usb_wwan_write(struct tty_struct *tty, struct usb_serial_port *port, - usb_pipeendpoint(this_urb->pipe), i); - - err = usb_autopm_get_interface_async(port->serial->interface); -- if (err < 0) -+ if (err < 0) { -+ clear_bit(i, &portdata->out_busy); - break; -+ } - - /* send the data */ - memcpy(this_urb->transfer_buffer, buf, todo); -@@ -518,6 +520,14 @@ int usb_wwan_open(struct tty_struct *tty, struct usb_serial_port *port) - set_bit(TTY_NO_WRITE_SPLIT, &tty->flags); - dbg("%s", __func__); - -+ if (port->interrupt_in_urb) { -+ err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); -+ if (err) { -+ dev_dbg(&port->dev, "%s: submit int urb failed: %d\n", -+ __func__, err); -+ } -+ } -+ - /* Start reading from the IN endpoint */ - for (i = 0; i < N_IN_URB; i++) { - urb = portdata->in_urbs[i]; -@@ -546,12 +556,26 @@ int usb_wwan_open(struct tty_struct *tty, struct usb_serial_port *port) - } - EXPORT_SYMBOL(usb_wwan_open); - -+static void unbusy_queued_urb(struct urb *urb, -+ struct usb_wwan_port_private *portdata) -+{ -+ int i; -+ -+ for (i = 0; i < N_OUT_URB; i++) { -+ if (urb == portdata->out_urbs[i]) { -+ clear_bit(i, &portdata->out_busy); -+ break; -+ } -+ } -+} -+ - void usb_wwan_close(struct usb_serial_port *port) - { - int i; - struct usb_serial *serial = port->serial; - struct usb_wwan_port_private *portdata; - struct usb_wwan_intf_private *intfdata = port->serial->private; -+ struct urb *urb; - - dbg("%s", __func__); - portdata = usb_get_serial_port_data(port); -@@ -562,10 +586,19 @@ void usb_wwan_close(struct usb_serial_port *port) - portdata->opened = 0; - spin_unlock_irq(&intfdata->susp_lock); - -+ for (;;) { -+ urb = usb_get_from_anchor(&portdata->delayed); -+ if (!urb) -+ break; -+ unbusy_queued_urb(urb, portdata); -+ usb_autopm_put_interface_async(serial->interface); -+ } -+ - for (i = 0; i < N_IN_URB; i++) - usb_kill_urb(portdata->in_urbs[i]); - for (i = 0; i < N_OUT_URB; i++) - usb_kill_urb(portdata->out_urbs[i]); -+ usb_kill_urb(port->interrupt_in_urb); - /* balancing - important as an error cannot be handled*/ - usb_autopm_get_interface_no_resume(serial->interface); - serial->interface->needs_remote_wakeup = 0; -@@ -641,7 +674,7 @@ static void usb_wwan_setup_urbs(struct usb_serial *serial) - - int usb_wwan_startup(struct usb_serial *serial) - { -- int i, j, err; -+ int i, j; - struct usb_serial_port *port; - struct usb_wwan_port_private *portdata; - u8 *buffer; -@@ -678,12 +711,6 @@ int usb_wwan_startup(struct usb_serial *serial) - } - - usb_set_serial_port_data(port, portdata); -- -- if (!port->interrupt_in_urb) -- continue; -- err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); -- if (err) -- dbg("%s: submit irq_in urb failed %d", __func__, err); - } - usb_wwan_setup_urbs(serial); - return 0; -@@ -791,18 +818,6 @@ int usb_wwan_suspend(struct usb_serial *serial, pm_message_t message) - } - EXPORT_SYMBOL(usb_wwan_suspend); - --static void unbusy_queued_urb(struct urb *urb, struct usb_wwan_port_private *portdata) --{ -- int i; -- -- for (i = 0; i < N_OUT_URB; i++) { -- if (urb == portdata->out_urbs[i]) { -- clear_bit(i, &portdata->out_busy); -- break; -- } -- } --} -- - static void play_delayed(struct usb_serial_port *port) - { - struct usb_wwan_intf_private *data; -@@ -839,21 +854,6 @@ int usb_wwan_resume(struct usb_serial *serial) - int err = 0; - - dbg("%s entered", __func__); -- /* get the interrupt URBs resubmitted unconditionally */ -- for (i = 0; i < serial->num_ports; i++) { -- port = serial->port[i]; -- if (!port->interrupt_in_urb) { -- dbg("%s: No interrupt URB for port %d", __func__, i); -- continue; -- } -- err = usb_submit_urb(port->interrupt_in_urb, GFP_NOIO); -- dbg("Submitted interrupt URB for port %d (result %d)", i, err); -- if (err < 0) { -- err("%s: Error %d for interrupt URB of port%d", -- __func__, err, i); -- goto err_out; -- } -- } - - spin_lock_irq(&intfdata->susp_lock); - intfdata->suspended = 0; -@@ -866,6 +866,16 @@ int usb_wwan_resume(struct usb_serial *serial) - if (!portdata->opened) - continue; - -+ if (port->interrupt_in_urb) { -+ err = usb_submit_urb(port->interrupt_in_urb, -+ GFP_ATOMIC); -+ if (err) { -+ dev_err(&port->dev, -+ "%s: submit int urb failed: %d\n", -+ __func__, err); -+ } -+ } -+ - for (j = 0; j < N_IN_URB; j++) { - urb = portdata->in_urbs[j]; - -diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c -index 0d06d7c..bf7014d 100644 ---- a/drivers/usb/serial/whiteheat.c -+++ b/drivers/usb/serial/whiteheat.c -@@ -953,6 +953,10 @@ static void command_port_read_callback(struct urb *urb) - dbg("%s - command_info is NULL, exiting.", __func__); - return; - } -+ if (!urb->actual_length) { -+ dev_dbg(&urb->dev->dev, "%s - empty response, exiting.\n", __func__); -+ return; -+ } - if (status) { - dbg("%s - nonzero urb status: %d", __func__, status); - if (status != -ENOENT) -@@ -974,7 +978,8 @@ static void command_port_read_callback(struct urb *urb) - /* These are unsolicited reports from the firmware, hence no - waiting command to wakeup */ - dbg("%s - event received", __func__); -- } else if (data[0] == WHITEHEAT_GET_DTR_RTS) { -+ } else if ((data[0] == WHITEHEAT_GET_DTR_RTS) && -+ (urb->actual_length - 1 <= sizeof(command_info->result_buffer))) { - memcpy(command_info->result_buffer, &data[1], - urb->actual_length - 1); - command_info->command_finished = WHITEHEAT_CMD_COMPLETE; -diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig -index 685edc8..144386b 100644 ---- a/drivers/usb/storage/Kconfig -+++ b/drivers/usb/storage/Kconfig -@@ -19,7 +19,9 @@ config USB_STORAGE - - This option depends on 'SCSI' support being enabled, but you - probably also need 'SCSI device support: SCSI disk support' -- (BLK_DEV_SD) for most USB storage devices. -+ (BLK_DEV_SD) for most USB storage devices. Some devices also -+ will require 'Probe all LUNs on each SCSI device' -+ (SCSI_MULTI_LUN). - - To compile this driver as a module, choose M here: the - module will be called usb-storage. -diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c -index d496efa..a4f033b 100644 ---- a/drivers/usb/storage/scsiglue.c -+++ b/drivers/usb/storage/scsiglue.c -@@ -78,6 +78,8 @@ static const char* host_info(struct Scsi_Host *host) - - static int slave_alloc (struct scsi_device *sdev) - { -+ struct us_data *us = host_to_us(sdev->host); -+ - /* - * Set the INQUIRY transfer length to 36. We don't use any of - * the extra data and many devices choke if asked for more or -@@ -102,6 +104,10 @@ static int slave_alloc (struct scsi_device *sdev) - */ - blk_queue_update_dma_alignment(sdev->request_queue, (512 - 1)); - -+ /* Tell the SCSI layer if we know there is more than one LUN */ -+ if (us->protocol == USB_PR_BULK && us->max_lun > 0) -+ sdev->sdev_bflags |= BLIST_FORCELUN; -+ - return 0; - } - -diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c -index fa1ceeb..f3248fb 100644 ---- a/drivers/usb/storage/shuttle_usbat.c -+++ b/drivers/usb/storage/shuttle_usbat.c -@@ -1846,7 +1846,7 @@ static int usbat_probe(struct usb_interface *intf, - us->transport_name = "Shuttle USBAT"; - us->transport = usbat_flash_transport; - us->transport_reset = usb_stor_CB_reset; -- us->max_lun = 1; -+ us->max_lun = 0; - - result = usb_stor_probe2(us); - return result; -diff --git a/drivers/usb/storage/unusual_cypress.h b/drivers/usb/storage/unusual_cypress.h -index 65a6a75..82e8ed0 100644 ---- a/drivers/usb/storage/unusual_cypress.h -+++ b/drivers/usb/storage/unusual_cypress.h -@@ -31,7 +31,7 @@ UNUSUAL_DEV( 0x04b4, 0x6831, 0x0000, 0x9999, - "Cypress ISD-300LP", - USB_SC_CYP_ATACB, USB_PR_DEVICE, NULL, 0), - --UNUSUAL_DEV( 0x14cd, 0x6116, 0x0000, 0x0219, -+UNUSUAL_DEV( 0x14cd, 0x6116, 0x0160, 0x0160, - "Super Top", - "USB 2.0 SATA BRIDGE", - USB_SC_CYP_ATACB, USB_PR_DEVICE, NULL, 0), -diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h -index cf442e0..a280945 100644 ---- a/drivers/usb/storage/unusual_devs.h -+++ b/drivers/usb/storage/unusual_devs.h -@@ -93,6 +93,12 @@ UNUSUAL_DEV( 0x03f0, 0x4002, 0x0001, 0x0001, - "PhotoSmart R707", - USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_FIX_CAPACITY), - -+UNUSUAL_DEV( 0x03f3, 0x0001, 0x0000, 0x9999, -+ "Adaptec", -+ "USBConnect 2000", -+ USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, -+ US_FL_SCM_MULT_TARG ), -+ - /* Reported by Sebastian Kapfer - * and Olaf Hering (different bcd's, same vendor/product) - * for USB floppies that need the SINGLE_LUN enforcement. -@@ -226,6 +232,27 @@ UNUSUAL_DEV( 0x0421, 0x0495, 0x0370, 0x0370, - USB_SC_DEVICE, USB_PR_DEVICE, NULL, - US_FL_MAX_SECTORS_64 ), - -+/* Reported by Daniele Forsi */ -+UNUSUAL_DEV( 0x0421, 0x04b9, 0x0350, 0x0350, -+ "Nokia", -+ "5300", -+ USB_SC_DEVICE, USB_PR_DEVICE, NULL, -+ US_FL_MAX_SECTORS_64 ), -+ -+/* Patch submitted by Victor A. Santos */ -+UNUSUAL_DEV( 0x0421, 0x05af, 0x0742, 0x0742, -+ "Nokia", -+ "305", -+ USB_SC_DEVICE, USB_PR_DEVICE, NULL, -+ US_FL_MAX_SECTORS_64), -+ -+/* Patch submitted by Mikhail Zolotaryov */ -+UNUSUAL_DEV( 0x0421, 0x06aa, 0x1110, 0x1110, -+ "Nokia", -+ "502", -+ USB_SC_DEVICE, USB_PR_DEVICE, NULL, -+ US_FL_MAX_SECTORS_64 ), -+ - #ifdef NO_SDDR09 - UNUSUAL_DEV( 0x0436, 0x0005, 0x0100, 0x0100, - "Microtech", -@@ -712,6 +739,12 @@ UNUSUAL_DEV( 0x059b, 0x0001, 0x0100, 0x0100, - USB_SC_DEVICE, USB_PR_DEVICE, NULL, - US_FL_SINGLE_LUN ), - -+UNUSUAL_DEV( 0x059b, 0x0040, 0x0100, 0x0100, -+ "Iomega", -+ "Jaz USB Adapter", -+ USB_SC_DEVICE, USB_PR_DEVICE, NULL, -+ US_FL_SINGLE_LUN ), -+ - /* Reported by */ - UNUSUAL_DEV( 0x059f, 0x0643, 0x0000, 0x0000, - "LaCie", -@@ -1084,6 +1117,18 @@ UNUSUAL_DEV( 0x0851, 0x1543, 0x0200, 0x0200, - USB_SC_DEVICE, USB_PR_DEVICE, NULL, - US_FL_NOT_LOCKABLE), - -+UNUSUAL_DEV( 0x085a, 0x0026, 0x0100, 0x0133, -+ "Xircom", -+ "PortGear USB-SCSI (Mac USB Dock)", -+ USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, -+ US_FL_SCM_MULT_TARG ), -+ -+UNUSUAL_DEV( 0x085a, 0x0028, 0x0100, 0x0133, -+ "Xircom", -+ "PortGear USB to SCSI Converter", -+ USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, -+ US_FL_SCM_MULT_TARG ), -+ - /* Submitted by Jan De Luyck */ - UNUSUAL_DEV( 0x08bd, 0x1100, 0x0000, 0x0000, - "CITIZEN", -@@ -1434,6 +1479,13 @@ UNUSUAL_DEV( 0x0f88, 0x042e, 0x0100, 0x0100, - USB_SC_DEVICE, USB_PR_DEVICE, NULL, - US_FL_FIX_CAPACITY ), - -+/* Reported by Moritz Moeller-Herrmann */ -+UNUSUAL_DEV( 0x0fca, 0x8004, 0x0201, 0x0201, -+ "Research In Motion", -+ "BlackBerry Bold 9000", -+ USB_SC_DEVICE, USB_PR_DEVICE, NULL, -+ US_FL_MAX_SECTORS_64 ), -+ - /* Reported by Michael Stattmann */ - UNUSUAL_DEV( 0x0fce, 0xd008, 0x0000, 0x0000, - "Sony Ericsson", -@@ -1897,6 +1949,14 @@ UNUSUAL_DEV( 0x152d, 0x2329, 0x0100, 0x0100, - USB_SC_DEVICE, USB_PR_DEVICE, NULL, - US_FL_IGNORE_RESIDUE | US_FL_SANE_SENSE ), - -+/* Entrega Technologies U1-SC25 (later Xircom PortGear PGSCSI) -+ * and Mac USB Dock USB-SCSI */ -+UNUSUAL_DEV( 0x1645, 0x0007, 0x0100, 0x0133, -+ "Entrega Technologies", -+ "USB to SCSI Converter", -+ USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, -+ US_FL_SCM_MULT_TARG ), -+ - /* Reported by Robert Schedel - * Note: this is a 'super top' device like the above 14cd/6600 device */ - UNUSUAL_DEV( 0x1652, 0x6600, 0x0201, 0x0201, -@@ -1912,6 +1972,12 @@ UNUSUAL_DEV( 0x177f, 0x0400, 0x0000, 0x0000, - USB_SC_DEVICE, USB_PR_DEVICE, NULL, - US_FL_BULK_IGNORE_TAG | US_FL_MAX_SECTORS_64 ), - -+UNUSUAL_DEV( 0x1822, 0x0001, 0x0000, 0x9999, -+ "Ariston Technologies", -+ "iConnect USB to SCSI adapter", -+ USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, -+ US_FL_SCM_MULT_TARG ), -+ - /* Reported by Hans de Goede - * These Appotech controllers are found in Picture Frames, they provide a - * (buggy) emulation of a cdrom drive which contains the windows software -diff --git a/drivers/usb/wusbcore/wa-rpipe.c b/drivers/usb/wusbcore/wa-rpipe.c -index f0d546c..ca1031b 100644 ---- a/drivers/usb/wusbcore/wa-rpipe.c -+++ b/drivers/usb/wusbcore/wa-rpipe.c -@@ -332,7 +332,10 @@ static int rpipe_aim(struct wa_rpipe *rpipe, struct wahc *wa, - /* FIXME: compute so seg_size > ep->maxpktsize */ - rpipe->descr.wBlocks = cpu_to_le16(16); /* given */ - /* ep0 maxpktsize is 0x200 (WUSB1.0[4.8.1]) */ -- rpipe->descr.wMaxPacketSize = cpu_to_le16(ep->desc.wMaxPacketSize); -+ if (usb_endpoint_xfer_isoc(&ep->desc)) -+ rpipe->descr.wMaxPacketSize = epcd->wOverTheAirPacketSize; -+ else -+ rpipe->descr.wMaxPacketSize = ep->desc.wMaxPacketSize; - rpipe->descr.bHSHubAddress = 0; /* reserved: zero */ - rpipe->descr.bHSHubPort = wusb_port_no_to_idx(urb->dev->portnum); - /* FIXME: use maximum speed as supported or recommended by device */ -diff --git a/drivers/usb/wusbcore/wa-xfer.c b/drivers/usb/wusbcore/wa-xfer.c -index 57c01ab..5f6df6e 100644 ---- a/drivers/usb/wusbcore/wa-xfer.c -+++ b/drivers/usb/wusbcore/wa-xfer.c -@@ -90,7 +90,8 @@ - #include "wusbhc.h" - - enum { -- WA_SEGS_MAX = 255, -+ /* [WUSB] section 8.3.3 allocates 7 bits for the segment index. */ -+ WA_SEGS_MAX = 128, - }; - - enum wa_seg_status { -@@ -444,7 +445,7 @@ static ssize_t __wa_xfer_setup_sizes(struct wa_xfer *xfer, - xfer->seg_size = (xfer->seg_size / maxpktsize) * maxpktsize; - xfer->segs = (urb->transfer_buffer_length + xfer->seg_size - 1) - / xfer->seg_size; -- if (xfer->segs >= WA_SEGS_MAX) { -+ if (xfer->segs > WA_SEGS_MAX) { - dev_err(dev, "BUG? ops, number of segments %d bigger than %d\n", - (int)(urb->transfer_buffer_length / xfer->seg_size), - WA_SEGS_MAX); -diff --git a/drivers/uwb/lc-dev.c b/drivers/uwb/lc-dev.c -index 5241f1d..3c9e929 100644 ---- a/drivers/uwb/lc-dev.c -+++ b/drivers/uwb/lc-dev.c -@@ -441,16 +441,19 @@ void uwbd_dev_onair(struct uwb_rc *rc, struct uwb_beca_e *bce) - uwb_dev->mac_addr = *bce->mac_addr; - uwb_dev->dev_addr = bce->dev_addr; - dev_set_name(&uwb_dev->dev, macbuf); -+ -+ /* plug the beacon cache */ -+ bce->uwb_dev = uwb_dev; -+ uwb_dev->bce = bce; -+ uwb_bce_get(bce); /* released in uwb_dev_sys_release() */ -+ - result = uwb_dev_add(uwb_dev, &rc->uwb_dev.dev, rc); - if (result < 0) { - dev_err(dev, "new device %s: cannot instantiate device\n", - macbuf); - goto error_dev_add; - } -- /* plug the beacon cache */ -- bce->uwb_dev = uwb_dev; -- uwb_dev->bce = bce; -- uwb_bce_get(bce); /* released in uwb_dev_sys_release() */ -+ - dev_info(dev, "uwb device (mac %s dev %s) connected to %s %s\n", - macbuf, devbuf, rc->uwb_dev.dev.parent->bus->name, - dev_name(rc->uwb_dev.dev.parent)); -@@ -458,6 +461,8 @@ void uwbd_dev_onair(struct uwb_rc *rc, struct uwb_beca_e *bce) - return; - - error_dev_add: -+ bce->uwb_dev = NULL; -+ uwb_bce_put(bce); - kfree(uwb_dev); - return; - } -diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c -index 50a3cb5..3fd908c 100644 ---- a/drivers/vhost/net.c -+++ b/drivers/vhost/net.c -@@ -324,9 +324,13 @@ static int get_rx_bufs(struct vhost_virtqueue *vq, - r = -ENOBUFS; - goto err; - } -- d = vhost_get_vq_desc(vq->dev, vq, vq->iov + seg, -+ r = vhost_get_vq_desc(vq->dev, vq, vq->iov + seg, - ARRAY_SIZE(vq->iov) - seg, &out, - &in, log, log_num); -+ if (unlikely(r < 0)) -+ goto err; -+ -+ d = r; - if (d == vq->num) { - r = 0; - goto err; -@@ -351,6 +355,12 @@ static int get_rx_bufs(struct vhost_virtqueue *vq, - *iovcount = seg; - if (unlikely(log)) - *log_num = nlogs; -+ -+ /* Detect overrun */ -+ if (unlikely(datalen > 0)) { -+ r = UIO_MAXIOV + 1; -+ goto err; -+ } - return headcount; - err: - vhost_discard_vq_desc(vq, headcount); -@@ -405,6 +415,14 @@ static void handle_rx(struct vhost_net *net) - /* On error, stop handling until the next kick. */ - if (unlikely(headcount < 0)) - break; -+ /* On overrun, truncate and discard */ -+ if (unlikely(headcount > UIO_MAXIOV)) { -+ msg.msg_iovlen = 1; -+ err = sock->ops->recvmsg(NULL, sock, &msg, -+ 1, MSG_DONTWAIT | MSG_TRUNC); -+ pr_debug("Discarded rx packet: len %zd\n", sock_len); -+ continue; -+ } - /* OK, now we need to know about added descriptors. */ - if (!headcount) { - if (unlikely(vhost_enable_notify(&net->dev, vq))) { -diff --git a/drivers/video/aty/mach64_accel.c b/drivers/video/aty/mach64_accel.c -index e45833c..182bd68 100644 ---- a/drivers/video/aty/mach64_accel.c -+++ b/drivers/video/aty/mach64_accel.c -@@ -4,6 +4,7 @@ - */ - - #include -+#include - #include - #include