From 3168e416b5d53cf410db769f4aed23f97e7111da Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 18 Nov 2012 19:39:04 +0100 Subject: [PATCH] linux: update to linux-3.6.7 Signed-off-by: Stephan Raue --- packages/linux/meta | 2 +- ...h => linux-3.6.7-003-no_dev_console.patch} | 0 ....7-004_lower_undefined_mode_timeout.patch} | 0 ...atch => linux-3.6.7-006_enable_utf8.patch} | 0 ...h => linux-3.6.7-007_die_floppy_die.patch} | 0 ...09_disable_i8042_check_on_apple_mac.patch} | 0 ...nux-3.6.7-053-spinelplus-remote-0.1.patch} | 0 ...1056c5564eec8a1b169c6e84ff3.6.74c13.patch} | 0 ...-203-stb0899_enable_low_symbol_rate.patch} | 0 ...add_Formosa_eHome_Infrared_Receiver.patch} | 0 ....6.7-212-mantis_stb0899_faster_lock.patch} | 0 ...> linux-3.6.7-213-cinergy_s2_usb_r2.patch} | 0 ...nux-3.6.7-215-technisat-usb2-module.patch} | 0 ...linux-3.6.7-601-RPi_support-9641b52.patch} | 6471 ++++++++++++++--- ....6.7-602-RPi_vc04-service_downgrade.patch} | 0 ...-3.6.7-603-RPi_add_LIRC_RPi_support.patch} | 0 ...3.6.7-603-RPi_vc04-service_buildfix.patch} | 0 ... => linux-3.6.7-700-jmicron_1_0_8_5.patch} | 0 ...atch => linux-3.6.7-920-add_rtl8168.patch} | 0 19 files changed, 5659 insertions(+), 814 deletions(-) rename packages/linux/patches/{linux-3.6.6-003-no_dev_console.patch => linux-3.6.7-003-no_dev_console.patch} (100%) rename packages/linux/patches/{linux-3.6.6-004_lower_undefined_mode_timeout.patch => linux-3.6.7-004_lower_undefined_mode_timeout.patch} (100%) rename packages/linux/patches/{linux-3.6.6-006_enable_utf8.patch => linux-3.6.7-006_enable_utf8.patch} (100%) rename packages/linux/patches/{linux-3.6.6-007_die_floppy_die.patch => linux-3.6.7-007_die_floppy_die.patch} (100%) rename packages/linux/patches/{linux-3.6.6-009_disable_i8042_check_on_apple_mac.patch => linux-3.6.7-009_disable_i8042_check_on_apple_mac.patch} (100%) rename packages/linux/patches/{linux-3.6.6-053-spinelplus-remote-0.1.patch => linux-3.6.7-053-spinelplus-remote-0.1.patch} (100%) rename packages/linux/patches/{linux-3.6.6-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.64c13.patch => linux-3.6.7-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.74c13.patch} (100%) rename packages/linux/patches/{linux-3.6.6-203-stb0899_enable_low_symbol_rate.patch => linux-3.6.7-203-stb0899_enable_low_symbol_rate.patch} (100%) rename packages/linux/patches/{linux-3.6.6-204-add_Formosa_eHome_Infrared_Receiver.patch => linux-3.6.7-204-add_Formosa_eHome_Infrared_Receiver.patch} (100%) rename packages/linux/patches/{linux-3.6.6-212-mantis_stb0899_faster_lock.patch => linux-3.6.7-212-mantis_stb0899_faster_lock.patch} (100%) rename packages/linux/patches/{linux-3.6.6-213-cinergy_s2_usb_r2.patch => linux-3.6.7-213-cinergy_s2_usb_r2.patch} (100%) rename packages/linux/patches/{linux-3.6.6-215-technisat-usb2-module.patch => linux-3.6.7-215-technisat-usb2-module.patch} (100%) rename packages/linux/patches/{linux-3.6.6-601-RPi_support-9641b52.patch => linux-3.6.7-601-RPi_support-9641b52.patch} (92%) rename packages/linux/patches/{linux-3.6.6-602-RPi_vc04-service_downgrade.patch => linux-3.6.7-602-RPi_vc04-service_downgrade.patch} (100%) rename packages/linux/patches/{linux-3.6.6-603-RPi_add_LIRC_RPi_support.patch => linux-3.6.7-603-RPi_add_LIRC_RPi_support.patch} (100%) rename packages/linux/patches/{linux-3.6.6-603-RPi_vc04-service_buildfix.patch => linux-3.6.7-603-RPi_vc04-service_buildfix.patch} (100%) rename packages/linux/patches/{linux-3.6.6-700-jmicron_1_0_8_5.patch => linux-3.6.7-700-jmicron_1_0_8_5.patch} (100%) rename packages/linux/patches/{linux-3.6.6-920-add_rtl8168.patch => linux-3.6.7-920-add_rtl8168.patch} (100%) diff --git a/packages/linux/meta b/packages/linux/meta index 327c801e6e..888c7d206b 100644 --- a/packages/linux/meta +++ b/packages/linux/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="linux" -PKG_VERSION="3.6.6" +PKG_VERSION="3.6.7" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/linux/patches/linux-3.6.6-003-no_dev_console.patch b/packages/linux/patches/linux-3.6.7-003-no_dev_console.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-003-no_dev_console.patch rename to packages/linux/patches/linux-3.6.7-003-no_dev_console.patch diff --git a/packages/linux/patches/linux-3.6.6-004_lower_undefined_mode_timeout.patch b/packages/linux/patches/linux-3.6.7-004_lower_undefined_mode_timeout.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-004_lower_undefined_mode_timeout.patch rename to packages/linux/patches/linux-3.6.7-004_lower_undefined_mode_timeout.patch diff --git a/packages/linux/patches/linux-3.6.6-006_enable_utf8.patch b/packages/linux/patches/linux-3.6.7-006_enable_utf8.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-006_enable_utf8.patch rename to packages/linux/patches/linux-3.6.7-006_enable_utf8.patch diff --git a/packages/linux/patches/linux-3.6.6-007_die_floppy_die.patch b/packages/linux/patches/linux-3.6.7-007_die_floppy_die.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-007_die_floppy_die.patch rename to packages/linux/patches/linux-3.6.7-007_die_floppy_die.patch diff --git a/packages/linux/patches/linux-3.6.6-009_disable_i8042_check_on_apple_mac.patch b/packages/linux/patches/linux-3.6.7-009_disable_i8042_check_on_apple_mac.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-009_disable_i8042_check_on_apple_mac.patch rename to packages/linux/patches/linux-3.6.7-009_disable_i8042_check_on_apple_mac.patch diff --git a/packages/linux/patches/linux-3.6.6-053-spinelplus-remote-0.1.patch b/packages/linux/patches/linux-3.6.7-053-spinelplus-remote-0.1.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-053-spinelplus-remote-0.1.patch rename to packages/linux/patches/linux-3.6.7-053-spinelplus-remote-0.1.patch diff --git a/packages/linux/patches/linux-3.6.6-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.64c13.patch b/packages/linux/patches/linux-3.6.7-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.74c13.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.64c13.patch rename to packages/linux/patches/linux-3.6.7-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.74c13.patch diff --git a/packages/linux/patches/linux-3.6.6-203-stb0899_enable_low_symbol_rate.patch b/packages/linux/patches/linux-3.6.7-203-stb0899_enable_low_symbol_rate.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-203-stb0899_enable_low_symbol_rate.patch rename to packages/linux/patches/linux-3.6.7-203-stb0899_enable_low_symbol_rate.patch diff --git a/packages/linux/patches/linux-3.6.6-204-add_Formosa_eHome_Infrared_Receiver.patch b/packages/linux/patches/linux-3.6.7-204-add_Formosa_eHome_Infrared_Receiver.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-204-add_Formosa_eHome_Infrared_Receiver.patch rename to packages/linux/patches/linux-3.6.7-204-add_Formosa_eHome_Infrared_Receiver.patch diff --git a/packages/linux/patches/linux-3.6.6-212-mantis_stb0899_faster_lock.patch b/packages/linux/patches/linux-3.6.7-212-mantis_stb0899_faster_lock.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-212-mantis_stb0899_faster_lock.patch rename to packages/linux/patches/linux-3.6.7-212-mantis_stb0899_faster_lock.patch diff --git a/packages/linux/patches/linux-3.6.6-213-cinergy_s2_usb_r2.patch b/packages/linux/patches/linux-3.6.7-213-cinergy_s2_usb_r2.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-213-cinergy_s2_usb_r2.patch rename to packages/linux/patches/linux-3.6.7-213-cinergy_s2_usb_r2.patch diff --git a/packages/linux/patches/linux-3.6.6-215-technisat-usb2-module.patch b/packages/linux/patches/linux-3.6.7-215-technisat-usb2-module.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-215-technisat-usb2-module.patch rename to packages/linux/patches/linux-3.6.7-215-technisat-usb2-module.patch diff --git a/packages/linux/patches/linux-3.6.6-601-RPi_support-9641b52.patch b/packages/linux/patches/linux-3.6.7-601-RPi_support-9641b52.patch similarity index 92% rename from packages/linux/patches/linux-3.6.6-601-RPi_support-9641b52.patch rename to packages/linux/patches/linux-3.6.7-601-RPi_support-9641b52.patch index c375ab8bdf..581a5bef8e 100644 --- a/packages/linux/patches/linux-3.6.6-601-RPi_support-9641b52.patch +++ b/packages/linux/patches/linux-3.6.7-601-RPi_support-9641b52.patch @@ -1,6 +1,6 @@ -diff -Naur linux-3.6.1/arch/arm/configs/bcmrpi_cutdown_defconfig linux-rpi-3.6.y/arch/arm/configs/bcmrpi_cutdown_defconfig ---- linux-3.6.1/arch/arm/configs/bcmrpi_cutdown_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/configs/bcmrpi_cutdown_defconfig 2012-11-11 18:17:01.093891144 +0100 +diff -Naur linux-3.6.7/arch/arm/configs/bcmrpi_cutdown_defconfig linux-3.6.7.patch/arch/arm/configs/bcmrpi_cutdown_defconfig +--- linux-3.6.7/arch/arm/configs/bcmrpi_cutdown_defconfig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/configs/bcmrpi_cutdown_defconfig 2012-11-18 12:45:10.213326321 +0100 @@ -0,0 +1,546 @@ +CONFIG_EXPERIMENTAL=y +CONFIG_LOCALVERSION="-cutdown" @@ -548,9 +548,9 @@ diff -Naur linux-3.6.1/arch/arm/configs/bcmrpi_cutdown_defconfig linux-rpi-3.6.y +# CONFIG_CRYPTO_HW is not set +CONFIG_CRC_ITU_T=y +CONFIG_LIBCRC32C=y -diff -Naur linux-3.6.1/arch/arm/configs/bcmrpi_defconfig linux-rpi-3.6.y/arch/arm/configs/bcmrpi_defconfig ---- linux-3.6.1/arch/arm/configs/bcmrpi_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/configs/bcmrpi_defconfig 2012-11-11 18:17:01.075890790 +0100 +diff -Naur linux-3.6.7/arch/arm/configs/bcmrpi_defconfig linux-3.6.7.patch/arch/arm/configs/bcmrpi_defconfig +--- linux-3.6.7/arch/arm/configs/bcmrpi_defconfig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/configs/bcmrpi_defconfig 2012-11-18 12:45:10.215326358 +0100 @@ -0,0 +1,945 @@ +# CONFIG_ARM_PATCH_PHYS_VIRT is not set +CONFIG_EXPERIMENTAL=y @@ -1497,9 +1497,9 @@ diff -Naur linux-3.6.1/arch/arm/configs/bcmrpi_defconfig linux-rpi-3.6.y/arch/ar +# CONFIG_CRYPTO_HW is not set +CONFIG_CRC_ITU_T=y +CONFIG_LIBCRC32C=y -diff -Naur linux-3.6.1/arch/arm/configs/bcmrpi_emergency_defconfig linux-rpi-3.6.y/arch/arm/configs/bcmrpi_emergency_defconfig ---- linux-3.6.1/arch/arm/configs/bcmrpi_emergency_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/configs/bcmrpi_emergency_defconfig 2012-11-11 18:17:01.074890771 +0100 +diff -Naur linux-3.6.7/arch/arm/configs/bcmrpi_emergency_defconfig linux-3.6.7.patch/arch/arm/configs/bcmrpi_emergency_defconfig +--- linux-3.6.7/arch/arm/configs/bcmrpi_emergency_defconfig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/configs/bcmrpi_emergency_defconfig 2012-11-18 12:45:10.391329789 +0100 @@ -0,0 +1,532 @@ +CONFIG_EXPERIMENTAL=y +# CONFIG_LOCALVERSION_AUTO is not set @@ -2033,9 +2033,9 @@ diff -Naur linux-3.6.1/arch/arm/configs/bcmrpi_emergency_defconfig linux-rpi-3.6 +# CONFIG_CRYPTO_HW is not set +CONFIG_CRC_ITU_T=y +CONFIG_LIBCRC32C=y -diff -Naur linux-3.6.1/arch/arm/include/asm/fiq.h linux-rpi-3.6.y/arch/arm/include/asm/fiq.h ---- linux-3.6.1/arch/arm/include/asm/fiq.h 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/arch/arm/include/asm/fiq.h 2012-11-11 18:17:00.010869975 +0100 +diff -Naur linux-3.6.7/arch/arm/include/asm/fiq.h linux-3.6.7.patch/arch/arm/include/asm/fiq.h +--- linux-3.6.7/arch/arm/include/asm/fiq.h 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/include/asm/fiq.h 2012-11-18 12:45:10.442330782 +0100 @@ -42,6 +42,7 @@ /* helpers defined in fiqasm.S: */ extern void __set_fiq_regs(unsigned long const *regs); @@ -2044,9 +2044,9 @@ diff -Naur linux-3.6.1/arch/arm/include/asm/fiq.h linux-rpi-3.6.y/arch/arm/inclu static inline void set_fiq_regs(struct pt_regs const *regs) { -diff -Naur linux-3.6.1/arch/arm/Kconfig linux-rpi-3.6.y/arch/arm/Kconfig ---- linux-3.6.1/arch/arm/Kconfig 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/arch/arm/Kconfig 2012-11-11 18:17:01.656902145 +0100 +diff -Naur linux-3.6.7/arch/arm/Kconfig linux-3.6.7.patch/arch/arm/Kconfig +--- linux-3.6.7/arch/arm/Kconfig 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/Kconfig 2012-11-18 12:45:10.461331155 +0100 @@ -998,6 +998,23 @@ help Support for ST's SPEAr platform (SPEAr3xx, SPEAr6xx and SPEAr13xx). @@ -2079,9 +2079,9 @@ diff -Naur linux-3.6.1/arch/arm/Kconfig linux-rpi-3.6.y/arch/arm/Kconfig # Definitions to make life easier config ARCH_ACORN -diff -Naur linux-3.6.1/arch/arm/Kconfig.debug linux-rpi-3.6.y/arch/arm/Kconfig.debug ---- linux-3.6.1/arch/arm/Kconfig.debug 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/arch/arm/Kconfig.debug 2012-11-11 18:17:00.647882426 +0100 +diff -Naur linux-3.6.7/arch/arm/Kconfig.debug linux-3.6.7.patch/arch/arm/Kconfig.debug +--- linux-3.6.7/arch/arm/Kconfig.debug 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/Kconfig.debug 2012-11-18 12:45:10.462331175 +0100 @@ -371,6 +371,14 @@ For more details about semihosting, please see chapter 8 of DUI0203I_rvct_developer_guide.pdf from ARM Ltd. @@ -2097,9 +2097,9 @@ diff -Naur linux-3.6.1/arch/arm/Kconfig.debug linux-rpi-3.6.y/arch/arm/Kconfig.d endchoice config EARLY_PRINTK -diff -Naur linux-3.6.1/arch/arm/kernel/fiqasm.S linux-rpi-3.6.y/arch/arm/kernel/fiqasm.S ---- linux-3.6.1/arch/arm/kernel/fiqasm.S 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/arch/arm/kernel/fiqasm.S 2012-11-11 18:17:00.238874431 +0100 +diff -Naur linux-3.6.7/arch/arm/kernel/fiqasm.S linux-3.6.7.patch/arch/arm/kernel/fiqasm.S +--- linux-3.6.7/arch/arm/kernel/fiqasm.S 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/kernel/fiqasm.S 2012-11-18 12:45:10.469331314 +0100 @@ -47,3 +47,7 @@ mov r0, r0 @ avoid hazard prior to ARMv4 mov pc, lr @@ -2108,9 +2108,9 @@ diff -Naur linux-3.6.1/arch/arm/kernel/fiqasm.S linux-rpi-3.6.y/arch/arm/kernel/ +ENTRY(__FIQ_Branch) + mov pc, r8 +ENDPROC(__FIQ_Branch) -diff -Naur linux-3.6.1/arch/arm/kernel/fiq.c linux-rpi-3.6.y/arch/arm/kernel/fiq.c ---- linux-3.6.1/arch/arm/kernel/fiq.c 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/arch/arm/kernel/fiq.c 2012-11-11 18:17:00.521879960 +0100 +diff -Naur linux-3.6.7/arch/arm/kernel/fiq.c linux-3.6.7.patch/arch/arm/kernel/fiq.c +--- linux-3.6.7/arch/arm/kernel/fiq.c 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/kernel/fiq.c 2012-11-18 12:45:10.470331333 +0100 @@ -137,6 +137,7 @@ EXPORT_SYMBOL(set_fiq_handler); EXPORT_SYMBOL(__set_fiq_regs); /* defined in fiqasm.S */ @@ -2119,9 +2119,9 @@ diff -Naur linux-3.6.1/arch/arm/kernel/fiq.c linux-rpi-3.6.y/arch/arm/kernel/fiq EXPORT_SYMBOL(claim_fiq); EXPORT_SYMBOL(release_fiq); EXPORT_SYMBOL(enable_fiq); -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/armctrl.c linux-rpi-3.6.y/arch/arm/mach-bcm2708/armctrl.c ---- linux-3.6.1/arch/arm/mach-bcm2708/armctrl.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/armctrl.c 2012-11-11 18:16:52.771728474 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/armctrl.c linux-3.6.7.patch/arch/arm/mach-bcm2708/armctrl.c +--- linux-3.6.7/arch/arm/mach-bcm2708/armctrl.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/armctrl.c 2012-11-18 12:45:10.470331333 +0100 @@ -0,0 +1,227 @@ +/* + * linux/arch/arm/mach-bcm2708/armctrl.c @@ -2350,9 +2350,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/armctrl.c linux-rpi-3.6.y/arch/arm/ + init_FIQ(FIQ_START); + return 0; +} -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/armctrl.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/armctrl.h ---- linux-3.6.1/arch/arm/mach-bcm2708/armctrl.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/armctrl.h 2012-11-11 18:16:52.741727886 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/armctrl.h linux-3.6.7.patch/arch/arm/mach-bcm2708/armctrl.h +--- linux-3.6.7/arch/arm/mach-bcm2708/armctrl.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/armctrl.h 2012-11-18 12:45:10.471331352 +0100 @@ -0,0 +1,27 @@ +/* + * linux/arch/arm/mach-bcm2708/armctrl.h @@ -2381,9 +2381,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/armctrl.h linux-rpi-3.6.y/arch/arm/ + u32 armctrl_sources, u32 resume_sources); + +#endif -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/bcm2708.c linux-rpi-3.6.y/arch/arm/mach-bcm2708/bcm2708.c ---- linux-3.6.1/arch/arm/mach-bcm2708/bcm2708.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/bcm2708.c 2012-11-11 18:16:52.752728101 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/bcm2708.c linux-3.6.7.patch/arch/arm/mach-bcm2708/bcm2708.c +--- linux-3.6.7/arch/arm/mach-bcm2708/bcm2708.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/bcm2708.c 2012-11-18 12:45:10.472331371 +0100 @@ -0,0 +1,951 @@ +/* + * linux/arch/arm/mach-bcm2708/bcm2708.c @@ -3336,9 +3336,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/bcm2708.c linux-rpi-3.6.y/arch/arm/ +module_param(boardrev, uint, 0644); +module_param(serial, uint, 0644); +module_param(uart_clock, uint, 0644); -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/bcm2708_gpio.c linux-rpi-3.6.y/arch/arm/mach-bcm2708/bcm2708_gpio.c ---- linux-3.6.1/arch/arm/mach-bcm2708/bcm2708_gpio.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/bcm2708_gpio.c 2012-11-11 18:16:52.721727498 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/bcm2708_gpio.c linux-3.6.7.patch/arch/arm/mach-bcm2708/bcm2708_gpio.c +--- linux-3.6.7/arch/arm/mach-bcm2708/bcm2708_gpio.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/bcm2708_gpio.c 2012-11-18 12:45:10.473331390 +0100 @@ -0,0 +1,339 @@ +/* + * linux/arch/arm/mach-bcm2708/bcm2708_gpio.c @@ -3679,9 +3679,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/bcm2708_gpio.c linux-rpi-3.6.y/arch + +MODULE_DESCRIPTION("Broadcom BCM2708 GPIO driver"); +MODULE_LICENSE("GPL"); -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/bcm2708.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/bcm2708.h ---- linux-3.6.1/arch/arm/mach-bcm2708/bcm2708.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/bcm2708.h 2012-11-11 18:16:52.753728121 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/bcm2708.h linux-3.6.7.patch/arch/arm/mach-bcm2708/bcm2708.h +--- linux-3.6.7/arch/arm/mach-bcm2708/bcm2708.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/bcm2708.h 2012-11-18 12:45:10.473331390 +0100 @@ -0,0 +1,51 @@ +/* + * linux/arch/arm/mach-bcm2708/bcm2708.h @@ -3734,9 +3734,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/bcm2708.h linux-rpi-3.6.y/arch/arm/ +} + +#endif -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/clock.c linux-rpi-3.6.y/arch/arm/mach-bcm2708/clock.c ---- linux-3.6.1/arch/arm/mach-bcm2708/clock.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/clock.c 2012-11-11 18:16:52.722727517 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/clock.c linux-3.6.7.patch/arch/arm/mach-bcm2708/clock.c +--- linux-3.6.7/arch/arm/mach-bcm2708/clock.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/clock.c 2012-11-18 12:45:10.474331410 +0100 @@ -0,0 +1,61 @@ +/* + * linux/arch/arm/mach-bcm2708/clock.c @@ -3799,9 +3799,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/clock.c linux-rpi-3.6.y/arch/arm/ma + return -EIO; +} +EXPORT_SYMBOL(clk_set_rate); -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/clock.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/clock.h ---- linux-3.6.1/arch/arm/mach-bcm2708/clock.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/clock.h 2012-11-11 18:16:52.721727498 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/clock.h linux-3.6.7.patch/arch/arm/mach-bcm2708/clock.h +--- linux-3.6.7/arch/arm/mach-bcm2708/clock.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/clock.h 2012-11-18 12:45:10.474331410 +0100 @@ -0,0 +1,24 @@ +/* + * linux/arch/arm/mach-bcm2708/clock.h @@ -3827,9 +3827,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/clock.h linux-rpi-3.6.y/arch/arm/ma +struct clk { + unsigned long rate; +}; -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/delay.S linux-rpi-3.6.y/arch/arm/mach-bcm2708/delay.S ---- linux-3.6.1/arch/arm/mach-bcm2708/delay.S 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/delay.S 2012-11-11 18:16:52.741727886 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/delay.S linux-3.6.7.patch/arch/arm/mach-bcm2708/delay.S +--- linux-3.6.7/arch/arm/mach-bcm2708/delay.S 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/delay.S 2012-11-18 12:45:10.474331410 +0100 @@ -0,0 +1,20 @@ +/* + * linux/arch/arm/lib/delay.S @@ -3851,9 +3851,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/delay.S linux-rpi-3.6.y/arch/arm/ma + bhi bcm2708_delay + mov pc, lr +ENDPROC(bcm2708_delay) -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/dma.c linux-rpi-3.6.y/arch/arm/mach-bcm2708/dma.c ---- linux-3.6.1/arch/arm/mach-bcm2708/dma.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/dma.c 2012-11-11 18:16:52.720727478 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/dma.c linux-3.6.7.patch/arch/arm/mach-bcm2708/dma.c +--- linux-3.6.7/arch/arm/mach-bcm2708/dma.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/dma.c 2012-11-18 12:45:10.475331431 +0100 @@ -0,0 +1,397 @@ +/* + * linux/arch/arm/mach-bcm2708/dma.c @@ -4252,9 +4252,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/dma.c linux-rpi-3.6.y/arch/arm/mach +MODULE_LICENSE("GPL"); + +MODULE_PARM_DESC(dmachans, "Bitmap of DMA channels available to the ARM"); -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/arm_control.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/arm_control.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/arm_control.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/arm_control.h 2012-11-11 18:16:52.768728417 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/arm_control.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/arm_control.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/arm_control.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/arm_control.h 2012-11-18 12:45:10.477331470 +0100 @@ -0,0 +1,419 @@ +/* + * linux/arch/arm/mach-bcm2708/arm_control.h @@ -4675,9 +4675,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/arm_control.h linux-rp +#define AJBTDO HW_REGISTER_RW(AJB_BASE+0x0c) + +#endif -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/arm_power.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/arm_power.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/arm_power.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/arm_power.h 2012-11-11 18:16:52.770728455 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/arm_power.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/arm_power.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/arm_power.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/arm_power.h 2012-11-18 12:45:10.477331470 +0100 @@ -0,0 +1,60 @@ +/* + * linux/arch/arm/mach-bcm2708/include/mach/arm_power.h @@ -4739,9 +4739,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/arm_power.h linux-rpi- +}; + +#endif -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/clkdev.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/clkdev.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/clkdev.h 2012-11-11 18:16:52.756728183 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/clkdev.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/clkdev.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/clkdev.h 2012-11-18 12:45:10.477331470 +0100 @@ -0,0 +1,7 @@ +#ifndef __ASM_MACH_CLKDEV_H +#define __ASM_MACH_CLKDEV_H @@ -4750,9 +4750,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-rpi-3.6 +#define __clk_put(clk) do { } while (0) + +#endif -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/debug-macro.S linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/debug-macro.S ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/debug-macro.S 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/debug-macro.S 2012-11-11 18:16:52.769728436 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/debug-macro.S linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/debug-macro.S +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/debug-macro.S 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/debug-macro.S 2012-11-18 12:45:10.478331489 +0100 @@ -0,0 +1,22 @@ +/* arch/arm/mach-bcm2708/include/mach/debug-macro.S + * @@ -4776,9 +4776,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/debug-macro.S linux-rp + .endm + +#include -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/dma.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/dma.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/dma.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/dma.h 2012-11-11 18:16:52.770728455 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/dma.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/dma.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/dma.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/dma.h 2012-11-18 12:45:10.478331489 +0100 @@ -0,0 +1,84 @@ +/* + * linux/arch/arm/mach-bcm2708/include/mach/dma.h @@ -4864,9 +4864,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/dma.h linux-rpi-3.6.y/ + + +#endif /* _MACH_BCM2708_DMA_H */ -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/entry-macro.S linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/entry-macro.S ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/entry-macro.S 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/entry-macro.S 2012-11-11 18:16:52.755728163 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/entry-macro.S linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/entry-macro.S +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/entry-macro.S 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/entry-macro.S 2012-11-18 12:45:10.479331508 +0100 @@ -0,0 +1,69 @@ +/* + * arch/arm/mach-bcm2708/include/mach/entry-macro.S @@ -4937,9 +4937,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/entry-macro.S linux-rp +1020: @ EQ will be set if no irqs pending + + .endm -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/frc.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/frc.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/frc.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/frc.h 2012-11-11 18:16:52.769728436 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/frc.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/frc.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/frc.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/frc.h 2012-11-18 12:45:10.479331508 +0100 @@ -0,0 +1,38 @@ +/* + * arch/arm/mach-bcm2708/include/mach/timex.h @@ -4979,9 +4979,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/frc.h linux-rpi-3.6.y/ +extern unsigned long long frc_clock_ticks63(void); + +#endif -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/gpio.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/gpio.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/gpio.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/gpio.h 2012-11-11 18:16:52.768728417 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/gpio.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/gpio.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/gpio.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/gpio.h 2012-11-18 12:45:10.480331527 +0100 @@ -0,0 +1,48 @@ +/* + * arch/arm/mach-bcm2708/include/mach/gpio.h @@ -5031,9 +5031,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/gpio.h linux-rpi-3.6.y + +#endif + -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/hardware.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/hardware.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/hardware.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/hardware.h 2012-11-11 18:16:52.769728436 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/hardware.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/hardware.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/hardware.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/hardware.h 2012-11-18 12:45:10.480331527 +0100 @@ -0,0 +1,28 @@ +/* + * arch/arm/mach-bcm2708/include/mach/hardware.h @@ -5063,9 +5063,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/hardware.h linux-rpi-3 +#include + +#endif -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/io.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/io.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/io.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/io.h 2012-11-11 18:16:52.768728417 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/io.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/io.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/io.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/io.h 2012-11-18 12:45:10.480331527 +0100 @@ -0,0 +1,28 @@ +/* + * arch/arm/mach-bcm2708/include/mach/io.h @@ -5095,9 +5095,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/io.h linux-rpi-3.6.y/a +#define __mem_pci(a) (a) + +#endif -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/irqs.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/irqs.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/irqs.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/irqs.h 2012-11-11 18:16:52.768728417 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/irqs.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/irqs.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/irqs.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/irqs.h 2012-11-18 12:45:10.481331546 +0100 @@ -0,0 +1,199 @@ +/* + * arch/arm/mach-bcm2708/include/mach/irqs.h @@ -5298,9 +5298,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/irqs.h linux-rpi-3.6.y + + +#endif /* _BCM2708_IRQS_H_ */ -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/memory.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/memory.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/memory.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/memory.h 2012-11-11 18:16:52.767728398 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/memory.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/memory.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/memory.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/memory.h 2012-11-18 12:45:10.481331546 +0100 @@ -0,0 +1,57 @@ +/* + * arch/arm/mach-bcm2708/include/mach/memory.h @@ -5359,9 +5359,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/memory.h linux-rpi-3.6 +#define __bus_to_pfn(x) __phys_to_pfn((x) - (BUS_OFFSET - PLAT_PHYS_OFFSET)) + +#endif -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/platform.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/platform.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/platform.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/platform.h 2012-11-11 18:16:52.754728142 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/platform.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/platform.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/platform.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/platform.h 2012-11-18 12:45:10.482331566 +0100 @@ -0,0 +1,225 @@ +/* + * arch/arm/mach-bcm2708/include/mach/platform.h @@ -5588,9 +5588,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/platform.h linux-rpi-3 +#endif + +/* END */ -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/power.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/power.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/power.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/power.h 2012-11-11 18:16:52.770728455 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/power.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/power.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/power.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/power.h 2012-11-18 12:45:10.483331587 +0100 @@ -0,0 +1,26 @@ +/* + * linux/arch/arm/mach-bcm2708/power.h @@ -5618,9 +5618,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/power.h linux-rpi-3.6. +extern int bcm_power_close(BCM_POWER_HANDLE_T handle); + +#endif -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/system.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/system.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/system.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/system.h 2012-11-11 18:16:52.754728142 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/system.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/system.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/system.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/system.h 2012-11-18 12:45:10.483331587 +0100 @@ -0,0 +1,38 @@ +/* + * arch/arm/mach-bcm2708/include/mach/system.h @@ -5660,9 +5660,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/system.h linux-rpi-3.6 +} + +#endif -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/timex.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/timex.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/timex.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/timex.h 2012-11-11 18:16:52.755728163 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/timex.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/timex.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/timex.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/timex.h 2012-11-18 12:45:10.483331587 +0100 @@ -0,0 +1,23 @@ +/* + * arch/arm/mach-bcm2708/include/mach/timex.h @@ -5687,9 +5687,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/timex.h linux-rpi-3.6. + */ + +#define CLOCK_TICK_RATE (1000000) -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/uncompress.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/uncompress.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/uncompress.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/uncompress.h 2012-11-11 18:16:52.770728455 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/uncompress.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/uncompress.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/uncompress.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/uncompress.h 2012-11-18 12:45:10.484331607 +0100 @@ -0,0 +1,85 @@ +/* + * arch/arm/mach-bcn2708/include/mach/uncompress.h @@ -5776,9 +5776,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/uncompress.h linux-rpi + */ +#define arch_decomp_wdog() + -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/vcio.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/vcio.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/vcio.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/vcio.h 2012-11-11 18:16:52.755728163 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/vcio.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/vcio.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/vcio.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/vcio.h 2012-11-18 12:45:10.484331607 +0100 @@ -0,0 +1,108 @@ +/* + * arch/arm/mach-bcm2708/include/mach/vcio.h @@ -5888,9 +5888,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/vcio.h linux-rpi-3.6.y +extern int /*rc*/ bcm_mailbox_property(void *data, int size); + +#endif -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/vc_mem.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/vc_mem.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/vc_mem.h 2012-11-11 18:16:52.769728436 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/vc_mem.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/vc_mem.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/vc_mem.h 2012-11-18 12:45:10.485331626 +0100 @@ -0,0 +1,36 @@ +/***************************************************************************** +* Copyright 2010 - 2011 Broadcom Corporation. All rights reserved. @@ -5928,9 +5928,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-rpi-3.6 + +#endif /* VC_MEM_H */ + -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/vmalloc.h linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/vmalloc.h ---- linux-3.6.1/arch/arm/mach-bcm2708/include/mach/vmalloc.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/include/mach/vmalloc.h 2012-11-11 18:16:52.755728163 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/include/mach/vmalloc.h linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/vmalloc.h +--- linux-3.6.7/arch/arm/mach-bcm2708/include/mach/vmalloc.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/include/mach/vmalloc.h 2012-11-18 12:45:10.485331626 +0100 @@ -0,0 +1,20 @@ +/* + * arch/arm/mach-bcm2708/include/mach/vmalloc.h @@ -5952,9 +5952,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/include/mach/vmalloc.h linux-rpi-3. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#define VMALLOC_END (0xe8000000) -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/Kconfig linux-rpi-3.6.y/arch/arm/mach-bcm2708/Kconfig ---- linux-3.6.1/arch/arm/mach-bcm2708/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/Kconfig 2012-11-11 18:16:52.772728493 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/Kconfig linux-3.6.7.patch/arch/arm/mach-bcm2708/Kconfig +--- linux-3.6.7/arch/arm/mach-bcm2708/Kconfig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/Kconfig 2012-11-18 12:45:10.485331626 +0100 @@ -0,0 +1,34 @@ +menu "Broadcom BCM2708 Implementations" + depends on ARCH_BCM2708 @@ -5990,9 +5990,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/Kconfig linux-rpi-3.6.y/arch/arm/ma + Do not allow ARM to use GPU's L2 cache. Requires disable_l2cache in config.txt. + +endmenu -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/Makefile linux-rpi-3.6.y/arch/arm/mach-bcm2708/Makefile ---- linux-3.6.1/arch/arm/mach-bcm2708/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/Makefile 2012-11-11 18:16:52.771728474 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/Makefile linux-3.6.7.patch/arch/arm/mach-bcm2708/Makefile +--- linux-3.6.7/arch/arm/mach-bcm2708/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/Makefile 2012-11-18 12:45:10.486331645 +0100 @@ -0,0 +1,8 @@ +# +# Makefile for the linux kernel. @@ -6002,16 +6002,16 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/Makefile linux-rpi-3.6.y/arch/arm/m +obj-$(CONFIG_BCM2708_GPIO) += bcm2708_gpio.o +obj-$(CONFIG_BCM2708_VCMEM) += vc_mem.o + -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/Makefile.boot linux-rpi-3.6.y/arch/arm/mach-bcm2708/Makefile.boot ---- linux-3.6.1/arch/arm/mach-bcm2708/Makefile.boot 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/Makefile.boot 2012-11-11 18:16:52.741727886 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/Makefile.boot linux-3.6.7.patch/arch/arm/mach-bcm2708/Makefile.boot +--- linux-3.6.7/arch/arm/mach-bcm2708/Makefile.boot 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/Makefile.boot 2012-11-18 12:45:10.486331645 +0100 @@ -0,0 +1,3 @@ + zreladdr-y := 0x00008000 +params_phys-y := 0x00000100 +initrd_phys-y := 0x00800000 -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/power.c linux-rpi-3.6.y/arch/arm/mach-bcm2708/power.c ---- linux-3.6.1/arch/arm/mach-bcm2708/power.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/power.c 2012-11-11 18:16:52.771728474 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/power.c linux-3.6.7.patch/arch/arm/mach-bcm2708/power.c +--- linux-3.6.7/arch/arm/mach-bcm2708/power.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/power.c 2012-11-18 12:45:10.487331664 +0100 @@ -0,0 +1,194 @@ +/* + * linux/arch/arm/mach-bcm2708/power.c @@ -6207,9 +6207,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/power.c linux-rpi-3.6.y/arch/arm/ma +MODULE_AUTHOR("Phil Elwell"); +MODULE_DESCRIPTION("Interface to BCM2708 power management"); +MODULE_LICENSE("GPL"); -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/vcio.c linux-rpi-3.6.y/arch/arm/mach-bcm2708/vcio.c ---- linux-3.6.1/arch/arm/mach-bcm2708/vcio.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/vcio.c 2012-11-11 18:16:52.771728474 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/vcio.c linux-3.6.7.patch/arch/arm/mach-bcm2708/vcio.c +--- linux-3.6.7/arch/arm/mach-bcm2708/vcio.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/vcio.c 2012-11-18 12:45:10.487331664 +0100 @@ -0,0 +1,338 @@ +/* + * linux/arch/arm/mach-bcm2708/vcio.c @@ -6549,9 +6549,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/vcio.c linux-rpi-3.6.y/arch/arm/mac +MODULE_DESCRIPTION("ARM I/O to VideoCore processor"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:bcm-mbox"); -diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/vc_mem.c linux-rpi-3.6.y/arch/arm/mach-bcm2708/vc_mem.c ---- linux-3.6.1/arch/arm/mach-bcm2708/vc_mem.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/arch/arm/mach-bcm2708/vc_mem.c 2012-11-11 18:16:52.753728121 +0100 +diff -Naur linux-3.6.7/arch/arm/mach-bcm2708/vc_mem.c linux-3.6.7.patch/arch/arm/mach-bcm2708/vc_mem.c +--- linux-3.6.7/arch/arm/mach-bcm2708/vc_mem.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mach-bcm2708/vc_mem.c 2012-11-18 12:45:10.488331683 +0100 @@ -0,0 +1,458 @@ +/***************************************************************************** +* Copyright 2010 - 2011 Broadcom Corporation. All rights reserved. @@ -7011,9 +7011,9 @@ diff -Naur linux-3.6.1/arch/arm/mach-bcm2708/vc_mem.c linux-rpi-3.6.y/arch/arm/m +module_param(mem_size, uint, 0644); +module_param(mem_base, uint, 0644); + -diff -Naur linux-3.6.1/arch/arm/Makefile linux-rpi-3.6.y/arch/arm/Makefile ---- linux-3.6.1/arch/arm/Makefile 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/arch/arm/Makefile 2012-11-11 18:17:00.535880235 +0100 +diff -Naur linux-3.6.7/arch/arm/Makefile linux-3.6.7.patch/arch/arm/Makefile +--- linux-3.6.7/arch/arm/Makefile 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/Makefile 2012-11-18 12:45:10.489331702 +0100 @@ -198,6 +198,7 @@ machine-$(CONFIG_MACH_SPEAR320) := spear3xx machine-$(CONFIG_MACH_SPEAR600) := spear6xx @@ -7022,9 +7022,9 @@ diff -Naur linux-3.6.1/arch/arm/Makefile linux-rpi-3.6.y/arch/arm/Makefile # Platform directory name. This list is sorted alphanumerically # by CONFIG_* macro name. -diff -Naur linux-3.6.1/arch/arm/mm/alignment.c linux-rpi-3.6.y/arch/arm/mm/alignment.c ---- linux-3.6.1/arch/arm/mm/alignment.c 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/arch/arm/mm/alignment.c 2012-11-11 18:16:55.348778848 +0100 +diff -Naur linux-3.6.7/arch/arm/mm/alignment.c linux-3.6.7.patch/arch/arm/mm/alignment.c +--- linux-3.6.7/arch/arm/mm/alignment.c 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mm/alignment.c 2012-11-18 12:45:10.490331722 +0100 @@ -856,9 +856,11 @@ case 0x08000000: /* ldm or stm, or thumb-2 32bit instruction */ if (thumb2_32b) @@ -7039,9 +7039,9 @@ diff -Naur linux-3.6.1/arch/arm/mm/alignment.c linux-rpi-3.6.y/arch/arm/mm/align default: goto bad; -diff -Naur linux-3.6.1/arch/arm/mm/Kconfig linux-rpi-3.6.y/arch/arm/mm/Kconfig ---- linux-3.6.1/arch/arm/mm/Kconfig 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/arch/arm/mm/Kconfig 2012-11-11 18:16:55.364779159 +0100 +diff -Naur linux-3.6.7/arch/arm/mm/Kconfig linux-3.6.7.patch/arch/arm/mm/Kconfig +--- linux-3.6.7/arch/arm/mm/Kconfig 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mm/Kconfig 2012-11-18 12:45:10.490331722 +0100 @@ -354,7 +354,7 @@ # ARMv6 @@ -7051,9 +7051,9 @@ diff -Naur linux-3.6.1/arch/arm/mm/Kconfig linux-rpi-3.6.y/arch/arm/mm/Kconfig select CPU_32v6 select CPU_ABRT_EV6 select CPU_PABRT_V6 -diff -Naur linux-3.6.1/arch/arm/mm/proc-v6.S linux-rpi-3.6.y/arch/arm/mm/proc-v6.S ---- linux-3.6.1/arch/arm/mm/proc-v6.S 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/arch/arm/mm/proc-v6.S 2012-11-11 18:16:55.350778887 +0100 +diff -Naur linux-3.6.7/arch/arm/mm/proc-v6.S linux-3.6.7.patch/arch/arm/mm/proc-v6.S +--- linux-3.6.7/arch/arm/mm/proc-v6.S 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/mm/proc-v6.S 2012-11-18 12:45:10.491331743 +0100 @@ -73,10 +73,19 @@ * * IRQs are already disabled. @@ -7077,9 +7077,9 @@ diff -Naur linux-3.6.1/arch/arm/mm/proc-v6.S linux-rpi-3.6.y/arch/arm/mm/proc-v6 mov pc, lr ENTRY(cpu_v6_dcache_clean_area) -diff -Naur linux-3.6.1/arch/arm/tools/mach-types linux-rpi-3.6.y/arch/arm/tools/mach-types ---- linux-3.6.1/arch/arm/tools/mach-types 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/arch/arm/tools/mach-types 2012-11-11 18:16:53.970751911 +0100 +diff -Naur linux-3.6.7/arch/arm/tools/mach-types linux-3.6.7.patch/arch/arm/tools/mach-types +--- linux-3.6.7/arch/arm/tools/mach-types 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/arch/arm/tools/mach-types 2012-11-18 12:45:10.492331763 +0100 @@ -519,6 +519,7 @@ prima2_evb MACH_PRIMA2_EVB PRIMA2_EVB 3103 paz00 MACH_PAZ00 PAZ00 3128 @@ -7088,9 +7088,9 @@ diff -Naur linux-3.6.1/arch/arm/tools/mach-types linux-rpi-3.6.y/arch/arm/tools/ ag5evm MACH_AG5EVM AG5EVM 3189 tsunagi MACH_TSUNAGI TSUNAGI 3197 ics_if_voip MACH_ICS_IF_VOIP ICS_IF_VOIP 3206 -diff -Naur linux-3.6.1/drivers/char/broadcom/Kconfig linux-rpi-3.6.y/drivers/char/broadcom/Kconfig ---- linux-3.6.1/drivers/char/broadcom/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/char/broadcom/Kconfig 2012-11-11 18:15:54.257582920 +0100 +diff -Naur linux-3.6.7/drivers/char/broadcom/Kconfig linux-3.6.7.patch/drivers/char/broadcom/Kconfig +--- linux-3.6.7/drivers/char/broadcom/Kconfig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/char/broadcom/Kconfig 2012-11-18 12:45:10.492331763 +0100 @@ -0,0 +1,18 @@ +# +# Broadcom char driver config @@ -7110,15 +7110,15 @@ diff -Naur linux-3.6.1/drivers/char/broadcom/Kconfig linux-rpi-3.6.y/drivers/cha + help + Helper for videocore CMA access. + -diff -Naur linux-3.6.1/drivers/char/broadcom/Makefile linux-rpi-3.6.y/drivers/char/broadcom/Makefile ---- linux-3.6.1/drivers/char/broadcom/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/char/broadcom/Makefile 2012-11-11 18:15:54.257582920 +0100 +diff -Naur linux-3.6.7/drivers/char/broadcom/Makefile linux-3.6.7.patch/drivers/char/broadcom/Makefile +--- linux-3.6.7/drivers/char/broadcom/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/char/broadcom/Makefile 2012-11-18 12:45:10.493331782 +0100 @@ -0,0 +1,2 @@ +obj-$(CONFIG_BCM_VC_CMA) += vc_cma/ + -diff -Naur linux-3.6.1/drivers/char/broadcom/vc_cma/Makefile linux-rpi-3.6.y/drivers/char/broadcom/vc_cma/Makefile ---- linux-3.6.1/drivers/char/broadcom/vc_cma/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/char/broadcom/vc_cma/Makefile 2012-11-11 18:15:54.257582920 +0100 +diff -Naur linux-3.6.7/drivers/char/broadcom/vc_cma/Makefile linux-3.6.7.patch/drivers/char/broadcom/vc_cma/Makefile +--- linux-3.6.7/drivers/char/broadcom/vc_cma/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/char/broadcom/vc_cma/Makefile 2012-11-18 12:45:10.493331782 +0100 @@ -0,0 +1,15 @@ +EXTRA_CFLAGS += -Wall -Wstrict-prototypes -Wno-trigraphs +EXTRA_CFLAGS += -Werror @@ -7135,9 +7135,9 @@ diff -Naur linux-3.6.1/drivers/char/broadcom/vc_cma/Makefile linux-rpi-3.6.y/dri + +vc-cma-objs := vc_cma.o + -diff -Naur linux-3.6.1/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi-3.6.y/drivers/char/broadcom/vc_cma/vc_cma.c ---- linux-3.6.1/drivers/char/broadcom/vc_cma/vc_cma.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/char/broadcom/vc_cma/vc_cma.c 2012-11-11 18:15:54.257582920 +0100 +diff -Naur linux-3.6.7/drivers/char/broadcom/vc_cma/vc_cma.c linux-3.6.7.patch/drivers/char/broadcom/vc_cma/vc_cma.c +--- linux-3.6.7/drivers/char/broadcom/vc_cma/vc_cma.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/char/broadcom/vc_cma/vc_cma.c 2012-11-18 12:45:10.495331821 +0100 @@ -0,0 +1,886 @@ +/***************************************************************************** +* Copyright 2012 Broadcom Corporation. All rights reserved. @@ -8025,9 +8025,9 @@ diff -Naur linux-3.6.1/drivers/char/broadcom/vc_cma/vc_cma.c linux-rpi-3.6.y/dri +module_exit(vc_cma_exit); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Broadcom Corporation"); -diff -Naur linux-3.6.1/drivers/char/Kconfig linux-rpi-3.6.y/drivers/char/Kconfig ---- linux-3.6.1/drivers/char/Kconfig 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/char/Kconfig 2012-11-11 18:15:54.577589187 +0100 +diff -Naur linux-3.6.7/drivers/char/Kconfig linux-3.6.7.patch/drivers/char/Kconfig +--- linux-3.6.7/drivers/char/Kconfig 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/char/Kconfig 2012-11-18 12:45:10.495331821 +0100 @@ -585,6 +585,8 @@ source "drivers/s390/char/Kconfig" @@ -8037,9 +8037,9 @@ diff -Naur linux-3.6.1/drivers/char/Kconfig linux-rpi-3.6.y/drivers/char/Kconfig config MSM_SMD_PKT bool "Enable device interface for some SMD packet ports" default n -diff -Naur linux-3.6.1/drivers/char/Makefile linux-rpi-3.6.y/drivers/char/Makefile ---- linux-3.6.1/drivers/char/Makefile 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/char/Makefile 2012-11-11 18:15:54.438586464 +0100 +diff -Naur linux-3.6.7/drivers/char/Makefile linux-3.6.7.patch/drivers/char/Makefile +--- linux-3.6.7/drivers/char/Makefile 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/char/Makefile 2012-11-18 12:45:10.496331840 +0100 @@ -63,3 +63,6 @@ js-rtc-y = rtc.o @@ -8047,9 +8047,9 @@ diff -Naur linux-3.6.1/drivers/char/Makefile linux-rpi-3.6.y/drivers/char/Makefi + +obj-$(CONFIG_BRCM_CHAR_DRIVERS) += broadcom/ + -diff -Naur linux-3.6.1/drivers/cpufreq/bcm2835-cpufreq.c linux-rpi-3.6.y/drivers/cpufreq/bcm2835-cpufreq.c ---- linux-3.6.1/drivers/cpufreq/bcm2835-cpufreq.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/cpufreq/bcm2835-cpufreq.c 2012-11-11 18:15:06.378645187 +0100 +diff -Naur linux-3.6.7/drivers/cpufreq/bcm2835-cpufreq.c linux-3.6.7.patch/drivers/cpufreq/bcm2835-cpufreq.c +--- linux-3.6.7/drivers/cpufreq/bcm2835-cpufreq.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/cpufreq/bcm2835-cpufreq.c 2012-11-18 12:45:10.496331840 +0100 @@ -0,0 +1,239 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -8290,9 +8290,9 @@ diff -Naur linux-3.6.1/drivers/cpufreq/bcm2835-cpufreq.c linux-rpi-3.6.y/drivers +module_init(bcm2835_cpufreq_module_init); +module_exit(bcm2835_cpufreq_module_exit); + -diff -Naur linux-3.6.1/drivers/cpufreq/Kconfig.arm linux-rpi-3.6.y/drivers/cpufreq/Kconfig.arm ---- linux-3.6.1/drivers/cpufreq/Kconfig.arm 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/cpufreq/Kconfig.arm 2012-11-11 18:15:06.155640819 +0100 +diff -Naur linux-3.6.7/drivers/cpufreq/Kconfig.arm linux-3.6.7.patch/drivers/cpufreq/Kconfig.arm +--- linux-3.6.7/drivers/cpufreq/Kconfig.arm 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/cpufreq/Kconfig.arm 2012-11-18 12:45:10.519332283 +0100 @@ -76,3 +76,12 @@ help This adds the CPUFreq driver for Samsung EXYNOS5250 @@ -8306,9 +8306,9 @@ diff -Naur linux-3.6.1/drivers/cpufreq/Kconfig.arm linux-rpi-3.6.y/drivers/cpufr + + If in doubt, say N. + -diff -Naur linux-3.6.1/drivers/cpufreq/Makefile linux-rpi-3.6.y/drivers/cpufreq/Makefile ---- linux-3.6.1/drivers/cpufreq/Makefile 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/cpufreq/Makefile 2012-11-11 18:15:06.411645833 +0100 +diff -Naur linux-3.6.7/drivers/cpufreq/Makefile linux-3.6.7.patch/drivers/cpufreq/Makefile +--- linux-3.6.7/drivers/cpufreq/Makefile 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/cpufreq/Makefile 2012-11-18 12:45:10.574333361 +0100 @@ -48,6 +48,7 @@ obj-$(CONFIG_ARM_EXYNOS4X12_CPUFREQ) += exynos4x12-cpufreq.o obj-$(CONFIG_ARM_EXYNOS5250_CPUFREQ) += exynos5250-cpufreq.o @@ -8317,9 +8317,9 @@ diff -Naur linux-3.6.1/drivers/cpufreq/Makefile linux-rpi-3.6.y/drivers/cpufreq/ ################################################################################## # PowerPC platform drivers -diff -Naur linux-3.6.1/drivers/hwmon/bcm2835-hwmon.c linux-rpi-3.6.y/drivers/hwmon/bcm2835-hwmon.c ---- linux-3.6.1/drivers/hwmon/bcm2835-hwmon.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/hwmon/bcm2835-hwmon.c 2012-11-11 18:15:30.188111514 +0100 +diff -Naur linux-3.6.7/drivers/hwmon/bcm2835-hwmon.c linux-3.6.7.patch/drivers/hwmon/bcm2835-hwmon.c +--- linux-3.6.7/drivers/hwmon/bcm2835-hwmon.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/hwmon/bcm2835-hwmon.c 2012-11-18 12:45:10.581333498 +0100 @@ -0,0 +1,219 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -8540,9 +8540,9 @@ diff -Naur linux-3.6.1/drivers/hwmon/bcm2835-hwmon.c linux-rpi-3.6.y/drivers/hwm +MODULE_DESCRIPTION("HW Monitor driver for bcm2835 chip"); + +module_platform_driver(bcm2835_hwmon_driver); -diff -Naur linux-3.6.1/drivers/hwmon/Kconfig linux-rpi-3.6.y/drivers/hwmon/Kconfig ---- linux-3.6.1/drivers/hwmon/Kconfig 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/hwmon/Kconfig 2012-11-11 18:15:30.365114982 +0100 +diff -Naur linux-3.6.7/drivers/hwmon/Kconfig linux-3.6.7.patch/drivers/hwmon/Kconfig +--- linux-3.6.7/drivers/hwmon/Kconfig 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/hwmon/Kconfig 2012-11-18 12:45:10.739336578 +0100 @@ -1411,6 +1411,16 @@ help Support for the A/D converter on MC13783 and MC13892 PMIC. @@ -8560,9 +8560,9 @@ diff -Naur linux-3.6.1/drivers/hwmon/Kconfig linux-rpi-3.6.y/drivers/hwmon/Kconf if ACPI comment "ACPI drivers" -diff -Naur linux-3.6.1/drivers/hwmon/Makefile linux-rpi-3.6.y/drivers/hwmon/Makefile ---- linux-3.6.1/drivers/hwmon/Makefile 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/hwmon/Makefile 2012-11-11 18:15:30.331114316 +0100 +diff -Naur linux-3.6.7/drivers/hwmon/Makefile linux-3.6.7.patch/drivers/hwmon/Makefile +--- linux-3.6.7/drivers/hwmon/Makefile 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/hwmon/Makefile 2012-11-18 12:45:10.739336578 +0100 @@ -129,6 +129,7 @@ obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o @@ -8571,9 +8571,9 @@ diff -Naur linux-3.6.1/drivers/hwmon/Makefile linux-rpi-3.6.y/drivers/hwmon/Make obj-$(CONFIG_PMBUS) += pmbus/ -diff -Naur linux-3.6.1/drivers/i2c/busses/i2c-bcm2708.c linux-rpi-3.6.y/drivers/i2c/busses/i2c-bcm2708.c ---- linux-3.6.1/drivers/i2c/busses/i2c-bcm2708.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/i2c/busses/i2c-bcm2708.c 2012-11-11 18:15:59.151678772 +0100 +diff -Naur linux-3.6.7/drivers/i2c/busses/i2c-bcm2708.c linux-3.6.7.patch/drivers/i2c/busses/i2c-bcm2708.c +--- linux-3.6.7/drivers/i2c/busses/i2c-bcm2708.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/i2c/busses/i2c-bcm2708.c 2012-11-18 12:45:10.741336618 +0100 @@ -0,0 +1,400 @@ +/* + * Driver for Broadcom BCM2708 BSC Controllers @@ -8975,9 +8975,9 @@ diff -Naur linux-3.6.1/drivers/i2c/busses/i2c-bcm2708.c linux-rpi-3.6.y/drivers/ +MODULE_AUTHOR("Chris Boot "); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:" DRV_NAME); -diff -Naur linux-3.6.1/drivers/i2c/busses/Kconfig linux-rpi-3.6.y/drivers/i2c/busses/Kconfig ---- linux-3.6.1/drivers/i2c/busses/Kconfig 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/i2c/busses/Kconfig 2012-11-11 18:15:59.194679612 +0100 +diff -Naur linux-3.6.7/drivers/i2c/busses/Kconfig linux-3.6.7.patch/drivers/i2c/busses/Kconfig +--- linux-3.6.7/drivers/i2c/busses/Kconfig 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/i2c/busses/Kconfig 2012-11-18 12:45:10.742336638 +0100 @@ -314,6 +314,25 @@ This driver can also be built as a module. If so, the module will be called i2c-au1550. @@ -9004,9 +9004,9 @@ diff -Naur linux-3.6.1/drivers/i2c/busses/Kconfig linux-rpi-3.6.y/drivers/i2c/bu config I2C_BLACKFIN_TWI tristate "Blackfin TWI I2C support" depends on BLACKFIN -diff -Naur linux-3.6.1/drivers/i2c/busses/Makefile linux-rpi-3.6.y/drivers/i2c/busses/Makefile ---- linux-3.6.1/drivers/i2c/busses/Makefile 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/i2c/busses/Makefile 2012-11-11 18:15:59.187679475 +0100 +diff -Naur linux-3.6.7/drivers/i2c/busses/Makefile linux-3.6.7.patch/drivers/i2c/busses/Makefile +--- linux-3.6.7/drivers/i2c/busses/Makefile 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/i2c/busses/Makefile 2012-11-18 12:45:10.742336638 +0100 @@ -30,6 +30,7 @@ # Embedded system I2C/SMBus host controller drivers obj-$(CONFIG_I2C_AT91) += i2c-at91.o @@ -9015,9 +9015,9 @@ diff -Naur linux-3.6.1/drivers/i2c/busses/Makefile linux-rpi-3.6.y/drivers/i2c/b obj-$(CONFIG_I2C_BLACKFIN_TWI) += i2c-bfin-twi.o obj-$(CONFIG_I2C_CPM) += i2c-cpm.o obj-$(CONFIG_I2C_DAVINCI) += i2c-davinci.o -diff -Naur linux-3.6.1/drivers/misc/Kconfig linux-rpi-3.6.y/drivers/misc/Kconfig ---- linux-3.6.1/drivers/misc/Kconfig 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/misc/Kconfig 2012-11-11 18:15:16.089835391 +0100 +diff -Naur linux-3.6.7/drivers/misc/Kconfig linux-3.6.7.patch/drivers/misc/Kconfig +--- linux-3.6.7/drivers/misc/Kconfig 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/Kconfig 2012-11-18 12:45:10.743336658 +0100 @@ -517,4 +517,6 @@ source "drivers/misc/carma/Kconfig" source "drivers/misc/altera-stapl/Kconfig" @@ -9025,17 +9025,17 @@ diff -Naur linux-3.6.1/drivers/misc/Kconfig linux-rpi-3.6.y/drivers/misc/Kconfig +source "drivers/misc/vc04_services/Kconfig" endmenu + -diff -Naur linux-3.6.1/drivers/misc/Makefile linux-rpi-3.6.y/drivers/misc/Makefile ---- linux-3.6.1/drivers/misc/Makefile 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/misc/Makefile 2012-11-11 18:15:15.953832727 +0100 +diff -Naur linux-3.6.7/drivers/misc/Makefile linux-3.6.7.patch/drivers/misc/Makefile +--- linux-3.6.7/drivers/misc/Makefile 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/Makefile 2012-11-18 12:45:10.744336678 +0100 @@ -50,3 +50,4 @@ obj-$(CONFIG_USB_SWITCH_FSA9480) += fsa9480.o obj-$(CONFIG_ALTERA_STAPL) +=altera-stapl/ obj-$(CONFIG_INTEL_MEI) += mei/ +obj-$(CONFIG_BCM2708_VCHIQ) += vc04_services/ -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchi/connections/connection.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchi/connections/connection.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchi/connections/connection.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchi/connections/connection.h 2012-11-11 18:15:15.880831297 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchi/connections/connection.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchi/connections/connection.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchi/connections/connection.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchi/connections/connection.h 2012-11-18 12:45:10.745336698 +0100 @@ -0,0 +1,313 @@ +/* + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -9350,9 +9350,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchi/connections/con +#endif /* CONNECTION_H_ */ + +/****************************** End of file **********************************/ -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 2012-11-11 18:15:15.904831770 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 2012-11-18 12:45:10.746336717 +0100 @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -9543,9 +9543,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchi/message_drivers +#endif // _VCHI_MESSAGE_H_ + +/****************************** End of file ***********************************/ -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 2012-11-11 18:15:15.904831770 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 2012-11-18 12:45:10.747336736 +0100 @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -9756,9 +9756,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h linu +#endif /* VCHI_CFG_H_ */ + +/****************************** End of file **********************************/ -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 2012-11-11 18:15:15.880831297 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 2012-11-18 12:45:10.747336736 +0100 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -9816,9 +9816,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchi/vchi_cfg_intern +//#define VCHI_RX_NANOLOCKS + +#endif /*VCHI_CFG_INTERNAL_H_*/ -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchi/vchi_common.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchi/vchi_common.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchi/vchi_common.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchi/vchi_common.h 2012-11-11 18:15:15.893831549 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchi/vchi_common.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchi/vchi_common.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchi/vchi_common.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchi/vchi_common.h 2012-11-18 12:45:10.748336754 +0100 @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -9968,9 +9968,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchi/vchi_common.h l + + +#endif // VCHI_COMMON_H_ -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchi/vchi.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchi/vchi.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchi/vchi.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchi/vchi.h 2012-11-11 18:15:15.904831770 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchi/vchi.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchi/vchi.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchi/vchi.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchi/vchi.h 2012-11-18 12:45:10.749336773 +0100 @@ -0,0 +1,355 @@ +/* + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -10327,9 +10327,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchi/vchi.h linux-rp +#endif /* VCHI_H_ */ + +/****************************** End of file **********************************/ -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchi/vchi_mh.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchi/vchi_mh.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 2012-11-11 18:15:15.879831278 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchi/vchi_mh.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchi/vchi_mh.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 2012-11-18 12:45:10.749336773 +0100 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -10358,9 +10358,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchi/vchi_mh.h linux +#define VCHI_MEM_HANDLE_INVALID 0 + +#endif -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 2012-11-11 18:15:15.877831238 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 2012-11-18 12:45:10.751336814 +0100 @@ -0,0 +1,518 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -10880,9 +10880,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835 + + kfree(pagelist); +} -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 2012-11-11 18:15:15.870831101 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 2012-11-18 12:45:10.751336814 +0100 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -10911,9 +10911,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835 +#define VCHIQ_PLATFORM_FRAGMENTS_COUNT_IDX 1 + +#endif /* VCHIQ_2835_H */ -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 2012-11-11 18:15:15.867831043 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 2012-11-18 12:45:10.755336893 +0100 @@ -0,0 +1,2740 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -13655,9 +13655,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm. +module_exit(vchiq_exit); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Broadcom Corporation"); -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 2012-11-11 18:15:15.870831101 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 2012-11-18 12:45:10.755336893 +0100 @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -13860,9 +13860,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm. + + +#endif /* VCHIQ_ARM_H */ -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 2012-11-11 18:15:15.870831101 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 2012-11-18 12:45:10.756336912 +0100 @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -13886,9 +13886,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_buil +const char *vchiq_get_build_version(void); +const char *vchiq_get_build_time(void); +const char *vchiq_get_build_date(void); -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 2012-11-11 18:15:15.879831278 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 2012-11-18 12:45:10.756336912 +0100 @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -13935,9 +13935,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg. +#endif + +#endif /* VCHIQ_CFG_H */ -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 2012-11-11 18:15:15.869831082 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 2012-11-18 12:45:10.757336931 +0100 @@ -0,0 +1,100 @@ +/***************************************************************************** +* Copyright 2001 - 2010 Broadcom Corporation. All rights reserved. @@ -14039,9 +14039,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_conn + mutex_unlock(&g_connected_mutex); +} +EXPORT_SYMBOL(vchiq_add_connected_callback); -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 2012-11-11 18:15:15.875831198 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 2012-11-18 12:45:10.757336931 +0100 @@ -0,0 +1,32 @@ +/***************************************************************************** +* Copyright 2001 - 2010 Broadcom Corporation. All rights reserved. @@ -14075,9 +14075,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_conn + +#endif /* VCHIQ_CONNECTED_H */ + -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 2012-11-11 18:15:15.878831258 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 2012-11-18 12:45:10.762337029 +0100 @@ -0,0 +1,3613 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -17692,9 +17692,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core + numBytes = 0; + } +} -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 2012-11-11 18:15:15.877831238 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 2012-11-18 12:45:10.763337048 +0100 @@ -0,0 +1,673 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -18369,9 +18369,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core + size_t numBytes); + +#endif -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 2012-11-11 18:15:15.868831063 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 2012-11-18 12:45:10.764337068 +0100 @@ -0,0 +1,87 @@ +#!/usr/bin/perl -w + @@ -18460,9 +18460,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genv + return vchiq_build_time; +} +EOF -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 2012-11-11 18:15:15.879831278 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 2012-11-18 12:45:10.764337068 +0100 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -18490,9 +18490,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h li + +#endif + -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 2012-11-11 18:15:15.869831082 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 2012-11-18 12:45:10.765337087 +0100 @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -18659,9 +18659,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h + void *ptr, size_t num_bytes); + +#endif /* VCHIQ_IF_H */ -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 2012-11-11 18:15:15.874831178 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 2012-11-18 12:45:10.766337107 +0100 @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -18777,9 +18777,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioct +#define VCHIQ_IOC_MAX 15 + +#endif -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 2012-11-11 18:15:15.855830803 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 2012-11-18 12:45:10.766337107 +0100 @@ -0,0 +1,424 @@ +/***************************************************************************** +* Copyright 2001 - 2011 Broadcom Corporation. All rights reserved. @@ -19205,9 +19205,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern + + return status; +} -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 2012-11-11 18:15:15.870831101 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 2012-11-18 12:45:10.767337126 +0100 @@ -0,0 +1,52 @@ +/***************************************************************************** +* Copyright 2001 - 2010 Broadcom Corporation. All rights reserved. @@ -19261,9 +19261,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memd + const VCHIQ_PLATFORM_DATA_T * platform_data); + +#endif -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 2012-11-11 18:15:15.869831082 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 2012-11-18 12:45:10.767337126 +0100 @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -19308,9 +19308,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_page +} FRAGMENTS_T; + +#endif /* VCHIQ_PAGELIST_H */ -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c 2012-11-11 18:15:15.855830803 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c 2012-11-18 12:45:10.768337146 +0100 @@ -0,0 +1,223 @@ +/* + * Copyright (c) 2012 Broadcom Corporation. All rights reserved. @@ -19535,9 +19535,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc +{ + return proc_info.clients; +} -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 2012-11-11 18:15:15.869831082 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 2012-11-18 12:45:10.770337185 +0100 @@ -0,0 +1,787 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -20326,9 +20326,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim + return ret; +} +EXPORT_SYMBOL(vchi_service_release); -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 2012-11-11 18:15:15.855830803 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 2012-11-18 12:45:10.770337185 +0100 @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -20435,9 +20435,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util + + return header; +} -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 2012-11-11 18:15:15.879831278 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 2012-11-18 12:45:10.771337204 +0100 @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -20506,9 +20506,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util + +#endif + -diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c ---- linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 2012-11-11 18:15:15.868831063 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c +--- linux-3.6.7/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 2012-11-18 12:45:10.771337204 +0100 @@ -0,0 +1,27 @@ +#include "vchiq_build_info.h" +#include @@ -20537,9 +20537,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_vers +{ + return vchiq_build_time; +} -diff -Naur linux-3.6.1/drivers/misc/vc04_services/Kconfig linux-rpi-3.6.y/drivers/misc/vc04_services/Kconfig ---- linux-3.6.1/drivers/misc/vc04_services/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/Kconfig 2012-11-11 18:15:15.905831790 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/Kconfig linux-3.6.7.patch/drivers/misc/vc04_services/Kconfig +--- linux-3.6.7/drivers/misc/vc04_services/Kconfig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/Kconfig 2012-11-18 12:45:10.771337204 +0100 @@ -0,0 +1,10 @@ +config BCM2708_VCHIQ + tristate "Videocore VCHIQ" @@ -20551,9 +20551,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/Kconfig linux-rpi-3.6.y/driver + Defaults to Y when the Broadcom Videocore services + are included in the build, N otherwise. + -diff -Naur linux-3.6.1/drivers/misc/vc04_services/Makefile linux-rpi-3.6.y/drivers/misc/vc04_services/Makefile ---- linux-3.6.1/drivers/misc/vc04_services/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/misc/vc04_services/Makefile 2012-11-11 18:15:15.905831790 +0100 +diff -Naur linux-3.6.7/drivers/misc/vc04_services/Makefile linux-3.6.7.patch/drivers/misc/vc04_services/Makefile +--- linux-3.6.7/drivers/misc/vc04_services/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/misc/vc04_services/Makefile 2012-11-18 12:45:10.772337224 +0100 @@ -0,0 +1,18 @@ +ifeq ($(CONFIG_MACH_BCM2708),y) + @@ -20573,9 +20573,9 @@ diff -Naur linux-3.6.1/drivers/misc/vc04_services/Makefile linux-rpi-3.6.y/drive + +endif + -diff -Naur linux-3.6.1/drivers/mmc/card/block.c linux-rpi-3.6.y/drivers/mmc/card/block.c ---- linux-3.6.1/drivers/mmc/card/block.c 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/mmc/card/block.c 2012-11-11 18:15:16.860850490 +0100 +diff -Naur linux-3.6.7/drivers/mmc/card/block.c linux-3.6.7.patch/drivers/mmc/card/block.c +--- linux-3.6.7/drivers/mmc/card/block.c 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/mmc/card/block.c 2012-11-18 12:45:10.773337243 +0100 @@ -1135,7 +1135,7 @@ brq->data.blocks = 1; } @@ -20585,9 +20585,9 @@ diff -Naur linux-3.6.1/drivers/mmc/card/block.c linux-rpi-3.6.y/drivers/mmc/card /* SPI multiblock writes terminate using a special * token, not a STOP_TRANSMISSION request. */ -diff -Naur linux-3.6.1/drivers/mmc/host/Kconfig linux-rpi-3.6.y/drivers/mmc/host/Kconfig ---- linux-3.6.1/drivers/mmc/host/Kconfig 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/mmc/host/Kconfig 2012-11-11 18:15:16.801849335 +0100 +diff -Naur linux-3.6.7/drivers/mmc/host/Kconfig linux-3.6.7.patch/drivers/mmc/host/Kconfig +--- linux-3.6.7/drivers/mmc/host/Kconfig 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/mmc/host/Kconfig 2012-11-18 12:45:10.774337263 +0100 @@ -229,6 +229,27 @@ YMMV. @@ -20616,9 +20616,9 @@ diff -Naur linux-3.6.1/drivers/mmc/host/Kconfig linux-rpi-3.6.y/drivers/mmc/host config MMC_OMAP tristate "TI OMAP Multimedia Card Interface support" depends on ARCH_OMAP -diff -Naur linux-3.6.1/drivers/mmc/host/Makefile linux-rpi-3.6.y/drivers/mmc/host/Makefile ---- linux-3.6.1/drivers/mmc/host/Makefile 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/mmc/host/Makefile 2012-11-11 18:15:16.788849081 +0100 +diff -Naur linux-3.6.7/drivers/mmc/host/Makefile linux-3.6.7.patch/drivers/mmc/host/Makefile +--- linux-3.6.7/drivers/mmc/host/Makefile 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/mmc/host/Makefile 2012-11-18 12:45:10.774337263 +0100 @@ -13,6 +13,7 @@ obj-$(CONFIG_MMC_SDHCI_PXAV2) += sdhci-pxav2.o obj-$(CONFIG_MMC_SDHCI_S3C) += sdhci-s3c.o @@ -20627,9 +20627,9 @@ diff -Naur linux-3.6.1/drivers/mmc/host/Makefile linux-rpi-3.6.y/drivers/mmc/hos obj-$(CONFIG_MMC_WBSD) += wbsd.o obj-$(CONFIG_MMC_AU1X) += au1xmmc.o obj-$(CONFIG_MMC_OMAP) += omap.o -diff -Naur linux-3.6.1/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-3.6.y/drivers/mmc/host/sdhci-bcm2708.c ---- linux-3.6.1/drivers/mmc/host/sdhci-bcm2708.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/mmc/host/sdhci-bcm2708.c 2012-11-11 18:15:16.791849139 +0100 +diff -Naur linux-3.6.7/drivers/mmc/host/sdhci-bcm2708.c linux-3.6.7.patch/drivers/mmc/host/sdhci-bcm2708.c +--- linux-3.6.7/drivers/mmc/host/sdhci-bcm2708.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/mmc/host/sdhci-bcm2708.c 2012-11-18 12:45:10.776337302 +0100 @@ -0,0 +1,1406 @@ +/* + * sdhci-bcm2708.c Support for SDHCI device on BCM2708 @@ -22037,9 +22037,9 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-3.6.y/drivers/ +MODULE_PARM_DESC(enable_llm, "Enable low-latency mode"); + + -diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host/sdhci.c ---- linux-3.6.1/drivers/mmc/host/sdhci.c 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/mmc/host/sdhci.c 2012-11-11 18:15:16.756848453 +0100 +diff -Naur linux-3.6.7/drivers/mmc/host/sdhci.c linux-3.6.7.patch/drivers/mmc/host/sdhci.c +--- linux-3.6.7/drivers/mmc/host/sdhci.c 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/mmc/host/sdhci.c 2012-11-18 12:46:55.770377168 +0100 @@ -28,6 +28,7 @@ #include #include @@ -22407,19 +22407,19 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host WARN_ON(host->mrq != NULL); -@@ -1311,9 +1414,9 @@ - tuning_opcode = mmc->card->type == MMC_TYPE_MMC ? - MMC_SEND_TUNING_BLOCK_HS200 : - MMC_SEND_TUNING_BLOCK; -- spin_unlock_irqrestore(&host->lock, flags); -+ sdhci_spin_unlock_irqrestore(host, flags); - sdhci_execute_tuning(mmc, tuning_opcode); -- spin_lock_irqsave(&host->lock, flags); -+ sdhci_spin_lock_irqsave(host, &flags); +@@ -1313,9 +1416,9 @@ + mmc->card->type == MMC_TYPE_MMC ? + MMC_SEND_TUNING_BLOCK_HS200 : + MMC_SEND_TUNING_BLOCK; +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + sdhci_execute_tuning(mmc, tuning_opcode); +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); - /* Restore original mmc_request structure */ - host->mrq = mrq; -@@ -1326,7 +1429,7 @@ + /* Restore original mmc_request structure */ + host->mrq = mrq; +@@ -1329,7 +1432,7 @@ } mmiowb(); @@ -22428,7 +22428,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host } static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios) -@@ -1335,7 +1438,7 @@ +@@ -1338,7 +1441,7 @@ int vdd_bit = -1; u8 ctrl; @@ -22437,7 +22437,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host if (host->flags & SDHCI_DEVICE_DEAD) { spin_unlock_irqrestore(&host->lock, flags); -@@ -1402,7 +1505,7 @@ +@@ -1405,7 +1508,7 @@ else ctrl &= ~SDHCI_CTRL_HISPD; @@ -22446,7 +22446,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host u16 clk, ctrl_2; unsigned int clock; -@@ -1411,7 +1514,8 @@ +@@ -1414,7 +1517,8 @@ (ios->timing == MMC_TIMING_UHS_SDR50) || (ios->timing == MMC_TIMING_UHS_SDR104) || (ios->timing == MMC_TIMING_UHS_DDR50) || @@ -22456,7 +22456,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host ctrl |= SDHCI_CTRL_HISPD; ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2); -@@ -1492,7 +1596,7 @@ +@@ -1495,7 +1599,7 @@ sdhci_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA); mmiowb(); @@ -22465,7 +22465,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host } static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) -@@ -1509,7 +1613,7 @@ +@@ -1512,7 +1616,7 @@ unsigned long flags; int is_readonly; @@ -22474,7 +22474,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host if (host->flags & SDHCI_DEVICE_DEAD) is_readonly = 0; -@@ -1519,7 +1623,7 @@ +@@ -1522,7 +1626,7 @@ is_readonly = !(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_WRITE_PROTECT); @@ -22483,7 +22483,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host /* This quirk needs to be replaced by a callback-function later */ return host->quirks & SDHCI_QUIRK_INVERTED_WRITE_PROTECT ? -@@ -1592,9 +1696,9 @@ +@@ -1595,9 +1699,9 @@ struct sdhci_host *host = mmc_priv(mmc); unsigned long flags; @@ -22495,7 +22495,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host } static int sdhci_do_start_signal_voltage_switch(struct sdhci_host *host, -@@ -1919,7 +2023,7 @@ +@@ -1922,7 +2026,7 @@ if (host->version < SDHCI_SPEC_300) return; @@ -22504,7 +22504,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); -@@ -1937,7 +2041,7 @@ +@@ -1940,7 +2044,7 @@ host->flags &= ~SDHCI_PV_ENABLED; } @@ -22513,7 +22513,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host } static void sdhci_enable_preset_value(struct mmc_host *mmc, bool enable) -@@ -1973,7 +2077,7 @@ +@@ -1976,7 +2080,7 @@ host = (struct sdhci_host*)param; @@ -22522,7 +22522,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host /* Check host->mrq first in case we are runtime suspended */ if (host->mrq && -@@ -1990,7 +2094,7 @@ +@@ -1993,7 +2097,7 @@ tasklet_schedule(&host->finish_tasklet); } @@ -22531,7 +22531,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host mmc_detect_change(host->mmc, msecs_to_jiffies(200)); } -@@ -2003,14 +2107,14 @@ +@@ -2006,14 +2110,14 @@ host = (struct sdhci_host*)param; @@ -22548,7 +22548,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host return; } -@@ -2053,7 +2157,7 @@ +@@ -2056,7 +2160,7 @@ #endif mmiowb(); @@ -22557,7 +22557,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host mmc_request_done(host->mmc, mrq); sdhci_runtime_pm_put(host); -@@ -2066,11 +2170,11 @@ +@@ -2069,11 +2173,11 @@ host = (struct sdhci_host*)data; @@ -22571,7 +22571,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host sdhci_dumpregs(host); if (host->data) { -@@ -2087,7 +2191,7 @@ +@@ -2090,7 +2194,7 @@ } mmiowb(); @@ -22580,7 +22580,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host } static void sdhci_tuning_timer(unsigned long data) -@@ -2097,11 +2201,11 @@ +@@ -2100,11 +2204,11 @@ host = (struct sdhci_host *)data; @@ -22594,7 +22594,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host } /*****************************************************************************\ -@@ -2115,10 +2219,13 @@ +@@ -2118,10 +2222,13 @@ BUG_ON(intmask == 0); if (!host->cmd) { @@ -22612,7 +22612,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host return; } -@@ -2188,6 +2295,19 @@ +@@ -2191,6 +2298,19 @@ static void sdhci_show_adma_error(struct sdhci_host *host) { } #endif @@ -22632,7 +22632,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host static void sdhci_data_irq(struct sdhci_host *host, u32 intmask) { u32 command; -@@ -2216,34 +2336,57 @@ +@@ -2219,34 +2339,57 @@ return; } } @@ -22705,7 +22705,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host /* * We currently don't do anything fancy with DMA -@@ -2272,18 +2415,8 @@ +@@ -2275,18 +2418,8 @@ sdhci_writel(host, dmanow, SDHCI_DMA_ADDRESS); } @@ -22726,7 +22726,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host } } -@@ -2294,10 +2427,10 @@ +@@ -2297,10 +2430,10 @@ u32 intmask, unexpected = 0; int cardint = 0, max_loops = 16; @@ -22739,7 +22739,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host pr_warning("%s: got irq while runtime suspended\n", mmc_hostname(host->mmc)); return IRQ_HANDLED; -@@ -2339,6 +2472,22 @@ +@@ -2342,6 +2475,22 @@ tasklet_schedule(&host->card_tasklet); } @@ -22762,7 +22762,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host if (intmask & SDHCI_INT_CMD_MASK) { sdhci_writel(host, intmask & SDHCI_INT_CMD_MASK, SDHCI_INT_STATUS); -@@ -2353,7 +2502,13 @@ +@@ -2356,7 +2505,13 @@ intmask &= ~(SDHCI_INT_CMD_MASK | SDHCI_INT_DATA_MASK); @@ -22777,7 +22777,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host if (intmask & SDHCI_INT_BUS_POWER) { pr_err("%s: Card is consuming too much power!\n", -@@ -2379,7 +2534,7 @@ +@@ -2382,7 +2537,7 @@ if (intmask && --max_loops) goto again; out: @@ -22786,7 +22786,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host if (unexpected) { pr_err("%s: Unexpected interrupt 0x%08x.\n", -@@ -2442,7 +2597,8 @@ +@@ -2445,7 +2600,8 @@ { int ret; @@ -22796,7 +22796,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host if (host->ops->enable_dma) host->ops->enable_dma(host); } -@@ -2515,15 +2671,15 @@ +@@ -2518,15 +2674,15 @@ host->flags &= ~SDHCI_NEEDS_RETUNING; } @@ -22816,7 +22816,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host return ret; } -@@ -2554,7 +2710,7 @@ +@@ -2557,7 +2713,7 @@ if (host->flags & SDHCI_USING_RETUNING_TIMER) host->flags |= SDHCI_NEEDS_RETUNING; @@ -22825,7 +22825,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host host->runtime_suspended = false; -@@ -2565,7 +2721,7 @@ +@@ -2568,7 +2724,7 @@ /* Enable Card Detection */ sdhci_enable_card_detection(host); @@ -22834,7 +22834,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host return ret; } -@@ -2660,14 +2816,16 @@ +@@ -2663,14 +2819,16 @@ host->flags &= ~SDHCI_USE_ADMA; } @@ -22853,7 +22853,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host } } } -@@ -2778,7 +2936,7 @@ +@@ -2781,7 +2939,7 @@ /* Auto-CMD23 stuff only works in ADMA or PIO. */ if ((host->version >= SDHCI_SPEC_300) && ((host->flags & SDHCI_USE_ADMA) || @@ -22862,7 +22862,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host host->flags |= SDHCI_AUTO_CMD23; DBG("%s: Auto-CMD23 available\n", mmc_hostname(mmc)); } else { -@@ -2930,6 +3088,12 @@ +@@ -2933,6 +3091,12 @@ SDHCI_MAX_CURRENT_MULTIPLIER; } @@ -22875,7 +22875,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host mmc->ocr_avail = ocr_avail; mmc->ocr_avail_sdio = ocr_avail; if (host->ocr_avail_sdio) -@@ -3024,7 +3188,7 @@ +@@ -3027,7 +3191,7 @@ host->tuning_timer.function = sdhci_tuning_timer; } @@ -22884,7 +22884,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host mmc_hostname(mmc), host); if (ret) { pr_err("%s: Failed to request IRQ %d: %d\n", -@@ -3060,6 +3224,7 @@ +@@ -3063,6 +3227,7 @@ pr_info("%s: SDHCI controller on %s [%s] using %s\n", mmc_hostname(mmc), host->hw_name, dev_name(mmc_dev(mmc)), @@ -22892,7 +22892,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host (host->flags & SDHCI_USE_ADMA) ? "ADMA" : (host->flags & SDHCI_USE_SDMA) ? "DMA" : "PIO"); -@@ -3086,7 +3251,7 @@ +@@ -3089,7 +3254,7 @@ unsigned long flags; if (dead) { @@ -22901,7 +22901,7 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host host->flags |= SDHCI_DEVICE_DEAD; -@@ -3098,7 +3263,7 @@ +@@ -3101,7 +3266,7 @@ tasklet_schedule(&host->finish_tasklet); } @@ -22910,9 +22910,9 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.c linux-rpi-3.6.y/drivers/mmc/host } sdhci_disable_card_detection(host); -diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.h linux-rpi-3.6.y/drivers/mmc/host/sdhci.h ---- linux-3.6.1/drivers/mmc/host/sdhci.h 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/mmc/host/sdhci.h 2012-11-11 18:15:16.759848513 +0100 +diff -Naur linux-3.6.7/drivers/mmc/host/sdhci.h linux-3.6.7.patch/drivers/mmc/host/sdhci.h +--- linux-3.6.7/drivers/mmc/host/sdhci.h 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/mmc/host/sdhci.h 2012-11-18 12:45:10.781337399 +0100 @@ -275,6 +275,20 @@ void (*platform_reset_enter)(struct sdhci_host *host, u8 mask); void (*platform_reset_exit)(struct sdhci_host *host, u8 mask); @@ -22973,9 +22973,9 @@ diff -Naur linux-3.6.1/drivers/mmc/host/sdhci.h linux-rpi-3.6.y/drivers/mmc/host + + #endif /* __SDHCI_HW_H */ -diff -Naur linux-3.6.1/drivers/net/usb/smsc95xx.c linux-rpi-3.6.y/drivers/net/usb/smsc95xx.c ---- linux-3.6.1/drivers/net/usb/smsc95xx.c 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/net/usb/smsc95xx.c 2012-11-11 18:15:21.368938786 +0100 +diff -Naur linux-3.6.7/drivers/net/usb/smsc95xx.c linux-3.6.7.patch/drivers/net/usb/smsc95xx.c +--- linux-3.6.7/drivers/net/usb/smsc95xx.c 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/net/usb/smsc95xx.c 2012-11-18 12:45:10.783337439 +0100 @@ -46,11 +46,23 @@ #define SMSC95XX_INTERNAL_PHY_ID (1) #define SMSC95XX_TX_OVERHEAD (8) @@ -23990,9 +23990,9 @@ diff -Naur linux-3.6.1/drivers/net/usb/smsc95xx.c linux-rpi-3.6.y/drivers/net/us .disconnect = usbnet_disconnect, .disable_hub_initiated_lpm = 1, }; -diff -Naur linux-3.6.1/drivers/net/usb/smsc95xx.h linux-rpi-3.6.y/drivers/net/usb/smsc95xx.h ---- linux-3.6.1/drivers/net/usb/smsc95xx.h 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/net/usb/smsc95xx.h 2012-11-11 18:15:21.370938825 +0100 +diff -Naur linux-3.6.7/drivers/net/usb/smsc95xx.h linux-3.6.7.patch/drivers/net/usb/smsc95xx.h +--- linux-3.6.7/drivers/net/usb/smsc95xx.h 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/net/usb/smsc95xx.h 2012-11-18 12:45:10.784337459 +0100 @@ -63,6 +63,7 @@ #define INT_STS_TDFO_ (0x00001000) #define INT_STS_RXDF_ (0x00000800) @@ -24031,176 +24031,9 @@ diff -Naur linux-3.6.1/drivers/net/usb/smsc95xx.h linux-rpi-3.6.y/drivers/net/us #define COE_CR (0x130) #define Tx_COE_EN_ (0x00010000) -diff -Naur linux-3.6.1/drivers/net/wireless/Kconfig linux-rpi-3.6.y/drivers/net/wireless/Kconfig -diff -Naur linux-3.6.1/drivers/net/wireless/Makefile linux-rpi-3.6.y/drivers/net/wireless/Makefile -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/clean linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/clean -\ Kein Zeilenumbruch am Dateiende. -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/efuse/rtw_efuse.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/efuse/rtw_efuse.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_br_ext.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_br_ext.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_cmd.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_cmd.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_debug.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_debug.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_eeprom.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_eeprom.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_ieee80211.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_ieee80211.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_io.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_io.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_ioctl_query.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_ioctl_query.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_ioctl_rtl.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_ioctl_rtl.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_ioctl_set.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_ioctl_set.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_iol.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_iol.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_mlme.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_mlme.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_mlme_ext.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_mlme_ext.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_mp.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_mp.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_mp_ioctl.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_mp_ioctl.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_p2p.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_p2p.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_pwrctrl.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_pwrctrl.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_recv.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_recv.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_rf.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_rf.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_security.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_security.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_sta_mgt.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_sta_mgt.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_wlan_util.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_wlan_util.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/core/rtw_xmit.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/core/rtw_xmit.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/hal_init.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/hal_init.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_cmd.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_cmd.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_dm.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_dm.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_hal_init.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_hal_init.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_mp.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_mp.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_phycfg.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_phycfg.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_rf6052.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_rf6052.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_rxdesc.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_rxdesc.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_sreset.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_sreset.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/Hal8192CUHWImg.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/Hal8192CUHWImg.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/Hal8192CUHWImg_wowlan.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/Hal8192CUHWImg_wowlan.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_led.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_led.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_recv.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_recv.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_xmit.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_xmit.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_halinit.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_halinit.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_ce.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_ce.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_linux.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_linux.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_xp.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_xp.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/ifcfg-wlan0 linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/ifcfg-wlan0 -\ Kein Zeilenumbruch am Dateiende. -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/autoconf.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/autoconf.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/basic_types.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/basic_types.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/byteorder/big_endian.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/byteorder/big_endian.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/byteorder/generic.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/byteorder/generic.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/byteorder/little_endian.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/byteorder/little_endian.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/byteorder/swabb.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/byteorder/swabb.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/byteorder/swab.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/byteorder/swab.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/circ_buf.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/circ_buf.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/cmd_osdep.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/cmd_osdep.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/drv_conf.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/drv_conf.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/drv_types_ce.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/drv_types_ce.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/drv_types.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/drv_types.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/drv_types_linux.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/drv_types_linux.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/drv_types_xp.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/drv_types_xp.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/ethernet.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/ethernet.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/farray.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/farray.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/h2clbk.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/h2clbk.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/Hal8192CEHWImg.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/Hal8192CEHWImg.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/Hal8192CPhyCfg.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/Hal8192CPhyCfg.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/Hal8192CPhyReg.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/Hal8192CPhyReg.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/Hal8192CUHWImg.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/Hal8192CUHWImg.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/Hal8192CUHWImg_wowlan.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/Hal8192CUHWImg_wowlan.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/Hal8192DEHWImg.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/Hal8192DEHWImg.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/Hal8192DETestHWImg.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/Hal8192DETestHWImg.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/Hal8192DPhyCfg.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/Hal8192DPhyCfg.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/Hal8192DPhyReg.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/Hal8192DPhyReg.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/Hal8192DUHWImg.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/Hal8192DUHWImg.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/Hal8192DUHWImg_wowlan.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/Hal8192DUHWImg_wowlan.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/Hal8192DUTestHWImg.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/Hal8192DUTestHWImg.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/hal_init.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/hal_init.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/ieee80211_ext.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/ieee80211_ext.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/ieee80211.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/ieee80211.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/if_ether.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/if_ether.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/ioctl_cfg80211.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/ioctl_cfg80211.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/ip.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/ip.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/mlme_osdep.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/mlme_osdep.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/mp_custom_oid.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/mp_custom_oid.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/nic_spec.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/nic_spec.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/osdep_ce_service.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/osdep_ce_service.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/osdep_intf.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/osdep_intf.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/osdep_service.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/osdep_service.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/pci_hal.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/pci_hal.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/pci_ops.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/pci_ops.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/pci_osintf.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/pci_osintf.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/recv_osdep.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/recv_osdep.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192c_cmd.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192c_cmd.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192c_dm.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192c_dm.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192c_event.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192c_event.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192c_hal.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192c_hal.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192c_led.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192c_led.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192c_recv.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192c_recv.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192c_rf.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192c_rf.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192c_spec.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192c_spec.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192c_sreset.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192c_sreset.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192c_xmit.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192c_xmit.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192d_cmd.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192d_cmd.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192d_dm.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192d_dm.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192d_hal.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192d_hal.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192d_led.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192d_led.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192d_recv.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192d_recv.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192d_rf.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192d_rf.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192d_spec.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192d_spec.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtl8192d_xmit.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtl8192d_xmit.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_android.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_android.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_br_ext.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_br_ext.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_byteorder.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_byteorder.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_cmd.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_cmd.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_debug.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_debug.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_eeprom.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_eeprom.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_efuse.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_efuse.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_event.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_event.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_ht.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_ht.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_ioctl.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_ioctl.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_ioctl_query.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_ioctl_query.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_ioctl_rtl.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_ioctl_rtl.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_ioctl_set.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_ioctl_set.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_io.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_io.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_iol.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_iol.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_led.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_led.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_mlme_ext.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_mlme_ext.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_mlme.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_mlme.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_mp.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_mp.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_mp_ioctl.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_mp_ioctl.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_mp_phy_regdef.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_mp_phy_regdef.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_p2p.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_p2p.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_pwrctrl.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_pwrctrl.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_qos.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_qos.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_recv.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_recv.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_rf.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_rf.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_security.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_security.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_version.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_version.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/rtw_xmit.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/rtw_xmit.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/sdio_hal.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/sdio_hal.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/sdio_ops_ce.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/sdio_ops_ce.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/sdio_ops.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/sdio_ops.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/sdio_ops_linux.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/sdio_ops_linux.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/sdio_ops_xp.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/sdio_ops_xp.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/sdio_osintf.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/sdio_osintf.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/sta_info.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/sta_info.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/usb_hal.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/usb_hal.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/usb_ops.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/usb_ops.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/usb_osintf.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/usb_osintf.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/usb_vendor_req.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/usb_vendor_req.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/wifi.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/wifi.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/wlan_bssdef.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/wlan_bssdef.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/include/xmit_osdep.h linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/include/xmit_osdep.h -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/Kconfig linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/Kconfig -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/Makefile linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/Makefile -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_cfg80211.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_cfg80211.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_linux.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_linux.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/os_dep/linux/mlme_linux.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/os_dep/linux/mlme_linux.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/os_dep/linux/os_intfs.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/os_dep/linux/os_intfs.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/os_dep/linux/pci_intf.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/os_dep/linux/pci_intf.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/os_dep/linux/recv_linux.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/os_dep/linux/recv_linux.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/os_dep/linux/rtw_android.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/os_dep/linux/rtw_android.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/os_dep/linux/sdio_intf.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/os_dep/linux/sdio_intf.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/os_dep/linux/usb_intf.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/os_dep/linux/usb_intf.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/os_dep/linux/xmit_linux.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/os_dep/linux/xmit_linux.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/os_dep/osdep_service.c linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/os_dep/osdep_service.c -diff -Naur linux-3.6.1/drivers/net/wireless/rtl8192cu/wlan0dhcp linux-rpi-3.6.y/drivers/net/wireless/rtl8192cu/wlan0dhcp -diff -Naur linux-3.6.1/drivers/spi/Kconfig linux-rpi-3.6.y/drivers/spi/Kconfig ---- linux-3.6.1/drivers/spi/Kconfig 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/spi/Kconfig 2012-11-11 18:15:16.414841756 +0100 +diff -Naur linux-3.6.7/drivers/spi/Kconfig linux-3.6.7.patch/drivers/spi/Kconfig +--- linux-3.6.7/drivers/spi/Kconfig 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/spi/Kconfig 2012-11-18 12:45:10.785337478 +0100 @@ -74,6 +74,14 @@ This selects a driver for the Atmel SPI Controller, present on many AT32 (AVR32) and AT91 (ARM) chips. @@ -24216,9 +24049,9 @@ diff -Naur linux-3.6.1/drivers/spi/Kconfig linux-rpi-3.6.y/drivers/spi/Kconfig config SPI_BFIN5XX tristate "SPI controller driver for ADI Blackfin5xx" depends on BLACKFIN -diff -Naur linux-3.6.1/drivers/spi/Makefile linux-rpi-3.6.y/drivers/spi/Makefile ---- linux-3.6.1/drivers/spi/Makefile 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/spi/Makefile 2012-11-11 18:15:16.411841697 +0100 +diff -Naur linux-3.6.7/drivers/spi/Makefile linux-3.6.7.patch/drivers/spi/Makefile +--- linux-3.6.7/drivers/spi/Makefile 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/spi/Makefile 2012-11-18 12:45:10.786337497 +0100 @@ -16,6 +16,7 @@ obj-$(CONFIG_SPI_AU1550) += spi-au1550.o obj-$(CONFIG_SPI_BCM63XX) += spi-bcm63xx.o @@ -24227,9 +24060,9 @@ diff -Naur linux-3.6.1/drivers/spi/Makefile linux-rpi-3.6.y/drivers/spi/Makefile obj-$(CONFIG_SPI_BFIN_SPORT) += spi-bfin-sport.o obj-$(CONFIG_SPI_BITBANG) += spi-bitbang.o obj-$(CONFIG_SPI_BUTTERFLY) += spi-butterfly.o -diff -Naur linux-3.6.1/drivers/spi/spi-bcm2708.c linux-rpi-3.6.y/drivers/spi/spi-bcm2708.c ---- linux-3.6.1/drivers/spi/spi-bcm2708.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/spi/spi-bcm2708.c 2012-11-11 18:15:16.387841226 +0100 +diff -Naur linux-3.6.7/drivers/spi/spi-bcm2708.c linux-3.6.7.patch/drivers/spi/spi-bcm2708.c +--- linux-3.6.7/drivers/spi/spi-bcm2708.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/spi/spi-bcm2708.c 2012-11-18 12:45:10.787337516 +0100 @@ -0,0 +1,594 @@ +/* + * Driver for Broadcom BCM2708 SPI Controllers @@ -24825,9 +24658,9 @@ diff -Naur linux-3.6.1/drivers/spi/spi-bcm2708.c linux-rpi-3.6.y/drivers/spi/spi +MODULE_AUTHOR("Chris Boot "); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:" DRV_NAME); -diff -Naur linux-3.6.1/drivers/thermal/bcm2835-thermal.c linux-rpi-3.6.y/drivers/thermal/bcm2835-thermal.c ---- linux-3.6.1/drivers/thermal/bcm2835-thermal.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/thermal/bcm2835-thermal.c 2012-11-11 18:15:19.681905745 +0100 +diff -Naur linux-3.6.7/drivers/thermal/bcm2835-thermal.c linux-3.6.7.patch/drivers/thermal/bcm2835-thermal.c +--- linux-3.6.7/drivers/thermal/bcm2835-thermal.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/thermal/bcm2835-thermal.c 2012-11-18 12:45:10.787337516 +0100 @@ -0,0 +1,208 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -25037,9 +24870,9 @@ diff -Naur linux-3.6.1/drivers/thermal/bcm2835-thermal.c linux-rpi-3.6.y/drivers +MODULE_DESCRIPTION("Thermal driver for bcm2835 chip"); + +module_platform_driver(bcm2835_thermal_driver); -diff -Naur linux-3.6.1/drivers/thermal/Kconfig linux-rpi-3.6.y/drivers/thermal/Kconfig ---- linux-3.6.1/drivers/thermal/Kconfig 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/thermal/Kconfig 2012-11-11 18:15:19.682905764 +0100 +diff -Naur linux-3.6.7/drivers/thermal/Kconfig linux-3.6.7.patch/drivers/thermal/Kconfig +--- linux-3.6.7/drivers/thermal/Kconfig 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/thermal/Kconfig 2012-11-18 12:45:10.788337535 +0100 @@ -27,3 +27,14 @@ help Enable this to plug the SPEAr thermal sensor driver into the Linux @@ -25055,9 +24888,9 @@ diff -Naur linux-3.6.1/drivers/thermal/Kconfig linux-rpi-3.6.y/drivers/thermal/K + +endif # THERMAL_BCM2835 + -diff -Naur linux-3.6.1/drivers/thermal/Makefile linux-rpi-3.6.y/drivers/thermal/Makefile ---- linux-3.6.1/drivers/thermal/Makefile 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/thermal/Makefile 2012-11-11 18:15:19.681905745 +0100 +diff -Naur linux-3.6.7/drivers/thermal/Makefile linux-3.6.7.patch/drivers/thermal/Makefile +--- linux-3.6.7/drivers/thermal/Makefile 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/thermal/Makefile 2012-11-18 12:45:10.788337535 +0100 @@ -3,4 +3,5 @@ # @@ -25066,9 +24899,9 @@ diff -Naur linux-3.6.1/drivers/thermal/Makefile linux-rpi-3.6.y/drivers/thermal/ \ Kein Zeilenumbruch am Dateiende. +obj-$(CONFIG_SPEAR_THERMAL) += spear_thermal.o +obj-$(CONFIG_THERMAL_BCM2835) += bcm2835-thermal.o -diff -Naur linux-3.6.1/drivers/usb/core/generic.c linux-rpi-3.6.y/drivers/usb/core/generic.c ---- linux-3.6.1/drivers/usb/core/generic.c 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/usb/core/generic.c 2012-11-11 18:15:17.213857404 +0100 +diff -Naur linux-3.6.7/drivers/usb/core/generic.c linux-3.6.7.patch/drivers/usb/core/generic.c +--- linux-3.6.7/drivers/usb/core/generic.c 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/core/generic.c 2012-11-18 12:45:10.789337554 +0100 @@ -149,6 +149,7 @@ dev_warn(&udev->dev, "no configuration chosen from %d choice%s\n", @@ -25077,9 +24910,9 @@ diff -Naur linux-3.6.1/drivers/usb/core/generic.c linux-rpi-3.6.y/drivers/usb/co } return i; } -diff -Naur linux-3.6.1/drivers/usb/core/hub.c linux-rpi-3.6.y/drivers/usb/core/hub.c ---- linux-3.6.1/drivers/usb/core/hub.c 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/usb/core/hub.c 2012-11-11 18:15:17.230857737 +0100 +diff -Naur linux-3.6.7/drivers/usb/core/hub.c linux-3.6.7.patch/drivers/usb/core/hub.c +--- linux-3.6.7/drivers/usb/core/hub.c 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/core/hub.c 2012-11-18 12:45:10.792337614 +0100 @@ -25,7 +25,6 @@ #include #include @@ -25088,7 +24921,7 @@ diff -Naur linux-3.6.1/drivers/usb/core/hub.c linux-rpi-3.6.y/drivers/usb/core/h #include #include -@@ -1970,6 +1969,12 @@ +@@ -1973,6 +1972,12 @@ #endif #ifdef CONFIG_USB_OTG @@ -25101,7 +24934,7 @@ diff -Naur linux-3.6.1/drivers/usb/core/hub.c linux-rpi-3.6.y/drivers/usb/core/h #include "otg_whitelist.h" #endif -@@ -2024,9 +2029,15 @@ +@@ -2027,9 +2032,15 @@ dev_info(&udev->dev, "can't set HNP mode: %d\n", err); @@ -25118,7 +24951,7 @@ diff -Naur linux-3.6.1/drivers/usb/core/hub.c linux-rpi-3.6.y/drivers/usb/core/h } } -@@ -2035,12 +2046,27 @@ +@@ -2038,12 +2049,27 @@ /* Maybe it can talk to us, though we can't talk to it. * (Includes HNP test device.) */ @@ -25149,7 +24982,7 @@ diff -Naur linux-3.6.1/drivers/usb/core/hub.c linux-rpi-3.6.y/drivers/usb/core/h goto fail; } fail: -@@ -2182,14 +2208,6 @@ +@@ -2185,14 +2211,6 @@ /* Tell the world! */ announce_device(udev); @@ -25164,7 +24997,7 @@ diff -Naur linux-3.6.1/drivers/usb/core/hub.c linux-rpi-3.6.y/drivers/usb/core/h device_enable_async_suspend(&udev->dev); /* -@@ -2810,9 +2828,9 @@ +@@ -2813,9 +2831,9 @@ status = 0; } else { /* device has up to 10 msec to fully suspend */ @@ -25176,7 +25009,7 @@ diff -Naur linux-3.6.1/drivers/usb/core/hub.c linux-rpi-3.6.y/drivers/usb/core/h usb_set_device_state(udev, USB_STATE_SUSPENDED); msleep(10); } -@@ -3805,7 +3823,9 @@ +@@ -3819,7 +3837,9 @@ buf->bMaxPacketSize0 = 0; r = usb_control_msg(udev, usb_rcvaddr0pipe(), USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, @@ -25187,7 +25020,7 @@ diff -Naur linux-3.6.1/drivers/usb/core/hub.c linux-rpi-3.6.y/drivers/usb/core/h buf, GET_DESCRIPTOR_BUFSIZE, initial_descriptor_timeout); switch (buf->bMaxPacketSize0) { -@@ -4257,8 +4277,10 @@ +@@ -4271,8 +4291,10 @@ release_devnum(udev); hub_free_dev(udev); usb_put_dev(udev); @@ -25200,9 +25033,5022 @@ diff -Naur linux-3.6.1/drivers/usb/core/hub.c linux-rpi-3.6.y/drivers/usb/core/h } if (hub->hdev->parent || !hcd->driver->port_handed_over || -diff -Naur linux-3.6.1/drivers/usb/core/message.c linux-rpi-3.6.y/drivers/usb/core/message.c ---- linux-3.6.1/drivers/usb/core/message.c 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/usb/core/message.c 2012-11-11 18:15:17.231857757 +0100 +diff -Naur linux-3.6.7/drivers/usb/core/hub.c.orig linux-3.6.7.patch/drivers/usb/core/hub.c.orig +--- linux-3.6.7/drivers/usb/core/hub.c.orig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/core/hub.c.orig 2012-11-17 22:21:23.000000000 +0100 +@@ -0,0 +1,5009 @@ ++/* ++ * USB hub driver. ++ * ++ * (C) Copyright 1999 Linus Torvalds ++ * (C) Copyright 1999 Johannes Erdfelt ++ * (C) Copyright 1999 Gregory P. Smith ++ * (C) Copyright 2001 Brad Hards (bhards@bigpond.net.au) ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "usb.h" ++ ++/* if we are in debug mode, always announce new devices */ ++#ifdef DEBUG ++#ifndef CONFIG_USB_ANNOUNCE_NEW_DEVICES ++#define CONFIG_USB_ANNOUNCE_NEW_DEVICES ++#endif ++#endif ++ ++struct usb_hub { ++ struct device *intfdev; /* the "interface" device */ ++ struct usb_device *hdev; ++ struct kref kref; ++ struct urb *urb; /* for interrupt polling pipe */ ++ ++ /* buffer for urb ... with extra space in case of babble */ ++ char (*buffer)[8]; ++ union { ++ struct usb_hub_status hub; ++ struct usb_port_status port; ++ } *status; /* buffer for status reports */ ++ struct mutex status_mutex; /* for the status buffer */ ++ ++ int error; /* last reported error */ ++ int nerrors; /* track consecutive errors */ ++ ++ struct list_head event_list; /* hubs w/data or errs ready */ ++ unsigned long event_bits[1]; /* status change bitmask */ ++ unsigned long change_bits[1]; /* ports with logical connect ++ status change */ ++ unsigned long busy_bits[1]; /* ports being reset or ++ resumed */ ++ unsigned long removed_bits[1]; /* ports with a "removed" ++ device present */ ++ unsigned long wakeup_bits[1]; /* ports that have signaled ++ remote wakeup */ ++#if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */ ++#error event_bits[] is too short! ++#endif ++ ++ struct usb_hub_descriptor *descriptor; /* class descriptor */ ++ struct usb_tt tt; /* Transaction Translator */ ++ ++ unsigned mA_per_port; /* current for each child */ ++ ++ unsigned limited_power:1; ++ unsigned quiescing:1; ++ unsigned disconnected:1; ++ ++ unsigned has_indicators:1; ++ u8 indicator[USB_MAXCHILDREN]; ++ struct delayed_work leds; ++ struct delayed_work init_work; ++ struct dev_state **port_owners; ++}; ++ ++static inline int hub_is_superspeed(struct usb_device *hdev) ++{ ++ return (hdev->descriptor.bDeviceProtocol == USB_HUB_PR_SS); ++} ++ ++/* Protect struct usb_device->state and ->children members ++ * Note: Both are also protected by ->dev.sem, except that ->state can ++ * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */ ++static DEFINE_SPINLOCK(device_state_lock); ++ ++/* khubd's worklist and its lock */ ++static DEFINE_SPINLOCK(hub_event_lock); ++static LIST_HEAD(hub_event_list); /* List of hubs needing servicing */ ++ ++/* Wakes up khubd */ ++static DECLARE_WAIT_QUEUE_HEAD(khubd_wait); ++ ++static struct task_struct *khubd_task; ++ ++/* cycle leds on hubs that aren't blinking for attention */ ++static bool blinkenlights = 0; ++module_param (blinkenlights, bool, S_IRUGO); ++MODULE_PARM_DESC (blinkenlights, "true to cycle leds on hubs"); ++ ++/* ++ * Device SATA8000 FW1.0 from DATAST0R Technology Corp requires about ++ * 10 seconds to send reply for the initial 64-byte descriptor request. ++ */ ++/* define initial 64-byte descriptor request timeout in milliseconds */ ++static int initial_descriptor_timeout = USB_CTRL_GET_TIMEOUT; ++module_param(initial_descriptor_timeout, int, S_IRUGO|S_IWUSR); ++MODULE_PARM_DESC(initial_descriptor_timeout, ++ "initial 64-byte descriptor request timeout in milliseconds " ++ "(default 5000 - 5.0 seconds)"); ++ ++/* ++ * As of 2.6.10 we introduce a new USB device initialization scheme which ++ * closely resembles the way Windows works. Hopefully it will be compatible ++ * with a wider range of devices than the old scheme. However some previously ++ * working devices may start giving rise to "device not accepting address" ++ * errors; if that happens the user can try the old scheme by adjusting the ++ * following module parameters. ++ * ++ * For maximum flexibility there are two boolean parameters to control the ++ * hub driver's behavior. On the first initialization attempt, if the ++ * "old_scheme_first" parameter is set then the old scheme will be used, ++ * otherwise the new scheme is used. If that fails and "use_both_schemes" ++ * is set, then the driver will make another attempt, using the other scheme. ++ */ ++static bool old_scheme_first = 0; ++module_param(old_scheme_first, bool, S_IRUGO | S_IWUSR); ++MODULE_PARM_DESC(old_scheme_first, ++ "start with the old device initialization scheme"); ++ ++static bool use_both_schemes = 1; ++module_param(use_both_schemes, bool, S_IRUGO | S_IWUSR); ++MODULE_PARM_DESC(use_both_schemes, ++ "try the other device initialization scheme if the " ++ "first one fails"); ++ ++/* Mutual exclusion for EHCI CF initialization. This interferes with ++ * port reset on some companion controllers. ++ */ ++DECLARE_RWSEM(ehci_cf_port_reset_rwsem); ++EXPORT_SYMBOL_GPL(ehci_cf_port_reset_rwsem); ++ ++#define HUB_DEBOUNCE_TIMEOUT 1500 ++#define HUB_DEBOUNCE_STEP 25 ++#define HUB_DEBOUNCE_STABLE 100 ++ ++ ++static int usb_reset_and_verify_device(struct usb_device *udev); ++ ++static inline char *portspeed(struct usb_hub *hub, int portstatus) ++{ ++ if (hub_is_superspeed(hub->hdev)) ++ return "5.0 Gb/s"; ++ if (portstatus & USB_PORT_STAT_HIGH_SPEED) ++ return "480 Mb/s"; ++ else if (portstatus & USB_PORT_STAT_LOW_SPEED) ++ return "1.5 Mb/s"; ++ else ++ return "12 Mb/s"; ++} ++ ++/* Note that hdev or one of its children must be locked! */ ++static struct usb_hub *hdev_to_hub(struct usb_device *hdev) ++{ ++ if (!hdev || !hdev->actconfig) ++ return NULL; ++ return usb_get_intfdata(hdev->actconfig->interface[0]); ++} ++ ++static int usb_device_supports_lpm(struct usb_device *udev) ++{ ++ /* USB 2.1 (and greater) devices indicate LPM support through ++ * their USB 2.0 Extended Capabilities BOS descriptor. ++ */ ++ if (udev->speed == USB_SPEED_HIGH) { ++ if (udev->bos->ext_cap && ++ (USB_LPM_SUPPORT & ++ le32_to_cpu(udev->bos->ext_cap->bmAttributes))) ++ return 1; ++ return 0; ++ } ++ ++ /* All USB 3.0 must support LPM, but we need their max exit latency ++ * information from the SuperSpeed Extended Capabilities BOS descriptor. ++ */ ++ if (!udev->bos->ss_cap) { ++ dev_warn(&udev->dev, "No LPM exit latency info found. " ++ "Power management will be impacted.\n"); ++ return 0; ++ } ++ if (udev->parent->lpm_capable) ++ return 1; ++ ++ dev_warn(&udev->dev, "Parent hub missing LPM exit latency info. " ++ "Power management will be impacted.\n"); ++ return 0; ++} ++ ++/* ++ * Set the Maximum Exit Latency (MEL) for the host to initiate a transition from ++ * either U1 or U2. ++ */ ++static void usb_set_lpm_mel(struct usb_device *udev, ++ struct usb3_lpm_parameters *udev_lpm_params, ++ unsigned int udev_exit_latency, ++ struct usb_hub *hub, ++ struct usb3_lpm_parameters *hub_lpm_params, ++ unsigned int hub_exit_latency) ++{ ++ unsigned int total_mel; ++ unsigned int device_mel; ++ unsigned int hub_mel; ++ ++ /* ++ * Calculate the time it takes to transition all links from the roothub ++ * to the parent hub into U0. The parent hub must then decode the ++ * packet (hub header decode latency) to figure out which port it was ++ * bound for. ++ * ++ * The Hub Header decode latency is expressed in 0.1us intervals (0x1 ++ * means 0.1us). Multiply that by 100 to get nanoseconds. ++ */ ++ total_mel = hub_lpm_params->mel + ++ (hub->descriptor->u.ss.bHubHdrDecLat * 100); ++ ++ /* ++ * How long will it take to transition the downstream hub's port into ++ * U0? The greater of either the hub exit latency or the device exit ++ * latency. ++ * ++ * The BOS U1/U2 exit latencies are expressed in 1us intervals. ++ * Multiply that by 1000 to get nanoseconds. ++ */ ++ device_mel = udev_exit_latency * 1000; ++ hub_mel = hub_exit_latency * 1000; ++ if (device_mel > hub_mel) ++ total_mel += device_mel; ++ else ++ total_mel += hub_mel; ++ ++ udev_lpm_params->mel = total_mel; ++} ++ ++/* ++ * Set the maximum Device to Host Exit Latency (PEL) for the device to initiate ++ * a transition from either U1 or U2. ++ */ ++static void usb_set_lpm_pel(struct usb_device *udev, ++ struct usb3_lpm_parameters *udev_lpm_params, ++ unsigned int udev_exit_latency, ++ struct usb_hub *hub, ++ struct usb3_lpm_parameters *hub_lpm_params, ++ unsigned int hub_exit_latency, ++ unsigned int port_to_port_exit_latency) ++{ ++ unsigned int first_link_pel; ++ unsigned int hub_pel; ++ ++ /* ++ * First, the device sends an LFPS to transition the link between the ++ * device and the parent hub into U0. The exit latency is the bigger of ++ * the device exit latency or the hub exit latency. ++ */ ++ if (udev_exit_latency > hub_exit_latency) ++ first_link_pel = udev_exit_latency * 1000; ++ else ++ first_link_pel = hub_exit_latency * 1000; ++ ++ /* ++ * When the hub starts to receive the LFPS, there is a slight delay for ++ * it to figure out that one of the ports is sending an LFPS. Then it ++ * will forward the LFPS to its upstream link. The exit latency is the ++ * delay, plus the PEL that we calculated for this hub. ++ */ ++ hub_pel = port_to_port_exit_latency * 1000 + hub_lpm_params->pel; ++ ++ /* ++ * According to figure C-7 in the USB 3.0 spec, the PEL for this device ++ * is the greater of the two exit latencies. ++ */ ++ if (first_link_pel > hub_pel) ++ udev_lpm_params->pel = first_link_pel; ++ else ++ udev_lpm_params->pel = hub_pel; ++} ++ ++/* ++ * Set the System Exit Latency (SEL) to indicate the total worst-case time from ++ * when a device initiates a transition to U0, until when it will receive the ++ * first packet from the host controller. ++ * ++ * Section C.1.5.1 describes the four components to this: ++ * - t1: device PEL ++ * - t2: time for the ERDY to make it from the device to the host. ++ * - t3: a host-specific delay to process the ERDY. ++ * - t4: time for the packet to make it from the host to the device. ++ * ++ * t3 is specific to both the xHCI host and the platform the host is integrated ++ * into. The Intel HW folks have said it's negligible, FIXME if a different ++ * vendor says otherwise. ++ */ ++static void usb_set_lpm_sel(struct usb_device *udev, ++ struct usb3_lpm_parameters *udev_lpm_params) ++{ ++ struct usb_device *parent; ++ unsigned int num_hubs; ++ unsigned int total_sel; ++ ++ /* t1 = device PEL */ ++ total_sel = udev_lpm_params->pel; ++ /* How many external hubs are in between the device & the root port. */ ++ for (parent = udev->parent, num_hubs = 0; parent->parent; ++ parent = parent->parent) ++ num_hubs++; ++ /* t2 = 2.1us + 250ns * (num_hubs - 1) */ ++ if (num_hubs > 0) ++ total_sel += 2100 + 250 * (num_hubs - 1); ++ ++ /* t4 = 250ns * num_hubs */ ++ total_sel += 250 * num_hubs; ++ ++ udev_lpm_params->sel = total_sel; ++} ++ ++static void usb_set_lpm_parameters(struct usb_device *udev) ++{ ++ struct usb_hub *hub; ++ unsigned int port_to_port_delay; ++ unsigned int udev_u1_del; ++ unsigned int udev_u2_del; ++ unsigned int hub_u1_del; ++ unsigned int hub_u2_del; ++ ++ if (!udev->lpm_capable || udev->speed != USB_SPEED_SUPER) ++ return; ++ ++ hub = hdev_to_hub(udev->parent); ++ /* It doesn't take time to transition the roothub into U0, since it ++ * doesn't have an upstream link. ++ */ ++ if (!hub) ++ return; ++ ++ udev_u1_del = udev->bos->ss_cap->bU1devExitLat; ++ udev_u2_del = udev->bos->ss_cap->bU2DevExitLat; ++ hub_u1_del = udev->parent->bos->ss_cap->bU1devExitLat; ++ hub_u2_del = udev->parent->bos->ss_cap->bU2DevExitLat; ++ ++ usb_set_lpm_mel(udev, &udev->u1_params, udev_u1_del, ++ hub, &udev->parent->u1_params, hub_u1_del); ++ ++ usb_set_lpm_mel(udev, &udev->u2_params, udev_u2_del, ++ hub, &udev->parent->u2_params, hub_u2_del); ++ ++ /* ++ * Appendix C, section C.2.2.2, says that there is a slight delay from ++ * when the parent hub notices the downstream port is trying to ++ * transition to U0 to when the hub initiates a U0 transition on its ++ * upstream port. The section says the delays are tPort2PortU1EL and ++ * tPort2PortU2EL, but it doesn't define what they are. ++ * ++ * The hub chapter, sections 10.4.2.4 and 10.4.2.5 seem to be talking ++ * about the same delays. Use the maximum delay calculations from those ++ * sections. For U1, it's tHubPort2PortExitLat, which is 1us max. For ++ * U2, it's tHubPort2PortExitLat + U2DevExitLat - U1DevExitLat. I ++ * assume the device exit latencies they are talking about are the hub ++ * exit latencies. ++ * ++ * What do we do if the U2 exit latency is less than the U1 exit ++ * latency? It's possible, although not likely... ++ */ ++ port_to_port_delay = 1; ++ ++ usb_set_lpm_pel(udev, &udev->u1_params, udev_u1_del, ++ hub, &udev->parent->u1_params, hub_u1_del, ++ port_to_port_delay); ++ ++ if (hub_u2_del > hub_u1_del) ++ port_to_port_delay = 1 + hub_u2_del - hub_u1_del; ++ else ++ port_to_port_delay = 1 + hub_u1_del; ++ ++ usb_set_lpm_pel(udev, &udev->u2_params, udev_u2_del, ++ hub, &udev->parent->u2_params, hub_u2_del, ++ port_to_port_delay); ++ ++ /* Now that we've got PEL, calculate SEL. */ ++ usb_set_lpm_sel(udev, &udev->u1_params); ++ usb_set_lpm_sel(udev, &udev->u2_params); ++} ++ ++/* USB 2.0 spec Section 11.24.4.5 */ ++static int get_hub_descriptor(struct usb_device *hdev, void *data) ++{ ++ int i, ret, size; ++ unsigned dtype; ++ ++ if (hub_is_superspeed(hdev)) { ++ dtype = USB_DT_SS_HUB; ++ size = USB_DT_SS_HUB_SIZE; ++ } else { ++ dtype = USB_DT_HUB; ++ size = sizeof(struct usb_hub_descriptor); ++ } ++ ++ for (i = 0; i < 3; i++) { ++ ret = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), ++ USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB, ++ dtype << 8, 0, data, size, ++ USB_CTRL_GET_TIMEOUT); ++ if (ret >= (USB_DT_HUB_NONVAR_SIZE + 2)) ++ return ret; ++ } ++ return -EINVAL; ++} ++ ++/* ++ * USB 2.0 spec Section 11.24.2.1 ++ */ ++static int clear_hub_feature(struct usb_device *hdev, int feature) ++{ ++ return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), ++ USB_REQ_CLEAR_FEATURE, USB_RT_HUB, feature, 0, NULL, 0, 1000); ++} ++ ++/* ++ * USB 2.0 spec Section 11.24.2.2 ++ */ ++static int clear_port_feature(struct usb_device *hdev, int port1, int feature) ++{ ++ return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), ++ USB_REQ_CLEAR_FEATURE, USB_RT_PORT, feature, port1, ++ NULL, 0, 1000); ++} ++ ++/* ++ * USB 2.0 spec Section 11.24.2.13 ++ */ ++static int set_port_feature(struct usb_device *hdev, int port1, int feature) ++{ ++ return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), ++ USB_REQ_SET_FEATURE, USB_RT_PORT, feature, port1, ++ NULL, 0, 1000); ++} ++ ++/* ++ * USB 2.0 spec Section 11.24.2.7.1.10 and table 11-7 ++ * for info about using port indicators ++ */ ++static void set_port_led( ++ struct usb_hub *hub, ++ int port1, ++ int selector ++) ++{ ++ int status = set_port_feature(hub->hdev, (selector << 8) | port1, ++ USB_PORT_FEAT_INDICATOR); ++ if (status < 0) ++ dev_dbg (hub->intfdev, ++ "port %d indicator %s status %d\n", ++ port1, ++ ({ char *s; switch (selector) { ++ case HUB_LED_AMBER: s = "amber"; break; ++ case HUB_LED_GREEN: s = "green"; break; ++ case HUB_LED_OFF: s = "off"; break; ++ case HUB_LED_AUTO: s = "auto"; break; ++ default: s = "??"; break; ++ }; s; }), ++ status); ++} ++ ++#define LED_CYCLE_PERIOD ((2*HZ)/3) ++ ++static void led_work (struct work_struct *work) ++{ ++ struct usb_hub *hub = ++ container_of(work, struct usb_hub, leds.work); ++ struct usb_device *hdev = hub->hdev; ++ unsigned i; ++ unsigned changed = 0; ++ int cursor = -1; ++ ++ if (hdev->state != USB_STATE_CONFIGURED || hub->quiescing) ++ return; ++ ++ for (i = 0; i < hub->descriptor->bNbrPorts; i++) { ++ unsigned selector, mode; ++ ++ /* 30%-50% duty cycle */ ++ ++ switch (hub->indicator[i]) { ++ /* cycle marker */ ++ case INDICATOR_CYCLE: ++ cursor = i; ++ selector = HUB_LED_AUTO; ++ mode = INDICATOR_AUTO; ++ break; ++ /* blinking green = sw attention */ ++ case INDICATOR_GREEN_BLINK: ++ selector = HUB_LED_GREEN; ++ mode = INDICATOR_GREEN_BLINK_OFF; ++ break; ++ case INDICATOR_GREEN_BLINK_OFF: ++ selector = HUB_LED_OFF; ++ mode = INDICATOR_GREEN_BLINK; ++ break; ++ /* blinking amber = hw attention */ ++ case INDICATOR_AMBER_BLINK: ++ selector = HUB_LED_AMBER; ++ mode = INDICATOR_AMBER_BLINK_OFF; ++ break; ++ case INDICATOR_AMBER_BLINK_OFF: ++ selector = HUB_LED_OFF; ++ mode = INDICATOR_AMBER_BLINK; ++ break; ++ /* blink green/amber = reserved */ ++ case INDICATOR_ALT_BLINK: ++ selector = HUB_LED_GREEN; ++ mode = INDICATOR_ALT_BLINK_OFF; ++ break; ++ case INDICATOR_ALT_BLINK_OFF: ++ selector = HUB_LED_AMBER; ++ mode = INDICATOR_ALT_BLINK; ++ break; ++ default: ++ continue; ++ } ++ if (selector != HUB_LED_AUTO) ++ changed = 1; ++ set_port_led(hub, i + 1, selector); ++ hub->indicator[i] = mode; ++ } ++ if (!changed && blinkenlights) { ++ cursor++; ++ cursor %= hub->descriptor->bNbrPorts; ++ set_port_led(hub, cursor + 1, HUB_LED_GREEN); ++ hub->indicator[cursor] = INDICATOR_CYCLE; ++ changed++; ++ } ++ if (changed) ++ schedule_delayed_work(&hub->leds, LED_CYCLE_PERIOD); ++} ++ ++/* use a short timeout for hub/port status fetches */ ++#define USB_STS_TIMEOUT 1000 ++#define USB_STS_RETRIES 5 ++ ++/* ++ * USB 2.0 spec Section 11.24.2.6 ++ */ ++static int get_hub_status(struct usb_device *hdev, ++ struct usb_hub_status *data) ++{ ++ int i, status = -ETIMEDOUT; ++ ++ for (i = 0; i < USB_STS_RETRIES && ++ (status == -ETIMEDOUT || status == -EPIPE); i++) { ++ status = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), ++ USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_HUB, 0, 0, ++ data, sizeof(*data), USB_STS_TIMEOUT); ++ } ++ return status; ++} ++ ++/* ++ * USB 2.0 spec Section 11.24.2.7 ++ */ ++static int get_port_status(struct usb_device *hdev, int port1, ++ struct usb_port_status *data) ++{ ++ int i, status = -ETIMEDOUT; ++ ++ for (i = 0; i < USB_STS_RETRIES && ++ (status == -ETIMEDOUT || status == -EPIPE); i++) { ++ status = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), ++ USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port1, ++ data, sizeof(*data), USB_STS_TIMEOUT); ++ } ++ return status; ++} ++ ++static int hub_port_status(struct usb_hub *hub, int port1, ++ u16 *status, u16 *change) ++{ ++ int ret; ++ ++ mutex_lock(&hub->status_mutex); ++ ret = get_port_status(hub->hdev, port1, &hub->status->port); ++ if (ret < 4) { ++ dev_err(hub->intfdev, ++ "%s failed (err = %d)\n", __func__, ret); ++ if (ret >= 0) ++ ret = -EIO; ++ } else { ++ *status = le16_to_cpu(hub->status->port.wPortStatus); ++ *change = le16_to_cpu(hub->status->port.wPortChange); ++ ++ ret = 0; ++ } ++ mutex_unlock(&hub->status_mutex); ++ return ret; ++} ++ ++static void kick_khubd(struct usb_hub *hub) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&hub_event_lock, flags); ++ if (!hub->disconnected && list_empty(&hub->event_list)) { ++ list_add_tail(&hub->event_list, &hub_event_list); ++ ++ /* Suppress autosuspend until khubd runs */ ++ usb_autopm_get_interface_no_resume( ++ to_usb_interface(hub->intfdev)); ++ wake_up(&khubd_wait); ++ } ++ spin_unlock_irqrestore(&hub_event_lock, flags); ++} ++ ++void usb_kick_khubd(struct usb_device *hdev) ++{ ++ struct usb_hub *hub = hdev_to_hub(hdev); ++ ++ if (hub) ++ kick_khubd(hub); ++} ++ ++/* ++ * Let the USB core know that a USB 3.0 device has sent a Function Wake Device ++ * Notification, which indicates it had initiated remote wakeup. ++ * ++ * USB 3.0 hubs do not report the port link state change from U3 to U0 when the ++ * device initiates resume, so the USB core will not receive notice of the ++ * resume through the normal hub interrupt URB. ++ */ ++void usb_wakeup_notification(struct usb_device *hdev, ++ unsigned int portnum) ++{ ++ struct usb_hub *hub; ++ ++ if (!hdev) ++ return; ++ ++ hub = hdev_to_hub(hdev); ++ if (hub) { ++ set_bit(portnum, hub->wakeup_bits); ++ kick_khubd(hub); ++ } ++} ++EXPORT_SYMBOL_GPL(usb_wakeup_notification); ++ ++/* completion function, fires on port status changes and various faults */ ++static void hub_irq(struct urb *urb) ++{ ++ struct usb_hub *hub = urb->context; ++ int status = urb->status; ++ unsigned i; ++ unsigned long bits; ++ ++ switch (status) { ++ case -ENOENT: /* synchronous unlink */ ++ case -ECONNRESET: /* async unlink */ ++ case -ESHUTDOWN: /* hardware going away */ ++ return; ++ ++ default: /* presumably an error */ ++ /* Cause a hub reset after 10 consecutive errors */ ++ dev_dbg (hub->intfdev, "transfer --> %d\n", status); ++ if ((++hub->nerrors < 10) || hub->error) ++ goto resubmit; ++ hub->error = status; ++ /* FALL THROUGH */ ++ ++ /* let khubd handle things */ ++ case 0: /* we got data: port status changed */ ++ bits = 0; ++ for (i = 0; i < urb->actual_length; ++i) ++ bits |= ((unsigned long) ((*hub->buffer)[i])) ++ << (i*8); ++ hub->event_bits[0] = bits; ++ break; ++ } ++ ++ hub->nerrors = 0; ++ ++ /* Something happened, let khubd figure it out */ ++ kick_khubd(hub); ++ ++resubmit: ++ if (hub->quiescing) ++ return; ++ ++ if ((status = usb_submit_urb (hub->urb, GFP_ATOMIC)) != 0 ++ && status != -ENODEV && status != -EPERM) ++ dev_err (hub->intfdev, "resubmit --> %d\n", status); ++} ++ ++/* USB 2.0 spec Section 11.24.2.3 */ ++static inline int ++hub_clear_tt_buffer (struct usb_device *hdev, u16 devinfo, u16 tt) ++{ ++ return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), ++ HUB_CLEAR_TT_BUFFER, USB_RT_PORT, devinfo, ++ tt, NULL, 0, 1000); ++} ++ ++/* ++ * enumeration blocks khubd for a long time. we use keventd instead, since ++ * long blocking there is the exception, not the rule. accordingly, HCDs ++ * talking to TTs must queue control transfers (not just bulk and iso), so ++ * both can talk to the same hub concurrently. ++ */ ++static void hub_tt_work(struct work_struct *work) ++{ ++ struct usb_hub *hub = ++ container_of(work, struct usb_hub, tt.clear_work); ++ unsigned long flags; ++ int limit = 100; ++ ++ spin_lock_irqsave (&hub->tt.lock, flags); ++ while (!list_empty(&hub->tt.clear_list)) { ++ struct list_head *next; ++ struct usb_tt_clear *clear; ++ struct usb_device *hdev = hub->hdev; ++ const struct hc_driver *drv; ++ int status; ++ ++ if (!hub->quiescing && --limit < 0) ++ break; ++ ++ next = hub->tt.clear_list.next; ++ clear = list_entry (next, struct usb_tt_clear, clear_list); ++ list_del (&clear->clear_list); ++ ++ /* drop lock so HCD can concurrently report other TT errors */ ++ spin_unlock_irqrestore (&hub->tt.lock, flags); ++ status = hub_clear_tt_buffer (hdev, clear->devinfo, clear->tt); ++ if (status) ++ dev_err (&hdev->dev, ++ "clear tt %d (%04x) error %d\n", ++ clear->tt, clear->devinfo, status); ++ ++ /* Tell the HCD, even if the operation failed */ ++ drv = clear->hcd->driver; ++ if (drv->clear_tt_buffer_complete) ++ (drv->clear_tt_buffer_complete)(clear->hcd, clear->ep); ++ ++ kfree(clear); ++ spin_lock_irqsave(&hub->tt.lock, flags); ++ } ++ spin_unlock_irqrestore (&hub->tt.lock, flags); ++} ++ ++/** ++ * usb_hub_clear_tt_buffer - clear control/bulk TT state in high speed hub ++ * @urb: an URB associated with the failed or incomplete split transaction ++ * ++ * High speed HCDs use this to tell the hub driver that some split control or ++ * bulk transaction failed in a way that requires clearing internal state of ++ * a transaction translator. This is normally detected (and reported) from ++ * interrupt context. ++ * ++ * It may not be possible for that hub to handle additional full (or low) ++ * speed transactions until that state is fully cleared out. ++ */ ++int usb_hub_clear_tt_buffer(struct urb *urb) ++{ ++ struct usb_device *udev = urb->dev; ++ int pipe = urb->pipe; ++ struct usb_tt *tt = udev->tt; ++ unsigned long flags; ++ struct usb_tt_clear *clear; ++ ++ /* we've got to cope with an arbitrary number of pending TT clears, ++ * since each TT has "at least two" buffers that can need it (and ++ * there can be many TTs per hub). even if they're uncommon. ++ */ ++ if ((clear = kmalloc (sizeof *clear, GFP_ATOMIC)) == NULL) { ++ dev_err (&udev->dev, "can't save CLEAR_TT_BUFFER state\n"); ++ /* FIXME recover somehow ... RESET_TT? */ ++ return -ENOMEM; ++ } ++ ++ /* info that CLEAR_TT_BUFFER needs */ ++ clear->tt = tt->multi ? udev->ttport : 1; ++ clear->devinfo = usb_pipeendpoint (pipe); ++ clear->devinfo |= udev->devnum << 4; ++ clear->devinfo |= usb_pipecontrol (pipe) ++ ? (USB_ENDPOINT_XFER_CONTROL << 11) ++ : (USB_ENDPOINT_XFER_BULK << 11); ++ if (usb_pipein (pipe)) ++ clear->devinfo |= 1 << 15; ++ ++ /* info for completion callback */ ++ clear->hcd = bus_to_hcd(udev->bus); ++ clear->ep = urb->ep; ++ ++ /* tell keventd to clear state for this TT */ ++ spin_lock_irqsave (&tt->lock, flags); ++ list_add_tail (&clear->clear_list, &tt->clear_list); ++ schedule_work(&tt->clear_work); ++ spin_unlock_irqrestore (&tt->lock, flags); ++ return 0; ++} ++EXPORT_SYMBOL_GPL(usb_hub_clear_tt_buffer); ++ ++/* If do_delay is false, return the number of milliseconds the caller ++ * needs to delay. ++ */ ++static unsigned hub_power_on(struct usb_hub *hub, bool do_delay) ++{ ++ int port1; ++ unsigned pgood_delay = hub->descriptor->bPwrOn2PwrGood * 2; ++ unsigned delay; ++ u16 wHubCharacteristics = ++ le16_to_cpu(hub->descriptor->wHubCharacteristics); ++ ++ /* Enable power on each port. Some hubs have reserved values ++ * of LPSM (> 2) in their descriptors, even though they are ++ * USB 2.0 hubs. Some hubs do not implement port-power switching ++ * but only emulate it. In all cases, the ports won't work ++ * unless we send these messages to the hub. ++ */ ++ if ((wHubCharacteristics & HUB_CHAR_LPSM) < 2) ++ dev_dbg(hub->intfdev, "enabling power on all ports\n"); ++ else ++ dev_dbg(hub->intfdev, "trying to enable port power on " ++ "non-switchable hub\n"); ++ for (port1 = 1; port1 <= hub->descriptor->bNbrPorts; port1++) ++ set_port_feature(hub->hdev, port1, USB_PORT_FEAT_POWER); ++ ++ /* Wait at least 100 msec for power to become stable */ ++ delay = max(pgood_delay, (unsigned) 100); ++ if (do_delay) ++ msleep(delay); ++ return delay; ++} ++ ++static int hub_hub_status(struct usb_hub *hub, ++ u16 *status, u16 *change) ++{ ++ int ret; ++ ++ mutex_lock(&hub->status_mutex); ++ ret = get_hub_status(hub->hdev, &hub->status->hub); ++ if (ret < 0) ++ dev_err (hub->intfdev, ++ "%s failed (err = %d)\n", __func__, ret); ++ else { ++ *status = le16_to_cpu(hub->status->hub.wHubStatus); ++ *change = le16_to_cpu(hub->status->hub.wHubChange); ++ ret = 0; ++ } ++ mutex_unlock(&hub->status_mutex); ++ return ret; ++} ++ ++static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) ++{ ++ struct usb_device *hdev = hub->hdev; ++ int ret = 0; ++ ++ if (hdev->children[port1-1] && set_state) ++ usb_set_device_state(hdev->children[port1-1], ++ USB_STATE_NOTATTACHED); ++ if (!hub->error && !hub_is_superspeed(hub->hdev)) ++ ret = clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE); ++ if (ret) ++ dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n", ++ port1, ret); ++ return ret; ++} ++ ++/* ++ * Disable a port and mark a logical connect-change event, so that some ++ * time later khubd will disconnect() any existing usb_device on the port ++ * and will re-enumerate if there actually is a device attached. ++ */ ++static void hub_port_logical_disconnect(struct usb_hub *hub, int port1) ++{ ++ dev_dbg(hub->intfdev, "logical disconnect on port %d\n", port1); ++ hub_port_disable(hub, port1, 1); ++ ++ /* FIXME let caller ask to power down the port: ++ * - some devices won't enumerate without a VBUS power cycle ++ * - SRP saves power that way ++ * - ... new call, TBD ... ++ * That's easy if this hub can switch power per-port, and ++ * khubd reactivates the port later (timer, SRP, etc). ++ * Powerdown must be optional, because of reset/DFU. ++ */ ++ ++ set_bit(port1, hub->change_bits); ++ kick_khubd(hub); ++} ++ ++/** ++ * usb_remove_device - disable a device's port on its parent hub ++ * @udev: device to be disabled and removed ++ * Context: @udev locked, must be able to sleep. ++ * ++ * After @udev's port has been disabled, khubd is notified and it will ++ * see that the device has been disconnected. When the device is ++ * physically unplugged and something is plugged in, the events will ++ * be received and processed normally. ++ */ ++int usb_remove_device(struct usb_device *udev) ++{ ++ struct usb_hub *hub; ++ struct usb_interface *intf; ++ ++ if (!udev->parent) /* Can't remove a root hub */ ++ return -EINVAL; ++ hub = hdev_to_hub(udev->parent); ++ intf = to_usb_interface(hub->intfdev); ++ ++ usb_autopm_get_interface(intf); ++ set_bit(udev->portnum, hub->removed_bits); ++ hub_port_logical_disconnect(hub, udev->portnum); ++ usb_autopm_put_interface(intf); ++ return 0; ++} ++ ++enum hub_activation_type { ++ HUB_INIT, HUB_INIT2, HUB_INIT3, /* INITs must come first */ ++ HUB_POST_RESET, HUB_RESUME, HUB_RESET_RESUME, ++}; ++ ++static void hub_init_func2(struct work_struct *ws); ++static void hub_init_func3(struct work_struct *ws); ++ ++static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) ++{ ++ struct usb_device *hdev = hub->hdev; ++ struct usb_hcd *hcd; ++ int ret; ++ int port1; ++ int status; ++ bool need_debounce_delay = false; ++ unsigned delay; ++ ++ /* Continue a partial initialization */ ++ if (type == HUB_INIT2) ++ goto init2; ++ if (type == HUB_INIT3) ++ goto init3; ++ ++ /* The superspeed hub except for root hub has to use Hub Depth ++ * value as an offset into the route string to locate the bits ++ * it uses to determine the downstream port number. So hub driver ++ * should send a set hub depth request to superspeed hub after ++ * the superspeed hub is set configuration in initialization or ++ * reset procedure. ++ * ++ * After a resume, port power should still be on. ++ * For any other type of activation, turn it on. ++ */ ++ if (type != HUB_RESUME) { ++ if (hdev->parent && hub_is_superspeed(hdev)) { ++ ret = usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), ++ HUB_SET_DEPTH, USB_RT_HUB, ++ hdev->level - 1, 0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); ++ if (ret < 0) ++ dev_err(hub->intfdev, ++ "set hub depth failed\n"); ++ } ++ ++ /* Speed up system boot by using a delayed_work for the ++ * hub's initial power-up delays. This is pretty awkward ++ * and the implementation looks like a home-brewed sort of ++ * setjmp/longjmp, but it saves at least 100 ms for each ++ * root hub (assuming usbcore is compiled into the kernel ++ * rather than as a module). It adds up. ++ * ++ * This can't be done for HUB_RESUME or HUB_RESET_RESUME ++ * because for those activation types the ports have to be ++ * operational when we return. In theory this could be done ++ * for HUB_POST_RESET, but it's easier not to. ++ */ ++ if (type == HUB_INIT) { ++ delay = hub_power_on(hub, false); ++ PREPARE_DELAYED_WORK(&hub->init_work, hub_init_func2); ++ schedule_delayed_work(&hub->init_work, ++ msecs_to_jiffies(delay)); ++ ++ /* Suppress autosuspend until init is done */ ++ usb_autopm_get_interface_no_resume( ++ to_usb_interface(hub->intfdev)); ++ return; /* Continues at init2: below */ ++ } else if (type == HUB_RESET_RESUME) { ++ /* The internal host controller state for the hub device ++ * may be gone after a host power loss on system resume. ++ * Update the device's info so the HW knows it's a hub. ++ */ ++ hcd = bus_to_hcd(hdev->bus); ++ if (hcd->driver->update_hub_device) { ++ ret = hcd->driver->update_hub_device(hcd, hdev, ++ &hub->tt, GFP_NOIO); ++ if (ret < 0) { ++ dev_err(hub->intfdev, "Host not " ++ "accepting hub info " ++ "update.\n"); ++ dev_err(hub->intfdev, "LS/FS devices " ++ "and hubs may not work " ++ "under this hub\n."); ++ } ++ } ++ hub_power_on(hub, true); ++ } else { ++ hub_power_on(hub, true); ++ } ++ } ++ init2: ++ ++ /* Check each port and set hub->change_bits to let khubd know ++ * which ports need attention. ++ */ ++ for (port1 = 1; port1 <= hdev->maxchild; ++port1) { ++ struct usb_device *udev = hdev->children[port1-1]; ++ u16 portstatus, portchange; ++ ++ portstatus = portchange = 0; ++ status = hub_port_status(hub, port1, &portstatus, &portchange); ++ if (udev || (portstatus & USB_PORT_STAT_CONNECTION)) ++ dev_dbg(hub->intfdev, ++ "port %d: status %04x change %04x\n", ++ port1, portstatus, portchange); ++ ++ /* After anything other than HUB_RESUME (i.e., initialization ++ * or any sort of reset), every port should be disabled. ++ * Unconnected ports should likewise be disabled (paranoia), ++ * and so should ports for which we have no usb_device. ++ */ ++ if ((portstatus & USB_PORT_STAT_ENABLE) && ( ++ type != HUB_RESUME || ++ !(portstatus & USB_PORT_STAT_CONNECTION) || ++ !udev || ++ udev->state == USB_STATE_NOTATTACHED)) { ++ /* ++ * USB3 protocol ports will automatically transition ++ * to Enabled state when detect an USB3.0 device attach. ++ * Do not disable USB3 protocol ports. ++ */ ++ if (!hub_is_superspeed(hdev)) { ++ clear_port_feature(hdev, port1, ++ USB_PORT_FEAT_ENABLE); ++ portstatus &= ~USB_PORT_STAT_ENABLE; ++ } else { ++ /* Pretend that power was lost for USB3 devs */ ++ portstatus &= ~USB_PORT_STAT_ENABLE; ++ } ++ } ++ ++ /* Clear status-change flags; we'll debounce later */ ++ if (portchange & USB_PORT_STAT_C_CONNECTION) { ++ need_debounce_delay = true; ++ clear_port_feature(hub->hdev, port1, ++ USB_PORT_FEAT_C_CONNECTION); ++ } ++ if (portchange & USB_PORT_STAT_C_ENABLE) { ++ need_debounce_delay = true; ++ clear_port_feature(hub->hdev, port1, ++ USB_PORT_FEAT_C_ENABLE); ++ } ++ if ((portchange & USB_PORT_STAT_C_BH_RESET) && ++ hub_is_superspeed(hub->hdev)) { ++ need_debounce_delay = true; ++ clear_port_feature(hub->hdev, port1, ++ USB_PORT_FEAT_C_BH_PORT_RESET); ++ } ++ /* We can forget about a "removed" device when there's a ++ * physical disconnect or the connect status changes. ++ */ ++ if (!(portstatus & USB_PORT_STAT_CONNECTION) || ++ (portchange & USB_PORT_STAT_C_CONNECTION)) ++ clear_bit(port1, hub->removed_bits); ++ ++ if (!udev || udev->state == USB_STATE_NOTATTACHED) { ++ /* Tell khubd to disconnect the device or ++ * check for a new connection ++ */ ++ if (udev || (portstatus & USB_PORT_STAT_CONNECTION)) ++ set_bit(port1, hub->change_bits); ++ ++ } else if (portstatus & USB_PORT_STAT_ENABLE) { ++ bool port_resumed = (portstatus & ++ USB_PORT_STAT_LINK_STATE) == ++ USB_SS_PORT_LS_U0; ++ /* The power session apparently survived the resume. ++ * If there was an overcurrent or suspend change ++ * (i.e., remote wakeup request), have khubd ++ * take care of it. Look at the port link state ++ * for USB 3.0 hubs, since they don't have a suspend ++ * change bit, and they don't set the port link change ++ * bit on device-initiated resume. ++ */ ++ if (portchange || (hub_is_superspeed(hub->hdev) && ++ port_resumed)) ++ set_bit(port1, hub->change_bits); ++ ++ } else if (udev->persist_enabled) { ++#ifdef CONFIG_PM ++ udev->reset_resume = 1; ++#endif ++ set_bit(port1, hub->change_bits); ++ ++ } else { ++ /* The power session is gone; tell khubd */ ++ usb_set_device_state(udev, USB_STATE_NOTATTACHED); ++ set_bit(port1, hub->change_bits); ++ } ++ } ++ ++ /* If no port-status-change flags were set, we don't need any ++ * debouncing. If flags were set we can try to debounce the ++ * ports all at once right now, instead of letting khubd do them ++ * one at a time later on. ++ * ++ * If any port-status changes do occur during this delay, khubd ++ * will see them later and handle them normally. ++ */ ++ if (need_debounce_delay) { ++ delay = HUB_DEBOUNCE_STABLE; ++ ++ /* Don't do a long sleep inside a workqueue routine */ ++ if (type == HUB_INIT2) { ++ PREPARE_DELAYED_WORK(&hub->init_work, hub_init_func3); ++ schedule_delayed_work(&hub->init_work, ++ msecs_to_jiffies(delay)); ++ return; /* Continues at init3: below */ ++ } else { ++ msleep(delay); ++ } ++ } ++ init3: ++ hub->quiescing = 0; ++ ++ status = usb_submit_urb(hub->urb, GFP_NOIO); ++ if (status < 0) ++ dev_err(hub->intfdev, "activate --> %d\n", status); ++ if (hub->has_indicators && blinkenlights) ++ schedule_delayed_work(&hub->leds, LED_CYCLE_PERIOD); ++ ++ /* Scan all ports that need attention */ ++ kick_khubd(hub); ++ ++ /* Allow autosuspend if it was suppressed */ ++ if (type <= HUB_INIT3) ++ usb_autopm_put_interface_async(to_usb_interface(hub->intfdev)); ++} ++ ++/* Implement the continuations for the delays above */ ++static void hub_init_func2(struct work_struct *ws) ++{ ++ struct usb_hub *hub = container_of(ws, struct usb_hub, init_work.work); ++ ++ hub_activate(hub, HUB_INIT2); ++} ++ ++static void hub_init_func3(struct work_struct *ws) ++{ ++ struct usb_hub *hub = container_of(ws, struct usb_hub, init_work.work); ++ ++ hub_activate(hub, HUB_INIT3); ++} ++ ++enum hub_quiescing_type { ++ HUB_DISCONNECT, HUB_PRE_RESET, HUB_SUSPEND ++}; ++ ++static void hub_quiesce(struct usb_hub *hub, enum hub_quiescing_type type) ++{ ++ struct usb_device *hdev = hub->hdev; ++ int i; ++ ++ cancel_delayed_work_sync(&hub->init_work); ++ ++ /* khubd and related activity won't re-trigger */ ++ hub->quiescing = 1; ++ ++ if (type != HUB_SUSPEND) { ++ /* Disconnect all the children */ ++ for (i = 0; i < hdev->maxchild; ++i) { ++ if (hdev->children[i]) ++ usb_disconnect(&hdev->children[i]); ++ } ++ } ++ ++ /* Stop khubd and related activity */ ++ usb_kill_urb(hub->urb); ++ if (hub->has_indicators) ++ cancel_delayed_work_sync(&hub->leds); ++ if (hub->tt.hub) ++ flush_work_sync(&hub->tt.clear_work); ++} ++ ++/* caller has locked the hub device */ ++static int hub_pre_reset(struct usb_interface *intf) ++{ ++ struct usb_hub *hub = usb_get_intfdata(intf); ++ ++ hub_quiesce(hub, HUB_PRE_RESET); ++ return 0; ++} ++ ++/* caller has locked the hub device */ ++static int hub_post_reset(struct usb_interface *intf) ++{ ++ struct usb_hub *hub = usb_get_intfdata(intf); ++ ++ hub_activate(hub, HUB_POST_RESET); ++ return 0; ++} ++ ++static int hub_configure(struct usb_hub *hub, ++ struct usb_endpoint_descriptor *endpoint) ++{ ++ struct usb_hcd *hcd; ++ struct usb_device *hdev = hub->hdev; ++ struct device *hub_dev = hub->intfdev; ++ u16 hubstatus, hubchange; ++ u16 wHubCharacteristics; ++ unsigned int pipe; ++ int maxp, ret; ++ char *message = "out of memory"; ++ ++ hub->buffer = kmalloc(sizeof(*hub->buffer), GFP_KERNEL); ++ if (!hub->buffer) { ++ ret = -ENOMEM; ++ goto fail; ++ } ++ ++ hub->status = kmalloc(sizeof(*hub->status), GFP_KERNEL); ++ if (!hub->status) { ++ ret = -ENOMEM; ++ goto fail; ++ } ++ mutex_init(&hub->status_mutex); ++ ++ hub->descriptor = kmalloc(sizeof(*hub->descriptor), GFP_KERNEL); ++ if (!hub->descriptor) { ++ ret = -ENOMEM; ++ goto fail; ++ } ++ ++ /* Request the entire hub descriptor. ++ * hub->descriptor can handle USB_MAXCHILDREN ports, ++ * but the hub can/will return fewer bytes here. ++ */ ++ ret = get_hub_descriptor(hdev, hub->descriptor); ++ if (ret < 0) { ++ message = "can't read hub descriptor"; ++ goto fail; ++ } else if (hub->descriptor->bNbrPorts > USB_MAXCHILDREN) { ++ message = "hub has too many ports!"; ++ ret = -ENODEV; ++ goto fail; ++ } ++ ++ hdev->maxchild = hub->descriptor->bNbrPorts; ++ dev_info (hub_dev, "%d port%s detected\n", hdev->maxchild, ++ (hdev->maxchild == 1) ? "" : "s"); ++ ++ hdev->children = kzalloc(hdev->maxchild * ++ sizeof(struct usb_device *), GFP_KERNEL); ++ hub->port_owners = kzalloc(hdev->maxchild * sizeof(struct dev_state *), ++ GFP_KERNEL); ++ if (!hdev->children || !hub->port_owners) { ++ ret = -ENOMEM; ++ goto fail; ++ } ++ ++ wHubCharacteristics = le16_to_cpu(hub->descriptor->wHubCharacteristics); ++ ++ /* FIXME for USB 3.0, skip for now */ ++ if ((wHubCharacteristics & HUB_CHAR_COMPOUND) && ++ !(hub_is_superspeed(hdev))) { ++ int i; ++ char portstr [USB_MAXCHILDREN + 1]; ++ ++ for (i = 0; i < hdev->maxchild; i++) ++ portstr[i] = hub->descriptor->u.hs.DeviceRemovable ++ [((i + 1) / 8)] & (1 << ((i + 1) % 8)) ++ ? 'F' : 'R'; ++ portstr[hdev->maxchild] = 0; ++ dev_dbg(hub_dev, "compound device; port removable status: %s\n", portstr); ++ } else ++ dev_dbg(hub_dev, "standalone hub\n"); ++ ++ switch (wHubCharacteristics & HUB_CHAR_LPSM) { ++ case HUB_CHAR_COMMON_LPSM: ++ dev_dbg(hub_dev, "ganged power switching\n"); ++ break; ++ case HUB_CHAR_INDV_PORT_LPSM: ++ dev_dbg(hub_dev, "individual port power switching\n"); ++ break; ++ case HUB_CHAR_NO_LPSM: ++ case HUB_CHAR_LPSM: ++ dev_dbg(hub_dev, "no power switching (usb 1.0)\n"); ++ break; ++ } ++ ++ switch (wHubCharacteristics & HUB_CHAR_OCPM) { ++ case HUB_CHAR_COMMON_OCPM: ++ dev_dbg(hub_dev, "global over-current protection\n"); ++ break; ++ case HUB_CHAR_INDV_PORT_OCPM: ++ dev_dbg(hub_dev, "individual port over-current protection\n"); ++ break; ++ case HUB_CHAR_NO_OCPM: ++ case HUB_CHAR_OCPM: ++ dev_dbg(hub_dev, "no over-current protection\n"); ++ break; ++ } ++ ++ spin_lock_init (&hub->tt.lock); ++ INIT_LIST_HEAD (&hub->tt.clear_list); ++ INIT_WORK(&hub->tt.clear_work, hub_tt_work); ++ switch (hdev->descriptor.bDeviceProtocol) { ++ case USB_HUB_PR_FS: ++ break; ++ case USB_HUB_PR_HS_SINGLE_TT: ++ dev_dbg(hub_dev, "Single TT\n"); ++ hub->tt.hub = hdev; ++ break; ++ case USB_HUB_PR_HS_MULTI_TT: ++ ret = usb_set_interface(hdev, 0, 1); ++ if (ret == 0) { ++ dev_dbg(hub_dev, "TT per port\n"); ++ hub->tt.multi = 1; ++ } else ++ dev_err(hub_dev, "Using single TT (err %d)\n", ++ ret); ++ hub->tt.hub = hdev; ++ break; ++ case USB_HUB_PR_SS: ++ /* USB 3.0 hubs don't have a TT */ ++ break; ++ default: ++ dev_dbg(hub_dev, "Unrecognized hub protocol %d\n", ++ hdev->descriptor.bDeviceProtocol); ++ break; ++ } ++ ++ /* Note 8 FS bit times == (8 bits / 12000000 bps) ~= 666ns */ ++ switch (wHubCharacteristics & HUB_CHAR_TTTT) { ++ case HUB_TTTT_8_BITS: ++ if (hdev->descriptor.bDeviceProtocol != 0) { ++ hub->tt.think_time = 666; ++ dev_dbg(hub_dev, "TT requires at most %d " ++ "FS bit times (%d ns)\n", ++ 8, hub->tt.think_time); ++ } ++ break; ++ case HUB_TTTT_16_BITS: ++ hub->tt.think_time = 666 * 2; ++ dev_dbg(hub_dev, "TT requires at most %d " ++ "FS bit times (%d ns)\n", ++ 16, hub->tt.think_time); ++ break; ++ case HUB_TTTT_24_BITS: ++ hub->tt.think_time = 666 * 3; ++ dev_dbg(hub_dev, "TT requires at most %d " ++ "FS bit times (%d ns)\n", ++ 24, hub->tt.think_time); ++ break; ++ case HUB_TTTT_32_BITS: ++ hub->tt.think_time = 666 * 4; ++ dev_dbg(hub_dev, "TT requires at most %d " ++ "FS bit times (%d ns)\n", ++ 32, hub->tt.think_time); ++ break; ++ } ++ ++ /* probe() zeroes hub->indicator[] */ ++ if (wHubCharacteristics & HUB_CHAR_PORTIND) { ++ hub->has_indicators = 1; ++ dev_dbg(hub_dev, "Port indicators are supported\n"); ++ } ++ ++ dev_dbg(hub_dev, "power on to power good time: %dms\n", ++ hub->descriptor->bPwrOn2PwrGood * 2); ++ ++ /* power budgeting mostly matters with bus-powered hubs, ++ * and battery-powered root hubs (may provide just 8 mA). ++ */ ++ ret = usb_get_status(hdev, USB_RECIP_DEVICE, 0, &hubstatus); ++ if (ret < 2) { ++ message = "can't get hub status"; ++ goto fail; ++ } ++ le16_to_cpus(&hubstatus); ++ if (hdev == hdev->bus->root_hub) { ++ if (hdev->bus_mA == 0 || hdev->bus_mA >= 500) ++ hub->mA_per_port = 500; ++ else { ++ hub->mA_per_port = hdev->bus_mA; ++ hub->limited_power = 1; ++ } ++ } else if ((hubstatus & (1 << USB_DEVICE_SELF_POWERED)) == 0) { ++ dev_dbg(hub_dev, "hub controller current requirement: %dmA\n", ++ hub->descriptor->bHubContrCurrent); ++ hub->limited_power = 1; ++ if (hdev->maxchild > 0) { ++ int remaining = hdev->bus_mA - ++ hub->descriptor->bHubContrCurrent; ++ ++ if (remaining < hdev->maxchild * 100) ++ dev_warn(hub_dev, ++ "insufficient power available " ++ "to use all downstream ports\n"); ++ hub->mA_per_port = 100; /* 7.2.1.1 */ ++ } ++ } else { /* Self-powered external hub */ ++ /* FIXME: What about battery-powered external hubs that ++ * provide less current per port? */ ++ hub->mA_per_port = 500; ++ } ++ if (hub->mA_per_port < 500) ++ dev_dbg(hub_dev, "%umA bus power budget for each child\n", ++ hub->mA_per_port); ++ ++ /* Update the HCD's internal representation of this hub before khubd ++ * starts getting port status changes for devices under the hub. ++ */ ++ hcd = bus_to_hcd(hdev->bus); ++ if (hcd->driver->update_hub_device) { ++ ret = hcd->driver->update_hub_device(hcd, hdev, ++ &hub->tt, GFP_KERNEL); ++ if (ret < 0) { ++ message = "can't update HCD hub info"; ++ goto fail; ++ } ++ } ++ ++ ret = hub_hub_status(hub, &hubstatus, &hubchange); ++ if (ret < 0) { ++ message = "can't get hub status"; ++ goto fail; ++ } ++ ++ /* local power status reports aren't always correct */ ++ if (hdev->actconfig->desc.bmAttributes & USB_CONFIG_ATT_SELFPOWER) ++ dev_dbg(hub_dev, "local power source is %s\n", ++ (hubstatus & HUB_STATUS_LOCAL_POWER) ++ ? "lost (inactive)" : "good"); ++ ++ if ((wHubCharacteristics & HUB_CHAR_OCPM) == 0) ++ dev_dbg(hub_dev, "%sover-current condition exists\n", ++ (hubstatus & HUB_STATUS_OVERCURRENT) ? "" : "no "); ++ ++ /* set up the interrupt endpoint ++ * We use the EP's maxpacket size instead of (PORTS+1+7)/8 ++ * bytes as USB2.0[11.12.3] says because some hubs are known ++ * to send more data (and thus cause overflow). For root hubs, ++ * maxpktsize is defined in hcd.c's fake endpoint descriptors ++ * to be big enough for at least USB_MAXCHILDREN ports. */ ++ pipe = usb_rcvintpipe(hdev, endpoint->bEndpointAddress); ++ maxp = usb_maxpacket(hdev, pipe, usb_pipeout(pipe)); ++ ++ if (maxp > sizeof(*hub->buffer)) ++ maxp = sizeof(*hub->buffer); ++ ++ hub->urb = usb_alloc_urb(0, GFP_KERNEL); ++ if (!hub->urb) { ++ ret = -ENOMEM; ++ goto fail; ++ } ++ ++ usb_fill_int_urb(hub->urb, hdev, pipe, *hub->buffer, maxp, hub_irq, ++ hub, endpoint->bInterval); ++ ++ /* maybe cycle the hub leds */ ++ if (hub->has_indicators && blinkenlights) ++ hub->indicator [0] = INDICATOR_CYCLE; ++ ++ hub_activate(hub, HUB_INIT); ++ return 0; ++ ++fail: ++ dev_err (hub_dev, "config failed, %s (err %d)\n", ++ message, ret); ++ /* hub_disconnect() frees urb and descriptor */ ++ return ret; ++} ++ ++static void hub_release(struct kref *kref) ++{ ++ struct usb_hub *hub = container_of(kref, struct usb_hub, kref); ++ ++ usb_put_intf(to_usb_interface(hub->intfdev)); ++ kfree(hub); ++} ++ ++static unsigned highspeed_hubs; ++ ++static void hub_disconnect(struct usb_interface *intf) ++{ ++ struct usb_hub *hub = usb_get_intfdata(intf); ++ struct usb_device *hdev = interface_to_usbdev(intf); ++ ++ /* Take the hub off the event list and don't let it be added again */ ++ spin_lock_irq(&hub_event_lock); ++ if (!list_empty(&hub->event_list)) { ++ list_del_init(&hub->event_list); ++ usb_autopm_put_interface_no_suspend(intf); ++ } ++ hub->disconnected = 1; ++ spin_unlock_irq(&hub_event_lock); ++ ++ /* Disconnect all children and quiesce the hub */ ++ hub->error = 0; ++ hub_quiesce(hub, HUB_DISCONNECT); ++ ++ usb_set_intfdata (intf, NULL); ++ hub->hdev->maxchild = 0; ++ ++ if (hub->hdev->speed == USB_SPEED_HIGH) ++ highspeed_hubs--; ++ ++ usb_free_urb(hub->urb); ++ kfree(hdev->children); ++ kfree(hub->port_owners); ++ kfree(hub->descriptor); ++ kfree(hub->status); ++ kfree(hub->buffer); ++ ++ kref_put(&hub->kref, hub_release); ++} ++ ++static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) ++{ ++ struct usb_host_interface *desc; ++ struct usb_endpoint_descriptor *endpoint; ++ struct usb_device *hdev; ++ struct usb_hub *hub; ++ ++ desc = intf->cur_altsetting; ++ hdev = interface_to_usbdev(intf); ++ ++ /* Hubs have proper suspend/resume support. */ ++ usb_enable_autosuspend(hdev); ++ ++ if (hdev->level == MAX_TOPO_LEVEL) { ++ dev_err(&intf->dev, ++ "Unsupported bus topology: hub nested too deep\n"); ++ return -E2BIG; ++ } ++ ++#ifdef CONFIG_USB_OTG_BLACKLIST_HUB ++ if (hdev->parent) { ++ dev_warn(&intf->dev, "ignoring external hub\n"); ++ return -ENODEV; ++ } ++#endif ++ ++ /* Some hubs have a subclass of 1, which AFAICT according to the */ ++ /* specs is not defined, but it works */ ++ if ((desc->desc.bInterfaceSubClass != 0) && ++ (desc->desc.bInterfaceSubClass != 1)) { ++descriptor_error: ++ dev_err (&intf->dev, "bad descriptor, ignoring hub\n"); ++ return -EIO; ++ } ++ ++ /* Multiple endpoints? What kind of mutant ninja-hub is this? */ ++ if (desc->desc.bNumEndpoints != 1) ++ goto descriptor_error; ++ ++ endpoint = &desc->endpoint[0].desc; ++ ++ /* If it's not an interrupt in endpoint, we'd better punt! */ ++ if (!usb_endpoint_is_int_in(endpoint)) ++ goto descriptor_error; ++ ++ /* We found a hub */ ++ dev_info (&intf->dev, "USB hub found\n"); ++ ++ hub = kzalloc(sizeof(*hub), GFP_KERNEL); ++ if (!hub) { ++ dev_dbg (&intf->dev, "couldn't kmalloc hub struct\n"); ++ return -ENOMEM; ++ } ++ ++ kref_init(&hub->kref); ++ INIT_LIST_HEAD(&hub->event_list); ++ hub->intfdev = &intf->dev; ++ hub->hdev = hdev; ++ INIT_DELAYED_WORK(&hub->leds, led_work); ++ INIT_DELAYED_WORK(&hub->init_work, NULL); ++ usb_get_intf(intf); ++ ++ usb_set_intfdata (intf, hub); ++ intf->needs_remote_wakeup = 1; ++ ++ if (hdev->speed == USB_SPEED_HIGH) ++ highspeed_hubs++; ++ ++ if (hub_configure(hub, endpoint) >= 0) ++ return 0; ++ ++ hub_disconnect (intf); ++ return -ENODEV; ++} ++ ++static int ++hub_ioctl(struct usb_interface *intf, unsigned int code, void *user_data) ++{ ++ struct usb_device *hdev = interface_to_usbdev (intf); ++ ++ /* assert ifno == 0 (part of hub spec) */ ++ switch (code) { ++ case USBDEVFS_HUB_PORTINFO: { ++ struct usbdevfs_hub_portinfo *info = user_data; ++ int i; ++ ++ spin_lock_irq(&device_state_lock); ++ if (hdev->devnum <= 0) ++ info->nports = 0; ++ else { ++ info->nports = hdev->maxchild; ++ for (i = 0; i < info->nports; i++) { ++ if (hdev->children[i] == NULL) ++ info->port[i] = 0; ++ else ++ info->port[i] = ++ hdev->children[i]->devnum; ++ } ++ } ++ spin_unlock_irq(&device_state_lock); ++ ++ return info->nports + 1; ++ } ++ ++ default: ++ return -ENOSYS; ++ } ++} ++ ++/* ++ * Allow user programs to claim ports on a hub. When a device is attached ++ * to one of these "claimed" ports, the program will "own" the device. ++ */ ++static int find_port_owner(struct usb_device *hdev, unsigned port1, ++ struct dev_state ***ppowner) ++{ ++ if (hdev->state == USB_STATE_NOTATTACHED) ++ return -ENODEV; ++ if (port1 == 0 || port1 > hdev->maxchild) ++ return -EINVAL; ++ ++ /* This assumes that devices not managed by the hub driver ++ * will always have maxchild equal to 0. ++ */ ++ *ppowner = &(hdev_to_hub(hdev)->port_owners[port1 - 1]); ++ return 0; ++} ++ ++/* In the following three functions, the caller must hold hdev's lock */ ++int usb_hub_claim_port(struct usb_device *hdev, unsigned port1, ++ struct dev_state *owner) ++{ ++ int rc; ++ struct dev_state **powner; ++ ++ rc = find_port_owner(hdev, port1, &powner); ++ if (rc) ++ return rc; ++ if (*powner) ++ return -EBUSY; ++ *powner = owner; ++ return rc; ++} ++ ++int usb_hub_release_port(struct usb_device *hdev, unsigned port1, ++ struct dev_state *owner) ++{ ++ int rc; ++ struct dev_state **powner; ++ ++ rc = find_port_owner(hdev, port1, &powner); ++ if (rc) ++ return rc; ++ if (*powner != owner) ++ return -ENOENT; ++ *powner = NULL; ++ return rc; ++} ++ ++void usb_hub_release_all_ports(struct usb_device *hdev, struct dev_state *owner) ++{ ++ int n; ++ struct dev_state **powner; ++ ++ n = find_port_owner(hdev, 1, &powner); ++ if (n == 0) { ++ for (; n < hdev->maxchild; (++n, ++powner)) { ++ if (*powner == owner) ++ *powner = NULL; ++ } ++ } ++} ++ ++/* The caller must hold udev's lock */ ++bool usb_device_is_owned(struct usb_device *udev) ++{ ++ struct usb_hub *hub; ++ ++ if (udev->state == USB_STATE_NOTATTACHED || !udev->parent) ++ return false; ++ hub = hdev_to_hub(udev->parent); ++ return !!hub->port_owners[udev->portnum - 1]; ++} ++ ++ ++static void recursively_mark_NOTATTACHED(struct usb_device *udev) ++{ ++ int i; ++ ++ for (i = 0; i < udev->maxchild; ++i) { ++ if (udev->children[i]) ++ recursively_mark_NOTATTACHED(udev->children[i]); ++ } ++ if (udev->state == USB_STATE_SUSPENDED) ++ udev->active_duration -= jiffies; ++ udev->state = USB_STATE_NOTATTACHED; ++} ++ ++/** ++ * usb_set_device_state - change a device's current state (usbcore, hcds) ++ * @udev: pointer to device whose state should be changed ++ * @new_state: new state value to be stored ++ * ++ * udev->state is _not_ fully protected by the device lock. Although ++ * most transitions are made only while holding the lock, the state can ++ * can change to USB_STATE_NOTATTACHED at almost any time. This ++ * is so that devices can be marked as disconnected as soon as possible, ++ * without having to wait for any semaphores to be released. As a result, ++ * all changes to any device's state must be protected by the ++ * device_state_lock spinlock. ++ * ++ * Once a device has been added to the device tree, all changes to its state ++ * should be made using this routine. The state should _not_ be set directly. ++ * ++ * If udev->state is already USB_STATE_NOTATTACHED then no change is made. ++ * Otherwise udev->state is set to new_state, and if new_state is ++ * USB_STATE_NOTATTACHED then all of udev's descendants' states are also set ++ * to USB_STATE_NOTATTACHED. ++ */ ++void usb_set_device_state(struct usb_device *udev, ++ enum usb_device_state new_state) ++{ ++ unsigned long flags; ++ int wakeup = -1; ++ ++ spin_lock_irqsave(&device_state_lock, flags); ++ if (udev->state == USB_STATE_NOTATTACHED) ++ ; /* do nothing */ ++ else if (new_state != USB_STATE_NOTATTACHED) { ++ ++ /* root hub wakeup capabilities are managed out-of-band ++ * and may involve silicon errata ... ignore them here. ++ */ ++ if (udev->parent) { ++ if (udev->state == USB_STATE_SUSPENDED ++ || new_state == USB_STATE_SUSPENDED) ++ ; /* No change to wakeup settings */ ++ else if (new_state == USB_STATE_CONFIGURED) ++ wakeup = udev->actconfig->desc.bmAttributes ++ & USB_CONFIG_ATT_WAKEUP; ++ else ++ wakeup = 0; ++ } ++ if (udev->state == USB_STATE_SUSPENDED && ++ new_state != USB_STATE_SUSPENDED) ++ udev->active_duration -= jiffies; ++ else if (new_state == USB_STATE_SUSPENDED && ++ udev->state != USB_STATE_SUSPENDED) ++ udev->active_duration += jiffies; ++ udev->state = new_state; ++ } else ++ recursively_mark_NOTATTACHED(udev); ++ spin_unlock_irqrestore(&device_state_lock, flags); ++ if (wakeup >= 0) ++ device_set_wakeup_capable(&udev->dev, wakeup); ++} ++EXPORT_SYMBOL_GPL(usb_set_device_state); ++ ++/* ++ * Choose a device number. ++ * ++ * Device numbers are used as filenames in usbfs. On USB-1.1 and ++ * USB-2.0 buses they are also used as device addresses, however on ++ * USB-3.0 buses the address is assigned by the controller hardware ++ * and it usually is not the same as the device number. ++ * ++ * WUSB devices are simple: they have no hubs behind, so the mapping ++ * device <-> virtual port number becomes 1:1. Why? to simplify the ++ * life of the device connection logic in ++ * drivers/usb/wusbcore/devconnect.c. When we do the initial secret ++ * handshake we need to assign a temporary address in the unauthorized ++ * space. For simplicity we use the first virtual port number found to ++ * be free [drivers/usb/wusbcore/devconnect.c:wusbhc_devconnect_ack()] ++ * and that becomes it's address [X < 128] or its unauthorized address ++ * [X | 0x80]. ++ * ++ * We add 1 as an offset to the one-based USB-stack port number ++ * (zero-based wusb virtual port index) for two reasons: (a) dev addr ++ * 0 is reserved by USB for default address; (b) Linux's USB stack ++ * uses always #1 for the root hub of the controller. So USB stack's ++ * port #1, which is wusb virtual-port #0 has address #2. ++ * ++ * Devices connected under xHCI are not as simple. The host controller ++ * supports virtualization, so the hardware assigns device addresses and ++ * the HCD must setup data structures before issuing a set address ++ * command to the hardware. ++ */ ++static void choose_devnum(struct usb_device *udev) ++{ ++ int devnum; ++ struct usb_bus *bus = udev->bus; ++ ++ /* If khubd ever becomes multithreaded, this will need a lock */ ++ if (udev->wusb) { ++ devnum = udev->portnum + 1; ++ BUG_ON(test_bit(devnum, bus->devmap.devicemap)); ++ } else { ++ /* Try to allocate the next devnum beginning at ++ * bus->devnum_next. */ ++ devnum = find_next_zero_bit(bus->devmap.devicemap, 128, ++ bus->devnum_next); ++ if (devnum >= 128) ++ devnum = find_next_zero_bit(bus->devmap.devicemap, ++ 128, 1); ++ bus->devnum_next = ( devnum >= 127 ? 1 : devnum + 1); ++ } ++ if (devnum < 128) { ++ set_bit(devnum, bus->devmap.devicemap); ++ udev->devnum = devnum; ++ } ++} ++ ++static void release_devnum(struct usb_device *udev) ++{ ++ if (udev->devnum > 0) { ++ clear_bit(udev->devnum, udev->bus->devmap.devicemap); ++ udev->devnum = -1; ++ } ++} ++ ++static void update_devnum(struct usb_device *udev, int devnum) ++{ ++ /* The address for a WUSB device is managed by wusbcore. */ ++ if (!udev->wusb) ++ udev->devnum = devnum; ++} ++ ++static void hub_free_dev(struct usb_device *udev) ++{ ++ struct usb_hcd *hcd = bus_to_hcd(udev->bus); ++ ++ /* Root hubs aren't real devices, so don't free HCD resources */ ++ if (hcd->driver->free_dev && udev->parent) ++ hcd->driver->free_dev(hcd, udev); ++} ++ ++/** ++ * usb_disconnect - disconnect a device (usbcore-internal) ++ * @pdev: pointer to device being disconnected ++ * Context: !in_interrupt () ++ * ++ * Something got disconnected. Get rid of it and all of its children. ++ * ++ * If *pdev is a normal device then the parent hub must already be locked. ++ * If *pdev is a root hub then this routine will acquire the ++ * usb_bus_list_lock on behalf of the caller. ++ * ++ * Only hub drivers (including virtual root hub drivers for host ++ * controllers) should ever call this. ++ * ++ * This call is synchronous, and may not be used in an interrupt context. ++ */ ++void usb_disconnect(struct usb_device **pdev) ++{ ++ struct usb_device *udev = *pdev; ++ int i; ++ ++ /* mark the device as inactive, so any further urb submissions for ++ * this device (and any of its children) will fail immediately. ++ * this quiesces everything except pending urbs. ++ */ ++ usb_set_device_state(udev, USB_STATE_NOTATTACHED); ++ dev_info(&udev->dev, "USB disconnect, device number %d\n", ++ udev->devnum); ++ ++ usb_lock_device(udev); ++ ++ /* Free up all the children before we remove this device */ ++ for (i = 0; i < udev->maxchild; i++) { ++ if (udev->children[i]) ++ usb_disconnect(&udev->children[i]); ++ } ++ ++ /* deallocate hcd/hardware state ... nuking all pending urbs and ++ * cleaning up all state associated with the current configuration ++ * so that the hardware is now fully quiesced. ++ */ ++ dev_dbg (&udev->dev, "unregistering device\n"); ++ usb_disable_device(udev, 0); ++ usb_hcd_synchronize_unlinks(udev); ++ ++ usb_remove_ep_devs(&udev->ep0); ++ usb_unlock_device(udev); ++ ++ /* Unregister the device. The device driver is responsible ++ * for de-configuring the device and invoking the remove-device ++ * notifier chain (used by usbfs and possibly others). ++ */ ++ device_del(&udev->dev); ++ ++ /* Free the device number and delete the parent's children[] ++ * (or root_hub) pointer. ++ */ ++ release_devnum(udev); ++ ++ /* Avoid races with recursively_mark_NOTATTACHED() */ ++ spin_lock_irq(&device_state_lock); ++ *pdev = NULL; ++ spin_unlock_irq(&device_state_lock); ++ ++ hub_free_dev(udev); ++ ++ put_device(&udev->dev); ++} ++ ++#ifdef CONFIG_USB_ANNOUNCE_NEW_DEVICES ++static void show_string(struct usb_device *udev, char *id, char *string) ++{ ++ if (!string) ++ return; ++ dev_printk(KERN_INFO, &udev->dev, "%s: %s\n", id, string); ++} ++ ++static void announce_device(struct usb_device *udev) ++{ ++ dev_info(&udev->dev, "New USB device found, idVendor=%04x, idProduct=%04x\n", ++ le16_to_cpu(udev->descriptor.idVendor), ++ le16_to_cpu(udev->descriptor.idProduct)); ++ dev_info(&udev->dev, ++ "New USB device strings: Mfr=%d, Product=%d, SerialNumber=%d\n", ++ udev->descriptor.iManufacturer, ++ udev->descriptor.iProduct, ++ udev->descriptor.iSerialNumber); ++ show_string(udev, "Product", udev->product); ++ show_string(udev, "Manufacturer", udev->manufacturer); ++ show_string(udev, "SerialNumber", udev->serial); ++} ++#else ++static inline void announce_device(struct usb_device *udev) { } ++#endif ++ ++#ifdef CONFIG_USB_OTG ++#include "otg_whitelist.h" ++#endif ++ ++/** ++ * usb_enumerate_device_otg - FIXME (usbcore-internal) ++ * @udev: newly addressed device (in ADDRESS state) ++ * ++ * Finish enumeration for On-The-Go devices ++ */ ++static int usb_enumerate_device_otg(struct usb_device *udev) ++{ ++ int err = 0; ++ ++#ifdef CONFIG_USB_OTG ++ /* ++ * OTG-aware devices on OTG-capable root hubs may be able to use SRP, ++ * to wake us after we've powered off VBUS; and HNP, switching roles ++ * "host" to "peripheral". The OTG descriptor helps figure this out. ++ */ ++ if (!udev->bus->is_b_host ++ && udev->config ++ && udev->parent == udev->bus->root_hub) { ++ struct usb_otg_descriptor *desc = NULL; ++ struct usb_bus *bus = udev->bus; ++ ++ /* descriptor may appear anywhere in config */ ++ if (__usb_get_extra_descriptor (udev->rawdescriptors[0], ++ le16_to_cpu(udev->config[0].desc.wTotalLength), ++ USB_DT_OTG, (void **) &desc) == 0) { ++ if (desc->bmAttributes & USB_OTG_HNP) { ++ unsigned port1 = udev->portnum; ++ ++ dev_info(&udev->dev, ++ "Dual-Role OTG device on %sHNP port\n", ++ (port1 == bus->otg_port) ++ ? "" : "non-"); ++ ++ /* enable HNP before suspend, it's simpler */ ++ if (port1 == bus->otg_port) ++ bus->b_hnp_enable = 1; ++ err = usb_control_msg(udev, ++ usb_sndctrlpipe(udev, 0), ++ USB_REQ_SET_FEATURE, 0, ++ bus->b_hnp_enable ++ ? USB_DEVICE_B_HNP_ENABLE ++ : USB_DEVICE_A_ALT_HNP_SUPPORT, ++ 0, NULL, 0, USB_CTRL_SET_TIMEOUT); ++ if (err < 0) { ++ /* OTG MESSAGE: report errors here, ++ * customize to match your product. ++ */ ++ dev_info(&udev->dev, ++ "can't set HNP mode: %d\n", ++ err); ++ bus->b_hnp_enable = 0; ++ } ++ } ++ } ++ } ++ ++ if (!is_targeted(udev)) { ++ ++ /* Maybe it can talk to us, though we can't talk to it. ++ * (Includes HNP test device.) ++ */ ++ if (udev->bus->b_hnp_enable || udev->bus->is_b_host) { ++ err = usb_port_suspend(udev, PMSG_SUSPEND); ++ if (err < 0) ++ dev_dbg(&udev->dev, "HNP fail, %d\n", err); ++ } ++ err = -ENOTSUPP; ++ goto fail; ++ } ++fail: ++#endif ++ return err; ++} ++ ++ ++/** ++ * usb_enumerate_device - Read device configs/intfs/otg (usbcore-internal) ++ * @udev: newly addressed device (in ADDRESS state) ++ * ++ * This is only called by usb_new_device() and usb_authorize_device() ++ * and FIXME -- all comments that apply to them apply here wrt to ++ * environment. ++ * ++ * If the device is WUSB and not authorized, we don't attempt to read ++ * the string descriptors, as they will be errored out by the device ++ * until it has been authorized. ++ */ ++static int usb_enumerate_device(struct usb_device *udev) ++{ ++ int err; ++ ++ if (udev->config == NULL) { ++ err = usb_get_configuration(udev); ++ if (err < 0) { ++ dev_err(&udev->dev, "can't read configurations, error %d\n", ++ err); ++ return err; ++ } ++ } ++ 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); ++ } ++ err = usb_enumerate_device_otg(udev); ++ if (err < 0) ++ return err; ++ ++ usb_detect_interface_quirks(udev); ++ ++ return 0; ++} ++ ++static void set_usb_port_removable(struct usb_device *udev) ++{ ++ struct usb_device *hdev = udev->parent; ++ struct usb_hub *hub; ++ u8 port = udev->portnum; ++ u16 wHubCharacteristics; ++ bool removable = true; ++ ++ if (!hdev) ++ return; ++ ++ hub = hdev_to_hub(udev->parent); ++ ++ wHubCharacteristics = le16_to_cpu(hub->descriptor->wHubCharacteristics); ++ ++ if (!(wHubCharacteristics & HUB_CHAR_COMPOUND)) ++ return; ++ ++ if (hub_is_superspeed(hdev)) { ++ if (hub->descriptor->u.ss.DeviceRemovable & (1 << port)) ++ removable = false; ++ } else { ++ if (hub->descriptor->u.hs.DeviceRemovable[port / 8] & (1 << (port % 8))) ++ removable = false; ++ } ++ ++ if (removable) ++ udev->removable = USB_DEVICE_REMOVABLE; ++ else ++ udev->removable = USB_DEVICE_FIXED; ++} ++ ++/** ++ * usb_new_device - perform initial device setup (usbcore-internal) ++ * @udev: newly addressed device (in ADDRESS state) ++ * ++ * This is called with devices which have been detected but not fully ++ * enumerated. The device descriptor is available, but not descriptors ++ * for any device configuration. The caller must have locked either ++ * the parent hub (if udev is a normal device) or else the ++ * usb_bus_list_lock (if udev is a root hub). The parent's pointer to ++ * udev has already been installed, but udev is not yet visible through ++ * sysfs or other filesystem code. ++ * ++ * It will return if the device is configured properly or not. Zero if ++ * the interface was registered with the driver core; else a negative ++ * errno value. ++ * ++ * This call is synchronous, and may not be used in an interrupt context. ++ * ++ * Only the hub driver or root-hub registrar should ever call this. ++ */ ++int usb_new_device(struct usb_device *udev) ++{ ++ int err; ++ ++ if (udev->parent) { ++ /* Initialize non-root-hub device wakeup to disabled; ++ * device (un)configuration controls wakeup capable ++ * sysfs power/wakeup controls wakeup enabled/disabled ++ */ ++ device_init_wakeup(&udev->dev, 0); ++ } ++ ++ /* Tell the runtime-PM framework the device is active */ ++ pm_runtime_set_active(&udev->dev); ++ pm_runtime_get_noresume(&udev->dev); ++ pm_runtime_use_autosuspend(&udev->dev); ++ pm_runtime_enable(&udev->dev); ++ ++ /* By default, forbid autosuspend for all devices. It will be ++ * allowed for hubs during binding. ++ */ ++ usb_disable_autosuspend(udev); ++ ++ err = usb_enumerate_device(udev); /* Read descriptors */ ++ if (err < 0) ++ goto fail; ++ dev_dbg(&udev->dev, "udev %d, busnum %d, minor = %d\n", ++ udev->devnum, udev->bus->busnum, ++ (((udev->bus->busnum-1) * 128) + (udev->devnum-1))); ++ /* export the usbdev device-node for libusb */ ++ udev->dev.devt = MKDEV(USB_DEVICE_MAJOR, ++ (((udev->bus->busnum-1) * 128) + (udev->devnum-1))); ++ ++ /* Tell the world! */ ++ announce_device(udev); ++ ++ if (udev->serial) ++ add_device_randomness(udev->serial, strlen(udev->serial)); ++ if (udev->product) ++ add_device_randomness(udev->product, strlen(udev->product)); ++ if (udev->manufacturer) ++ add_device_randomness(udev->manufacturer, ++ strlen(udev->manufacturer)); ++ ++ device_enable_async_suspend(&udev->dev); ++ ++ /* ++ * check whether the hub marks this port as non-removable. Do it ++ * now so that platform-specific data can override it in ++ * device_add() ++ */ ++ if (udev->parent) ++ set_usb_port_removable(udev); ++ ++ /* Register the device. The device driver is responsible ++ * for configuring the device and invoking the add-device ++ * notifier chain (used by usbfs and possibly others). ++ */ ++ err = device_add(&udev->dev); ++ if (err) { ++ dev_err(&udev->dev, "can't device_add, error %d\n", err); ++ goto fail; ++ } ++ ++ (void) usb_create_ep_devs(&udev->dev, &udev->ep0, udev); ++ usb_mark_last_busy(udev); ++ pm_runtime_put_sync_autosuspend(&udev->dev); ++ return err; ++ ++fail: ++ usb_set_device_state(udev, USB_STATE_NOTATTACHED); ++ pm_runtime_disable(&udev->dev); ++ pm_runtime_set_suspended(&udev->dev); ++ return err; ++} ++ ++ ++/** ++ * usb_deauthorize_device - deauthorize a device (usbcore-internal) ++ * @usb_dev: USB device ++ * ++ * Move the USB device to a very basic state where interfaces are disabled ++ * and the device is in fact unconfigured and unusable. ++ * ++ * We share a lock (that we have) with device_del(), so we need to ++ * defer its call. ++ */ ++int usb_deauthorize_device(struct usb_device *usb_dev) ++{ ++ usb_lock_device(usb_dev); ++ if (usb_dev->authorized == 0) ++ goto out_unauthorized; ++ ++ 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; ++} ++ ++ ++int usb_authorize_device(struct usb_device *usb_dev) ++{ ++ int result = 0, c; ++ ++ usb_lock_device(usb_dev); ++ if (usb_dev->authorized == 1) ++ goto out_authorized; ++ ++ result = usb_autoresume_device(usb_dev); ++ if (result < 0) { ++ dev_err(&usb_dev->dev, ++ "can't autoresume for authorization: %d\n", result); ++ goto error_autoresume; ++ } ++ result = usb_get_device_descriptor(usb_dev, sizeof(usb_dev->descriptor)); ++ if (result < 0) { ++ dev_err(&usb_dev->dev, "can't re-read device descriptor for " ++ "authorization: %d\n", result); ++ 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. ++ */ ++ c = usb_choose_configuration(usb_dev); ++ if (c >= 0) { ++ result = usb_set_configuration(usb_dev, c); ++ if (result) { ++ dev_err(&usb_dev->dev, ++ "can't set config #%d, error %d\n", c, result); ++ /* This need not be fatal. The user can try to ++ * set other configurations. */ ++ } ++ } ++ dev_info(&usb_dev->dev, "authorized to connect\n"); ++ ++error_enumerate: ++error_device_descriptor: ++ usb_autosuspend_device(usb_dev); ++error_autoresume: ++out_authorized: ++ usb_unlock_device(usb_dev); // complements locktree ++ return result; ++} ++ ++ ++/* Returns 1 if @hub is a WUSB root hub, 0 otherwise */ ++static unsigned hub_is_wusb(struct usb_hub *hub) ++{ ++ struct usb_hcd *hcd; ++ if (hub->hdev->parent != NULL) /* not a root hub? */ ++ return 0; ++ hcd = container_of(hub->hdev->bus, struct usb_hcd, self); ++ return hcd->wireless; ++} ++ ++ ++#define PORT_RESET_TRIES 5 ++#define SET_ADDRESS_TRIES 2 ++#define GET_DESCRIPTOR_TRIES 2 ++#define SET_CONFIG_TRIES (2 * (use_both_schemes + 1)) ++#define USE_NEW_SCHEME(i) ((i) / 2 == (int)old_scheme_first) ++ ++#define HUB_ROOT_RESET_TIME 50 /* times are in msec */ ++#define HUB_SHORT_RESET_TIME 10 ++#define HUB_BH_RESET_TIME 50 ++#define HUB_LONG_RESET_TIME 200 ++#define HUB_RESET_TIMEOUT 500 ++ ++static int hub_port_reset(struct usb_hub *hub, int port1, ++ struct usb_device *udev, unsigned int delay, bool warm); ++ ++/* Is a USB 3.0 port in the Inactive or Complinance Mode state? ++ * Port worm reset is required to recover ++ */ ++static bool hub_port_warm_reset_required(struct usb_hub *hub, u16 portstatus) ++{ ++ return hub_is_superspeed(hub->hdev) && ++ (((portstatus & USB_PORT_STAT_LINK_STATE) == ++ USB_SS_PORT_LS_SS_INACTIVE) || ++ ((portstatus & USB_PORT_STAT_LINK_STATE) == ++ USB_SS_PORT_LS_COMP_MOD)) ; ++} ++ ++static int hub_port_wait_reset(struct usb_hub *hub, int port1, ++ struct usb_device *udev, unsigned int delay, bool warm) ++{ ++ int delay_time, ret; ++ u16 portstatus; ++ u16 portchange; ++ ++ for (delay_time = 0; ++ delay_time < HUB_RESET_TIMEOUT; ++ delay_time += delay) { ++ /* wait to give the device a chance to reset */ ++ msleep(delay); ++ ++ /* read and decode port status */ ++ ret = hub_port_status(hub, port1, &portstatus, &portchange); ++ if (ret < 0) ++ return ret; ++ ++ /* ++ * Some buggy devices require a warm reset to be issued even ++ * when the port appears not to be connected. ++ */ ++ if (!warm) { ++ /* ++ * Some buggy devices can cause an NEC host controller ++ * to transition to the "Error" state after a hot port ++ * reset. This will show up as the port state in ++ * "Inactive", and the port may also report a ++ * disconnect. Forcing a warm port reset seems to make ++ * the device work. ++ * ++ * See https://bugzilla.kernel.org/show_bug.cgi?id=41752 ++ */ ++ if (hub_port_warm_reset_required(hub, portstatus)) { ++ int ret; ++ ++ if ((portchange & USB_PORT_STAT_C_CONNECTION)) ++ clear_port_feature(hub->hdev, port1, ++ USB_PORT_FEAT_C_CONNECTION); ++ if (portchange & USB_PORT_STAT_C_LINK_STATE) ++ clear_port_feature(hub->hdev, port1, ++ USB_PORT_FEAT_C_PORT_LINK_STATE); ++ if (portchange & USB_PORT_STAT_C_RESET) ++ clear_port_feature(hub->hdev, port1, ++ USB_PORT_FEAT_C_RESET); ++ dev_dbg(hub->intfdev, "hot reset failed, warm reset port %d\n", ++ port1); ++ ret = hub_port_reset(hub, port1, ++ udev, HUB_BH_RESET_TIME, ++ true); ++ if ((portchange & USB_PORT_STAT_C_CONNECTION)) ++ clear_port_feature(hub->hdev, port1, ++ USB_PORT_FEAT_C_CONNECTION); ++ return ret; ++ } ++ /* Device went away? */ ++ if (!(portstatus & USB_PORT_STAT_CONNECTION)) ++ return -ENOTCONN; ++ ++ /* bomb out completely if the connection bounced */ ++ if ((portchange & USB_PORT_STAT_C_CONNECTION)) ++ return -ENOTCONN; ++ ++ /* if we`ve finished resetting, then break out of ++ * the loop ++ */ ++ if (!(portstatus & USB_PORT_STAT_RESET) && ++ (portstatus & USB_PORT_STAT_ENABLE)) { ++ if (hub_is_wusb(hub)) ++ udev->speed = USB_SPEED_WIRELESS; ++ else if (hub_is_superspeed(hub->hdev)) ++ udev->speed = USB_SPEED_SUPER; ++ else if (portstatus & USB_PORT_STAT_HIGH_SPEED) ++ udev->speed = USB_SPEED_HIGH; ++ else if (portstatus & USB_PORT_STAT_LOW_SPEED) ++ udev->speed = USB_SPEED_LOW; ++ else ++ udev->speed = USB_SPEED_FULL; ++ return 0; ++ } ++ } else { ++ if (portchange & USB_PORT_STAT_C_BH_RESET) ++ return 0; ++ } ++ ++ /* switch to the long delay after two short delay failures */ ++ if (delay_time >= 2 * HUB_SHORT_RESET_TIME) ++ delay = HUB_LONG_RESET_TIME; ++ ++ dev_dbg (hub->intfdev, ++ "port %d not %sreset yet, waiting %dms\n", ++ port1, warm ? "warm " : "", delay); ++ } ++ ++ return -EBUSY; ++} ++ ++static void hub_port_finish_reset(struct usb_hub *hub, int port1, ++ struct usb_device *udev, int *status, bool warm) ++{ ++ switch (*status) { ++ case 0: ++ if (!warm) { ++ struct usb_hcd *hcd; ++ /* TRSTRCY = 10 ms; plus some extra */ ++ msleep(10 + 40); ++ update_devnum(udev, 0); ++ hcd = bus_to_hcd(udev->bus); ++ if (hcd->driver->reset_device) { ++ *status = hcd->driver->reset_device(hcd, udev); ++ if (*status < 0) { ++ dev_err(&udev->dev, "Cannot reset " ++ "HCD device state\n"); ++ break; ++ } ++ } ++ } ++ /* FALL THROUGH */ ++ case -ENOTCONN: ++ case -ENODEV: ++ clear_port_feature(hub->hdev, ++ port1, USB_PORT_FEAT_C_RESET); ++ /* FIXME need disconnect() for NOTATTACHED device */ ++ if (warm) { ++ clear_port_feature(hub->hdev, port1, ++ USB_PORT_FEAT_C_BH_PORT_RESET); ++ clear_port_feature(hub->hdev, port1, ++ USB_PORT_FEAT_C_PORT_LINK_STATE); ++ } else { ++ usb_set_device_state(udev, *status ++ ? USB_STATE_NOTATTACHED ++ : USB_STATE_DEFAULT); ++ } ++ break; ++ } ++} ++ ++/* Handle port reset and port warm(BH) reset (for USB3 protocol ports) */ ++static int hub_port_reset(struct usb_hub *hub, int port1, ++ struct usb_device *udev, unsigned int delay, bool warm) ++{ ++ int i, status; ++ ++ if (!warm) { ++ /* Block EHCI CF initialization during the port reset. ++ * Some companion controllers don't like it when they mix. ++ */ ++ down_read(&ehci_cf_port_reset_rwsem); ++ } else { ++ if (!hub_is_superspeed(hub->hdev)) { ++ dev_err(hub->intfdev, "only USB3 hub support " ++ "warm reset\n"); ++ return -EINVAL; ++ } ++ } ++ ++ /* Reset the port */ ++ for (i = 0; i < PORT_RESET_TRIES; i++) { ++ status = set_port_feature(hub->hdev, port1, (warm ? ++ USB_PORT_FEAT_BH_PORT_RESET : ++ USB_PORT_FEAT_RESET)); ++ if (status) { ++ dev_err(hub->intfdev, ++ "cannot %sreset port %d (err = %d)\n", ++ warm ? "warm " : "", port1, status); ++ } else { ++ status = hub_port_wait_reset(hub, port1, udev, delay, ++ warm); ++ if (status && status != -ENOTCONN) ++ dev_dbg(hub->intfdev, ++ "port_wait_reset: err = %d\n", ++ status); ++ } ++ ++ /* return on disconnect or reset */ ++ if (status == 0 || status == -ENOTCONN || status == -ENODEV) { ++ hub_port_finish_reset(hub, port1, udev, &status, warm); ++ goto done; ++ } ++ ++ dev_dbg (hub->intfdev, ++ "port %d not enabled, trying %sreset again...\n", ++ port1, warm ? "warm " : ""); ++ delay = HUB_LONG_RESET_TIME; ++ } ++ ++ dev_err (hub->intfdev, ++ "Cannot enable port %i. Maybe the USB cable is bad?\n", ++ port1); ++ ++done: ++ if (!warm) ++ up_read(&ehci_cf_port_reset_rwsem); ++ ++ return status; ++} ++ ++/* Check if a port is power on */ ++static int port_is_power_on(struct usb_hub *hub, unsigned portstatus) ++{ ++ int ret = 0; ++ ++ if (hub_is_superspeed(hub->hdev)) { ++ if (portstatus & USB_SS_PORT_STAT_POWER) ++ ret = 1; ++ } else { ++ if (portstatus & USB_PORT_STAT_POWER) ++ ret = 1; ++ } ++ ++ return ret; ++} ++ ++#ifdef CONFIG_PM ++ ++/* Check if a port is suspended(USB2.0 port) or in U3 state(USB3.0 port) */ ++static int port_is_suspended(struct usb_hub *hub, unsigned portstatus) ++{ ++ int ret = 0; ++ ++ if (hub_is_superspeed(hub->hdev)) { ++ if ((portstatus & USB_PORT_STAT_LINK_STATE) ++ == USB_SS_PORT_LS_U3) ++ ret = 1; ++ } else { ++ if (portstatus & USB_PORT_STAT_SUSPEND) ++ ret = 1; ++ } ++ ++ return ret; ++} ++ ++/* Determine whether the device on a port is ready for a normal resume, ++ * is ready for a reset-resume, or should be disconnected. ++ */ ++static int check_port_resume_type(struct usb_device *udev, ++ struct usb_hub *hub, int port1, ++ int status, unsigned portchange, unsigned portstatus) ++{ ++ /* Is the device still present? */ ++ if (status || port_is_suspended(hub, portstatus) || ++ !port_is_power_on(hub, portstatus) || ++ !(portstatus & USB_PORT_STAT_CONNECTION)) { ++ if (status >= 0) ++ status = -ENODEV; ++ } ++ ++ /* Can't do a normal resume if the port isn't enabled, ++ * so try a reset-resume instead. ++ */ ++ else if (!(portstatus & USB_PORT_STAT_ENABLE) && !udev->reset_resume) { ++ if (udev->persist_enabled) ++ udev->reset_resume = 1; ++ else ++ status = -ENODEV; ++ } ++ ++ if (status) { ++ dev_dbg(hub->intfdev, ++ "port %d status %04x.%04x after resume, %d\n", ++ port1, portchange, portstatus, status); ++ } else if (udev->reset_resume) { ++ ++ /* Late port handoff can set status-change bits */ ++ if (portchange & USB_PORT_STAT_C_CONNECTION) ++ clear_port_feature(hub->hdev, port1, ++ USB_PORT_FEAT_C_CONNECTION); ++ if (portchange & USB_PORT_STAT_C_ENABLE) ++ clear_port_feature(hub->hdev, port1, ++ USB_PORT_FEAT_C_ENABLE); ++ } ++ ++ return status; ++} ++ ++int usb_disable_ltm(struct usb_device *udev) ++{ ++ struct usb_hcd *hcd = bus_to_hcd(udev->bus); ++ ++ /* Check if the roothub and device supports LTM. */ ++ if (!usb_device_supports_ltm(hcd->self.root_hub) || ++ !usb_device_supports_ltm(udev)) ++ return 0; ++ ++ /* Clear Feature LTM Enable can only be sent if the device is ++ * configured. ++ */ ++ if (!udev->actconfig) ++ return 0; ++ ++ return usb_control_msg(udev, usb_sndctrlpipe(udev, 0), ++ USB_REQ_CLEAR_FEATURE, USB_RECIP_DEVICE, ++ USB_DEVICE_LTM_ENABLE, 0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); ++} ++EXPORT_SYMBOL_GPL(usb_disable_ltm); ++ ++void usb_enable_ltm(struct usb_device *udev) ++{ ++ struct usb_hcd *hcd = bus_to_hcd(udev->bus); ++ ++ /* Check if the roothub and device supports LTM. */ ++ if (!usb_device_supports_ltm(hcd->self.root_hub) || ++ !usb_device_supports_ltm(udev)) ++ return; ++ ++ /* Set Feature LTM Enable can only be sent if the device is ++ * configured. ++ */ ++ if (!udev->actconfig) ++ return; ++ ++ usb_control_msg(udev, usb_sndctrlpipe(udev, 0), ++ USB_REQ_SET_FEATURE, USB_RECIP_DEVICE, ++ USB_DEVICE_LTM_ENABLE, 0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); ++} ++EXPORT_SYMBOL_GPL(usb_enable_ltm); ++ ++#ifdef CONFIG_USB_SUSPEND ++ ++/* ++ * usb_port_suspend - suspend a usb device's upstream port ++ * @udev: device that's no longer in active use, not a root hub ++ * Context: must be able to sleep; device not locked; pm locks held ++ * ++ * Suspends a USB device that isn't in active use, conserving power. ++ * Devices may wake out of a suspend, if anything important happens, ++ * using the remote wakeup mechanism. They may also be taken out of ++ * suspend by the host, using usb_port_resume(). It's also routine ++ * to disconnect devices while they are suspended. ++ * ++ * This only affects the USB hardware for a device; its interfaces ++ * (and, for hubs, child devices) must already have been suspended. ++ * ++ * Selective port suspend reduces power; most suspended devices draw ++ * less than 500 uA. It's also used in OTG, along with remote wakeup. ++ * All devices below the suspended port are also suspended. ++ * ++ * Devices leave suspend state when the host wakes them up. Some devices ++ * also support "remote wakeup", where the device can activate the USB ++ * tree above them to deliver data, such as a keypress or packet. In ++ * some cases, this wakes the USB host. ++ * ++ * Suspending OTG devices may trigger HNP, if that's been enabled ++ * between a pair of dual-role devices. That will change roles, such ++ * as from A-Host to A-Peripheral or from B-Host back to B-Peripheral. ++ * ++ * Devices on USB hub ports have only one "suspend" state, corresponding ++ * to ACPI D2, "may cause the device to lose some context". ++ * State transitions include: ++ * ++ * - suspend, resume ... when the VBUS power link stays live ++ * - suspend, disconnect ... VBUS lost ++ * ++ * Once VBUS drop breaks the circuit, the port it's using has to go through ++ * normal re-enumeration procedures, starting with enabling VBUS power. ++ * Other than re-initializing the hub (plug/unplug, except for root hubs), ++ * Linux (2.6) currently has NO mechanisms to initiate that: no khubd ++ * timer, no SRP, no requests through sysfs. ++ * ++ * If CONFIG_USB_SUSPEND isn't enabled, devices only really suspend when ++ * the root hub for their bus goes into global suspend ... so we don't ++ * (falsely) update the device power state to say it suspended. ++ * ++ * Returns 0 on success, else negative errno. ++ */ ++int usb_port_suspend(struct usb_device *udev, pm_message_t msg) ++{ ++ struct usb_hub *hub = hdev_to_hub(udev->parent); ++ int port1 = udev->portnum; ++ int status; ++ ++ /* enable remote wakeup when appropriate; this lets the device ++ * wake up the upstream hub (including maybe the root hub). ++ * ++ * NOTE: OTG devices may issue remote wakeup (or SRP) even when ++ * we don't explicitly enable it here. ++ */ ++ if (udev->do_remote_wakeup) { ++ if (!hub_is_superspeed(hub->hdev)) { ++ status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), ++ USB_REQ_SET_FEATURE, USB_RECIP_DEVICE, ++ USB_DEVICE_REMOTE_WAKEUP, 0, ++ NULL, 0, ++ USB_CTRL_SET_TIMEOUT); ++ } else { ++ /* Assume there's only one function on the USB 3.0 ++ * device and enable remote wake for the first ++ * interface. FIXME if the interface association ++ * descriptor shows there's more than one function. ++ */ ++ status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), ++ USB_REQ_SET_FEATURE, ++ USB_RECIP_INTERFACE, ++ USB_INTRF_FUNC_SUSPEND, ++ USB_INTRF_FUNC_SUSPEND_RW | ++ USB_INTRF_FUNC_SUSPEND_LP, ++ NULL, 0, ++ USB_CTRL_SET_TIMEOUT); ++ } ++ if (status) { ++ dev_dbg(&udev->dev, "won't remote wakeup, status %d\n", ++ status); ++ /* bail if autosuspend is requested */ ++ if (PMSG_IS_AUTO(msg)) ++ return status; ++ } ++ } ++ ++ /* disable USB2 hardware LPM */ ++ if (udev->usb2_hw_lpm_enabled == 1) ++ usb_set_usb2_hardware_lpm(udev, 0); ++ ++ if (usb_disable_ltm(udev)) { ++ dev_err(&udev->dev, "%s Failed to disable LTM before suspend\n.", ++ __func__); ++ return -ENOMEM; ++ } ++ if (usb_unlocked_disable_lpm(udev)) { ++ dev_err(&udev->dev, "%s Failed to disable LPM before suspend\n.", ++ __func__); ++ return -ENOMEM; ++ } ++ ++ /* see 7.1.7.6 */ ++ if (hub_is_superspeed(hub->hdev)) ++ status = set_port_feature(hub->hdev, ++ port1 | (USB_SS_PORT_LS_U3 << 3), ++ USB_PORT_FEAT_LINK_STATE); ++ else ++ status = set_port_feature(hub->hdev, port1, ++ USB_PORT_FEAT_SUSPEND); ++ if (status) { ++ dev_dbg(hub->intfdev, "can't suspend port %d, status %d\n", ++ port1, status); ++ /* paranoia: "should not happen" */ ++ if (udev->do_remote_wakeup) ++ (void) usb_control_msg(udev, usb_sndctrlpipe(udev, 0), ++ USB_REQ_CLEAR_FEATURE, USB_RECIP_DEVICE, ++ USB_DEVICE_REMOTE_WAKEUP, 0, ++ NULL, 0, ++ USB_CTRL_SET_TIMEOUT); ++ ++ /* Try to enable USB2 hardware LPM again */ ++ if (udev->usb2_hw_lpm_capable == 1) ++ usb_set_usb2_hardware_lpm(udev, 1); ++ ++ /* Try to enable USB3 LTM and LPM again */ ++ usb_enable_ltm(udev); ++ usb_unlocked_enable_lpm(udev); ++ ++ /* System sleep transitions should never fail */ ++ if (!PMSG_IS_AUTO(msg)) ++ status = 0; ++ } else { ++ /* device has up to 10 msec to fully suspend */ ++ dev_dbg(&udev->dev, "usb %ssuspend, wakeup %d\n", ++ (PMSG_IS_AUTO(msg) ? "auto-" : ""), ++ udev->do_remote_wakeup); ++ usb_set_device_state(udev, USB_STATE_SUSPENDED); ++ msleep(10); ++ } ++ usb_mark_last_busy(hub->hdev); ++ return status; ++} ++ ++/* ++ * If the USB "suspend" state is in use (rather than "global suspend"), ++ * many devices will be individually taken out of suspend state using ++ * special "resume" signaling. This routine kicks in shortly after ++ * hardware resume signaling is finished, either because of selective ++ * resume (by host) or remote wakeup (by device) ... now see what changed ++ * in the tree that's rooted at this device. ++ * ++ * If @udev->reset_resume is set then the device is reset before the ++ * status check is done. ++ */ ++static int finish_port_resume(struct usb_device *udev) ++{ ++ int status = 0; ++ u16 devstatus; ++ ++ /* caller owns the udev device lock */ ++ dev_dbg(&udev->dev, "%s\n", ++ udev->reset_resume ? "finish reset-resume" : "finish resume"); ++ ++ /* usb ch9 identifies four variants of SUSPENDED, based on what ++ * state the device resumes to. Linux currently won't see the ++ * first two on the host side; they'd be inside hub_port_init() ++ * during many timeouts, but khubd can't suspend until later. ++ */ ++ usb_set_device_state(udev, udev->actconfig ++ ? USB_STATE_CONFIGURED ++ : USB_STATE_ADDRESS); ++ ++ /* 10.5.4.5 says not to reset a suspended port if the attached ++ * device is enabled for remote wakeup. Hence the reset ++ * operation is carried out here, after the port has been ++ * resumed. ++ */ ++ if (udev->reset_resume) ++ retry_reset_resume: ++ status = usb_reset_and_verify_device(udev); ++ ++ /* 10.5.4.5 says be sure devices in the tree are still there. ++ * For now let's assume the device didn't go crazy on resume, ++ * and device drivers will know about any resume quirks. ++ */ ++ if (status == 0) { ++ devstatus = 0; ++ status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus); ++ if (status >= 0) ++ status = (status > 0 ? 0 : -ENODEV); ++ ++ /* If a normal resume failed, try doing a reset-resume */ ++ if (status && !udev->reset_resume && udev->persist_enabled) { ++ dev_dbg(&udev->dev, "retry with reset-resume\n"); ++ udev->reset_resume = 1; ++ goto retry_reset_resume; ++ } ++ } ++ ++ if (status) { ++ dev_dbg(&udev->dev, "gone after usb resume? status %d\n", ++ status); ++ } else if (udev->actconfig) { ++ le16_to_cpus(&devstatus); ++ if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) { ++ status = usb_control_msg(udev, ++ usb_sndctrlpipe(udev, 0), ++ USB_REQ_CLEAR_FEATURE, ++ USB_RECIP_DEVICE, ++ USB_DEVICE_REMOTE_WAKEUP, 0, ++ NULL, 0, ++ USB_CTRL_SET_TIMEOUT); ++ if (status) ++ dev_dbg(&udev->dev, ++ "disable remote wakeup, status %d\n", ++ status); ++ } ++ status = 0; ++ } ++ return status; ++} ++ ++/* ++ * usb_port_resume - re-activate a suspended usb device's upstream port ++ * @udev: device to re-activate, not a root hub ++ * Context: must be able to sleep; device not locked; pm locks held ++ * ++ * This will re-activate the suspended device, increasing power usage ++ * while letting drivers communicate again with its endpoints. ++ * USB resume explicitly guarantees that the power session between ++ * the host and the device is the same as it was when the device ++ * suspended. ++ * ++ * If @udev->reset_resume is set then this routine won't check that the ++ * port is still enabled. Furthermore, finish_port_resume() above will ++ * reset @udev. The end result is that a broken power session can be ++ * recovered and @udev will appear to persist across a loss of VBUS power. ++ * ++ * For example, if a host controller doesn't maintain VBUS suspend current ++ * during a system sleep or is reset when the system wakes up, all the USB ++ * power sessions below it will be broken. This is especially troublesome ++ * for mass-storage devices containing mounted filesystems, since the ++ * device will appear to have disconnected and all the memory mappings ++ * to it will be lost. Using the USB_PERSIST facility, the device can be ++ * made to appear as if it had not disconnected. ++ * ++ * This facility can be dangerous. Although usb_reset_and_verify_device() makes ++ * every effort to insure that the same device is present after the ++ * reset as before, it cannot provide a 100% guarantee. Furthermore it's ++ * quite possible for a device to remain unaltered but its media to be ++ * changed. If the user replaces a flash memory card while the system is ++ * asleep, he will have only himself to blame when the filesystem on the ++ * new card is corrupted and the system crashes. ++ * ++ * Returns 0 on success, else negative errno. ++ */ ++int usb_port_resume(struct usb_device *udev, pm_message_t msg) ++{ ++ struct usb_hub *hub = hdev_to_hub(udev->parent); ++ int port1 = udev->portnum; ++ int status; ++ u16 portchange, portstatus; ++ ++ /* Skip the initial Clear-Suspend step for a remote wakeup */ ++ status = hub_port_status(hub, port1, &portstatus, &portchange); ++ if (status == 0 && !port_is_suspended(hub, portstatus)) ++ goto SuspendCleared; ++ ++ // dev_dbg(hub->intfdev, "resume port %d\n", port1); ++ ++ set_bit(port1, hub->busy_bits); ++ ++ /* see 7.1.7.7; affects power usage, but not budgeting */ ++ if (hub_is_superspeed(hub->hdev)) ++ status = set_port_feature(hub->hdev, ++ port1 | (USB_SS_PORT_LS_U0 << 3), ++ USB_PORT_FEAT_LINK_STATE); ++ else ++ status = clear_port_feature(hub->hdev, ++ port1, USB_PORT_FEAT_SUSPEND); ++ if (status) { ++ dev_dbg(hub->intfdev, "can't resume port %d, status %d\n", ++ port1, status); ++ } else { ++ /* drive resume for at least 20 msec */ ++ dev_dbg(&udev->dev, "usb %sresume\n", ++ (PMSG_IS_AUTO(msg) ? "auto-" : "")); ++ msleep(25); ++ ++ /* Virtual root hubs can trigger on GET_PORT_STATUS to ++ * stop resume signaling. Then finish the resume ++ * sequence. ++ */ ++ status = hub_port_status(hub, port1, &portstatus, &portchange); ++ ++ /* TRSMRCY = 10 msec */ ++ msleep(10); ++ } ++ ++ SuspendCleared: ++ if (status == 0) { ++ if (hub_is_superspeed(hub->hdev)) { ++ if (portchange & USB_PORT_STAT_C_LINK_STATE) ++ clear_port_feature(hub->hdev, port1, ++ USB_PORT_FEAT_C_PORT_LINK_STATE); ++ } else { ++ if (portchange & USB_PORT_STAT_C_SUSPEND) ++ clear_port_feature(hub->hdev, port1, ++ USB_PORT_FEAT_C_SUSPEND); ++ } ++ } ++ ++ clear_bit(port1, hub->busy_bits); ++ ++ status = check_port_resume_type(udev, ++ hub, port1, status, portchange, portstatus); ++ if (status == 0) ++ status = finish_port_resume(udev); ++ if (status < 0) { ++ dev_dbg(&udev->dev, "can't resume, status %d\n", status); ++ hub_port_logical_disconnect(hub, port1); ++ } else { ++ /* Try to enable USB2 hardware LPM */ ++ if (udev->usb2_hw_lpm_capable == 1) ++ usb_set_usb2_hardware_lpm(udev, 1); ++ ++ /* Try to enable USB3 LTM and LPM */ ++ usb_enable_ltm(udev); ++ usb_unlocked_enable_lpm(udev); ++ } ++ ++ return status; ++} ++ ++/* caller has locked udev */ ++int usb_remote_wakeup(struct usb_device *udev) ++{ ++ int status = 0; ++ ++ if (udev->state == USB_STATE_SUSPENDED) { ++ dev_dbg(&udev->dev, "usb %sresume\n", "wakeup-"); ++ status = usb_autoresume_device(udev); ++ if (status == 0) { ++ /* Let the drivers do their thing, then... */ ++ usb_autosuspend_device(udev); ++ } ++ } ++ return status; ++} ++ ++#else /* CONFIG_USB_SUSPEND */ ++ ++/* When CONFIG_USB_SUSPEND isn't set, we never suspend or resume any ports. */ ++ ++int usb_port_suspend(struct usb_device *udev, pm_message_t msg) ++{ ++ return 0; ++} ++ ++/* However we may need to do a reset-resume */ ++ ++int usb_port_resume(struct usb_device *udev, pm_message_t msg) ++{ ++ struct usb_hub *hub = hdev_to_hub(udev->parent); ++ int port1 = udev->portnum; ++ int status; ++ u16 portchange, portstatus; ++ ++ status = hub_port_status(hub, port1, &portstatus, &portchange); ++ status = check_port_resume_type(udev, ++ hub, port1, status, portchange, portstatus); ++ ++ if (status) { ++ dev_dbg(&udev->dev, "can't resume, status %d\n", status); ++ hub_port_logical_disconnect(hub, port1); ++ } else if (udev->reset_resume) { ++ dev_dbg(&udev->dev, "reset-resume\n"); ++ status = usb_reset_and_verify_device(udev); ++ } ++ return status; ++} ++ ++#endif ++ ++static int hub_suspend(struct usb_interface *intf, pm_message_t msg) ++{ ++ struct usb_hub *hub = usb_get_intfdata (intf); ++ struct usb_device *hdev = hub->hdev; ++ unsigned port1; ++ int status; ++ ++ /* Warn if children aren't already suspended */ ++ for (port1 = 1; port1 <= hdev->maxchild; port1++) { ++ struct usb_device *udev; ++ ++ udev = hdev->children [port1-1]; ++ if (udev && udev->can_submit) { ++ dev_warn(&intf->dev, "port %d nyet suspended\n", port1); ++ if (PMSG_IS_AUTO(msg)) ++ return -EBUSY; ++ } ++ } ++ if (hub_is_superspeed(hdev) && hdev->do_remote_wakeup) { ++ /* Enable hub to send remote wakeup for all ports. */ ++ for (port1 = 1; port1 <= hdev->maxchild; port1++) { ++ status = set_port_feature(hdev, ++ port1 | ++ USB_PORT_FEAT_REMOTE_WAKE_CONNECT | ++ USB_PORT_FEAT_REMOTE_WAKE_DISCONNECT | ++ USB_PORT_FEAT_REMOTE_WAKE_OVER_CURRENT, ++ USB_PORT_FEAT_REMOTE_WAKE_MASK); ++ } ++ } ++ ++ dev_dbg(&intf->dev, "%s\n", __func__); ++ ++ /* stop khubd and related activity */ ++ hub_quiesce(hub, HUB_SUSPEND); ++ return 0; ++} ++ ++static int hub_resume(struct usb_interface *intf) ++{ ++ struct usb_hub *hub = usb_get_intfdata(intf); ++ ++ dev_dbg(&intf->dev, "%s\n", __func__); ++ hub_activate(hub, HUB_RESUME); ++ return 0; ++} ++ ++static int hub_reset_resume(struct usb_interface *intf) ++{ ++ struct usb_hub *hub = usb_get_intfdata(intf); ++ ++ dev_dbg(&intf->dev, "%s\n", __func__); ++ hub_activate(hub, HUB_RESET_RESUME); ++ return 0; ++} ++ ++/** ++ * usb_root_hub_lost_power - called by HCD if the root hub lost Vbus power ++ * @rhdev: struct usb_device for the root hub ++ * ++ * The USB host controller driver calls this function when its root hub ++ * is resumed and Vbus power has been interrupted or the controller ++ * has been reset. The routine marks @rhdev as having lost power. ++ * When the hub driver is resumed it will take notice and carry out ++ * power-session recovery for all the "USB-PERSIST"-enabled child devices; ++ * the others will be disconnected. ++ */ ++void usb_root_hub_lost_power(struct usb_device *rhdev) ++{ ++ dev_warn(&rhdev->dev, "root hub lost power or was reset\n"); ++ rhdev->reset_resume = 1; ++} ++EXPORT_SYMBOL_GPL(usb_root_hub_lost_power); ++ ++static const char * const usb3_lpm_names[] = { ++ "U0", ++ "U1", ++ "U2", ++ "U3", ++}; ++ ++/* ++ * Send a Set SEL control transfer to the device, prior to enabling ++ * device-initiated U1 or U2. This lets the device know the exit latencies from ++ * the time the device initiates a U1 or U2 exit, to the time it will receive a ++ * packet from the host. ++ * ++ * This function will fail if the SEL or PEL values for udev are greater than ++ * the maximum allowed values for the link state to be enabled. ++ */ ++static int usb_req_set_sel(struct usb_device *udev, enum usb3_link_state state) ++{ ++ struct usb_set_sel_req *sel_values; ++ unsigned long long u1_sel; ++ unsigned long long u1_pel; ++ unsigned long long u2_sel; ++ unsigned long long u2_pel; ++ int ret; ++ ++ /* Convert SEL and PEL stored in ns to us */ ++ u1_sel = DIV_ROUND_UP(udev->u1_params.sel, 1000); ++ u1_pel = DIV_ROUND_UP(udev->u1_params.pel, 1000); ++ u2_sel = DIV_ROUND_UP(udev->u2_params.sel, 1000); ++ u2_pel = DIV_ROUND_UP(udev->u2_params.pel, 1000); ++ ++ /* ++ * Make sure that the calculated SEL and PEL values for the link ++ * state we're enabling aren't bigger than the max SEL/PEL ++ * value that will fit in the SET SEL control transfer. ++ * Otherwise the device would get an incorrect idea of the exit ++ * latency for the link state, and could start a device-initiated ++ * U1/U2 when the exit latencies are too high. ++ */ ++ if ((state == USB3_LPM_U1 && ++ (u1_sel > USB3_LPM_MAX_U1_SEL_PEL || ++ u1_pel > USB3_LPM_MAX_U1_SEL_PEL)) || ++ (state == USB3_LPM_U2 && ++ (u2_sel > USB3_LPM_MAX_U2_SEL_PEL || ++ u2_pel > USB3_LPM_MAX_U2_SEL_PEL))) { ++ dev_dbg(&udev->dev, "Device-initiated %s disabled due " ++ "to long SEL %llu ms or PEL %llu ms\n", ++ usb3_lpm_names[state], u1_sel, u1_pel); ++ return -EINVAL; ++ } ++ ++ /* ++ * If we're enabling device-initiated LPM for one link state, ++ * but the other link state has a too high SEL or PEL value, ++ * just set those values to the max in the Set SEL request. ++ */ ++ if (u1_sel > USB3_LPM_MAX_U1_SEL_PEL) ++ u1_sel = USB3_LPM_MAX_U1_SEL_PEL; ++ ++ if (u1_pel > USB3_LPM_MAX_U1_SEL_PEL) ++ u1_pel = USB3_LPM_MAX_U1_SEL_PEL; ++ ++ if (u2_sel > USB3_LPM_MAX_U2_SEL_PEL) ++ u2_sel = USB3_LPM_MAX_U2_SEL_PEL; ++ ++ if (u2_pel > USB3_LPM_MAX_U2_SEL_PEL) ++ u2_pel = USB3_LPM_MAX_U2_SEL_PEL; ++ ++ /* ++ * usb_enable_lpm() can be called as part of a failed device reset, ++ * which may be initiated by an error path of a mass storage driver. ++ * Therefore, use GFP_NOIO. ++ */ ++ sel_values = kmalloc(sizeof *(sel_values), GFP_NOIO); ++ if (!sel_values) ++ return -ENOMEM; ++ ++ sel_values->u1_sel = u1_sel; ++ sel_values->u1_pel = u1_pel; ++ sel_values->u2_sel = cpu_to_le16(u2_sel); ++ sel_values->u2_pel = cpu_to_le16(u2_pel); ++ ++ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), ++ USB_REQ_SET_SEL, ++ USB_RECIP_DEVICE, ++ 0, 0, ++ sel_values, sizeof *(sel_values), ++ USB_CTRL_SET_TIMEOUT); ++ kfree(sel_values); ++ return ret; ++} ++ ++/* ++ * Enable or disable device-initiated U1 or U2 transitions. ++ */ ++static int usb_set_device_initiated_lpm(struct usb_device *udev, ++ enum usb3_link_state state, bool enable) ++{ ++ int ret; ++ int feature; ++ ++ switch (state) { ++ case USB3_LPM_U1: ++ feature = USB_DEVICE_U1_ENABLE; ++ break; ++ case USB3_LPM_U2: ++ feature = USB_DEVICE_U2_ENABLE; ++ break; ++ default: ++ dev_warn(&udev->dev, "%s: Can't %s non-U1 or U2 state.\n", ++ __func__, enable ? "enable" : "disable"); ++ return -EINVAL; ++ } ++ ++ if (udev->state != USB_STATE_CONFIGURED) { ++ dev_dbg(&udev->dev, "%s: Can't %s %s state " ++ "for unconfigured device.\n", ++ __func__, enable ? "enable" : "disable", ++ usb3_lpm_names[state]); ++ return 0; ++ } ++ ++ if (enable) { ++ /* ++ * Now send the control transfer to enable device-initiated LPM ++ * for either U1 or U2. ++ */ ++ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), ++ USB_REQ_SET_FEATURE, ++ USB_RECIP_DEVICE, ++ feature, ++ 0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); ++ } else { ++ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), ++ USB_REQ_CLEAR_FEATURE, ++ USB_RECIP_DEVICE, ++ feature, ++ 0, NULL, 0, ++ USB_CTRL_SET_TIMEOUT); ++ } ++ if (ret < 0) { ++ dev_warn(&udev->dev, "%s of device-initiated %s failed.\n", ++ enable ? "Enable" : "Disable", ++ usb3_lpm_names[state]); ++ return -EBUSY; ++ } ++ return 0; ++} ++ ++static int usb_set_lpm_timeout(struct usb_device *udev, ++ enum usb3_link_state state, int timeout) ++{ ++ int ret; ++ int feature; ++ ++ switch (state) { ++ case USB3_LPM_U1: ++ feature = USB_PORT_FEAT_U1_TIMEOUT; ++ break; ++ case USB3_LPM_U2: ++ feature = USB_PORT_FEAT_U2_TIMEOUT; ++ break; ++ default: ++ dev_warn(&udev->dev, "%s: Can't set timeout for non-U1 or U2 state.\n", ++ __func__); ++ return -EINVAL; ++ } ++ ++ if (state == USB3_LPM_U1 && timeout > USB3_LPM_U1_MAX_TIMEOUT && ++ timeout != USB3_LPM_DEVICE_INITIATED) { ++ dev_warn(&udev->dev, "Failed to set %s timeout to 0x%x, " ++ "which is a reserved value.\n", ++ usb3_lpm_names[state], timeout); ++ return -EINVAL; ++ } ++ ++ ret = set_port_feature(udev->parent, ++ USB_PORT_LPM_TIMEOUT(timeout) | udev->portnum, ++ feature); ++ if (ret < 0) { ++ dev_warn(&udev->dev, "Failed to set %s timeout to 0x%x," ++ "error code %i\n", usb3_lpm_names[state], ++ timeout, ret); ++ return -EBUSY; ++ } ++ if (state == USB3_LPM_U1) ++ udev->u1_params.timeout = timeout; ++ else ++ udev->u2_params.timeout = timeout; ++ return 0; ++} ++ ++/* ++ * Enable the hub-initiated U1/U2 idle timeouts, and enable device-initiated ++ * U1/U2 entry. ++ * ++ * We will attempt to enable U1 or U2, but there are no guarantees that the ++ * control transfers to set the hub timeout or enable device-initiated U1/U2 ++ * will be successful. ++ * ++ * If we cannot set the parent hub U1/U2 timeout, we attempt to let the xHCI ++ * driver know about it. If that call fails, it should be harmless, and just ++ * take up more slightly more bus bandwidth for unnecessary U1/U2 exit latency. ++ */ ++static void usb_enable_link_state(struct usb_hcd *hcd, struct usb_device *udev, ++ enum usb3_link_state state) ++{ ++ int timeout, ret; ++ __u8 u1_mel = udev->bos->ss_cap->bU1devExitLat; ++ __le16 u2_mel = udev->bos->ss_cap->bU2DevExitLat; ++ ++ /* If the device says it doesn't have *any* exit latency to come out of ++ * U1 or U2, it's probably lying. Assume it doesn't implement that link ++ * state. ++ */ ++ if ((state == USB3_LPM_U1 && u1_mel == 0) || ++ (state == USB3_LPM_U2 && u2_mel == 0)) ++ return; ++ ++ /* ++ * First, let the device know about the exit latencies ++ * associated with the link state we're about to enable. ++ */ ++ ret = usb_req_set_sel(udev, state); ++ if (ret < 0) { ++ dev_warn(&udev->dev, "Set SEL for device-initiated %s failed.\n", ++ usb3_lpm_names[state]); ++ return; ++ } ++ ++ /* We allow the host controller to set the U1/U2 timeout internally ++ * first, so that it can change its schedule to account for the ++ * additional latency to send data to a device in a lower power ++ * link state. ++ */ ++ timeout = hcd->driver->enable_usb3_lpm_timeout(hcd, udev, state); ++ ++ /* xHCI host controller doesn't want to enable this LPM state. */ ++ if (timeout == 0) ++ return; ++ ++ if (timeout < 0) { ++ dev_warn(&udev->dev, "Could not enable %s link state, " ++ "xHCI error %i.\n", usb3_lpm_names[state], ++ timeout); ++ return; ++ } ++ ++ if (usb_set_lpm_timeout(udev, state, timeout)) ++ /* If we can't set the parent hub U1/U2 timeout, ++ * device-initiated LPM won't be allowed either, so let the xHCI ++ * host know that this link state won't be enabled. ++ */ ++ hcd->driver->disable_usb3_lpm_timeout(hcd, udev, state); ++ ++ /* Only a configured device will accept the Set Feature U1/U2_ENABLE */ ++ else if (udev->actconfig) ++ usb_set_device_initiated_lpm(udev, state, true); ++ ++} ++ ++/* ++ * Disable the hub-initiated U1/U2 idle timeouts, and disable device-initiated ++ * U1/U2 entry. ++ * ++ * If this function returns -EBUSY, the parent hub will still allow U1/U2 entry. ++ * If zero is returned, the parent will not allow the link to go into U1/U2. ++ * ++ * If zero is returned, device-initiated U1/U2 entry may still be enabled, but ++ * it won't have an effect on the bus link state because the parent hub will ++ * still disallow device-initiated U1/U2 entry. ++ * ++ * If zero is returned, the xHCI host controller may still think U1/U2 entry is ++ * possible. The result will be slightly more bus bandwidth will be taken up ++ * (to account for U1/U2 exit latency), but it should be harmless. ++ */ ++static int usb_disable_link_state(struct usb_hcd *hcd, struct usb_device *udev, ++ enum usb3_link_state state) ++{ ++ int feature; ++ ++ switch (state) { ++ case USB3_LPM_U1: ++ feature = USB_PORT_FEAT_U1_TIMEOUT; ++ break; ++ case USB3_LPM_U2: ++ feature = USB_PORT_FEAT_U2_TIMEOUT; ++ break; ++ default: ++ dev_warn(&udev->dev, "%s: Can't disable non-U1 or U2 state.\n", ++ __func__); ++ return -EINVAL; ++ } ++ ++ if (usb_set_lpm_timeout(udev, state, 0)) ++ return -EBUSY; ++ ++ usb_set_device_initiated_lpm(udev, state, false); ++ ++ if (hcd->driver->disable_usb3_lpm_timeout(hcd, udev, state)) ++ dev_warn(&udev->dev, "Could not disable xHCI %s timeout, " ++ "bus schedule bandwidth may be impacted.\n", ++ usb3_lpm_names[state]); ++ return 0; ++} ++ ++/* ++ * Disable hub-initiated and device-initiated U1 and U2 entry. ++ * Caller must own the bandwidth_mutex. ++ * ++ * This will call usb_enable_lpm() on failure, which will decrement ++ * lpm_disable_count, and will re-enable LPM if lpm_disable_count reaches zero. ++ */ ++int usb_disable_lpm(struct usb_device *udev) ++{ ++ struct usb_hcd *hcd; ++ ++ if (!udev || !udev->parent || ++ udev->speed != USB_SPEED_SUPER || ++ !udev->lpm_capable) ++ return 0; ++ ++ hcd = bus_to_hcd(udev->bus); ++ if (!hcd || !hcd->driver->disable_usb3_lpm_timeout) ++ return 0; ++ ++ udev->lpm_disable_count++; ++ if ((udev->u1_params.timeout == 0 && udev->u2_params.timeout == 0)) ++ return 0; ++ ++ /* If LPM is enabled, attempt to disable it. */ ++ if (usb_disable_link_state(hcd, udev, USB3_LPM_U1)) ++ goto enable_lpm; ++ if (usb_disable_link_state(hcd, udev, USB3_LPM_U2)) ++ goto enable_lpm; ++ ++ return 0; ++ ++enable_lpm: ++ usb_enable_lpm(udev); ++ return -EBUSY; ++} ++EXPORT_SYMBOL_GPL(usb_disable_lpm); ++ ++/* Grab the bandwidth_mutex before calling usb_disable_lpm() */ ++int usb_unlocked_disable_lpm(struct usb_device *udev) ++{ ++ struct usb_hcd *hcd = bus_to_hcd(udev->bus); ++ int ret; ++ ++ if (!hcd) ++ return -EINVAL; ++ ++ mutex_lock(hcd->bandwidth_mutex); ++ ret = usb_disable_lpm(udev); ++ mutex_unlock(hcd->bandwidth_mutex); ++ ++ return ret; ++} ++EXPORT_SYMBOL_GPL(usb_unlocked_disable_lpm); ++ ++/* ++ * Attempt to enable device-initiated and hub-initiated U1 and U2 entry. The ++ * xHCI host policy may prevent U1 or U2 from being enabled. ++ * ++ * Other callers may have disabled link PM, so U1 and U2 entry will be disabled ++ * until the lpm_disable_count drops to zero. Caller must own the ++ * bandwidth_mutex. ++ */ ++void usb_enable_lpm(struct usb_device *udev) ++{ ++ struct usb_hcd *hcd; ++ ++ if (!udev || !udev->parent || ++ udev->speed != USB_SPEED_SUPER || ++ !udev->lpm_capable) ++ return; ++ ++ udev->lpm_disable_count--; ++ hcd = bus_to_hcd(udev->bus); ++ /* Double check that we can both enable and disable LPM. ++ * Device must be configured to accept set feature U1/U2 timeout. ++ */ ++ if (!hcd || !hcd->driver->enable_usb3_lpm_timeout || ++ !hcd->driver->disable_usb3_lpm_timeout) ++ return; ++ ++ if (udev->lpm_disable_count > 0) ++ return; ++ ++ usb_enable_link_state(hcd, udev, USB3_LPM_U1); ++ usb_enable_link_state(hcd, udev, USB3_LPM_U2); ++} ++EXPORT_SYMBOL_GPL(usb_enable_lpm); ++ ++/* Grab the bandwidth_mutex before calling usb_enable_lpm() */ ++void usb_unlocked_enable_lpm(struct usb_device *udev) ++{ ++ struct usb_hcd *hcd = bus_to_hcd(udev->bus); ++ ++ if (!hcd) ++ return; ++ ++ mutex_lock(hcd->bandwidth_mutex); ++ usb_enable_lpm(udev); ++ mutex_unlock(hcd->bandwidth_mutex); ++} ++EXPORT_SYMBOL_GPL(usb_unlocked_enable_lpm); ++ ++ ++#else /* CONFIG_PM */ ++ ++#define hub_suspend NULL ++#define hub_resume NULL ++#define hub_reset_resume NULL ++ ++int usb_disable_lpm(struct usb_device *udev) ++{ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(usb_disable_lpm); ++ ++void usb_enable_lpm(struct usb_device *udev) { } ++EXPORT_SYMBOL_GPL(usb_enable_lpm); ++ ++int usb_unlocked_disable_lpm(struct usb_device *udev) ++{ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(usb_unlocked_disable_lpm); ++ ++void usb_unlocked_enable_lpm(struct usb_device *udev) { } ++EXPORT_SYMBOL_GPL(usb_unlocked_enable_lpm); ++ ++int usb_disable_ltm(struct usb_device *udev) ++{ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(usb_disable_ltm); ++ ++void usb_enable_ltm(struct usb_device *udev) { } ++EXPORT_SYMBOL_GPL(usb_enable_ltm); ++#endif ++ ++ ++/* USB 2.0 spec, 7.1.7.3 / fig 7-29: ++ * ++ * Between connect detection and reset signaling there must be a delay ++ * of 100ms at least for debounce and power-settling. The corresponding ++ * timer shall restart whenever the downstream port detects a disconnect. ++ * ++ * Apparently there are some bluetooth and irda-dongles and a number of ++ * low-speed devices for which this debounce period may last over a second. ++ * Not covered by the spec - but easy to deal with. ++ * ++ * This implementation uses a 1500ms total debounce timeout; if the ++ * connection isn't stable by then it returns -ETIMEDOUT. It checks ++ * every 25ms for transient disconnects. When the port status has been ++ * unchanged for 100ms it returns the port status. ++ */ ++static int hub_port_debounce(struct usb_hub *hub, int port1) ++{ ++ int ret; ++ int total_time, stable_time = 0; ++ u16 portchange, portstatus; ++ unsigned connection = 0xffff; ++ ++ for (total_time = 0; ; total_time += HUB_DEBOUNCE_STEP) { ++ ret = hub_port_status(hub, port1, &portstatus, &portchange); ++ if (ret < 0) ++ return ret; ++ ++ if (!(portchange & USB_PORT_STAT_C_CONNECTION) && ++ (portstatus & USB_PORT_STAT_CONNECTION) == connection) { ++ stable_time += HUB_DEBOUNCE_STEP; ++ if (stable_time >= HUB_DEBOUNCE_STABLE) ++ break; ++ } else { ++ stable_time = 0; ++ connection = portstatus & USB_PORT_STAT_CONNECTION; ++ } ++ ++ if (portchange & USB_PORT_STAT_C_CONNECTION) { ++ clear_port_feature(hub->hdev, port1, ++ USB_PORT_FEAT_C_CONNECTION); ++ } ++ ++ if (total_time >= HUB_DEBOUNCE_TIMEOUT) ++ break; ++ msleep(HUB_DEBOUNCE_STEP); ++ } ++ ++ dev_dbg (hub->intfdev, ++ "debounce: port %d: total %dms stable %dms status 0x%x\n", ++ port1, total_time, stable_time, portstatus); ++ ++ if (stable_time < HUB_DEBOUNCE_STABLE) ++ return -ETIMEDOUT; ++ return portstatus; ++} ++ ++void usb_ep0_reinit(struct usb_device *udev) ++{ ++ usb_disable_endpoint(udev, 0 + USB_DIR_IN, true); ++ usb_disable_endpoint(udev, 0 + USB_DIR_OUT, true); ++ usb_enable_endpoint(udev, &udev->ep0, true); ++} ++EXPORT_SYMBOL_GPL(usb_ep0_reinit); ++ ++#define usb_sndaddr0pipe() (PIPE_CONTROL << 30) ++#define usb_rcvaddr0pipe() ((PIPE_CONTROL << 30) | USB_DIR_IN) ++ ++static int hub_set_address(struct usb_device *udev, int devnum) ++{ ++ int retval; ++ struct usb_hcd *hcd = bus_to_hcd(udev->bus); ++ ++ /* ++ * The host controller will choose the device address, ++ * instead of the core having chosen it earlier ++ */ ++ if (!hcd->driver->address_device && devnum <= 1) ++ return -EINVAL; ++ if (udev->state == USB_STATE_ADDRESS) ++ return 0; ++ if (udev->state != USB_STATE_DEFAULT) ++ return -EINVAL; ++ if (hcd->driver->address_device) ++ retval = hcd->driver->address_device(hcd, udev); ++ else ++ retval = usb_control_msg(udev, usb_sndaddr0pipe(), ++ USB_REQ_SET_ADDRESS, 0, devnum, 0, ++ NULL, 0, USB_CTRL_SET_TIMEOUT); ++ if (retval == 0) { ++ update_devnum(udev, devnum); ++ /* Device now using proper address. */ ++ usb_set_device_state(udev, USB_STATE_ADDRESS); ++ usb_ep0_reinit(udev); ++ } ++ return retval; ++} ++ ++/* Reset device, (re)assign address, get device descriptor. ++ * Device connection must be stable, no more debouncing needed. ++ * Returns device in USB_STATE_ADDRESS, except on error. ++ * ++ * If this is called for an already-existing device (as part of ++ * usb_reset_and_verify_device), the caller must own the device lock. For a ++ * newly detected device that is not accessible through any global ++ * pointers, it's not necessary to lock the device. ++ */ ++static int ++hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, ++ int retry_counter) ++{ ++ static DEFINE_MUTEX(usb_address0_mutex); ++ ++ struct usb_device *hdev = hub->hdev; ++ struct usb_hcd *hcd = bus_to_hcd(hdev->bus); ++ int i, j, retval; ++ unsigned delay = HUB_SHORT_RESET_TIME; ++ enum usb_device_speed oldspeed = udev->speed; ++ const char *speed; ++ int devnum = udev->devnum; ++ ++ /* root hub ports have a slightly longer reset period ++ * (from USB 2.0 spec, section 7.1.7.5) ++ */ ++ if (!hdev->parent) { ++ delay = HUB_ROOT_RESET_TIME; ++ if (port1 == hdev->bus->otg_port) ++ hdev->bus->b_hnp_enable = 0; ++ } ++ ++ /* Some low speed devices have problems with the quick delay, so */ ++ /* be a bit pessimistic with those devices. RHbug #23670 */ ++ if (oldspeed == USB_SPEED_LOW) ++ delay = HUB_LONG_RESET_TIME; ++ ++ mutex_lock(&usb_address0_mutex); ++ ++ /* Reset the device; full speed may morph to high speed */ ++ /* FIXME a USB 2.0 device may morph into SuperSpeed on reset. */ ++ retval = hub_port_reset(hub, port1, udev, delay, false); ++ if (retval < 0) /* error or disconnect */ ++ goto fail; ++ /* success, speed is known */ ++ ++ retval = -ENODEV; ++ ++ if (oldspeed != USB_SPEED_UNKNOWN && oldspeed != udev->speed) { ++ dev_dbg(&udev->dev, "device reset changed speed!\n"); ++ goto fail; ++ } ++ oldspeed = udev->speed; ++ ++ /* USB 2.0 section 5.5.3 talks about ep0 maxpacket ... ++ * it's fixed size except for full speed devices. ++ * For Wireless USB devices, ep0 max packet is always 512 (tho ++ * reported as 0xff in the device descriptor). WUSB1.0[4.8.1]. ++ */ ++ switch (udev->speed) { ++ case USB_SPEED_SUPER: ++ case USB_SPEED_WIRELESS: /* fixed at 512 */ ++ udev->ep0.desc.wMaxPacketSize = cpu_to_le16(512); ++ break; ++ case USB_SPEED_HIGH: /* fixed at 64 */ ++ udev->ep0.desc.wMaxPacketSize = cpu_to_le16(64); ++ break; ++ case USB_SPEED_FULL: /* 8, 16, 32, or 64 */ ++ /* to determine the ep0 maxpacket size, try to read ++ * the device descriptor to get bMaxPacketSize0 and ++ * then correct our initial guess. ++ */ ++ udev->ep0.desc.wMaxPacketSize = cpu_to_le16(64); ++ break; ++ case USB_SPEED_LOW: /* fixed at 8 */ ++ udev->ep0.desc.wMaxPacketSize = cpu_to_le16(8); ++ break; ++ default: ++ goto fail; ++ } ++ ++ if (udev->speed == USB_SPEED_WIRELESS) ++ speed = "variable speed Wireless"; ++ else ++ speed = usb_speed_string(udev->speed); ++ ++ if (udev->speed != USB_SPEED_SUPER) ++ dev_info(&udev->dev, ++ "%s %s USB device number %d using %s\n", ++ (udev->config) ? "reset" : "new", speed, ++ devnum, udev->bus->controller->driver->name); ++ ++ /* Set up TT records, if needed */ ++ if (hdev->tt) { ++ udev->tt = hdev->tt; ++ udev->ttport = hdev->ttport; ++ } else if (udev->speed != USB_SPEED_HIGH ++ && hdev->speed == USB_SPEED_HIGH) { ++ if (!hub->tt.hub) { ++ dev_err(&udev->dev, "parent hub has no TT\n"); ++ retval = -EINVAL; ++ goto fail; ++ } ++ udev->tt = &hub->tt; ++ udev->ttport = port1; ++ } ++ ++ /* Why interleave GET_DESCRIPTOR and SET_ADDRESS this way? ++ * Because device hardware and firmware is sometimes buggy in ++ * this area, and this is how Linux has done it for ages. ++ * Change it cautiously. ++ * ++ * NOTE: If USE_NEW_SCHEME() is true we will start by issuing ++ * a 64-byte GET_DESCRIPTOR request. This is what Windows does, ++ * so it may help with some non-standards-compliant devices. ++ * Otherwise we start with SET_ADDRESS and then try to read the ++ * first 8 bytes of the device descriptor to get the ep0 maxpacket ++ * value. ++ */ ++ for (i = 0; i < GET_DESCRIPTOR_TRIES; (++i, msleep(100))) { ++ if (USE_NEW_SCHEME(retry_counter) && !(hcd->driver->flags & HCD_USB3)) { ++ struct usb_device_descriptor *buf; ++ int r = 0; ++ ++#define GET_DESCRIPTOR_BUFSIZE 64 ++ buf = kmalloc(GET_DESCRIPTOR_BUFSIZE, GFP_NOIO); ++ if (!buf) { ++ retval = -ENOMEM; ++ continue; ++ } ++ ++ /* Retry on all errors; some devices are flakey. ++ * 255 is for WUSB devices, we actually need to use ++ * 512 (WUSB1.0[4.8.1]). ++ */ ++ for (j = 0; j < 3; ++j) { ++ buf->bMaxPacketSize0 = 0; ++ r = usb_control_msg(udev, usb_rcvaddr0pipe(), ++ USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, ++ USB_DT_DEVICE << 8, 0, ++ buf, GET_DESCRIPTOR_BUFSIZE, ++ initial_descriptor_timeout); ++ switch (buf->bMaxPacketSize0) { ++ case 8: case 16: case 32: case 64: case 255: ++ if (buf->bDescriptorType == ++ USB_DT_DEVICE) { ++ r = 0; ++ break; ++ } ++ /* FALL THROUGH */ ++ default: ++ if (r == 0) ++ r = -EPROTO; ++ break; ++ } ++ if (r == 0) ++ break; ++ } ++ udev->descriptor.bMaxPacketSize0 = ++ buf->bMaxPacketSize0; ++ kfree(buf); ++ ++ retval = hub_port_reset(hub, port1, udev, delay, false); ++ if (retval < 0) /* error or disconnect */ ++ goto fail; ++ if (oldspeed != udev->speed) { ++ dev_dbg(&udev->dev, ++ "device reset changed speed!\n"); ++ retval = -ENODEV; ++ goto fail; ++ } ++ if (r) { ++ dev_err(&udev->dev, ++ "device descriptor read/64, error %d\n", ++ r); ++ retval = -EMSGSIZE; ++ continue; ++ } ++#undef GET_DESCRIPTOR_BUFSIZE ++ } ++ ++ /* ++ * If device is WUSB, we already assigned an ++ * unauthorized address in the Connect Ack sequence; ++ * authorization will assign the final address. ++ */ ++ if (udev->wusb == 0) { ++ for (j = 0; j < SET_ADDRESS_TRIES; ++j) { ++ retval = hub_set_address(udev, devnum); ++ if (retval >= 0) ++ break; ++ msleep(200); ++ } ++ if (retval < 0) { ++ dev_err(&udev->dev, ++ "device not accepting address %d, error %d\n", ++ devnum, retval); ++ goto fail; ++ } ++ if (udev->speed == USB_SPEED_SUPER) { ++ devnum = udev->devnum; ++ dev_info(&udev->dev, ++ "%s SuperSpeed USB device number %d using %s\n", ++ (udev->config) ? "reset" : "new", ++ devnum, udev->bus->controller->driver->name); ++ } ++ ++ /* cope with hardware quirkiness: ++ * - let SET_ADDRESS settle, some device hardware wants it ++ * - read ep0 maxpacket even for high and low speed, ++ */ ++ msleep(10); ++ if (USE_NEW_SCHEME(retry_counter) && !(hcd->driver->flags & HCD_USB3)) ++ break; ++ } ++ ++ retval = usb_get_device_descriptor(udev, 8); ++ if (retval < 8) { ++ dev_err(&udev->dev, ++ "device descriptor read/8, error %d\n", ++ retval); ++ if (retval >= 0) ++ retval = -EMSGSIZE; ++ } else { ++ retval = 0; ++ break; ++ } ++ } ++ if (retval) ++ goto fail; ++ ++ /* ++ * Some superspeed devices have finished the link training process ++ * and attached to a superspeed hub port, but the device descriptor ++ * got from those devices show they aren't superspeed devices. Warm ++ * reset the port attached by the devices can fix them. ++ */ ++ if ((udev->speed == USB_SPEED_SUPER) && ++ (le16_to_cpu(udev->descriptor.bcdUSB) < 0x0300)) { ++ dev_err(&udev->dev, "got a wrong device descriptor, " ++ "warm reset device\n"); ++ hub_port_reset(hub, port1, udev, ++ HUB_BH_RESET_TIME, true); ++ retval = -EINVAL; ++ goto fail; ++ } ++ ++ if (udev->descriptor.bMaxPacketSize0 == 0xff || ++ udev->speed == USB_SPEED_SUPER) ++ i = 512; ++ else ++ i = udev->descriptor.bMaxPacketSize0; ++ if (usb_endpoint_maxp(&udev->ep0.desc) != i) { ++ if (udev->speed == USB_SPEED_LOW || ++ !(i == 8 || i == 16 || i == 32 || i == 64)) { ++ dev_err(&udev->dev, "Invalid ep0 maxpacket: %d\n", i); ++ retval = -EMSGSIZE; ++ goto fail; ++ } ++ if (udev->speed == USB_SPEED_FULL) ++ dev_dbg(&udev->dev, "ep0 maxpacket = %d\n", i); ++ else ++ dev_warn(&udev->dev, "Using ep0 maxpacket: %d\n", i); ++ udev->ep0.desc.wMaxPacketSize = cpu_to_le16(i); ++ usb_ep0_reinit(udev); ++ } ++ ++ retval = usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE); ++ if (retval < (signed)sizeof(udev->descriptor)) { ++ dev_err(&udev->dev, "device descriptor read/all, error %d\n", ++ retval); ++ if (retval >= 0) ++ retval = -ENOMSG; ++ goto fail; ++ } ++ ++ if (udev->wusb == 0 && le16_to_cpu(udev->descriptor.bcdUSB) >= 0x0201) { ++ retval = usb_get_bos_descriptor(udev); ++ if (!retval) { ++ udev->lpm_capable = usb_device_supports_lpm(udev); ++ usb_set_lpm_parameters(udev); ++ } ++ } ++ ++ retval = 0; ++ /* notify HCD that we have a device connected and addressed */ ++ if (hcd->driver->update_device) ++ hcd->driver->update_device(hcd, udev); ++fail: ++ if (retval) { ++ hub_port_disable(hub, port1, 0); ++ update_devnum(udev, devnum); /* for disconnect processing */ ++ } ++ mutex_unlock(&usb_address0_mutex); ++ return retval; ++} ++ ++static void ++check_highspeed (struct usb_hub *hub, struct usb_device *udev, int port1) ++{ ++ struct usb_qualifier_descriptor *qual; ++ int status; ++ ++ qual = kmalloc (sizeof *qual, GFP_KERNEL); ++ if (qual == NULL) ++ return; ++ ++ status = usb_get_descriptor (udev, USB_DT_DEVICE_QUALIFIER, 0, ++ qual, sizeof *qual); ++ if (status == sizeof *qual) { ++ dev_info(&udev->dev, "not running at top speed; " ++ "connect to a high speed hub\n"); ++ /* hub LEDs are probably harder to miss than syslog */ ++ if (hub->has_indicators) { ++ hub->indicator[port1-1] = INDICATOR_GREEN_BLINK; ++ schedule_delayed_work (&hub->leds, 0); ++ } ++ } ++ kfree(qual); ++} ++ ++static unsigned ++hub_power_remaining (struct usb_hub *hub) ++{ ++ struct usb_device *hdev = hub->hdev; ++ int remaining; ++ int port1; ++ ++ if (!hub->limited_power) ++ return 0; ++ ++ remaining = hdev->bus_mA - hub->descriptor->bHubContrCurrent; ++ for (port1 = 1; port1 <= hdev->maxchild; ++port1) { ++ struct usb_device *udev = hdev->children[port1 - 1]; ++ int delta; ++ ++ if (!udev) ++ continue; ++ ++ /* Unconfigured devices may not use more than 100mA, ++ * or 8mA for OTG ports */ ++ if (udev->actconfig) ++ delta = udev->actconfig->desc.bMaxPower * 2; ++ else if (port1 != udev->bus->otg_port || hdev->parent) ++ delta = 100; ++ else ++ delta = 8; ++ if (delta > hub->mA_per_port) ++ dev_warn(&udev->dev, ++ "%dmA is over %umA budget for port %d!\n", ++ delta, hub->mA_per_port, port1); ++ remaining -= delta; ++ } ++ if (remaining < 0) { ++ dev_warn(hub->intfdev, "%dmA over power budget!\n", ++ - remaining); ++ remaining = 0; ++ } ++ return remaining; ++} ++ ++/* Handle physical or logical connection change events. ++ * This routine is called when: ++ * a port connection-change occurs; ++ * a port enable-change occurs (often caused by EMI); ++ * usb_reset_and_verify_device() encounters changed descriptors (as from ++ * a firmware download) ++ * caller already locked the hub ++ */ ++static void hub_port_connect_change(struct usb_hub *hub, int port1, ++ u16 portstatus, u16 portchange) ++{ ++ struct usb_device *hdev = hub->hdev; ++ struct device *hub_dev = hub->intfdev; ++ struct usb_hcd *hcd = bus_to_hcd(hdev->bus); ++ unsigned wHubCharacteristics = ++ le16_to_cpu(hub->descriptor->wHubCharacteristics); ++ struct usb_device *udev; ++ int status, i; ++ ++ dev_dbg (hub_dev, ++ "port %d, status %04x, change %04x, %s\n", ++ port1, portstatus, portchange, portspeed(hub, portstatus)); ++ ++ if (hub->has_indicators) { ++ set_port_led(hub, port1, HUB_LED_AUTO); ++ hub->indicator[port1-1] = INDICATOR_AUTO; ++ } ++ ++#ifdef CONFIG_USB_OTG ++ /* during HNP, don't repeat the debounce */ ++ if (hdev->bus->is_b_host) ++ portchange &= ~(USB_PORT_STAT_C_CONNECTION | ++ USB_PORT_STAT_C_ENABLE); ++#endif ++ ++ /* Try to resuscitate an existing device */ ++ udev = hdev->children[port1-1]; ++ if ((portstatus & USB_PORT_STAT_CONNECTION) && udev && ++ udev->state != USB_STATE_NOTATTACHED) { ++ usb_lock_device(udev); ++ if (portstatus & USB_PORT_STAT_ENABLE) { ++ status = 0; /* Nothing to do */ ++ ++#ifdef CONFIG_USB_SUSPEND ++ } else if (udev->state == USB_STATE_SUSPENDED && ++ udev->persist_enabled) { ++ /* For a suspended device, treat this as a ++ * remote wakeup event. ++ */ ++ status = usb_remote_wakeup(udev); ++#endif ++ ++ } else { ++ status = -ENODEV; /* Don't resuscitate */ ++ } ++ usb_unlock_device(udev); ++ ++ if (status == 0) { ++ clear_bit(port1, hub->change_bits); ++ return; ++ } ++ } ++ ++ /* Disconnect any existing devices under this port */ ++ if (udev) ++ usb_disconnect(&hdev->children[port1-1]); ++ clear_bit(port1, hub->change_bits); ++ ++ /* We can forget about a "removed" device when there's a physical ++ * disconnect or the connect status changes. ++ */ ++ if (!(portstatus & USB_PORT_STAT_CONNECTION) || ++ (portchange & USB_PORT_STAT_C_CONNECTION)) ++ clear_bit(port1, hub->removed_bits); ++ ++ if (portchange & (USB_PORT_STAT_C_CONNECTION | ++ USB_PORT_STAT_C_ENABLE)) { ++ status = hub_port_debounce(hub, port1); ++ if (status < 0) { ++ if (printk_ratelimit()) ++ dev_err(hub_dev, "connect-debounce failed, " ++ "port %d disabled\n", port1); ++ portstatus &= ~USB_PORT_STAT_CONNECTION; ++ } else { ++ portstatus = status; ++ } ++ } ++ ++ if (hcd->phy && !hdev->parent) { ++ if (portstatus & USB_PORT_STAT_CONNECTION) ++ usb_phy_notify_connect(hcd->phy, port1); ++ else ++ usb_phy_notify_disconnect(hcd->phy, port1); ++ } ++ ++ /* Return now if debouncing failed or nothing is connected or ++ * the device was "removed". ++ */ ++ if (!(portstatus & USB_PORT_STAT_CONNECTION) || ++ test_bit(port1, hub->removed_bits)) { ++ ++ /* maybe switch power back on (e.g. root hub was reset) */ ++ if ((wHubCharacteristics & HUB_CHAR_LPSM) < 2 ++ && !port_is_power_on(hub, portstatus)) ++ set_port_feature(hdev, port1, USB_PORT_FEAT_POWER); ++ ++ if (portstatus & USB_PORT_STAT_ENABLE) ++ goto done; ++ return; ++ } ++ ++ for (i = 0; i < SET_CONFIG_TRIES; i++) { ++ ++ /* reallocate for each attempt, since references ++ * to the previous one can escape in various ways ++ */ ++ udev = usb_alloc_dev(hdev, hdev->bus, port1); ++ if (!udev) { ++ dev_err (hub_dev, ++ "couldn't allocate port %d usb_device\n", ++ port1); ++ goto done; ++ } ++ ++ usb_set_device_state(udev, USB_STATE_POWERED); ++ udev->bus_mA = hub->mA_per_port; ++ udev->level = hdev->level + 1; ++ udev->wusb = hub_is_wusb(hub); ++ ++ /* Only USB 3.0 devices are connected to SuperSpeed hubs. */ ++ if (hub_is_superspeed(hub->hdev)) ++ udev->speed = USB_SPEED_SUPER; ++ else ++ udev->speed = USB_SPEED_UNKNOWN; ++ ++ choose_devnum(udev); ++ if (udev->devnum <= 0) { ++ status = -ENOTCONN; /* Don't retry */ ++ goto loop; ++ } ++ ++ /* reset (non-USB 3.0 devices) and get descriptor */ ++ status = hub_port_init(hub, udev, port1, i); ++ if (status < 0) ++ goto loop; ++ ++ usb_detect_quirks(udev); ++ if (udev->quirks & USB_QUIRK_DELAY_INIT) ++ msleep(1000); ++ ++ /* consecutive bus-powered hubs aren't reliable; they can ++ * violate the voltage drop budget. if the new child has ++ * a "powered" LED, users should notice we didn't enable it ++ * (without reading syslog), even without per-port LEDs ++ * on the parent. ++ */ ++ if (udev->descriptor.bDeviceClass == USB_CLASS_HUB ++ && udev->bus_mA <= 100) { ++ u16 devstat; ++ ++ status = usb_get_status(udev, USB_RECIP_DEVICE, 0, ++ &devstat); ++ if (status < 2) { ++ dev_dbg(&udev->dev, "get status %d ?\n", status); ++ goto loop_disable; ++ } ++ le16_to_cpus(&devstat); ++ if ((devstat & (1 << USB_DEVICE_SELF_POWERED)) == 0) { ++ dev_err(&udev->dev, ++ "can't connect bus-powered hub " ++ "to this port\n"); ++ if (hub->has_indicators) { ++ hub->indicator[port1-1] = ++ INDICATOR_AMBER_BLINK; ++ schedule_delayed_work (&hub->leds, 0); ++ } ++ status = -ENOTCONN; /* Don't retry */ ++ goto loop_disable; ++ } ++ } ++ ++ /* check for devices running slower than they could */ ++ if (le16_to_cpu(udev->descriptor.bcdUSB) >= 0x0200 ++ && udev->speed == USB_SPEED_FULL ++ && highspeed_hubs != 0) ++ check_highspeed (hub, udev, port1); ++ ++ /* Store the parent's children[] pointer. At this point ++ * udev becomes globally accessible, although presumably ++ * no one will look at it until hdev is unlocked. ++ */ ++ status = 0; ++ ++ /* We mustn't add new devices if the parent hub has ++ * been disconnected; we would race with the ++ * recursively_mark_NOTATTACHED() routine. ++ */ ++ spin_lock_irq(&device_state_lock); ++ if (hdev->state == USB_STATE_NOTATTACHED) ++ status = -ENOTCONN; ++ else ++ hdev->children[port1-1] = udev; ++ spin_unlock_irq(&device_state_lock); ++ ++ /* Run it through the hoops (find a driver, etc) */ ++ if (!status) { ++ status = usb_new_device(udev); ++ if (status) { ++ spin_lock_irq(&device_state_lock); ++ hdev->children[port1-1] = NULL; ++ spin_unlock_irq(&device_state_lock); ++ } ++ } ++ ++ if (status) ++ goto loop_disable; ++ ++ status = hub_power_remaining(hub); ++ if (status) ++ dev_dbg(hub_dev, "%dmA power budget left\n", status); ++ ++ return; ++ ++loop_disable: ++ hub_port_disable(hub, port1, 1); ++loop: ++ usb_ep0_reinit(udev); ++ release_devnum(udev); ++ hub_free_dev(udev); ++ usb_put_dev(udev); ++ if ((status == -ENOTCONN) || (status == -ENOTSUPP)) ++ break; ++ } ++ if (hub->hdev->parent || ++ !hcd->driver->port_handed_over || ++ !(hcd->driver->port_handed_over)(hcd, port1)) ++ dev_err(hub_dev, "unable to enumerate USB device on port %d\n", ++ port1); ++ ++done: ++ hub_port_disable(hub, port1, 1); ++ if (hcd->driver->relinquish_port && !hub->hdev->parent) ++ hcd->driver->relinquish_port(hcd, port1); ++} ++ ++/* Returns 1 if there was a remote wakeup and a connect status change. */ ++static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port, ++ u16 portstatus, u16 portchange) ++{ ++ struct usb_device *hdev; ++ struct usb_device *udev; ++ int connect_change = 0; ++ int ret; ++ ++ hdev = hub->hdev; ++ udev = hdev->children[port-1]; ++ if (!hub_is_superspeed(hdev)) { ++ if (!(portchange & USB_PORT_STAT_C_SUSPEND)) ++ return 0; ++ clear_port_feature(hdev, port, USB_PORT_FEAT_C_SUSPEND); ++ } else { ++ if (!udev || udev->state != USB_STATE_SUSPENDED || ++ (portstatus & USB_PORT_STAT_LINK_STATE) != ++ USB_SS_PORT_LS_U0) ++ return 0; ++ } ++ ++ if (udev) { ++ /* TRSMRCY = 10 msec */ ++ msleep(10); ++ ++ usb_lock_device(udev); ++ ret = usb_remote_wakeup(udev); ++ usb_unlock_device(udev); ++ if (ret < 0) ++ connect_change = 1; ++ } else { ++ ret = -ENODEV; ++ hub_port_disable(hub, port, 1); ++ } ++ dev_dbg(hub->intfdev, "resume on port %d, status %d\n", ++ port, ret); ++ return connect_change; ++} ++ ++static void hub_events(void) ++{ ++ struct list_head *tmp; ++ struct usb_device *hdev; ++ struct usb_interface *intf; ++ struct usb_hub *hub; ++ struct device *hub_dev; ++ u16 hubstatus; ++ u16 hubchange; ++ u16 portstatus; ++ u16 portchange; ++ int i, ret; ++ int connect_change, wakeup_change; ++ ++ /* ++ * We restart the list every time to avoid a deadlock with ++ * deleting hubs downstream from this one. This should be ++ * safe since we delete the hub from the event list. ++ * Not the most efficient, but avoids deadlocks. ++ */ ++ while (1) { ++ ++ /* Grab the first entry at the beginning of the list */ ++ spin_lock_irq(&hub_event_lock); ++ if (list_empty(&hub_event_list)) { ++ spin_unlock_irq(&hub_event_lock); ++ break; ++ } ++ ++ tmp = hub_event_list.next; ++ list_del_init(tmp); ++ ++ hub = list_entry(tmp, struct usb_hub, event_list); ++ kref_get(&hub->kref); ++ 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", ++ hdev->state, hub->descriptor ++ ? hub->descriptor->bNbrPorts ++ : 0, ++ /* NOTE: expects max 15 ports... */ ++ (u16) hub->change_bits[0], ++ (u16) hub->event_bits[0]); ++ ++ /* Lock the device, then check to see if we were ++ * disconnected while waiting for the lock to succeed. */ ++ usb_lock_device(hdev); ++ if (unlikely(hub->disconnected)) ++ goto loop_disconnected; ++ ++ /* If the hub has died, clean up after it */ ++ if (hdev->state == USB_STATE_NOTATTACHED) { ++ hub->error = -ENODEV; ++ hub_quiesce(hub, HUB_DISCONNECT); ++ goto loop; ++ } ++ ++ /* Autoresume */ ++ ret = usb_autopm_get_interface(intf); ++ if (ret) { ++ dev_dbg(hub_dev, "Can't autoresume: %d\n", ret); ++ goto loop; ++ } ++ ++ /* If this is an inactive hub, do nothing */ ++ if (hub->quiescing) ++ goto loop_autopm; ++ ++ if (hub->error) { ++ dev_dbg (hub_dev, "resetting for error %d\n", ++ hub->error); ++ ++ ret = usb_reset_device(hdev); ++ if (ret) { ++ dev_dbg (hub_dev, ++ "error resetting hub: %d\n", ret); ++ goto loop_autopm; ++ } ++ ++ hub->nerrors = 0; ++ hub->error = 0; ++ } ++ ++ /* deal with port status changes */ ++ for (i = 1; i <= hub->descriptor->bNbrPorts; i++) { ++ if (test_bit(i, hub->busy_bits)) ++ continue; ++ connect_change = test_bit(i, hub->change_bits); ++ wakeup_change = test_and_clear_bit(i, hub->wakeup_bits); ++ if (!test_and_clear_bit(i, hub->event_bits) && ++ !connect_change && !wakeup_change) ++ continue; ++ ++ ret = hub_port_status(hub, i, ++ &portstatus, &portchange); ++ if (ret < 0) ++ continue; ++ ++ if (portchange & USB_PORT_STAT_C_CONNECTION) { ++ clear_port_feature(hdev, i, ++ USB_PORT_FEAT_C_CONNECTION); ++ connect_change = 1; ++ } ++ ++ if (portchange & USB_PORT_STAT_C_ENABLE) { ++ if (!connect_change) ++ dev_dbg (hub_dev, ++ "port %d enable change, " ++ "status %08x\n", ++ i, portstatus); ++ clear_port_feature(hdev, i, ++ USB_PORT_FEAT_C_ENABLE); ++ ++ /* ++ * EM interference sometimes causes badly ++ * shielded USB devices to be shutdown by ++ * the hub, this hack enables them again. ++ * Works at least with mouse driver. ++ */ ++ if (!(portstatus & USB_PORT_STAT_ENABLE) ++ && !connect_change ++ && hdev->children[i-1]) { ++ dev_err (hub_dev, ++ "port %i " ++ "disabled by hub (EMI?), " ++ "re-enabling...\n", ++ i); ++ connect_change = 1; ++ } ++ } ++ ++ if (hub_handle_remote_wakeup(hub, i, ++ portstatus, portchange)) ++ connect_change = 1; ++ ++ if (portchange & USB_PORT_STAT_C_OVERCURRENT) { ++ u16 status = 0; ++ u16 unused; ++ ++ dev_dbg(hub_dev, "over-current change on port " ++ "%d\n", i); ++ clear_port_feature(hdev, i, ++ USB_PORT_FEAT_C_OVER_CURRENT); ++ msleep(100); /* Cool down */ ++ hub_power_on(hub, true); ++ hub_port_status(hub, i, &status, &unused); ++ if (status & USB_PORT_STAT_OVERCURRENT) ++ dev_err(hub_dev, "over-current " ++ "condition on port %d\n", i); ++ } ++ ++ if (portchange & USB_PORT_STAT_C_RESET) { ++ dev_dbg (hub_dev, ++ "reset change on port %d\n", ++ i); ++ clear_port_feature(hdev, i, ++ USB_PORT_FEAT_C_RESET); ++ } ++ if ((portchange & USB_PORT_STAT_C_BH_RESET) && ++ hub_is_superspeed(hub->hdev)) { ++ dev_dbg(hub_dev, ++ "warm reset change on port %d\n", ++ i); ++ clear_port_feature(hdev, i, ++ USB_PORT_FEAT_C_BH_PORT_RESET); ++ } ++ if (portchange & USB_PORT_STAT_C_LINK_STATE) { ++ clear_port_feature(hub->hdev, i, ++ USB_PORT_FEAT_C_PORT_LINK_STATE); ++ } ++ if (portchange & USB_PORT_STAT_C_CONFIG_ERROR) { ++ dev_warn(hub_dev, ++ "config error on port %d\n", ++ i); ++ clear_port_feature(hub->hdev, i, ++ USB_PORT_FEAT_C_PORT_CONFIG_ERROR); ++ } ++ ++ /* Warm reset a USB3 protocol port if it's in ++ * SS.Inactive state. ++ */ ++ if (hub_port_warm_reset_required(hub, portstatus)) { ++ dev_dbg(hub_dev, "warm reset port %d\n", i); ++ hub_port_reset(hub, i, NULL, ++ HUB_BH_RESET_TIME, true); ++ } ++ ++ if (connect_change) ++ hub_port_connect_change(hub, i, ++ portstatus, portchange); ++ } /* end for i */ ++ ++ /* deal with hub status changes */ ++ if (test_and_clear_bit(0, hub->event_bits) == 0) ++ ; /* do nothing */ ++ else if (hub_hub_status(hub, &hubstatus, &hubchange) < 0) ++ dev_err (hub_dev, "get_hub_status failed\n"); ++ else { ++ if (hubchange & HUB_CHANGE_LOCAL_POWER) { ++ dev_dbg (hub_dev, "power change\n"); ++ clear_hub_feature(hdev, C_HUB_LOCAL_POWER); ++ if (hubstatus & HUB_STATUS_LOCAL_POWER) ++ /* FIXME: Is this always true? */ ++ hub->limited_power = 1; ++ else ++ hub->limited_power = 0; ++ } ++ if (hubchange & HUB_CHANGE_OVERCURRENT) { ++ u16 status = 0; ++ u16 unused; ++ ++ dev_dbg(hub_dev, "over-current change\n"); ++ clear_hub_feature(hdev, C_HUB_OVER_CURRENT); ++ msleep(500); /* Cool down */ ++ hub_power_on(hub, true); ++ hub_hub_status(hub, &status, &unused); ++ if (status & HUB_STATUS_OVERCURRENT) ++ dev_err(hub_dev, "over-current " ++ "condition\n"); ++ } ++ } ++ ++ loop_autopm: ++ /* Balance the usb_autopm_get_interface() above */ ++ usb_autopm_put_interface_no_suspend(intf); ++ loop: ++ /* Balance the usb_autopm_get_interface_no_resume() in ++ * kick_khubd() and allow autosuspend. ++ */ ++ usb_autopm_put_interface(intf); ++ loop_disconnected: ++ usb_unlock_device(hdev); ++ kref_put(&hub->kref, hub_release); ++ ++ } /* end while (1) */ ++} ++ ++static int hub_thread(void *__unused) ++{ ++ /* khubd needs to be freezable to avoid intefering with USB-PERSIST ++ * port handover. Otherwise it might see that a full-speed device ++ * was gone before the EHCI controller had handed its port over to ++ * the companion full-speed controller. ++ */ ++ set_freezable(); ++ ++ do { ++ hub_events(); ++ wait_event_freezable(khubd_wait, ++ !list_empty(&hub_event_list) || ++ kthread_should_stop()); ++ } while (!kthread_should_stop() || !list_empty(&hub_event_list)); ++ ++ pr_debug("%s: khubd exiting\n", usbcore_name); ++ return 0; ++} ++ ++static const struct usb_device_id hub_id_table[] = { ++ { .match_flags = USB_DEVICE_ID_MATCH_DEV_CLASS, ++ .bDeviceClass = USB_CLASS_HUB}, ++ { .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS, ++ .bInterfaceClass = USB_CLASS_HUB}, ++ { } /* Terminating entry */ ++}; ++ ++MODULE_DEVICE_TABLE (usb, hub_id_table); ++ ++static struct usb_driver hub_driver = { ++ .name = "hub", ++ .probe = hub_probe, ++ .disconnect = hub_disconnect, ++ .suspend = hub_suspend, ++ .resume = hub_resume, ++ .reset_resume = hub_reset_resume, ++ .pre_reset = hub_pre_reset, ++ .post_reset = hub_post_reset, ++ .unlocked_ioctl = hub_ioctl, ++ .id_table = hub_id_table, ++ .supports_autosuspend = 1, ++}; ++ ++int usb_hub_init(void) ++{ ++ if (usb_register(&hub_driver) < 0) { ++ printk(KERN_ERR "%s: can't register hub driver\n", ++ usbcore_name); ++ return -1; ++ } ++ ++ khubd_task = kthread_run(hub_thread, NULL, "khubd"); ++ if (!IS_ERR(khubd_task)) ++ return 0; ++ ++ /* Fall through if kernel_thread failed */ ++ usb_deregister(&hub_driver); ++ printk(KERN_ERR "%s: can't start khubd\n", usbcore_name); ++ ++ return -1; ++} ++ ++void usb_hub_cleanup(void) ++{ ++ kthread_stop(khubd_task); ++ ++ /* ++ * Hub resources are freed for us by usb_deregister. It calls ++ * usb_driver_purge on every device which in turn calls that ++ * devices disconnect function if it is using this driver. ++ * The hub_disconnect function takes care of releasing the ++ * individual hub resources. -greg ++ */ ++ usb_deregister(&hub_driver); ++} /* usb_hub_cleanup() */ ++ ++static int descriptors_changed(struct usb_device *udev, ++ struct usb_device_descriptor *old_device_descriptor) ++{ ++ int changed = 0; ++ unsigned index; ++ unsigned serial_len = 0; ++ unsigned len; ++ unsigned old_length; ++ int length; ++ char *buf; ++ ++ if (memcmp(&udev->descriptor, old_device_descriptor, ++ sizeof(*old_device_descriptor)) != 0) ++ return 1; ++ ++ /* Since the idVendor, idProduct, and bcdDevice values in the ++ * device descriptor haven't changed, we will assume the ++ * Manufacturer and Product strings haven't changed either. ++ * But the SerialNumber string could be different (e.g., a ++ * different flash card of the same brand). ++ */ ++ if (udev->serial) ++ serial_len = strlen(udev->serial) + 1; ++ ++ len = serial_len; ++ for (index = 0; index < udev->descriptor.bNumConfigurations; index++) { ++ old_length = le16_to_cpu(udev->config[index].desc.wTotalLength); ++ len = max(len, old_length); ++ } ++ ++ buf = kmalloc(len, GFP_NOIO); ++ if (buf == NULL) { ++ dev_err(&udev->dev, "no mem to re-read configs after reset\n"); ++ /* assume the worst */ ++ return 1; ++ } ++ for (index = 0; index < udev->descriptor.bNumConfigurations; index++) { ++ old_length = le16_to_cpu(udev->config[index].desc.wTotalLength); ++ length = usb_get_descriptor(udev, USB_DT_CONFIG, index, buf, ++ old_length); ++ if (length != old_length) { ++ dev_dbg(&udev->dev, "config index %d, error %d\n", ++ index, length); ++ changed = 1; ++ break; ++ } ++ if (memcmp (buf, udev->rawdescriptors[index], old_length) ++ != 0) { ++ dev_dbg(&udev->dev, "config index %d changed (#%d)\n", ++ index, ++ ((struct usb_config_descriptor *) buf)-> ++ bConfigurationValue); ++ changed = 1; ++ break; ++ } ++ } ++ ++ if (!changed && serial_len) { ++ length = usb_string(udev, udev->descriptor.iSerialNumber, ++ buf, serial_len); ++ if (length + 1 != serial_len) { ++ dev_dbg(&udev->dev, "serial string error %d\n", ++ length); ++ changed = 1; ++ } else if (memcmp(buf, udev->serial, length) != 0) { ++ dev_dbg(&udev->dev, "serial string changed\n"); ++ changed = 1; ++ } ++ } ++ ++ kfree(buf); ++ return changed; ++} ++ ++/** ++ * usb_reset_and_verify_device - perform a USB port reset to reinitialize a device ++ * @udev: device to reset (not in SUSPENDED or NOTATTACHED state) ++ * ++ * WARNING - don't use this routine to reset a composite device ++ * (one with multiple interfaces owned by separate drivers)! ++ * Use usb_reset_device() instead. ++ * ++ * Do a port reset, reassign the device's address, and establish its ++ * former operating configuration. If the reset fails, or the device's ++ * descriptors change from their values before the reset, or the original ++ * configuration and altsettings cannot be restored, a flag will be set ++ * telling khubd to pretend the device has been disconnected and then ++ * re-connected. All drivers will be unbound, and the device will be ++ * re-enumerated and probed all over again. ++ * ++ * Returns 0 if the reset succeeded, -ENODEV if the device has been ++ * flagged for logical disconnection, or some other negative error code ++ * if the reset wasn't even attempted. ++ * ++ * The caller must own the device lock. For example, it's safe to use ++ * this from a driver probe() routine after downloading new firmware. ++ * For calls that might not occur during probe(), drivers should lock ++ * the device using usb_lock_device_for_reset(). ++ * ++ * Locking exception: This routine may also be called from within an ++ * autoresume handler. Such usage won't conflict with other tasks ++ * holding the device lock because these tasks should always call ++ * usb_autopm_resume_device(), thereby preventing any unwanted autoresume. ++ */ ++static int usb_reset_and_verify_device(struct usb_device *udev) ++{ ++ struct usb_device *parent_hdev = udev->parent; ++ struct usb_hub *parent_hub; ++ struct usb_hcd *hcd = bus_to_hcd(udev->bus); ++ struct usb_device_descriptor descriptor = udev->descriptor; ++ int i, ret = 0; ++ int port1 = udev->portnum; ++ ++ if (udev->state == USB_STATE_NOTATTACHED || ++ udev->state == USB_STATE_SUSPENDED) { ++ dev_dbg(&udev->dev, "device reset not allowed in state %d\n", ++ udev->state); ++ return -EINVAL; ++ } ++ ++ if (!parent_hdev) { ++ /* this requires hcd-specific logic; see ohci_restart() */ ++ dev_dbg(&udev->dev, "%s for root hub!\n", __func__); ++ return -EISDIR; ++ } ++ parent_hub = hdev_to_hub(parent_hdev); ++ ++ /* Disable LPM and LTM while we reset the device and reinstall the alt ++ * settings. Device-initiated LPM settings, and system exit latency ++ * settings are cleared when the device is reset, so we have to set ++ * them up again. ++ */ ++ ret = usb_unlocked_disable_lpm(udev); ++ if (ret) { ++ dev_err(&udev->dev, "%s Failed to disable LPM\n.", __func__); ++ goto re_enumerate; ++ } ++ ret = usb_disable_ltm(udev); ++ if (ret) { ++ dev_err(&udev->dev, "%s Failed to disable LTM\n.", ++ __func__); ++ goto re_enumerate; ++ } ++ ++ set_bit(port1, parent_hub->busy_bits); ++ for (i = 0; i < SET_CONFIG_TRIES; ++i) { ++ ++ /* ep0 maxpacket size may change; let the HCD know about it. ++ * Other endpoints will be handled by re-enumeration. */ ++ usb_ep0_reinit(udev); ++ ret = hub_port_init(parent_hub, udev, port1, i); ++ if (ret >= 0 || ret == -ENOTCONN || ret == -ENODEV) ++ break; ++ } ++ clear_bit(port1, parent_hub->busy_bits); ++ ++ if (ret < 0) ++ goto re_enumerate; ++ ++ /* Device might have changed firmware (DFU or similar) */ ++ if (descriptors_changed(udev, &descriptor)) { ++ dev_info(&udev->dev, "device firmware changed\n"); ++ udev->descriptor = descriptor; /* for disconnect() calls */ ++ goto re_enumerate; ++ } ++ ++ /* Restore the device's previous configuration */ ++ if (!udev->actconfig) ++ goto done; ++ ++ mutex_lock(hcd->bandwidth_mutex); ++ ret = usb_hcd_alloc_bandwidth(udev, udev->actconfig, NULL, NULL); ++ if (ret < 0) { ++ dev_warn(&udev->dev, ++ "Busted HC? Not enough HCD resources for " ++ "old configuration.\n"); ++ mutex_unlock(hcd->bandwidth_mutex); ++ goto re_enumerate; ++ } ++ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), ++ USB_REQ_SET_CONFIGURATION, 0, ++ udev->actconfig->desc.bConfigurationValue, 0, ++ NULL, 0, USB_CTRL_SET_TIMEOUT); ++ if (ret < 0) { ++ dev_err(&udev->dev, ++ "can't restore configuration #%d (error=%d)\n", ++ udev->actconfig->desc.bConfigurationValue, ret); ++ mutex_unlock(hcd->bandwidth_mutex); ++ goto re_enumerate; ++ } ++ mutex_unlock(hcd->bandwidth_mutex); ++ usb_set_device_state(udev, USB_STATE_CONFIGURED); ++ ++ /* Put interfaces back into the same altsettings as before. ++ * Don't bother to send the Set-Interface request for interfaces ++ * that were already in altsetting 0; besides being unnecessary, ++ * many devices can't handle it. Instead just reset the host-side ++ * endpoint state. ++ */ ++ for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { ++ struct usb_host_config *config = udev->actconfig; ++ struct usb_interface *intf = config->interface[i]; ++ struct usb_interface_descriptor *desc; ++ ++ desc = &intf->cur_altsetting->desc; ++ if (desc->bAlternateSetting == 0) { ++ usb_disable_interface(udev, intf, true); ++ usb_enable_interface(udev, intf, true); ++ ret = 0; ++ } else { ++ /* Let the bandwidth allocation function know that this ++ * device has been reset, and it will have to use ++ * alternate setting 0 as the current alternate setting. ++ */ ++ intf->resetting_device = 1; ++ ret = usb_set_interface(udev, desc->bInterfaceNumber, ++ desc->bAlternateSetting); ++ intf->resetting_device = 0; ++ } ++ if (ret < 0) { ++ dev_err(&udev->dev, "failed to restore interface %d " ++ "altsetting %d (error=%d)\n", ++ desc->bInterfaceNumber, ++ desc->bAlternateSetting, ++ ret); ++ goto re_enumerate; ++ } ++ } ++ ++done: ++ /* Now that the alt settings are re-installed, enable LTM and LPM. */ ++ usb_unlocked_enable_lpm(udev); ++ usb_enable_ltm(udev); ++ return 0; ++ ++re_enumerate: ++ /* LPM state doesn't matter when we're about to destroy the device. */ ++ hub_port_logical_disconnect(parent_hub, port1); ++ return -ENODEV; ++} ++ ++/** ++ * usb_reset_device - warn interface drivers and perform a USB port reset ++ * @udev: device to reset (not in SUSPENDED or NOTATTACHED state) ++ * ++ * Warns all drivers bound to registered interfaces (using their pre_reset ++ * method), performs the port reset, and then lets the drivers know that ++ * the reset is over (using their post_reset method). ++ * ++ * Return value is the same as for usb_reset_and_verify_device(). ++ * ++ * The caller must own the device lock. For example, it's safe to use ++ * this from a driver probe() routine after downloading new firmware. ++ * For calls that might not occur during probe(), drivers should lock ++ * the device using usb_lock_device_for_reset(). ++ * ++ * If an interface is currently being probed or disconnected, we assume ++ * its driver knows how to handle resets. For all other interfaces, ++ * if the driver doesn't have pre_reset and post_reset methods then ++ * we attempt to unbind it and rebind afterward. ++ */ ++int usb_reset_device(struct usb_device *udev) ++{ ++ int ret; ++ int i; ++ struct usb_host_config *config = udev->actconfig; ++ ++ if (udev->state == USB_STATE_NOTATTACHED || ++ udev->state == USB_STATE_SUSPENDED) { ++ dev_dbg(&udev->dev, "device reset not allowed in state %d\n", ++ udev->state); ++ return -EINVAL; ++ } ++ ++ /* Prevent autosuspend during the reset */ ++ usb_autoresume_device(udev); ++ ++ if (config) { ++ for (i = 0; i < config->desc.bNumInterfaces; ++i) { ++ struct usb_interface *cintf = config->interface[i]; ++ struct usb_driver *drv; ++ int unbind = 0; ++ ++ if (cintf->dev.driver) { ++ drv = to_usb_driver(cintf->dev.driver); ++ if (drv->pre_reset && drv->post_reset) ++ unbind = (drv->pre_reset)(cintf); ++ else if (cintf->condition == ++ USB_INTERFACE_BOUND) ++ unbind = 1; ++ if (unbind) ++ usb_forced_unbind_intf(cintf); ++ } ++ } ++ } ++ ++ ret = usb_reset_and_verify_device(udev); ++ ++ if (config) { ++ for (i = config->desc.bNumInterfaces - 1; i >= 0; --i) { ++ struct usb_interface *cintf = config->interface[i]; ++ struct usb_driver *drv; ++ int rebind = cintf->needs_binding; ++ ++ if (!rebind && cintf->dev.driver) { ++ drv = to_usb_driver(cintf->dev.driver); ++ if (drv->post_reset) ++ rebind = (drv->post_reset)(cintf); ++ else if (cintf->condition == ++ USB_INTERFACE_BOUND) ++ rebind = 1; ++ } ++ if (ret == 0 && rebind) ++ usb_rebind_intf(cintf); ++ } ++ } ++ ++ usb_autosuspend_device(udev); ++ return ret; ++} ++EXPORT_SYMBOL_GPL(usb_reset_device); ++ ++ ++/** ++ * usb_queue_reset_device - Reset a USB device from an atomic context ++ * @iface: USB interface belonging to the device to reset ++ * ++ * This function can be used to reset a USB device from an atomic ++ * context, where usb_reset_device() won't work (as it blocks). ++ * ++ * Doing a reset via this method is functionally equivalent to calling ++ * usb_reset_device(), except for the fact that it is delayed to a ++ * workqueue. This means that any drivers bound to other interfaces ++ * might be unbound, as well as users from usbfs in user space. ++ * ++ * Corner cases: ++ * ++ * - Scheduling two resets at the same time from two different drivers ++ * attached to two different interfaces of the same device is ++ * possible; depending on how the driver attached to each interface ++ * handles ->pre_reset(), the second reset might happen or not. ++ * ++ * - If a driver is unbound and it had a pending reset, the reset will ++ * be cancelled. ++ * ++ * - This function can be called during .probe() or .disconnect() ++ * times. On return from .disconnect(), any pending resets will be ++ * cancelled. ++ * ++ * There is no no need to lock/unlock the @reset_ws as schedule_work() ++ * does its own. ++ * ++ * NOTE: We don't do any reference count tracking because it is not ++ * needed. The lifecycle of the work_struct is tied to the ++ * usb_interface. Before destroying the interface we cancel the ++ * work_struct, so the fact that work_struct is queued and or ++ * running means the interface (and thus, the device) exist and ++ * are referenced. ++ */ ++void usb_queue_reset_device(struct usb_interface *iface) ++{ ++ schedule_work(&iface->reset_ws); ++} ++EXPORT_SYMBOL_GPL(usb_queue_reset_device); +diff -Naur linux-3.6.7/drivers/usb/core/message.c linux-3.6.7.patch/drivers/usb/core/message.c +--- linux-3.6.7/drivers/usb/core/message.c 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/core/message.c 2012-11-18 12:45:10.793337634 +0100 @@ -1877,6 +1877,85 @@ if (cp->string == NULL && !(dev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS)) @@ -25289,9 +30135,9 @@ diff -Naur linux-3.6.1/drivers/usb/core/message.c linux-rpi-3.6.y/drivers/usb/co /* Now that the interfaces are installed, re-enable LPM. */ usb_unlocked_enable_lpm(dev); -diff -Naur linux-3.6.1/drivers/usb/core/otg_whitelist.h linux-rpi-3.6.y/drivers/usb/core/otg_whitelist.h ---- linux-3.6.1/drivers/usb/core/otg_whitelist.h 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/usb/core/otg_whitelist.h 2012-11-11 18:15:17.214857424 +0100 +diff -Naur linux-3.6.7/drivers/usb/core/otg_whitelist.h linux-3.6.7.patch/drivers/usb/core/otg_whitelist.h +--- linux-3.6.7/drivers/usb/core/otg_whitelist.h 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/core/otg_whitelist.h 2012-11-18 12:45:10.794337654 +0100 @@ -19,33 +19,82 @@ static struct usb_device_id whitelist_table [] = { @@ -25507,9 +30353,9 @@ diff -Naur linux-3.6.1/drivers/usb/core/otg_whitelist.h linux-rpi-3.6.y/drivers/ #endif } -diff -Naur linux-3.6.1/drivers/usb/gadget/file_storage.c linux-rpi-3.6.y/drivers/usb/gadget/file_storage.c ---- linux-3.6.1/drivers/usb/gadget/file_storage.c 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/usb/gadget/file_storage.c 2012-11-11 18:15:18.226877245 +0100 +diff -Naur linux-3.6.7/drivers/usb/gadget/file_storage.c linux-3.6.7.patch/drivers/usb/gadget/file_storage.c +--- linux-3.6.7/drivers/usb/gadget/file_storage.c 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/gadget/file_storage.c 2012-11-18 12:45:10.796337692 +0100 @@ -573,8 +573,37 @@ .iConfiguration = FSG_STRING_CONFIG, .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER, @@ -25637,9 +30483,9 @@ diff -Naur linux-3.6.1/drivers/usb/gadget/file_storage.c linux-rpi-3.6.y/drivers /* Allocate the request and buffer for endpoint 0 */ fsg->ep0req = req = usb_ep_alloc_request(fsg->ep0, GFP_KERNEL); if (!req) -diff -Naur linux-3.6.1/drivers/usb/gadget/Kconfig linux-rpi-3.6.y/drivers/usb/gadget/Kconfig ---- linux-3.6.1/drivers/usb/gadget/Kconfig 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/usb/gadget/Kconfig 2012-11-11 18:15:18.226877245 +0100 +diff -Naur linux-3.6.7/drivers/usb/gadget/Kconfig linux-3.6.7.patch/drivers/usb/gadget/Kconfig +--- linux-3.6.7/drivers/usb/gadget/Kconfig 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/gadget/Kconfig 2012-11-18 12:45:10.797337711 +0100 @@ -505,6 +505,12 @@ bool depends on USB_GADGET_DUALSPEED @@ -25653,9 +30499,9 @@ diff -Naur linux-3.6.1/drivers/usb/gadget/Kconfig linux-rpi-3.6.y/drivers/usb/ga # # USB Gadget Drivers # -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/changes.txt linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/changes.txt ---- linux-3.6.1/drivers/usb/host/dwc_common_port/changes.txt 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/changes.txt 2012-11-11 18:15:16.990853037 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/changes.txt linux-3.6.7.patch/drivers/usb/host/dwc_common_port/changes.txt +--- linux-3.6.7/drivers/usb/host/dwc_common_port/changes.txt 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/changes.txt 2012-11-18 12:45:10.798337730 +0100 @@ -0,0 +1,174 @@ + +dwc_read_reg32() and friends now take an additional parameter, a pointer to an @@ -25831,9 +30677,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/changes.txt linux-rpi-3. +A DWC_LIBMODULE #define has also been added. If this is not defined, then the +module code in dwc_common_linux.c is not compiled in. This allows linking the +library code directly into a driver module, instead of as a standalone module. -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/doc/doxygen.cfg linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/doc/doxygen.cfg ---- linux-3.6.1/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 2012-11-11 18:15:16.989853018 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/doc/doxygen.cfg linux-3.6.7.patch/drivers/usb/host/dwc_common_port/doc/doxygen.cfg +--- linux-3.6.7/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 2012-11-18 12:45:10.798337730 +0100 @@ -0,0 +1,270 @@ +# Doxyfile 1.4.5 + @@ -26105,9 +30951,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/doc/doxygen.cfg linux-rp +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_cc.c ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_cc.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_cc.c 2012-11-11 18:15:16.991853057 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_cc.c linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_cc.c +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_cc.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_cc.c 2012-11-18 12:45:10.799337749 +0100 @@ -0,0 +1,532 @@ +/* ========================================================================= + * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_cc.c $ @@ -26641,9 +31487,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-3.6.y +} + +#endif /* DWC_CCLIB */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_cc.h linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_cc.h ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_cc.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_cc.h 2012-11-11 18:15:16.993853095 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_cc.h linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_cc.h +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_cc.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_cc.h 2012-11-18 12:45:10.800337768 +0100 @@ -0,0 +1,225 @@ +/* ========================================================================= + * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_cc.h $ @@ -26870,9 +31716,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_cc.h linux-rpi-3.6.y + +#endif /* _DWC_CC_H_ */ + -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 2012-11-11 18:15:16.988852998 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 2012-11-18 12:45:10.802337808 +0100 @@ -0,0 +1,1308 @@ +#include "dwc_os.h" +#include "dwc_list.h" @@ -28182,9 +33028,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c linux- +{ + return wq->pending; +} -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_common_linux.c linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_common_linux.c ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_common_linux.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_common_linux.c 2012-11-11 18:15:16.987852978 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_common_linux.c linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_common_linux.c +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_common_linux.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_common_linux.c 2012-11-18 12:45:10.803337828 +0100 @@ -0,0 +1,1421 @@ +#include +#include @@ -29607,9 +34453,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_common_linux.c linux +MODULE_LICENSE ("GPL"); + +#endif /* DWC_LIBMODULE */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 2012-11-11 18:15:16.987852978 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 2012-11-18 12:45:10.805337868 +0100 @@ -0,0 +1,1275 @@ +#include "dwc_os.h" +#include "dwc_list.h" @@ -30886,9 +35732,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c linux- +{ + return wq->pending; +} -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_crypto.c linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_crypto.c ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_crypto.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_crypto.c 2012-11-11 18:15:16.987852978 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_crypto.c linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_crypto.c +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_crypto.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_crypto.c 2012-11-18 12:45:10.805337868 +0100 @@ -0,0 +1,308 @@ +/* ========================================================================= + * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_crypto.c $ @@ -31198,9 +36044,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_crypto.c linux-rpi-3 +} + +#endif /* DWC_CRYPTOLIB */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_crypto.h linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_crypto.h ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_crypto.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_crypto.h 2012-11-11 18:15:16.989853018 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_crypto.h linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_crypto.h +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_crypto.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_crypto.h 2012-11-18 12:45:10.806337888 +0100 @@ -0,0 +1,111 @@ +/* ========================================================================= + * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_crypto.h $ @@ -31313,9 +36159,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_crypto.h linux-rpi-3 +#endif + +#endif /* _DWC_CRYPTO_H_ */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_dh.c linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_dh.c ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_dh.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_dh.c 2012-11-11 18:15:16.993853095 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_dh.c linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_dh.c +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_dh.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_dh.c 2012-11-18 12:45:10.806337888 +0100 @@ -0,0 +1,291 @@ +/* ========================================================================= + * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_dh.c $ @@ -31608,9 +36454,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_dh.c linux-rpi-3.6.y +#endif /* !CONFIG_MACH_IPMATE */ + +#endif /* DWC_CRYPTOLIB */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_dh.h linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_dh.h ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_dh.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_dh.h 2012-11-11 18:15:16.988852998 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_dh.h linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_dh.h +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_dh.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_dh.h 2012-11-18 12:45:10.807337907 +0100 @@ -0,0 +1,106 @@ +/* ========================================================================= + * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_dh.h $ @@ -31718,9 +36564,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_dh.h linux-rpi-3.6.y +#endif + +#endif /* _DWC_DH_H_ */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_list.h ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_list.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_list.h 2012-11-11 18:15:16.993853095 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_list.h linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_list.h +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_list.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_list.h 2012-11-18 12:45:10.808337926 +0100 @@ -0,0 +1,594 @@ +/* $OpenBSD: queue.h,v 1.26 2004/05/04 16:59:32 grange Exp $ */ +/* $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $ */ @@ -32316,9 +37162,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-3.6 +#endif + +#endif /* _DWC_LIST_H_ */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_mem.c linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_mem.c ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_mem.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_mem.c 2012-11-11 18:15:16.990853037 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_mem.c linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_mem.c +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_mem.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_mem.c 2012-11-18 12:45:10.809337945 +0100 @@ -0,0 +1,245 @@ +/* Memory Debugging */ +#ifdef DWC_DEBUG_MEMORY @@ -32565,9 +37411,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_mem.c linux-rpi-3.6. +} + +#endif /* DWC_DEBUG_MEMORY */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_modpow.c linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_modpow.c ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_modpow.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_modpow.c 2012-11-11 18:15:16.994853115 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_modpow.c linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_modpow.c +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_modpow.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_modpow.c 2012-11-18 12:45:10.810337964 +0100 @@ -0,0 +1,636 @@ +/* Bignum routines adapted from PUTTY sources. PuTTY copyright notice follows. + * @@ -33205,9 +38051,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_modpow.c linux-rpi-3 +#endif /* CONFIG_MACH_IPMATE */ + +#endif /*DWC_CRYPTOLIB */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_modpow.h linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_modpow.h ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_modpow.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_modpow.h 2012-11-11 18:15:16.988852998 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_modpow.h linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_modpow.h +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_modpow.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_modpow.h 2012-11-18 12:45:10.810337964 +0100 @@ -0,0 +1,34 @@ +/* + * dwc_modpow.h @@ -33243,9 +38089,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_modpow.h linux-rpi-3 +#endif + +#endif /* _LINUX_BIGNUM_H */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_notifier.c ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_notifier.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_notifier.c 2012-11-11 18:15:16.990853037 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_notifier.c +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_notifier.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_notifier.c 2012-11-18 12:45:10.811337984 +0100 @@ -0,0 +1,319 @@ +#ifdef DWC_NOTIFYLIB + @@ -33566,9 +38412,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rpi +} + +#endif /* DWC_NOTIFYLIB */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_notifier.h linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_notifier.h ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_notifier.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_notifier.h 2012-11-11 18:15:16.992853076 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_notifier.h linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_notifier.h +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_notifier.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_notifier.h 2012-11-18 12:45:10.811337984 +0100 @@ -0,0 +1,122 @@ + +#ifndef __DWC_NOTIFIER_H__ @@ -33692,9 +38538,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_notifier.h linux-rpi +#endif + +#endif /* __DWC_NOTIFIER_H__ */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_os.h ---- linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_os.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/dwc_os.h 2012-11-11 18:15:16.991853057 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_os.h linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_os.h +--- linux-3.6.7/drivers/usb/host/dwc_common_port/dwc_os.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/dwc_os.h 2012-11-18 12:45:10.814338043 +0100 @@ -0,0 +1,1260 @@ +/* ========================================================================= + * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_os.h $ @@ -34956,9 +39802,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-3.6.y +#endif + +#endif /* _DWC_OS_H_ */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/Makefile linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/Makefile ---- linux-3.6.1/drivers/usb/host/dwc_common_port/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/Makefile 2012-11-11 18:15:16.993853095 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/Makefile linux-3.6.7.patch/drivers/usb/host/dwc_common_port/Makefile +--- linux-3.6.7/drivers/usb/host/dwc_common_port/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/Makefile 2012-11-18 12:45:10.814338043 +0100 @@ -0,0 +1,58 @@ +# +# Makefile for DWC_common library @@ -35018,9 +39864,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/Makefile linux-rpi-3.6.y + +clean: + rm -rf *.o *.ko .*.cmd *.mod.c .*.o.d .*.o.tmp modules.order Module.markers Module.symvers .tmp_versions/ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/Makefile.fbsd linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/Makefile.fbsd ---- linux-3.6.1/drivers/usb/host/dwc_common_port/Makefile.fbsd 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/Makefile.fbsd 2012-11-11 18:15:16.992853076 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/Makefile.fbsd linux-3.6.7.patch/drivers/usb/host/dwc_common_port/Makefile.fbsd +--- linux-3.6.7/drivers/usb/host/dwc_common_port/Makefile.fbsd 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/Makefile.fbsd 2012-11-18 12:45:10.814338043 +0100 @@ -0,0 +1,17 @@ +CFLAGS += -I/sys/i386/compile/GENERIC -I/sys/i386/include -I/usr/include +CFLAGS += -DDWC_FREEBSD @@ -35039,9 +39885,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/Makefile.fbsd linux-rpi- + dwc_common_fbsd.c dwc_mem.c + +.include -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/Makefile.linux linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/Makefile.linux ---- linux-3.6.1/drivers/usb/host/dwc_common_port/Makefile.linux 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/Makefile.linux 2012-11-11 18:15:16.990853037 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/Makefile.linux linux-3.6.7.patch/drivers/usb/host/dwc_common_port/Makefile.linux +--- linux-3.6.7/drivers/usb/host/dwc_common_port/Makefile.linux 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/Makefile.linux 2012-11-18 12:45:10.815338062 +0100 @@ -0,0 +1,49 @@ +# +# Makefile for DWC_common library @@ -35092,9 +39938,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/Makefile.linux linux-rpi + +clean: + rm -rf *.o *.ko .*.cmd *.mod.c .*.o.d .*.o.tmp modules.order Module.markers Module.symvers .tmp_versions/ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/usb.h linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/usb.h ---- linux-3.6.1/drivers/usb/host/dwc_common_port/usb.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_common_port/usb.h 2012-11-11 18:15:16.992853076 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_common_port/usb.h linux-3.6.7.patch/drivers/usb/host/dwc_common_port/usb.h +--- linux-3.6.7/drivers/usb/host/dwc_common_port/usb.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_common_port/usb.h 2012-11-18 12:45:10.816338082 +0100 @@ -0,0 +1,946 @@ +/* + * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -36042,9 +40888,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_common_port/usb.h linux-rpi-3.6.y/dr +#endif + +#endif /* _USB_H_ */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/doc/doxygen.cfg linux-rpi-3.6.y/drivers/usb/host/dwc_otg/doc/doxygen.cfg ---- linux-3.6.1/drivers/usb/host/dwc_otg/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/doc/doxygen.cfg 2012-11-11 18:15:17.040854016 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/doc/doxygen.cfg linux-3.6.7.patch/drivers/usb/host/dwc_otg/doc/doxygen.cfg +--- linux-3.6.7/drivers/usb/host/dwc_otg/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/doc/doxygen.cfg 2012-11-18 12:45:10.817338101 +0100 @@ -0,0 +1,224 @@ +# Doxyfile 1.3.9.1 + @@ -36270,9 +41116,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/doc/doxygen.cfg linux-rpi-3.6.y/ +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dummy_audio.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dummy_audio.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dummy_audio.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dummy_audio.c 2012-11-11 18:15:17.058854369 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dummy_audio.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dummy_audio.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dummy_audio.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dummy_audio.c 2012-11-18 12:45:10.819338140 +0100 @@ -0,0 +1,1575 @@ +/* + * zero.c -- Gadget Zero, for USB development @@ -37849,9 +42695,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dummy_audio.c linux-rpi-3.6.y/dr + remove_proc_entry("isoc_test", NULL); +} +module_exit (cleanup); -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_cfi_common.h linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_cfi_common.h ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_cfi_common.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_cfi_common.h 2012-11-11 18:15:17.041854036 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_cfi_common.h linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_cfi_common.h +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_cfi_common.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_cfi_common.h 2012-11-18 12:45:10.820338160 +0100 @@ -0,0 +1,142 @@ +/* ========================================================================== + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, @@ -37995,9 +42841,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_cfi_common.h linux-rpi-3.6.y +typedef struct cfi_string cfi_string_t; + +#endif -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_adp.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_adp.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_adp.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_adp.c 2012-11-11 18:15:17.054854290 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_adp.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_adp.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_adp.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_adp.c 2012-11-18 12:45:10.821338179 +0100 @@ -0,0 +1,854 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_adp.c $ @@ -38853,9 +43699,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_adp.c linux-rpi-3.6.y/dr +#endif + return 1; +} -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_adp.h linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_adp.h ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_adp.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_adp.h 2012-11-11 18:15:17.045854114 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_adp.h linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_adp.h +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_adp.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_adp.h 2012-11-18 12:45:10.822338199 +0100 @@ -0,0 +1,80 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_adp.h $ @@ -38937,9 +43783,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_adp.h linux-rpi-3.6.y/dr +extern int32_t dwc_otg_adp_handle_srp_intr(dwc_otg_core_if_t * core_if); + +#endif //__DWC_OTG_ADP_H__ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_attr.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_attr.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_attr.c 2012-11-11 18:15:17.057854349 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_attr.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_attr.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_attr.c 2012-11-18 12:45:10.823338218 +0100 @@ -0,0 +1,1210 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_attr.c $ @@ -40151,9 +44997,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-3.6.y/d + device_remove_file(&dev->dev, &dev_attr_sleep_status); +#endif +} -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_attr.h ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_attr.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_attr.h 2012-11-11 18:15:17.054854290 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_attr.h +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_attr.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_attr.h 2012-11-18 12:45:10.824338238 +0100 @@ -0,0 +1,89 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_attr.h $ @@ -40244,9 +45090,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-rpi-3.6.y/d +#endif + ); +#endif -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_cfi.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 2012-11-11 18:15:17.052854251 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_cfi.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 2012-11-18 12:45:10.826338277 +0100 @@ -0,0 +1,1876 @@ +/* ========================================================================== + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, @@ -42124,9 +46970,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-3.6.y/dr +} + +#endif //DWC_UTE_CFI -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_cfi.h ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 2012-11-11 18:15:17.018853586 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_cfi.h +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 2012-11-18 12:45:10.827338296 +0100 @@ -0,0 +1,320 @@ +/* ========================================================================== + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, @@ -42448,9 +47294,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-rpi-3.6.y/dr +int cfi_setup(struct dwc_otg_pcd *pcd, struct cfi_usb_ctrlrequest *ctrl); + +#endif /* (__DWC_OTG_CFI_H__) */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_cil.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_cil.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_cil.c 2012-11-11 18:15:17.056854329 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_cil.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_cil.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_cil.c 2012-11-18 12:45:10.836338472 +0100 @@ -0,0 +1,7151 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.c $ @@ -49603,9 +54449,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-3.6.y/dr + dwc_otg_pcd_start_srp_timer(core_if); + return; +} -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_cil.h ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_cil.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_cil.h 2012-11-11 18:15:17.041854036 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_cil.h +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_cil.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_cil.h 2012-11-18 12:45:10.839338530 +0100 @@ -0,0 +1,1464 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.h $ @@ -51071,9 +55917,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-3.6.y/dr +////////////////////////////////////////////////////////////////////// + +#endif -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 2012-11-11 18:15:17.033853879 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 2012-11-18 12:45:10.841338569 +0100 @@ -0,0 +1,1571 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil_intr.c $ @@ -52646,9 +57492,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-3.6 + + return retval; +} -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_core_if.h ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 2012-11-11 18:15:17.059854389 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_core_if.h +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 2012-11-18 12:45:10.842338589 +0100 @@ -0,0 +1,705 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_core_if.h $ @@ -53355,9 +58201,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-rpi-3.6. +/** @} */ + +#endif /* __DWC_CORE_IF_H__ */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_dbg.h ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 2012-11-11 18:15:17.046854134 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_dbg.h +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 2012-11-18 12:45:10.843338608 +0100 @@ -0,0 +1,117 @@ +/* ========================================================================== + * @@ -53476,9 +58322,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-rpi-3.6.y/dr + +#endif /*DEBUG*/ +#endif -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_driver.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_driver.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_driver.c 2012-11-11 18:15:17.042854055 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_driver.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_driver.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_driver.c 2012-11-18 12:45:10.845338648 +0100 @@ -0,0 +1,1732 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_driver.c $ @@ -55212,9 +60058,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-3.6.y + + +*/ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_driver.h ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_driver.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_driver.h 2012-11-11 18:15:17.033853879 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_driver.h +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_driver.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_driver.h 2012-11-18 12:45:10.846338667 +0100 @@ -0,0 +1,86 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_driver.h $ @@ -55302,9 +60148,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-rpi-3.6.y +#endif + +#endif -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_hcd.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 2012-11-11 18:15:17.060854408 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_hcd.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 2012-11-18 12:45:10.850338745 +0100 @@ -0,0 +1,3498 @@ + +/* ========================================================================== @@ -58804,9 +63650,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-3.6.y/dr +} + +#endif /* DWC_DEVICE_ONLY */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 2012-11-11 18:15:17.046854134 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 2012-11-18 12:45:10.852338784 +0100 @@ -0,0 +1,1132 @@ +/*========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_ddma.c $ @@ -59940,9 +64786,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c linux-rpi-3.6 +} + +#endif /* DWC_DEVICE_ONLY */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_hcd.h ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 2012-11-11 18:15:17.057854349 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_hcd.h +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 2012-11-18 12:45:10.853338804 +0100 @@ -0,0 +1,829 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd.h $ @@ -60773,9 +65619,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-3.6.y/dr +#endif +#endif +#endif /* DWC_DEVICE_ONLY */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 2012-11-11 18:15:17.059854389 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 2012-11-18 12:45:10.855338843 +0100 @@ -0,0 +1,417 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_if.h $ @@ -61194,9 +66040,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-rpi-3.6.y + +#endif /* __DWC_HCD_IF_H__ */ +#endif /* DWC_DEVICE_ONLY */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 2012-11-11 18:15:17.053854271 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 2012-11-18 12:45:10.858338901 +0100 @@ -0,0 +1,2246 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_intr.c $ @@ -63444,9 +68290,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-3.6 + return retval; +} +#endif /* DWC_DEVICE_ONLY */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 2012-11-11 18:15:17.040854016 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 2012-11-18 12:45:10.859338921 +0100 @@ -0,0 +1,938 @@ + +/* ========================================================================== @@ -64386,9 +69232,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-3. +} + +#endif /* DWC_DEVICE_ONLY */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 2012-11-11 18:15:17.044854094 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 2012-11-18 12:45:10.861338960 +0100 @@ -0,0 +1,957 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_queue.c $ @@ -65347,9 +70193,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-3. +} + +#endif /* DWC_DEVICE_ONLY */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c 2012-11-11 18:15:17.041854036 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c 2012-11-18 12:45:10.861338960 +0100 @@ -0,0 +1,113 @@ +#include "dwc_otg_regs.h" +#include "dwc_otg_dbg.h" @@ -65464,9 +70310,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c linux-rpi-3.6 + + return; +} -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h 2012-11-11 18:15:17.035853919 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h 2012-11-18 12:45:10.862338979 +0100 @@ -0,0 +1,36 @@ +#ifndef __DWC_OTG_MPHI_FIX_H__ +#define __DWC_OTG_MPHI_FIX_H__ @@ -65504,9 +70350,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h linux-rpi-3.6 +#endif + +#endif -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 2012-11-11 18:15:17.043854075 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 2012-11-18 12:45:10.862338979 +0100 @@ -0,0 +1,188 @@ +#ifndef _DWC_OS_DEP_H_ +#define _DWC_OS_DEP_H_ @@ -65696,9 +70542,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h linux-rpi-3.6.y + + +#endif /* _DWC_OS_DEP_H_ */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_pcd.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 2012-11-11 18:15:17.038853977 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_pcd.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 2012-11-18 12:45:10.865339038 +0100 @@ -0,0 +1,2708 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.c $ @@ -68408,9 +73254,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-3.6.y/dr +} + +#endif /* DWC_HOST_ONLY */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_pcd.h ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 2012-11-11 18:15:17.028853781 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_pcd.h +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 2012-11-18 12:45:10.867339077 +0100 @@ -0,0 +1,266 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.h $ @@ -68678,9 +73524,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi-3.6.y/dr +extern void do_test_mode(void *data); +#endif +#endif /* DWC_HOST_ONLY */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 2012-11-11 18:15:17.043854075 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 2012-11-18 12:45:10.868339096 +0100 @@ -0,0 +1,360 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_if.h $ @@ -69042,9 +73888,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-rpi-3.6.y +#endif /* __DWC_PCD_IF_H__ */ + +#endif /* DWC_HOST_ONLY */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 2012-11-11 18:15:17.045854114 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 2012-11-18 12:45:10.874339213 +0100 @@ -0,0 +1,5147 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_intr.c $ @@ -74193,9 +79039,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-3.6 +} + +#endif /* DWC_HOST_ONLY */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 2012-11-11 18:15:17.043854075 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 2012-11-18 12:45:10.876339252 +0100 @@ -0,0 +1,1374 @@ + /* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_linux.c $ @@ -75571,9 +80417,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-3. +EXPORT_SYMBOL(usb_gadget_unregister_driver); + +#endif /* DWC_HOST_ONLY */ -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_regs.h ---- linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_regs.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/dwc_otg_regs.h 2012-11-11 18:15:17.058854369 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_regs.h +--- linux-3.6.7/drivers/usb/host/dwc_otg/dwc_otg_regs.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/dwc_otg_regs.h 2012-11-18 12:45:10.879339311 +0100 @@ -0,0 +1,2550 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_regs.h $ @@ -78125,9 +82971,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-3.6.y/d +} gpwrdn_data_t; + +#endif -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/Makefile linux-rpi-3.6.y/drivers/usb/host/dwc_otg/Makefile ---- linux-3.6.1/drivers/usb/host/dwc_otg/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/Makefile 2012-11-11 18:15:17.054854290 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/Makefile linux-3.6.7.patch/drivers/usb/host/dwc_otg/Makefile +--- linux-3.6.7/drivers/usb/host/dwc_otg/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/Makefile 2012-11-18 12:45:10.880339330 +0100 @@ -0,0 +1,81 @@ +# +# Makefile for DWC_otg Highspeed USB controller driver @@ -78210,9 +83056,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/Makefile linux-rpi-3.6.y/drivers + rm -rf *.o *.ko .*cmd *.mod.c .tmp_versions Module.symvers + +endif -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux-rpi-3.6.y/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm ---- linux-3.6.1/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 2012-11-11 18:15:17.036853938 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux-3.6.7.patch/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm +--- linux-3.6.7/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 2012-11-18 12:45:10.880339330 +0100 @@ -0,0 +1,337 @@ +package dwc_otg_test; + @@ -78551,9 +83397,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux-rpi-3 +); + +1; -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/test/Makefile linux-rpi-3.6.y/drivers/usb/host/dwc_otg/test/Makefile ---- linux-3.6.1/drivers/usb/host/dwc_otg/test/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/test/Makefile 2012-11-11 18:15:17.036853938 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/test/Makefile linux-3.6.7.patch/drivers/usb/host/dwc_otg/test/Makefile +--- linux-3.6.7/drivers/usb/host/dwc_otg/test/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/test/Makefile 2012-11-18 12:45:10.881339350 +0100 @@ -0,0 +1,16 @@ + +PERL=/usr/bin/perl @@ -78571,9 +83417,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/test/Makefile linux-rpi-3.6.y/dr + else echo "=======> $$test, FAILED" ; \ + fi \ + done -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/test/test_mod_param.pl linux-rpi-3.6.y/drivers/usb/host/dwc_otg/test/test_mod_param.pl ---- linux-3.6.1/drivers/usb/host/dwc_otg/test/test_mod_param.pl 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/test/test_mod_param.pl 2012-11-11 18:15:17.037853958 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/test/test_mod_param.pl linux-3.6.7.patch/drivers/usb/host/dwc_otg/test/test_mod_param.pl +--- linux-3.6.7/drivers/usb/host/dwc_otg/test/test_mod_param.pl 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/test/test_mod_param.pl 2012-11-18 12:45:10.881339350 +0100 @@ -0,0 +1,133 @@ +#!/usr/bin/perl -w +# @@ -78708,9 +83554,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/test/test_mod_param.pl linux-rpi + +test_main(); +0; -diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-rpi-3.6.y/drivers/usb/host/dwc_otg/test/test_sysfs.pl ---- linux-3.6.1/drivers/usb/host/dwc_otg/test/test_sysfs.pl 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/usb/host/dwc_otg/test/test_sysfs.pl 2012-11-11 18:15:17.035853919 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-3.6.7.patch/drivers/usb/host/dwc_otg/test/test_sysfs.pl +--- linux-3.6.7/drivers/usb/host/dwc_otg/test/test_sysfs.pl 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/dwc_otg/test/test_sysfs.pl 2012-11-18 12:45:10.882339369 +0100 @@ -0,0 +1,193 @@ +#!/usr/bin/perl -w +# @@ -78905,9 +83751,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-rpi-3.6 + +test_main(); +0; -diff -Naur linux-3.6.1/drivers/usb/host/Kconfig linux-rpi-3.6.y/drivers/usb/host/Kconfig ---- linux-3.6.1/drivers/usb/host/Kconfig 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/usb/host/Kconfig 2012-11-11 18:15:17.123855642 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/Kconfig linux-3.6.7.patch/drivers/usb/host/Kconfig +--- linux-3.6.7/drivers/usb/host/Kconfig 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/Kconfig 2012-11-18 12:45:10.883339389 +0100 @@ -610,6 +610,19 @@ To compile this driver a module, choose M here: the module will be called "hwa-hc". @@ -78928,9 +83774,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/Kconfig linux-rpi-3.6.y/drivers/usb/host config USB_IMX21_HCD tristate "i.MX21 HCD support" depends on USB && ARM && ARCH_MXC -diff -Naur linux-3.6.1/drivers/usb/host/Makefile linux-rpi-3.6.y/drivers/usb/host/Makefile ---- linux-3.6.1/drivers/usb/host/Makefile 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/usb/host/Makefile 2012-11-11 18:15:17.011853448 +0100 +diff -Naur linux-3.6.7/drivers/usb/host/Makefile linux-3.6.7.patch/drivers/usb/host/Makefile +--- linux-3.6.7/drivers/usb/host/Makefile 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/host/Makefile 2012-11-18 12:45:10.883339389 +0100 @@ -37,6 +37,8 @@ obj-$(CONFIG_USB_R8A66597_HCD) += r8a66597-hcd.o obj-$(CONFIG_USB_ISP1760_HCD) += isp1760.o @@ -78940,9 +83786,9 @@ diff -Naur linux-3.6.1/drivers/usb/host/Makefile linux-rpi-3.6.y/drivers/usb/hos obj-$(CONFIG_USB_IMX21_HCD) += imx21-hcd.o obj-$(CONFIG_USB_FSL_MPH_DR_OF) += fsl-mph-dr-of.o obj-$(CONFIG_USB_OCTEON2_COMMON) += octeon2-common.o -diff -Naur linux-3.6.1/drivers/usb/Makefile linux-rpi-3.6.y/drivers/usb/Makefile ---- linux-3.6.1/drivers/usb/Makefile 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/usb/Makefile 2012-11-11 18:15:18.313878949 +0100 +diff -Naur linux-3.6.7/drivers/usb/Makefile linux-3.6.7.patch/drivers/usb/Makefile +--- linux-3.6.7/drivers/usb/Makefile 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/usb/Makefile 2012-11-18 12:45:10.884339408 +0100 @@ -25,6 +25,7 @@ obj-$(CONFIG_USB_R8A66597_HCD) += host/ obj-$(CONFIG_USB_HWA_HCD) += host/ @@ -78951,9 +83797,9 @@ diff -Naur linux-3.6.1/drivers/usb/Makefile linux-rpi-3.6.y/drivers/usb/Makefile obj-$(CONFIG_USB_IMX21_HCD) += host/ obj-$(CONFIG_USB_FSL_MPH_DR_OF) += host/ -diff -Naur linux-3.6.1/drivers/video/bcm2708_fb.c linux-rpi-3.6.y/drivers/video/bcm2708_fb.c ---- linux-3.6.1/drivers/video/bcm2708_fb.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/video/bcm2708_fb.c 2012-11-11 18:15:12.802771009 +0100 +diff -Naur linux-3.6.7/drivers/video/bcm2708_fb.c linux-3.6.7.patch/drivers/video/bcm2708_fb.c +--- linux-3.6.7/drivers/video/bcm2708_fb.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/video/bcm2708_fb.c 2012-11-18 12:45:10.885339428 +0100 @@ -0,0 +1,491 @@ +/* + * linux/drivers/video/bcm2708_fb.c @@ -79446,9 +84292,9 @@ diff -Naur linux-3.6.1/drivers/video/bcm2708_fb.c linux-rpi-3.6.y/drivers/video/ +MODULE_PARM_DESC(fbwidth, "Width of ARM Framebuffer"); +MODULE_PARM_DESC(fbheight, "Height of ARM Framebuffer"); +MODULE_PARM_DESC(fbdepth, "Bit depth of ARM Framebuffer"); -diff -Naur linux-3.6.1/drivers/video/Kconfig linux-rpi-3.6.y/drivers/video/Kconfig ---- linux-3.6.1/drivers/video/Kconfig 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/video/Kconfig 2012-11-11 18:15:14.248799331 +0100 +diff -Naur linux-3.6.7/drivers/video/Kconfig linux-3.6.7.patch/drivers/video/Kconfig +--- linux-3.6.7/drivers/video/Kconfig 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/video/Kconfig 2012-11-18 12:45:10.886339447 +0100 @@ -312,6 +312,20 @@ help Support the Permedia2 FIFO disconnect feature. @@ -79470,9 +84316,9 @@ diff -Naur linux-3.6.1/drivers/video/Kconfig linux-rpi-3.6.y/drivers/video/Kconf config FB_ARMCLCD tristate "ARM PrimeCell PL110 support" depends on FB && ARM && ARM_AMBA -diff -Naur linux-3.6.1/drivers/video/logo/logo_linux_clut224.ppm linux-rpi-3.6.y/drivers/video/logo/logo_linux_clut224.ppm ---- linux-3.6.1/drivers/video/logo/logo_linux_clut224.ppm 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/video/logo/logo_linux_clut224.ppm 2012-11-11 18:15:12.531765700 +0100 +diff -Naur linux-3.6.7/drivers/video/logo/logo_linux_clut224.ppm linux-3.6.7.patch/drivers/video/logo/logo_linux_clut224.ppm +--- linux-3.6.7/drivers/video/logo/logo_linux_clut224.ppm 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/video/logo/logo_linux_clut224.ppm 2012-11-18 12:45:10.890339525 +0100 @@ -1,1604 +1,883 @@ P3 -# Standard 224-color Linux logo @@ -81959,9 +86805,9 @@ diff -Naur linux-3.6.1/drivers/video/logo/logo_linux_clut224.ppm linux-rpi-3.6.y +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 -diff -Naur linux-3.6.1/drivers/video/Makefile linux-rpi-3.6.y/drivers/video/Makefile ---- linux-3.6.1/drivers/video/Makefile 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/video/Makefile 2012-11-11 18:15:13.771789989 +0100 +diff -Naur linux-3.6.7/drivers/video/Makefile linux-3.6.7.patch/drivers/video/Makefile +--- linux-3.6.7/drivers/video/Makefile 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/video/Makefile 2012-11-18 12:45:10.891339545 +0100 @@ -99,6 +99,7 @@ obj-$(CONFIG_FB_PVR2) += pvr2fb.o obj-$(CONFIG_FB_VOODOO1) += sstfb.o @@ -81970,9 +86816,9 @@ diff -Naur linux-3.6.1/drivers/video/Makefile linux-rpi-3.6.y/drivers/video/Make obj-$(CONFIG_FB_68328) += 68328fb.o obj-$(CONFIG_FB_GBE) += gbefb.o obj-$(CONFIG_FB_CIRRUS) += cirrusfb.o -diff -Naur linux-3.6.1/drivers/watchdog/bcm2708_wdog.c linux-rpi-3.6.y/drivers/watchdog/bcm2708_wdog.c ---- linux-3.6.1/drivers/watchdog/bcm2708_wdog.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/drivers/watchdog/bcm2708_wdog.c 2012-11-11 18:15:38.035265203 +0100 +diff -Naur linux-3.6.7/drivers/watchdog/bcm2708_wdog.c linux-3.6.7.patch/drivers/watchdog/bcm2708_wdog.c +--- linux-3.6.7/drivers/watchdog/bcm2708_wdog.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/drivers/watchdog/bcm2708_wdog.c 2012-11-18 12:45:10.910339915 +0100 @@ -0,0 +1,385 @@ +/* + * Broadcom BCM2708 watchdog driver. @@ -82359,9 +87205,9 @@ diff -Naur linux-3.6.1/drivers/watchdog/bcm2708_wdog.c linux-rpi-3.6.y/drivers/w +MODULE_ALIAS_MISCDEV(TEMP_MINOR); +MODULE_LICENSE("GPL"); + -diff -Naur linux-3.6.1/drivers/watchdog/Kconfig linux-rpi-3.6.y/drivers/watchdog/Kconfig ---- linux-3.6.1/drivers/watchdog/Kconfig 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/watchdog/Kconfig 2012-11-11 18:15:38.279269982 +0100 +diff -Naur linux-3.6.7/drivers/watchdog/Kconfig linux-3.6.7.patch/drivers/watchdog/Kconfig +--- linux-3.6.7/drivers/watchdog/Kconfig 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/watchdog/Kconfig 2012-11-18 12:45:10.911339935 +0100 @@ -352,6 +352,12 @@ To compile this driver as a module, choose M here: the module will be called imx2_wdt. @@ -82375,9 +87221,9 @@ diff -Naur linux-3.6.1/drivers/watchdog/Kconfig linux-rpi-3.6.y/drivers/watchdog # AVR32 Architecture config AT32AP700X_WDT -diff -Naur linux-3.6.1/drivers/watchdog/Makefile linux-rpi-3.6.y/drivers/watchdog/Makefile ---- linux-3.6.1/drivers/watchdog/Makefile 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/drivers/watchdog/Makefile 2012-11-11 18:15:38.249269395 +0100 +diff -Naur linux-3.6.7/drivers/watchdog/Makefile linux-3.6.7.patch/drivers/watchdog/Makefile +--- linux-3.6.7/drivers/watchdog/Makefile 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/drivers/watchdog/Makefile 2012-11-18 12:45:10.912339955 +0100 @@ -52,6 +52,7 @@ obj-$(CONFIG_NUC900_WATCHDOG) += nuc900_wdt.o obj-$(CONFIG_TS72XX_WATCHDOG) += ts72xx_wdt.o @@ -82386,10 +87232,9 @@ diff -Naur linux-3.6.1/drivers/watchdog/Makefile linux-rpi-3.6.y/drivers/watchdo # AVR32 Architecture obj-$(CONFIG_AT32AP700X_WDT) += at32ap700x_wdt.o -diff -Naur linux-3.6.1/.gitignore linux-rpi-3.6.y/.gitignore -diff -Naur linux-3.6.1/include/linux/broadcom/vc_cma.h linux-rpi-3.6.y/include/linux/broadcom/vc_cma.h ---- linux-3.6.1/include/linux/broadcom/vc_cma.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/include/linux/broadcom/vc_cma.h 2012-11-11 18:18:42.905881123 +0100 +diff -Naur linux-3.6.7/include/linux/broadcom/vc_cma.h linux-3.6.7.patch/include/linux/broadcom/vc_cma.h +--- linux-3.6.7/include/linux/broadcom/vc_cma.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/include/linux/broadcom/vc_cma.h 2012-11-18 12:45:10.930340306 +0100 @@ -0,0 +1,30 @@ +/***************************************************************************** +* Copyright 2012 Broadcom Corporation. All rights reserved. @@ -82421,9 +87266,9 @@ diff -Naur linux-3.6.1/include/linux/broadcom/vc_cma.h linux-rpi-3.6.y/include/l + +#endif /* VC_CMA_H */ + -diff -Naur linux-3.6.1/include/linux/mmc/host.h linux-rpi-3.6.y/include/linux/mmc/host.h ---- linux-3.6.1/include/linux/mmc/host.h 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/include/linux/mmc/host.h 2012-11-11 18:18:40.293830067 +0100 +diff -Naur linux-3.6.7/include/linux/mmc/host.h linux-3.6.7.patch/include/linux/mmc/host.h +--- linux-3.6.7/include/linux/mmc/host.h 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/include/linux/mmc/host.h 2012-11-18 12:45:10.931340325 +0100 @@ -257,6 +257,7 @@ #define MMC_CAP2_HC_ERASE_SZ (1 << 9) /* High-capacity erase size */ #define MMC_CAP2_CD_ACTIVE_HIGH (1 << 10) /* Card-detect signal active high */ @@ -82432,9 +87277,9 @@ diff -Naur linux-3.6.1/include/linux/mmc/host.h linux-rpi-3.6.y/include/linux/mm mmc_pm_flag_t pm_caps; /* supported pm features */ unsigned int power_notify_type; -diff -Naur linux-3.6.1/include/linux/mmc/sdhci.h linux-rpi-3.6.y/include/linux/mmc/sdhci.h ---- linux-3.6.1/include/linux/mmc/sdhci.h 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/include/linux/mmc/sdhci.h 2012-11-11 18:18:40.319830578 +0100 +diff -Naur linux-3.6.7/include/linux/mmc/sdhci.h linux-3.6.7.patch/include/linux/mmc/sdhci.h +--- linux-3.6.7/include/linux/mmc/sdhci.h 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/include/linux/mmc/sdhci.h 2012-11-18 12:45:10.931340325 +0100 @@ -93,6 +93,7 @@ #define SDHCI_QUIRK2_HOST_OFF_CARD_ON (1<<0) @@ -82459,9 +87304,9 @@ diff -Naur linux-3.6.1/include/linux/mmc/sdhci.h linux-rpi-3.6.y/include/linux/m struct mmc_data *data; /* Current data request */ unsigned int data_early:1; /* Data finished before cmd */ -diff -Naur linux-3.6.1/kernel/module.c linux-rpi-3.6.y/kernel/module.c ---- linux-3.6.1/kernel/module.c 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/kernel/module.c 2012-11-11 18:18:53.564089435 +0100 +diff -Naur linux-3.6.7/kernel/module.c linux-3.6.7.patch/kernel/module.c +--- linux-3.6.7/kernel/module.c 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/kernel/module.c 2012-11-18 12:45:10.933340363 +0100 @@ -2675,20 +2675,23 @@ memset(ptr, 0, mod->core_size); mod->module_core = ptr; @@ -82499,9 +87344,9 @@ diff -Naur linux-3.6.1/kernel/module.c linux-rpi-3.6.y/kernel/module.c /* Transfer each section which specifies SHF_ALLOC */ pr_debug("final section addresses:\n"); -diff -Naur linux-3.6.1/sound/arm/bcm2835.c linux-rpi-3.6.y/sound/arm/bcm2835.c ---- linux-3.6.1/sound/arm/bcm2835.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/sound/arm/bcm2835.c 2012-11-11 18:19:04.603305192 +0100 +diff -Naur linux-3.6.7/sound/arm/bcm2835.c linux-3.6.7.patch/sound/arm/bcm2835.c +--- linux-3.6.7/sound/arm/bcm2835.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/sound/arm/bcm2835.c 2012-11-18 12:45:10.934340382 +0100 @@ -0,0 +1,413 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -82916,9 +87761,9 @@ diff -Naur linux-3.6.1/sound/arm/bcm2835.c linux-rpi-3.6.y/sound/arm/bcm2835.c +MODULE_DESCRIPTION("Alsa driver for BCM2835 chip"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:bcm2835_alsa"); -diff -Naur linux-3.6.1/sound/arm/bcm2835-ctl.c linux-rpi-3.6.y/sound/arm/bcm2835-ctl.c ---- linux-3.6.1/sound/arm/bcm2835-ctl.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/sound/arm/bcm2835-ctl.c 2012-11-11 18:19:04.601305153 +0100 +diff -Naur linux-3.6.7/sound/arm/bcm2835-ctl.c linux-3.6.7.patch/sound/arm/bcm2835-ctl.c +--- linux-3.6.7/sound/arm/bcm2835-ctl.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/sound/arm/bcm2835-ctl.c 2012-11-18 12:45:10.934340382 +0100 @@ -0,0 +1,200 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -83120,9 +87965,9 @@ diff -Naur linux-3.6.1/sound/arm/bcm2835-ctl.c linux-rpi-3.6.y/sound/arm/bcm2835 + } + return 0; +} -diff -Naur linux-3.6.1/sound/arm/bcm2835.h linux-rpi-3.6.y/sound/arm/bcm2835.h ---- linux-3.6.1/sound/arm/bcm2835.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/sound/arm/bcm2835.h 2012-11-11 18:19:04.602305172 +0100 +diff -Naur linux-3.6.7/sound/arm/bcm2835.h linux-3.6.7.patch/sound/arm/bcm2835.h +--- linux-3.6.7/sound/arm/bcm2835.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/sound/arm/bcm2835.h 2012-11-18 12:45:10.935340401 +0100 @@ -0,0 +1,155 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -83279,9 +88124,9 @@ diff -Naur linux-3.6.1/sound/arm/bcm2835.h linux-rpi-3.6.y/sound/arm/bcm2835.h +void bcm2835_audio_flush_playback_buffers(bcm2835_alsa_stream_t * alsa_stream); + +#endif /* __SOUND_ARM_BCM2835_H */ -diff -Naur linux-3.6.1/sound/arm/bcm2835-pcm.c linux-rpi-3.6.y/sound/arm/bcm2835-pcm.c ---- linux-3.6.1/sound/arm/bcm2835-pcm.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/sound/arm/bcm2835-pcm.c 2012-11-11 18:19:04.597305071 +0100 +diff -Naur linux-3.6.7/sound/arm/bcm2835-pcm.c linux-3.6.7.patch/sound/arm/bcm2835-pcm.c +--- linux-3.6.7/sound/arm/bcm2835-pcm.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/sound/arm/bcm2835-pcm.c 2012-11-18 12:45:10.938340463 +0100 @@ -0,0 +1,408 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -83691,9 +88536,9 @@ diff -Naur linux-3.6.1/sound/arm/bcm2835-pcm.c linux-rpi-3.6.y/sound/arm/bcm2835 + + return 0; +} -diff -Naur linux-3.6.1/sound/arm/bcm2835-vchiq.c linux-rpi-3.6.y/sound/arm/bcm2835-vchiq.c ---- linux-3.6.1/sound/arm/bcm2835-vchiq.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/sound/arm/bcm2835-vchiq.c 2012-11-11 18:19:04.600305134 +0100 +diff -Naur linux-3.6.7/sound/arm/bcm2835-vchiq.c linux-3.6.7.patch/sound/arm/bcm2835-vchiq.c +--- linux-3.6.7/sound/arm/bcm2835-vchiq.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/sound/arm/bcm2835-vchiq.c 2012-11-18 12:45:10.939340483 +0100 @@ -0,0 +1,826 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -84521,9 +89366,9 @@ diff -Naur linux-3.6.1/sound/arm/bcm2835-vchiq.c linux-rpi-3.6.y/sound/arm/bcm28 + atomic_sub(count, &alsa_stream->retrieved); + return count; +} -diff -Naur linux-3.6.1/sound/arm/Kconfig linux-rpi-3.6.y/sound/arm/Kconfig ---- linux-3.6.1/sound/arm/Kconfig 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/sound/arm/Kconfig 2012-11-11 18:19:04.603305192 +0100 +diff -Naur linux-3.6.7/sound/arm/Kconfig linux-3.6.7.patch/sound/arm/Kconfig +--- linux-3.6.7/sound/arm/Kconfig 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/sound/arm/Kconfig 2012-11-18 12:45:10.939340483 +0100 @@ -39,5 +39,12 @@ Say Y or M if you want to support any AC97 codec attached to the PXA2xx AC97 interface. @@ -84537,9 +89382,9 @@ diff -Naur linux-3.6.1/sound/arm/Kconfig linux-rpi-3.6.y/sound/arm/Kconfig + endif # SND_ARM -diff -Naur linux-3.6.1/sound/arm/Makefile linux-rpi-3.6.y/sound/arm/Makefile ---- linux-3.6.1/sound/arm/Makefile 2012-10-07 17:41:28.000000000 +0200 -+++ linux-rpi-3.6.y/sound/arm/Makefile 2012-11-11 18:19:04.602305172 +0100 +diff -Naur linux-3.6.7/sound/arm/Makefile linux-3.6.7.patch/sound/arm/Makefile +--- linux-3.6.7/sound/arm/Makefile 2012-11-17 22:21:23.000000000 +0100 ++++ linux-3.6.7.patch/sound/arm/Makefile 2012-11-18 12:45:10.940340502 +0100 @@ -14,3 +14,9 @@ obj-$(CONFIG_SND_PXA2XX_AC97) += snd-pxa2xx-ac97.o @@ -84550,9 +89395,9 @@ diff -Naur linux-3.6.1/sound/arm/Makefile linux-rpi-3.6.y/sound/arm/Makefile + +EXTRA_CFLAGS += -Idrivers/misc/vc04_services -Idrivers/misc/vc04_services/interface/vcos/linuxkernel -D__VCCOREVER__=0x04000000 + -diff -Naur linux-3.6.1/sound/arm/vc_vchi_audioserv_defs.h linux-rpi-3.6.y/sound/arm/vc_vchi_audioserv_defs.h ---- linux-3.6.1/sound/arm/vc_vchi_audioserv_defs.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-3.6.y/sound/arm/vc_vchi_audioserv_defs.h 2012-11-11 18:19:04.582304777 +0100 +diff -Naur linux-3.6.7/sound/arm/vc_vchi_audioserv_defs.h linux-3.6.7.patch/sound/arm/vc_vchi_audioserv_defs.h +--- linux-3.6.7/sound/arm/vc_vchi_audioserv_defs.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.6.7.patch/sound/arm/vc_vchi_audioserv_defs.h 2012-11-18 12:45:10.940340502 +0100 @@ -0,0 +1,114 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. diff --git a/packages/linux/patches/linux-3.6.6-602-RPi_vc04-service_downgrade.patch b/packages/linux/patches/linux-3.6.7-602-RPi_vc04-service_downgrade.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-602-RPi_vc04-service_downgrade.patch rename to packages/linux/patches/linux-3.6.7-602-RPi_vc04-service_downgrade.patch diff --git a/packages/linux/patches/linux-3.6.6-603-RPi_add_LIRC_RPi_support.patch b/packages/linux/patches/linux-3.6.7-603-RPi_add_LIRC_RPi_support.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-603-RPi_add_LIRC_RPi_support.patch rename to packages/linux/patches/linux-3.6.7-603-RPi_add_LIRC_RPi_support.patch diff --git a/packages/linux/patches/linux-3.6.6-603-RPi_vc04-service_buildfix.patch b/packages/linux/patches/linux-3.6.7-603-RPi_vc04-service_buildfix.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-603-RPi_vc04-service_buildfix.patch rename to packages/linux/patches/linux-3.6.7-603-RPi_vc04-service_buildfix.patch diff --git a/packages/linux/patches/linux-3.6.6-700-jmicron_1_0_8_5.patch b/packages/linux/patches/linux-3.6.7-700-jmicron_1_0_8_5.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-700-jmicron_1_0_8_5.patch rename to packages/linux/patches/linux-3.6.7-700-jmicron_1_0_8_5.patch diff --git a/packages/linux/patches/linux-3.6.6-920-add_rtl8168.patch b/packages/linux/patches/linux-3.6.7-920-add_rtl8168.patch similarity index 100% rename from packages/linux/patches/linux-3.6.6-920-add_rtl8168.patch rename to packages/linux/patches/linux-3.6.7-920-add_rtl8168.patch