diff options
author | Kyle McMartin <kyle@redhat.com> | 2010-12-09 13:46:11 -0500 |
---|---|---|
committer | Kyle McMartin <kyle@redhat.com> | 2010-12-09 13:46:11 -0500 |
commit | 72b3729657a0c46f187e4a6c500b239a0e4d391a (patch) | |
tree | 47c746511fa3f4ef828d70bc2011f71d2cec86f1 | |
parent | 738764956426a09304f07623f75f711a013ef55a (diff) | |
download | kernel-72b3729657a0c46f187e4a6c500b239a0e4d391a.tar.gz kernel-72b3729657a0c46f187e4a6c500b239a0e4d391a.tar.xz kernel-72b3729657a0c46f187e4a6c500b239a0e4d391a.zip |
Revert "Merge branch 'kernel-git' strategy 'theirs'"
This reverts commit a3f45c4a9c4acadb3b0e3531a0d4d3649f711ebf, reversing
changes made to ee99a68c51ebd08409e45b63796f3c971c27e3d6.
43 files changed, 3428 insertions, 476 deletions
diff --git a/.gitignore b/.gitignore index 05a9df52c..8ee6321e0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,5 @@ patch-*.bz2 clog *.rpm kernel-2.6.*/ -/patch-2.6.37-rc5.bz2 -/patch-2.6.37-rc5-git2.bz2 +/patch-2.6.36.1.bz2 +/patch-2.6.36.2-rc1.bz2 @@ -77,13 +77,12 @@ debug: @perl -pi -e 's/# CONFIG_DEBUG_CFQ_IOSCHED is not set/CONFIG_DEBUG_CFQ_IOSCHED=y/' config-nodebug @perl -pi -e 's/# CONFIG_DRBD_FAULT_INJECTION is not set/CONFIG_DRBD_FAULT_INJECTION=y/' config-nodebug @perl -pi -e 's/# CONFIG_ATH_DEBUG is not set/CONFIG_ATH_DEBUG=y/' config-nodebug - @perl -pi -e 's/# CONFIG_CARL9170_DEBUGFS is not set/CONFIG_CARL9170_DEBUGFS=y/' config-nodebug @perl -pi -e 's/# CONFIG_IWLWIFI_DEVICE_TRACING is not set/CONFIG_IWLWIFI_DEVICE_TRACING=y/' config-nodebug @perl -pi -e 's/# CONFIG_DEBUG_OBJECTS_WORK is not set/CONFIG_DEBUG_OBJECTS_WORK=y/' config-nodebug @perl -pi -e 's/# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set/CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y/' config-nodebug @perl -pi -e 's/# CONFIG_DMADEVICES_DEBUG is not set/CONFIG_DMADEVICES_DEBUG=y/' config-nodebug @perl -pi -e 's/# CONFIG_DMADEVICES_VDEBUG is not set/CONFIG_DMADEVICES_VDEBUG=y/' config-nodebug - @perl -pi -e 's/# CONFIG_CEPH_LIB_PRETTYDEBUG is not set/CONFIG_CEPH_LIB_PRETTYDEBUG=y/' config-nodebug + @perl -pi -e 's/# CONFIG_CEPH_FS_PRETTYDEBUG is not set/CONFIG_CEPH_FS_PRETTYDEBUG=y/' config-nodebug @perl -pi -e 's/# CONFIG_QUOTA_DEBUG is not set/CONFIG_QUOTA_DEBUG=y/' config-nodebug @perl -pi -e 's/# CONFIG_KGDB_KDB is not set/CONFIG_KGDB_KDB=y/' config-nodebug @perl -pi -e 's/# CONFIG_KDB_KEYBOARD is not set/CONFIG_KDB_KEYBOARD=y/' config-nodebug @@ -91,8 +90,6 @@ debug: @perl -pi -e 's/# CONFIG_DEBUG_PER_CPU_MAPS is not set/CONFIG_DEBUG_PER_CPU_MAPS=y/' config-nodebug @perl -pi -e 's/CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y/# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set/' config-nodebug #@perl -pi -e 's/# CONFIG_PCI_DEFAULT_USE_CRS is not set/CONFIG_PCI_DEFAULT_USE_CRS=y/' config-nodebug - @perl -pi -e 's/# CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER is not set/CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y/' config-nodebug - @perl -pi -e 's/# CONFIG_TEST_LIST_SORT is not set/CONFIG_TEST_LIST_SORT=y/' config-nodebug @# just in case we're going from extremedebug -> debug @perl -pi -e 's/CONFIG_DEBUG_PAGEALLOC=y/# CONFIG_DEBUG_PAGEALLOC is not set/' config-nodebug @@ -154,13 +151,12 @@ release: @perl -pi -e 's/CONFIG_DEBUG_CFQ_IOSCHED=y/# CONFIG_DEBUG_CFQ_IOSCHED is not set/' config-nodebug @perl -pi -e 's/CONFIG_DRBD_FAULT_INJECTION=y/# CONFIG_DRBD_FAULT_INJECTION is not set/' config-nodebug @perl -pi -e 's/CONFIG_ATH_DEBUG=y/# CONFIG_ATH_DEBUG is not set/' config-nodebug - @perl -pi -e 's/CONFIG_CARL9170_DEBUGFS=y/# CONFIG_CARL9170_DEBUGFS is not set/' config-nodebug @perl -pi -e 's/CONFIG_IWLWIFI_DEVICE_TRACING=y/# CONFIG_IWLWIFI_DEVICE_TRACING is not set/' config-nodebug @perl -pi -e 's/CONFIG_DEBUG_OBJECTS_WORK=y/# CONFIG_DEBUG_OBJECTS_WORK is not set/' config-nodebug @perl -pi -e 's/CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y/# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set/' config-nodebug @perl -pi -e 's/CONFIG_DMADEVICES_DEBUG=y/# CONFIG_DMADEVICES_DEBUG is not set/' config-nodebug @perl -pi -e 's/CONFIG_DMADEVICES_VDEBUG=y/# CONFIG_DMADEVICES_VDEBUG is not set/' config-nodebug - @perl -pi -e 's/CONFIG_CEPH_LIB_PRETTYDEBUG=y/# CONFIG_CEPH_LIB_PRETTYDEBUG is not set/' config-nodebug + @perl -pi -e 's/CONFIG_CEPH_FS_PRETTYDEBUG=y/# CONFIG_CEPH_FS_PRETTYDEBUG is not set/' config-nodebug @perl -pi -e 's/CONFIG_QUOTA_DEBUG=y/# CONFIG_QUOTA_DEBUG is not set/' config-nodebug @perl -pi -e 's/CONFIG_CPU_NOTIFIER_ERROR_INJECT=m/# CONFIG_CPU_NOTIFIER_ERROR_INJECT is not set/' config-nodebug #@perl -pi -e 's/CONFIG_KGDB_KDB=y/# CONFIG_KGDB_KDB is not set/' config-nodebug @@ -168,8 +164,6 @@ release: @perl -pi -e 's/CONFIG_DEBUG_PER_CPU_MAPS=y/# CONFIG_DEBUG_PER_CPU_MAPS is not set/' config-nodebug @perl -pi -e 's/# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set/CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y/' config-nodebug #@perl -pi -e 's/CONFIG_PCI_DEFAULT_USE_CRS=y/# CONFIG_PCI_DEFAULT_USE_CRS is not set/' config-nodebug - @perl -pi -e 's/CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y/# CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER is not set/' config-nodebug - @perl -pi -e 's/CONFIG_TEST_LIST_SORT=y/# CONFIG_TEST_LIST_SORT is not set/' config-nodebug @perl -pi -e 's/CONFIG_DEBUG_PAGEALLOC=y/# CONFIG_DEBUG_PAGEALLOC is not set/' config-debug @perl -pi -e 's/CONFIG_DEBUG_PAGEALLOC=y/# CONFIG_DEBUG_PAGEALLOC is not set/' config-nodebug diff --git a/acpi-ec-add-delay-before-write.patch b/acpi-ec-add-delay-before-write.patch index f1cb50817..af49cccbd 100644 --- a/acpi-ec-add-delay-before-write.patch +++ b/acpi-ec-add-delay-before-write.patch @@ -23,7 +23,7 @@ index 27e0b92..09fbb69 100644 pr_debug(PREFIX "controller reset, restart transaction\n"); spin_lock_irqsave(&ec->curr_lock, flags); start_transaction(ec); -@@ -271,15 +272,24 @@ static int ec_check_ibf0(struct acpi_ec *ec) +@@ -271,15 +272,25 @@ static int ec_check_ibf0(struct acpi_ec *ec) return (status & ACPI_EC_FLAG_IBF) == 0; } @@ -38,7 +38,8 @@ index 27e0b92..09fbb69 100644 + static int ec_wait_ibf0(struct acpi_ec *ec) { - unsigned long delay = jiffies + msecs_to_jiffies(ec_delay); ++ + unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY); /* interrupt wait manually if GPE mode is not active */ while (time_before(jiffies, delay)) if (wait_event_timeout(ec->wait, ec_check_ibf0(ec), diff --git a/acpi-update-battery-information-on-notification-0x81.patch b/acpi-update-battery-information-on-notification-0x81.patch index 3704b054d..3a8d619ce 100644 --- a/acpi-update-battery-information-on-notification-0x81.patch +++ b/acpi-update-battery-information-on-notification-0x81.patch @@ -56,9 +56,9 @@ index 95649d3..2a774a8 100644 } @@ -914,7 +923,8 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event) - if (!battery) - return; + #ifdef CONFIG_ACPI_SYSFS_POWER old = battery->bat.dev; + #endif - acpi_battery_update(battery); + acpi_battery_update(battery, (event == ACPI_BATTERY_NOTIFY_INFO ? true + : false)); diff --git a/btusb-macbookpro-6-2.patch b/btusb-macbookpro-6-2.patch new file mode 100644 index 000000000..d65a30960 --- /dev/null +++ b/btusb-macbookpro-6-2.patch @@ -0,0 +1,41 @@ +From kernel-bounces@lists.fedoraproject.org Fri Sep 17 17:09:15 2010 +From: Will Woods <wwoods@redhat.com> +To: Marcel Holtmann <marcel@holtmann.org> +Subject: [PATCH 2/2] bluetooth: add support for controller in MacBookPro6,2 +Date: Fri, 17 Sep 2010 17:09:21 -0400 + +Once again the device class is ff(vend.) instead of e0(wlcon). + +output from 'usb-devices': +T: Bus=01 Lev=03 Prnt=03 Port=02 Cnt=03 Dev#= 8 Spd=12 MxCh= 0 +D: Ver= 2.00 Cls=ff(vend.) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 +P: Vendor=05ac ProdID=8218 Rev=00.22 +S: Manufacturer=Apple Inc. +S: Product=Bluetooth USB Host Controller +C: #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=0mA +I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=01 Prot=01 Driver=(none) +I: If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) +I: If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +I: If#= 3 Alt= 0 #EPs= 0 Cls=fe(app. ) Sub=01 Prot=01 Driver=(none) + +Signed-off-by: Will Woods <wwoods@redhat.com> +--- + drivers/bluetooth/btusb.c | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index eac44e4..320e798 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -65,6 +65,9 @@ static struct usb_device_id btusb_table[] = { + /* Apple iMac11,1 */ + { USB_DEVICE(0x05ac, 0x8215) }, + ++ /* Apple MacBookPro6,2 */ ++ { USB_DEVICE(0x05ac, 0x8218) }, ++ + /* AVM BlueFRITZ! USB v2.0 */ + { USB_DEVICE(0x057c, 0x3800) }, + +-- +1.7.2.3 diff --git a/btusb-macbookpro-7-1.patch b/btusb-macbookpro-7-1.patch new file mode 100644 index 000000000..3e07dd583 --- /dev/null +++ b/btusb-macbookpro-7-1.patch @@ -0,0 +1,42 @@ +From kernel-bounces@lists.fedoraproject.org Fri Sep 17 17:09:18 2010 +From: Will Woods <wwoods@redhat.com> +To: Marcel Holtmann <marcel@holtmann.org> +Subject: [PATCH 1/2] bluetooth: add support for controller in MacBookPro7,1 +Date: Fri, 17 Sep 2010 17:09:20 -0400 + +As with iMac11,1 the device class is ff(vend.) instead of e0(wlcon). + +output from 'usb-devices': +T: Bus=04 Lev=02 Prnt=04 Port=00 Cnt=01 Dev#= 5 Spd=12 MxCh= 0 +D: Ver= 2.00 Cls=ff(vend.) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 +P: Vendor=05ac ProdID=8213 Rev=01.86 +S: Manufacturer=Apple Inc. +S: Product=Bluetooth USB Host Controller +S: SerialNumber=58B0359C28ED +C: #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=0mA +I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb +I: If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +I: If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) +I: If#= 3 Alt= 0 #EPs= 0 Cls=fe(app. ) Sub=01 Prot=00 Driver=(none) + +Signed-off-by: Will Woods <wwoods@redhat.com> +--- + drivers/bluetooth/btusb.c | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index d22ce3c..eac44e4 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -59,6 +59,9 @@ static struct usb_device_id btusb_table[] = { + /* Generic Bluetooth USB device */ + { USB_DEVICE_INFO(0xe0, 0x01, 0x01) }, + ++ /* Apple MacBookPro7,1 */ ++ { USB_DEVICE(0x05ac, 0x8213) }, ++ + /* Apple iMac11,1 */ + { USB_DEVICE(0x05ac, 0x8215) }, + +-- +1.7.2.3 diff --git a/config-arm b/config-arm index 22335ef40..8d7e46a49 100644 --- a/config-arm +++ b/config-arm @@ -122,10 +122,3 @@ CONFIG_AUTO_ZRELADDR=y # CONFIG_DEPRECATED_PARAM_STRUCT is not set # CONFIG_ARM_SP805_WATCHDOG is not set - -CONFIG_PM_OPP=y - -CONFIG_SECCOMP=y -CONFIG_STRICT_DEVMEM=y - -# CONFIG_AMBA_PL08X is not set diff --git a/config-debug b/config-debug index 5366a8461..441445364 100644 --- a/config-debug +++ b/config-debug @@ -74,7 +74,6 @@ CONFIG_DEBUG_CFQ_IOSCHED=y CONFIG_DRBD_FAULT_INJECTION=y CONFIG_ATH_DEBUG=y -CONFIG_CARL9170_DEBUGFS=y CONFIG_IWLWIFI_DEVICE_TRACING=y CONFIG_DEBUG_OBJECTS_WORK=y @@ -85,7 +84,7 @@ CONFIG_DMADEVICES_VDEBUG=y CONFIG_PM_ADVANCED_DEBUG=y -CONFIG_CEPH_LIB_PRETTYDEBUG=y +CONFIG_CEPH_FS_PRETTYDEBUG=y CONFIG_QUOTA_DEBUG=y # CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set @@ -94,6 +93,3 @@ CONFIG_PCI_DEFAULT_USE_CRS=y CONFIG_KGDB_KDB=y CONFIG_KDB_KEYBOARD=y - -CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y -CONFIG_TEST_LIST_SORT=y diff --git a/config-generic b/config-generic index 492df86ec..28597be1f 100644 --- a/config-generic +++ b/config-generic @@ -119,13 +119,12 @@ CONFIG_PCMCIA_IOCTL=y CONFIG_PCCARD=y CONFIG_MMC=m +CONFIG_MMC_BLOCK_BOUNCE=y CONFIG_SDIO_UART=m # CONFIG_MMC_TEST is not set # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_UNSAFE_RESUME is not set CONFIG_MMC_BLOCK=m -CONFIG_MMC_BLOCK_MINORS=8 -CONFIG_MMC_BLOCK_BOUNCE=y CONFIG_MMC_SDHCI=m CONFIG_MMC_SDHCI_PCI=m CONFIG_MMC_SDRICOH_CS=m @@ -135,7 +134,6 @@ CONFIG_MMC_VIA_SDMMC=m CONFIG_MMC_SDHCI_PLTFM=m CONFIG_MMC_CB710=m CONFIG_MMC_RICOH_MMC=y -CONFIG_MMC_USHC=m CONFIG_CB710_CORE=m # CONFIG_CB710_DEBUG is not set @@ -156,7 +154,6 @@ CONFIG_INFINIBAND_AMSO1100=m # CONFIG_INFINIBAND_AMSO1100_DEBUG is not set CONFIG_INFINIBAND_CXGB3=m CONFIG_INFINIBAND_CXGB4=m -CONFIG_SCSI_CXGB4_ISCSI=m # CONFIG_INFINIBAND_CXGB3_DEBUG is not set CONFIG_MLX4_INFINIBAND=m CONFIG_INFINIBAND_NES=m @@ -368,7 +365,6 @@ CONFIG_BLK_DEV_DELKIN=m CONFIG_LBDAF=y CONFIG_BLK_DEV_BSG=y CONFIG_BLK_DEV_INTEGRITY=y -CONFIG_BLK_DEV_THROTTLING=y # @@ -763,7 +759,6 @@ CONFIG_IP_ROUTE_VERBOSE=y CONFIG_IP_NF_SECURITY=m # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=m -CONFIG_NET_IPGRE_DEMUX=m CONFIG_NET_IPGRE=m CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y @@ -802,7 +797,6 @@ CONFIG_IP_VS_SH=m CONFIG_IP_VS_SED=m CONFIG_IP_VS_NQ=m CONFIG_IP_VS_FTP=m -CONFIG_IP_VS_PE_SIP=m CONFIG_IPV6=m CONFIG_IPV6_PRIVACY=y @@ -1106,7 +1100,6 @@ CONFIG_NET_ACT_NAT=m CONFIG_NET_ACT_PEDIT=m CONFIG_NET_ACT_POLICE=m CONFIG_NET_ACT_SIMP=m -CONFIG_NET_ACT_CSUM=m CONFIG_DCB=y @@ -1157,7 +1150,6 @@ CONFIG_ATM_FORE200E_TX_RETRY=16 CONFIG_ATM_FORE200E_DEBUG=0 CONFIG_ATM_HE=m -CONFIG_PPTP=m CONFIG_PPPOATM=m CONFIG_PPPOL2TP=m CONFIG_ATM_NICSTAR=m @@ -1203,7 +1195,6 @@ CONFIG_FIXED_PHY=y CONFIG_MDIO_BITBANG=m CONFIG_NATIONAL_PHY=m CONFIG_ICPLUS_PHY=m -CONFIG_BCM63XX_PHY=m CONFIG_LSI_ET1011C_PHY=m CONFIG_LXT_PHY=m CONFIG_MARVELL_PHY=m @@ -1221,12 +1212,6 @@ CONFIG_NET_VENDOR_3COM=y CONFIG_VORTEX=m CONFIG_TYPHOON=m CONFIG_DNET=m -CONFIG_STMMAC_ETH=m -# CONFIG_STMMAC_DA is not set -# CONFIG_STMMAC_DUAL_MAC is not set -# CONFIG_STMMAC_TIMER is not set - -# CONFIG_PCH_GBE is not set # # Tulip family network device support @@ -1344,7 +1329,6 @@ CONFIG_MLX4_EN=m # CONFIG_MLX4_DEBUG is not set CONFIG_QLCNIC=m CONFIG_QLGE=m -CONFIG_BNA=m CONFIG_SFC=m CONFIG_SFC_MTD=y CONFIG_BE2NET=m @@ -1424,9 +1408,6 @@ CONFIG_ATH9K=m CONFIG_ATH9K_DEBUGFS=y CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set -CONFIG_ATH9K_RATE_CONTROL=y -CONFIG_CARL9170=m -CONFIG_CARL9170_LEDS=y CONFIG_AT76C50X_USB=m CONFIG_AIRO=m CONFIG_AIRO_CS=m @@ -1481,7 +1462,6 @@ CONFIG_IWL4965=y CONFIG_IWL5000=y CONFIG_IWL3945=m CONFIG_IWL3945_SPECTRUM_MEASUREMENT=y -# CONFIG_IWLWIFI_DEBUG_EXPERIMENTAL_UCODE is not set CONFIG_IWM=m # CONFIG_IWM_DEBUG is not set # CONFIG_IWM_TRACING is not set @@ -1582,8 +1562,6 @@ CONFIG_CAN_EMS_USB=m CONFIG_CAN_ESD_USB2=m CONFIG_CAN_KVASER_PCI=m CONFIG_CAN_PLX_PCI=m -CONFIG_CAN_TSCAN1=m -CONFIG_PCH_CAN=m CONFIG_NETROM=m CONFIG_ROSE=m CONFIG_MKISS=m @@ -1822,7 +1800,6 @@ CONFIG_INPUT_TABLET=y CONFIG_TABLET_USB_ACECAD=m CONFIG_TABLET_USB_AIPTEK=m CONFIG_TABLET_USB_GTCO=m -CONFIG_TABLET_USB_HANWANG=m CONFIG_TABLET_USB_KBTAB=m CONFIG_TABLET_USB_WACOM=m @@ -1846,7 +1823,6 @@ CONFIG_SERIO_I8042=y CONFIG_SERIO_SERPORT=y CONFIG_SERIO_RAW=m CONFIG_SERIO_ALTERA_PS2=m -# CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_CT82C710 is not set # CONFIG_SERIO_PARKBD is not set @@ -1940,7 +1916,6 @@ CONFIG_TOUCHSCREEN_USB_E2I=y CONFIG_TOUCHSCREEN_USB_COMPOSITE=m # CONFIG_TOUCHSCREEN_WM97XX is not set CONFIG_TOUCHSCREEN_W90X900=m -# CONFIG_TOUCHSCREEN_BU21013 is not set CONFIG_INPUT_MISC=y CONFIG_INPUT_PCSPKR=m @@ -2066,7 +2041,6 @@ CONFIG_I2C_ALGOPCA=m # CONFIG_I2C_I801 is not set # CONFIG_I2C_ISCH is not set # CONFIG_I2C_NFORCE2_S4985 is not set -# CONFIG_I2C_INTEL_MID is not set CONFIG_EEPROM_AT24=m CONFIG_EEPROM_LEGACY=m @@ -2161,11 +2135,6 @@ CONFIG_SENSORS_SMSC47M192=m CONFIG_SENSORS_SMSC47B397=m CONFIG_SENSORS_THMC50=m CONFIG_SENSORS_TMP401=m -CONFIG_APDS9802ALS=m -CONFIG_ISL29020=m -CONFIG_ISL29003=m -CONFIG_SENSORS_BH1770=m -CONFIG_SENSORS_APDS990X=m CONFIG_SENSORS_TSL2550=m CONFIG_SENSORS_VIA686A=m CONFIG_SENSORS_VIA_CPUTEMP=m @@ -2190,18 +2159,13 @@ CONFIG_SENSORS_ADT7411=m CONFIG_SENSORS_ASC7621=m CONFIG_SENSORS_EMC1403=m CONFIG_SENSORS_TMP102=m -CONFIG_SENSORS_LTC4261=m # CONFIG_SENSORS_BH1780 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_EMC2103 is not set -# CONFIG_SENSORS_GPIO_FAN is not set -CONFIG_SENSORS_W83795=m -# CONFIG_SENSORS_W83795_FANCTRL is not set # CONFIG_HMC6352 is not set # CONFIG_BMP085 is not set -# CONFIG_PCH_PHUB is not set CONFIG_W1=m CONFIG_W1_CON=y @@ -2340,7 +2304,6 @@ CONFIG_AGP_VIA=y CONFIG_AGP_EFFICEON=y CONFIG_VGA_ARB=y CONFIG_VGA_ARB_MAX_GPUS=16 -CONFIG_STUB_POULSBO=m CONFIG_DRM=m CONFIG_DRM_TDFX=m CONFIG_DRM_R128=m @@ -2399,8 +2362,7 @@ CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_BT848=m CONFIG_VIDEO_BT848_DVB=y CONFIG_VIDEO_BWQCAM=m -CONFIG_VIDEO_SR030PC30=m -CONFIG_VIDEO_CAFE_CCIC=m +# CONFIG_VIDEO_CAFE_CCIC is not set # CONFIG_VIDEO_CPIA is not set CONFIG_VIDEO_CPIA2=m CONFIG_VIDEO_CQCAM=m @@ -2432,7 +2394,6 @@ CONFIG_VIDEO_SAA6588=m CONFIG_VIDEO_SAA7134=m CONFIG_VIDEO_SAA7134_ALSA=m CONFIG_VIDEO_SAA7134_DVB=m -CONFIG_VIDEO_SAA7134_RC=y CONFIG_VIDEO_STRADIS=m CONFIG_VIDEO_USBVISION=m CONFIG_VIDEO_W9966=m @@ -2475,7 +2436,6 @@ CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m CONFIG_MEDIA_TUNER_MC44S803=m CONFIG_MEDIA_TUNER_MAX2165=m -CONFIG_MEDIA_TUNER_TDA18218=m # # Digital Video Broadcasting Devices @@ -2515,8 +2475,6 @@ CONFIG_DVB_SP8870=m CONFIG_DVB_SP887X=m CONFIG_DVB_CX22700=m CONFIG_DVB_CX22702=m -CONFIG_DVB_S5H1432=m -CONFIG_DVB_IX2505V=m CONFIG_DVB_L64781=m CONFIG_DVB_NXT6000=m CONFIG_DVB_MT352=m @@ -2621,7 +2579,6 @@ CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_VP702X=m CONFIG_DVB_USB_VP7045=m CONFIG_DVB_USB_AZ6027=m -CONFIG_DVB_USB_LME2510=m CONFIG_DVB_PT1=m @@ -2643,11 +2600,9 @@ CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_SONY_DECODER=m -CONFIG_IR_RC5_SZ_DECODER=m CONFIG_IR_LIRC_CODEC=m CONFIG_IR_IMON=m CONFIG_IR_MCEUSB=m -CONFIG_IR_NUVOTON=m CONFIG_V4L_MEM2MEM_DRIVERS=y # CONFIG_VIDEO_MEM2MEM_TESTDEV is not set @@ -2792,7 +2747,6 @@ CONFIG_SND_DYNAMIC_MINORS=y # Generic devices # CONFIG_SND_DUMMY=m -CONFIG_SND_ALOOP=m CONFIG_SND_VIRMIDI=m CONFIG_SND_MTPAV=m CONFIG_SND_MTS64=m @@ -2811,8 +2765,6 @@ CONFIG_SND_AD1889=m # CONFIG_SND_WAVEFRONT is not set # CONFIG_SND_MSND_PINNACLE is not set # CONFIG_SND_MSND_CLASSIC is not set -# CONFIG_SND_AZT1605 is not set -# CONFIG_SND_AZT2316 is not set # # PCI devices @@ -2867,7 +2819,6 @@ CONFIG_SND_HDA_CODEC_CMEDIA=y CONFIG_SND_HDA_CODEC_INTELHDMI=y CONFIG_SND_HDA_CODEC_SI3054=y CONFIG_SND_HDA_CODEC_NVHDMI=y -CONFIG_SND_HDA_CODEC_HDMI=y CONFIG_SND_HDA_GENERIC=y CONFIG_SND_HDA_POWER_SAVE=y CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0 @@ -2985,8 +2936,6 @@ CONFIG_USB_STORAGE_ONETOUCH=y CONFIG_USB_STORAGE_ALAUDA=y CONFIG_USB_STORAGE_KARMA=y # CONFIG_USB_LIBUSUAL is not set -CONFIG_USB_UAS=m - # # USB Human Interface Devices (HID) @@ -3000,7 +2949,6 @@ CONFIG_HID=m CONFIG_HIDRAW=y CONFIG_HID_PID=y CONFIG_LOGITECH_FF=y -CONFIG_LOGIWII_FF=y CONFIG_LOGIRUMBLEPAD2_FF=y CONFIG_PANTHERLORD_FF=y CONFIG_THRUSTMASTER_FF=y @@ -3042,9 +2990,7 @@ CONFIG_HID_ZEROPLUS=m CONFIG_HID_ZYDACRON=m CONFIG_HID_ACRUX_FF=m CONFIG_HID_ELECOM=m -CONFIG_HID_UCLOGIC=m -CONFIG_HID_WALTOP=m -CONFIG_HID_ROCCAT_PYRA=m + # # USB Imaging devices @@ -3099,8 +3045,6 @@ CONFIG_USB_GSPCA_PAC7302=m CONFIG_USB_GSPCA_STV0680=m CONFIG_USB_GL860=m CONFIG_USB_GSPCA_JEILINJ=m -CONFIG_USB_GSPCA_KONICA=m -CONFIG_USB_GSPCA_XIRLINK_CIT=m CONFIG_USB_GSPCA_SPCA1528=m CONFIG_USB_GSPCA_SQ930X=m @@ -3125,8 +3069,6 @@ CONFIG_SOC_CAMERA_OV772X=m CONFIG_SOC_CAMERA_MT9T112=m CONFIG_SOC_CAMERA_RJ54N1=m CONFIG_SOC_CAMERA_OV9640=m -CONFIG_SOC_CAMERA_OV6650=m -CONFIG_SOC_CAMERA_IMX074=m # # USB Network adaptors @@ -3149,7 +3091,6 @@ CONFIG_USB_NET_RNDIS_HOST=m CONFIG_USB_NET_CDC_SUBSET=m CONFIG_USB_NET_CDC_EEM=m CONFIG_USB_NET_ZAURUS=m -CONFIG_USB_NET_CX82310_ETH=m CONFIG_USB_NET_INT51X1=m CONFIG_USB_CDC_PHONET=m CONFIG_USB_IPHETH=m @@ -3242,7 +3183,6 @@ CONFIG_USB_SERIAL_QCAUX=m CONFIG_USB_SERIAL_VIVOPAY_SERIAL=m CONFIG_USB_SERIAL_DEBUG=m CONFIG_USB_SERIAL_SSU100=m -CONFIG_USB_SERIAL_SAMBA=m CONFIG_USB_EZUSB=y CONFIG_USB_EMI62=m @@ -3276,7 +3216,6 @@ CONFIG_USB_FILE_STORAGE=m # CONFIG_USB_OXU210HP_HCD is not set CONFIG_USB_IOWARRIOR=m CONFIG_USB_ISIGHTFW=m -CONFIG_USB_YUREX=m CONFIG_USB_VST=m CONFIG_USB_LCD=m CONFIG_USB_LD=m @@ -3331,7 +3270,6 @@ CONFIG_RTC_DRV_DS3232=m CONFIG_RTC_DRV_ISL12022=m CONFIG_MFD_SUPPORT=y -CONFIG_MFD_VX855=m CONFIG_MFD_SM501=m CONFIG_MFD_SM501_GPIO=y # CONFIG_MFD_TC6393XB is not set @@ -3352,7 +3290,6 @@ CONFIG_MFD_WM8400=m # CONFIG_ABX500_CORE is not set # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_JANZ_CMODIO is not set -# CONFIG_MFD_WM831X_I2C is not set # # File systems @@ -3411,8 +3348,6 @@ CONFIG_EXOFS_FS=m CONFIG_NILFS2_FS=m CONFIG_LOGFS=m CONFIG_CEPH_FS=m -CONFIG_BLK_DEV_RBD=m -CONFIG_CEPH_LIB=m CONFIG_FSCACHE=m CONFIG_FSCACHE_STATS=y @@ -3489,7 +3424,6 @@ CONFIG_UFS_FS=m # CONFIG_UFS_DEBUG is not set CONFIG_9P_FS=m CONFIG_9P_FSCACHE=y -CONFIG_9P_FS_POSIX_ACL=y CONFIG_FUSE_FS=m CONFIG_OMFS_FS=m CONFIG_CUSE=m @@ -3509,8 +3443,6 @@ CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set -# CONFIG_NFS_USE_NEW_IDMAPPER is not set -# CONFIG_NFSD_DEPRECATED is not set CONFIG_LOCKD=m CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=m @@ -3528,8 +3460,7 @@ CONFIG_CIFS_EXPERIMENTAL=y CONFIG_CIFS_UPCALL=y CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y -CONFIG_CIFS_FSCACHE=y -CONFIG_CIFS_ACL=y +# CONFIG_CIFS_FSCACHE is not set CONFIG_CIFS_WEAK_PW_HASH=y # CONFIG_CIFS_DEBUG2 is not set CONFIG_CIFS_DFS_UPCALL=y @@ -3671,7 +3602,6 @@ CONFIG_KGDB_LOW_LEVEL_TRAP=y # Security options # CONFIG_SECURITY=y -# CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITY_NETWORK=y CONFIG_SECURITY_NETWORK_XFRM=y # CONFIG_SECURITY_PATH is not set @@ -3811,12 +3741,10 @@ CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_SCHED=y CONFIG_CGROUP_MEM_RES_CTLR=y -CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y # XXX disabled by default, pass 'swapaccount' -# CONFIG_CGROUP_MEM_RES_CTLR_SWAP_ENABLED is not set +CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y CONFIG_BLK_CGROUP=y # CONFIG_DEBUG_BLK_CGROUP is not set -# CONFIG_SYSFS_DEPRECATED is not set # CONFIG_SYSFS_DEPRECATED_V2 is not set CONFIG_RELAY=y @@ -4022,8 +3950,6 @@ CONFIG_LEDS_REGULATOR=m CONFIG_LEDS_LT3593=m CONFIG_LEDS_TRIGGER_GPIO=m CONFIG_LEDS_INTEL_SS4200=m -CONFIG_LEDS_LP5521=m -CONFIG_LEDS_LP5523=m CONFIG_DMADEVICES=y CONFIG_DMA_ENGINE=y @@ -4077,8 +4003,6 @@ CONFIG_APM_POWER=m CONFIG_WM831X_POWER=m # CONFIG_BATTERY_DS2760 is not set # CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_BQ20Z75 is not set -# CONFIG_CHARGER_ISP1704 is not set CONFIG_BATTERY_PMU=m CONFIG_BATTERY_BQ27x00=m CONFIG_BATTERY_MAX17040=m @@ -4139,10 +4063,13 @@ CONFIG_RESOURCE_COUNTERS=y #FIXME: x86 generic? CONFIG_LEDS_CLEVO_MAIL=m CONFIG_I8K=m +CONFIG_EDAC_I3000=m +CONFIG_EDAC_X38=m CONFIG_INPUT_APANEL=m # CONFIG_INTEL_MENLOW is not set CONFIG_ENCLOSURE_SERVICES=m +CONFIG_ISL29003=m CONFIG_IPWIRELESS=m CONFIG_RTC_DRV_DS1511=m @@ -4188,7 +4115,6 @@ CONFIG_NET_SCH_MULTIQ=m CONFIG_NET_ACT_SKBEDIT=m CONFIG_PHONET=m -# CONFIG_PHONET_PIPECTRLR is not set CONFIG_ICS932S401=m # CONFIG_C2PORT is not set @@ -4271,13 +4197,6 @@ CONFIG_USB_ATMEL=m # CONFIG_EASYCAP is not set # CONFIG_SOLO6X10 is not set # CONFIG_ACPI_QUICKSTART is not set -# CONFIG_BRCM80211 is not set -# CONFIG_R8712U is not set -# CONFIG_ATH6K_LEGACY is not set -# CONFIG_USB_ENESTORAGE is not set -# CONFIG_BCM_WIMAX is not set -# CONFIG_FT1000 is not set -# CONFIG_SPEAKUP is not set # # Android @@ -4399,9 +4318,7 @@ CONFIG_GPIO_SYSFS=y # CONFIG_GPIO_SCH is not set # CONFIG_GPIO_LANGWELL is not set # CONFIG_GPIO_RDC321X is not set -# CONFIG_GPIO_BASIC_MMIO is not set -# CONFIG_GPIO_VX855 is not set -# CONFIG_GPIO_PCH is not set + CONFIG_KSYM_TRACER=y CONFIG_PROFILE_KSYM_TRACER=y @@ -4417,9 +4334,3 @@ CONFIG_IR_STREAMZAP=m # CONFIG_MFD_STMPE is not set # CONFIG_MFD_MAX8998 is not set # CONFIG_MFD_TPS6586X is not set - -CONFIG_SPARSE_RCU_POINTER=y - -# CONFIG_PM_OPP is not set - -CONFIG_BKL=y diff --git a/config-nodebug b/config-nodebug index 3f289940f..b4472f9a5 100644 --- a/config-nodebug +++ b/config-nodebug @@ -73,9 +73,8 @@ CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1 # CONFIG_DRBD_FAULT_INJECTION is not set -CONFIG_ATH_DEBUG=y -CONFIG_CARL9170_DEBUGFS=y -CONFIG_IWLWIFI_DEVICE_TRACING=y +# CONFIG_ATH_DEBUG is not set +# CONFIG_IWLWIFI_DEVICE_TRACING is not set # CONFIG_DEBUG_OBJECTS_WORK is not set # CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set @@ -85,8 +84,8 @@ CONFIG_IWLWIFI_DEVICE_TRACING=y CONFIG_PM_ADVANCED_DEBUG=y -CONFIG_CEPH_LIB_PRETTYDEBUG=y -CONFIG_QUOTA_DEBUG=y +# CONFIG_CEPH_FS_PRETTYDEBUG is not set +# CONFIG_QUOTA_DEBUG is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y @@ -94,6 +93,3 @@ CONFIG_PCI_DEFAULT_USE_CRS=y CONFIG_KGDB_KDB=y CONFIG_KDB_KEYBOARD=y - -CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y -CONFIG_TEST_LIST_SORT=y diff --git a/config-powerpc-generic b/config-powerpc-generic index 1b05f4a90..0effe3d0d 100644 --- a/config-powerpc-generic +++ b/config-powerpc-generic @@ -334,5 +334,3 @@ CONFIG_SERIAL_GRLIB_GAISLER_APBUART=m # CONFIG_GPIO_SCH is not set # CONFIG_PPC_MPC512x is not set - -CONFIG_KVM_GUEST=y diff --git a/config-s390x b/config-s390x index 780fc9146..d9294023d 100644 --- a/config-s390x +++ b/config-s390x @@ -228,8 +228,3 @@ CONFIG_SMSGIUCV_EVENT=m CONFIG_VMCP=y CONFIG_ZFCP_DIF=y - -CONFIG_SCHED_MC=y -CONFIG_SCHED_BOOK=y - -CONFIG_STRICT_DEVMEM=y diff --git a/config-sparc64-generic b/config-sparc64-generic index 61612cb71..1d21fa781 100644 --- a/config-sparc64-generic +++ b/config-sparc64-generic @@ -201,5 +201,3 @@ CONFIG_GRETH=m CONFIG_FB_XVR1000=y CONFIG_CRYPTO_DEV_NIAGARA2=y - -CONFIG_JUMP_LABEL=y diff --git a/config-x86-generic b/config-x86-generic index 68bd39b2d..ba3993563 100644 --- a/config-x86-generic +++ b/config-x86-generic @@ -284,9 +284,6 @@ CONFIG_EDAC_R82600=m CONFIG_EDAC_AMD8131=m CONFIG_EDAC_AMD8111=m CONFIG_EDAC_I7CORE=m -CONFIG_EDAC_I3000=m -CONFIG_EDAC_I7300=m -CONFIG_EDAC_X38=m CONFIG_SCHED_MC=y @@ -312,7 +309,6 @@ CONFIG_EEEPC_LAPTOP=m CONFIG_EEEPC_WMI=m CONFIG_FUJITSU_LAPTOP=m # CONFIG_FUJITSU_LAPTOP_DEBUG is not set -CONFIG_IDEAPAD_LAPTOP=m CONFIG_MSI_LAPTOP=m CONFIG_SONY_LAPTOP=m CONFIG_DELL_LAPTOP=m @@ -356,7 +352,6 @@ CONFIG_PARAVIRT=y # CONFIG_PARAVIRT_SPINLOCKS is not set CONFIG_KVM_CLOCK=y CONFIG_KVM_GUEST=y -CONFIG_KVM_MMU_AUDIT=y # default $x would be nice... CONFIG_LGUEST_GUEST=y CONFIG_VMI=y @@ -370,7 +365,6 @@ CONFIG_XEN_FBDEV_FRONTEND=y CONFIG_XEN_KBDDEV_FRONTEND=y CONFIG_XEN_BLKDEV_FRONTEND=m CONFIG_XEN_NETDEV_FRONTEND=m -CONFIG_XEN_PCIDEV_FRONTEND=m CONFIG_XENFS=m CONFIG_XEN_COMPAT_XENFS=y @@ -476,7 +470,7 @@ CONFIG_SBC_FITPC2_WATCHDOG=m CONFIG_EDAC_I3200=m CONFIG_EDAC_DECODE_MCE=m -# CONFIG_GPIO_LANGWELL is not set +CONFIG_GPIO_LANGWELL=y # CONFIG_INTEL_TXT is not set @@ -512,17 +506,4 @@ CONFIG_XEN_PLATFORM_PCI=m # CONFIG_ACPI_QUICKSTART is not set CONFIG_IDEAPAD_ACPI=m CONFIG_INTEL_IPS=m -# CONFIG_IBM_RTL is not set - -CONFIG_OLPC_XO1=m -CONFIG_XO1_RFKILL=m -CONFIG_VIDEO_VIA_CAMERA=m - -CONFIG_EDAC_MCE_INJ=m -CONFIG_IRQ_TIME_ACCOUNTING=y -CONFIG_X86_RESERVE_LOW=64 - -CONFIG_PCH_GBE=m -CONFIG_PCH_PHUB=m -CONFIG_JUMP_LABEL=y diff --git a/config-x86_64-generic b/config-x86_64-generic index 0498d8581..b2e4a2531 100644 --- a/config-x86_64-generic +++ b/config-x86_64-generic @@ -204,9 +204,6 @@ CONFIG_EDAC_AMD64=m # CONFIG_EDAC_AMD64_ERROR_INJECTION is not set CONFIG_EDAC_DECODE_MCE=m CONFIG_EDAC_I7CORE=m -CONFIG_EDAC_I3000=m -CONFIG_EDAC_I7300=m -CONFIG_EDAC_X38=m CONFIG_SCHED_MC=y @@ -287,7 +284,6 @@ CONFIG_PARAVIRT=y # CONFIG_PARAVIRT_SPINLOCKS is not set CONFIG_KVM_CLOCK=y CONFIG_KVM_GUEST=y -CONFIG_KVM_MMU_AUDIT=y CONFIG_XEN=y CONFIG_XEN_MAX_DOMAIN_MEMORY=32 @@ -299,7 +295,6 @@ CONFIG_XEN_FBDEV_FRONTEND=y CONFIG_XEN_KBDDEV_FRONTEND=y CONFIG_XEN_BLKDEV_FRONTEND=m CONFIG_XEN_NETDEV_FRONTEND=m -CONFIG_XEN_PCIDEV_FRONTEND=m CONFIG_XENFS=m CONFIG_XEN_COMPAT_XENFS=y CONFIG_XEN_DEV_EVTCHN=m @@ -424,18 +419,5 @@ CONFIG_XEN_PLATFORM_PCI=m # CONFIG_ACPI_QUICKSTART is not set CONFIG_IDEAPAD_ACPI=m CONFIG_INTEL_IPS=m -CONFIG_IDEAPAD_LAPTOP=m -# CONFIG_IBM_RTL is not set - -CONFIG_EDAC_MCE_INJ=m -CONFIG_IRQ_TIME_ACCOUNTING=y -CONFIG_X86_RESERVE_LOW=64 - -CONFIG_PCH_GBE=m -CONFIG_PCH_PHUB=m - -CONFIG_VIDEO_VIA_CAMERA=m - -CONFIG_JUMP_LABEL=y CONFIG_HP_ILO=m diff --git a/debug-tty-print-dev-name.patch b/debug-tty-print-dev-name.patch index 5c06dd991..507dfe5f1 100644 --- a/debug-tty-print-dev-name.patch +++ b/debug-tty-print-dev-name.patch @@ -1,15 +1,15 @@ -diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c -index 878f6d6..8d6867d 100644 ---- a/drivers/tty/tty_io.c -+++ b/drivers/tty/tty_io.c -@@ -1329,7 +1330,11 @@ static int tty_reopen(struct tty_struct *tty) +diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c +index 613c852..09c86d2 100644 +--- a/drivers/char/tty_io.c ++++ b/drivers/char/tty_io.c +@@ -1322,7 +1322,11 @@ static int tty_reopen(struct tty_struct *tty) tty->driver = driver; /* N.B. why do this every time?? */ mutex_lock(&tty->ldisc_mutex); - WARN_ON(!test_bit(TTY_LDISC, &tty->flags)); + if (!test_bit(TTY_LDISC, &tty->flags)) { -+ printk("%s: !test_bit(TTY_LDISC, &tty->flags) dev=%s ldisc=%s flags=%x\n", -+ __func__, tty->name, tty->ldisc ? tty->ldisc->ops ? tty->ldisc->ops->name : NULL : NULL, tty->flags); ++ printk("%s: !test_bit(TTY_LDISC, &tty->flags) dev=%s ldisc=%s\n", ++ __func__, tty->name, tty->ldisc ? tty->ldisc->ops ? tty->ldisc->ops->name : NULL : NULL); + WARN_ON(1); + } mutex_unlock(&tty->ldisc_mutex); diff --git a/drm-intel-big-hammer.patch b/drm-intel-big-hammer.patch index 97bb2e8cd..63dc016b1 100644 --- a/drm-intel-big-hammer.patch +++ b/drm-intel-big-hammer.patch @@ -1,21 +1,16 @@ -omgwtfbbqchainsaw? ---- - drivers/gpu/drm/i915/i915_gem.c | 5 +++++ - 1 files changed, 5 insertions(+), 0 deletions(-) - diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c -index 8eb8453..36fa9d7 100644 +index 37427e4..08af9db 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c -@@ -3692,6 +3692,11 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, - if (ret) - goto pre_mutex_err; +@@ -2553,6 +2553,11 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, + + mutex_lock(&dev->struct_mutex); + /* We don't get the flushing right for these chipsets, use the -+ * big hammer for now to avoid random crashiness. */ ++ * big hamer for now to avoid random crashiness. */ + if (IS_I85X(dev) || IS_I865G(dev)) + wbinvd(); + - if (dev_priv->mm.suspended) { - mutex_unlock(&dev->struct_mutex); - ret = -EBUSY; + i915_verify_inactive(dev, __FILE__, __LINE__); + + if (dev_priv->mm.wedged) { diff --git a/drm-intel-edp-fixes.patch b/drm-intel-edp-fixes.patch deleted file mode 100644 index c77ef116c..000000000 --- a/drm-intel-edp-fixes.patch +++ /dev/null @@ -1,44 +0,0 @@ -diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c -index f737960..b1f8164 100644 ---- a/drivers/gpu/drm/i915/i915_drv.c -+++ b/drivers/gpu/drm/i915/i915_drv.c -@@ -509,6 +509,8 @@ i915_pci_remove(struct pci_dev *pdev) - { - struct drm_device *dev = pci_get_drvdata(pdev); - -+ pci_disable_device(pdev); /* core did previous enable */ -+ - drm_put_dev(dev); - } - -diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c -index 300f64b..2e3db37 100644 ---- a/drivers/gpu/drm/i915/intel_dp.c -+++ b/drivers/gpu/drm/i915/intel_dp.c -@@ -795,7 +795,8 @@ static bool ironlake_edp_panel_on (struct intel_dp *intel_dp) - { - struct drm_device *dev = intel_dp->base.base.dev; - struct drm_i915_private *dev_priv = dev->dev_private; -- u32 pp, idle_on_mask = PP_ON | PP_SEQUENCE_STATE_ON_IDLE; -+ u32 pp, idle_on = PP_ON | PP_SEQUENCE_STATE_ON_IDLE; -+ u32 idle_on_mask = PP_ON | PP_SEQUENCE_STATE_MASK; - - if (I915_READ(PCH_PP_STATUS) & PP_ON) - return true; -@@ -816,7 +817,7 @@ static bool ironlake_edp_panel_on (struct intel_dp *intel_dp) - */ - msleep(300); - -- if (wait_for((I915_READ(PCH_PP_STATUS) & idle_on_mask) == idle_on_mask, -+ if (wait_for((I915_READ(PCH_PP_STATUS) & idle_on_mask) == idle_on, - 5000)) - DRM_ERROR("panel on wait timed out: 0x%08x\n", - I915_READ(PCH_PP_STATUS)); -@@ -922,6 +923,7 @@ static void intel_dp_prepare(struct drm_encoder *encoder) - - if (is_edp(intel_dp)) { - ironlake_edp_backlight_off(dev); -+ ironlake_edp_panel_off(dev); - ironlake_edp_panel_on(intel_dp); - if (!is_pch_edp(intel_dp)) - ironlake_edp_pll_on(encoder); diff --git a/drm-intel-make-lvds-work.patch b/drm-intel-make-lvds-work.patch index 209deb295..5ca0152da 100644 --- a/drm-intel-make-lvds-work.patch +++ b/drm-intel-make-lvds-work.patch @@ -1,23 +1,19 @@ - drivers/gpu/drm/i915/intel_display.c | 2 -- - 1 files changed, 0 insertions(+), 2 deletions(-) - -diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c -index 990f065..171a797 100644 ---- a/drivers/gpu/drm/i915/intel_display.c -+++ b/drivers/gpu/drm/i915/intel_display.c -@@ -4568,7 +4568,6 @@ void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder, - struct drm_connector *connector, int dpms_mode) +diff -up linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_display.c.orig linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_display.c +--- linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_display.c.orig 2010-03-31 16:59:39.901995671 -0400 ++++ linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_display.c 2010-03-31 17:01:05.416996744 -0400 +@@ -3757,7 +3757,6 @@ struct drm_crtc *intel_get_load_detect_p + void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder, int dpms_mode) { - struct drm_encoder *encoder = &intel_encoder->base; + struct drm_encoder *encoder = &intel_encoder->enc; - struct drm_device *dev = encoder->dev; struct drm_crtc *crtc = encoder->crtc; struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; -@@ -4578,7 +4577,6 @@ void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder, - connector->encoder = NULL; +@@ -3767,7 +3766,6 @@ void intel_release_load_detect_pipe(stru + intel_encoder->base.encoder = NULL; intel_encoder->load_detect_temp = false; crtc->enabled = drm_helper_crtc_in_use(crtc); - drm_helper_disable_unused_functions(dev); } - /* Switch crtc and encoder back off if necessary */ + /* Switch crtc and output back off if necessary */ diff --git a/hdpvr-ir-enable.patch b/hdpvr-ir-enable.patch index e73c42122..787c8f84c 100644 --- a/hdpvr-ir-enable.patch +++ b/hdpvr-ir-enable.patch @@ -110,7 +110,7 @@ index 463b81b..60cdc06 100644 msgs[i].len); } -@@ -115,30 +120,58 @@ static struct i2c_algorithm hdpvr_algo = { +@@ -115,31 +120,59 @@ static struct i2c_algorithm hdpvr_algo = { .functionality = hdpvr_functionality, }; @@ -119,6 +119,7 @@ index 463b81b..60cdc06 100644 + .owner = THIS_MODULE, + .id = I2C_HW_B_HDPVR, + .algo = &hdpvr_algo, ++ .class = I2C_CLASS_TV_ANALOG, +}; + +static struct i2c_board_info hdpvr_i2c_board_info = { @@ -159,6 +160,7 @@ index 463b81b..60cdc06 100644 - strlcpy(i2c_adap->name, "Hauppauge HD PVR I2C", - sizeof(i2c_adap->name)); - i2c_adap->algo = &hdpvr_algo; +- i2c_adap->class = I2C_CLASS_TV_ANALOG; - i2c_adap->owner = THIS_MODULE; - i2c_adap->dev.parent = &dev->udev->dev; + memcpy(&dev->i2c_adapter, &hdpvr_i2c_adapter_template, @@ -216,14 +218,3 @@ index b0f046d..2107055 100644 /* I2C lock */ struct mutex i2c_mutex; -diff --git a/include/linux/i2c-id.h b/include/linux/i2c-id.h -index 4bef5c5..4385341 100644 ---- a/include/linux/i2c-id.h -+++ b/include/linux/i2c-id.h -@@ -33,5 +33,6 @@ - - /* --- Bit algorithm adapters */ - #define I2C_HW_B_CX2388x 0x01001b /* connexant 2388x based tv cards */ -+#define I2C_HW_B_HDPVR 0x010025 /* Hauppauge HD PVR */ - - #endif /* LINUX_I2C_ID_H */ diff --git a/kernel.spec b/kernel.spec index 2d354f16b..8b30de6c4 100644 --- a/kernel.spec +++ b/kernel.spec @@ -6,7 +6,7 @@ Summary: The Linux kernel # For a stable, released kernel, released_kernel should be 1. For rawhide # and/or a kernel built from an rc or git snapshot, released_kernel should # be 0. -%global released_kernel 0 +%global released_kernel 1 # Save original buildid for later if it's defined %if 0%{?buildid:1} @@ -82,9 +82,9 @@ Summary: The Linux kernel # The next upstream release sublevel (base_sublevel+1) %define upstream_sublevel %(echo $((%{base_sublevel} + 1))) # The rc snapshot level -%define rcrev 5 +%define rcrev 0 # The git snapshot level -%define gitrev 2 +%define gitrev 0 # Set rpm version accordingly %define rpmversion 2.6.%{upstream_sublevel} %endif @@ -175,7 +175,7 @@ Summary: The Linux kernel %else %define gittag .git0 %endif -%define pkg_release 0%{?rctag}%{?gittag}.%{fedora_build}%{?buildid}%{?dist} +%define pkg_release 0.%{fedora_build}%{?rctag}%{?gittag}%{?buildid}%{?dist} %endif @@ -656,8 +656,6 @@ Patch1810: drm-nouveau-updates.patch Patch1819: drm-intel-big-hammer.patch # make sure the lvds comes back on lid open Patch1825: drm-intel-make-lvds-work.patch -Patch1826: drm-intel-edp-fixes.patch - Patch1900: linux-2.6-intel-iommu-igfx.patch # linux1394 git patches @@ -696,18 +694,52 @@ Patch12018: neuter_intel_microcode_load.patch Patch12030: tpm-fix-stall-on-boot.patch +# Wacom Bamboo +Patch12100: wacom-01-add-fuzz-parameters-to-features.patch +Patch12105: wacom-02-parse-the-bamboo-device-family.patch +Patch12110: wacom-03-collect-device-quirks-into-single-function.patch +Patch12115: wacom-04-add-support-for-the-bamboo-touch-trackpad.patch +Patch12120: wacom-05-add-a-quirk-for-low-resolution-bamboo-devices.patch +Patch12125: wacom-06-request-tablet-data-for-bamboo-pens.patch +Patch12130: wacom-07-move-bamboo-touch-irq-to-its-own-function.patch +Patch12135: wacom-08-add-support-for-bamboo-pen.patch +Patch12140: wacom-09-disable-bamboo-touchpad-when-pen-is-being-used.patch + # Runtime power management +Patch12200: linux-2.6-bluetooth-autosuspend.patch +Patch12201: linux-2.6-uvc-autosuspend.patch +Patch12202: linux-2.6-qcserial-autosuspend.patch Patch12203: linux-2.6-usb-pci-autosuspend.patch Patch12204: linux-2.6-enable-more-pci-autosuspend.patch Patch12205: runtime_pm_fixups.patch +Patch12225: pci-crs-fixes.patch +Patch12226: x86-never-alloc-pci-from-the-last-1M-below-4G.patch + +Patch12300: btusb-macbookpro-7-1.patch +Patch12301: btusb-macbookpro-6-2.patch +Patch12304: add-macbookair3-ids.patch + Patch12303: dmar-disable-when-ricoh-multifunction.patch -Patch12410: mm-page-allocator-adjust-the-per-cpu-counter-threshold-when-memory-is-low.patch -Patch12411: mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch +Patch12305: xhci_hcd-suspend-resume.patch -# rhbz#650934 -Patch12420: sched-cure-more-NO_HZ-load-average-woes.patch +Patch12308: fix-i8k-inline-asm.patch + +Patch12405: inet_diag-make-sure-we-run-the-same-bytecode-we-audited.patch +Patch12408: netlink-make-nlmsg_find_attr-take-a-const-ptr.patch + +Patch12406: posix-cpu-timers-workaround-to-suppress-problems-with-mt-exec.patch + +Patch12410: tty-make-tiocgicount-a-handler.patch +Patch12411: tty-icount-changeover-for-other-main-devices.patch + +Patch12413: tpm-autodetect-itpm-devices.patch + +Patch12420: mm-page-allocator-adjust-the-per-cpu-counter-threshold-when-memory-is-low.patch +Patch12421: mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch + +Patch12430: sched-cure-more-NO_HZ-load-average-woes.patch %endif @@ -1195,7 +1227,10 @@ ApplyPatch linux-2.6-defaults-pci_use_crs.patch # enable ASPM by default on hardware we expect to work ApplyPatch linux-2.6-defaults-aspm.patch -#ApplyPatch ima-allow-it-to-be-completely-disabled-and-default-off.patch +# helps debug resource conflicts [c1f3f281] +ApplyPatch pnp-log-pnp-resources-as-we-do-for-pci.patch + +ApplyPatch ima-allow-it-to-be-completely-disabled-and-default-off.patch # # SCSI Bits. @@ -1257,7 +1292,6 @@ ApplyOptionalPatch drm-nouveau-updates.patch ApplyPatch drm-intel-big-hammer.patch ApplyPatch drm-intel-make-lvds-work.patch ApplyPatch linux-2.6-intel-iommu-igfx.patch -ApplyPatch drm-intel-edp-fixes.patch # linux1394 git patches #ApplyPatch linux-2.6-firewire-git-update.patch @@ -1291,14 +1325,54 @@ ApplyPatch neuter_intel_microcode_load.patch # try to fix stalls during boot (#530393) ApplyPatch tpm-fix-stall-on-boot.patch +# Wacom Bamboo +ApplyPatch wacom-01-add-fuzz-parameters-to-features.patch +ApplyPatch wacom-02-parse-the-bamboo-device-family.patch +ApplyPatch wacom-03-collect-device-quirks-into-single-function.patch +ApplyPatch wacom-04-add-support-for-the-bamboo-touch-trackpad.patch +ApplyPatch wacom-05-add-a-quirk-for-low-resolution-bamboo-devices.patch +ApplyPatch wacom-06-request-tablet-data-for-bamboo-pens.patch +ApplyPatch wacom-07-move-bamboo-touch-irq-to-its-own-function.patch +ApplyPatch wacom-08-add-support-for-bamboo-pen.patch +ApplyPatch wacom-09-disable-bamboo-touchpad-when-pen-is-being-used.patch + # Runtime PM +ApplyPatch linux-2.6-bluetooth-autosuspend.patch +ApplyPatch linux-2.6-uvc-autosuspend.patch +ApplyPatch linux-2.6-qcserial-autosuspend.patch ApplyPatch linux-2.6-usb-pci-autosuspend.patch ApplyPatch linux-2.6-enable-more-pci-autosuspend.patch ApplyPatch runtime_pm_fixups.patch +# PCI patches to fix problems with _CRS +# ( from linux-pci list ) +ApplyPatch pci-crs-fixes.patch +ApplyPatch x86-never-alloc-pci-from-the-last-1M-below-4G.patch + +ApplyPatch btusb-macbookpro-7-1.patch +ApplyPatch btusb-macbookpro-6-2.patch +ApplyPatch add-macbookair3-ids.patch + # rhbz#605888 ApplyPatch dmar-disable-when-ricoh-multifunction.patch +ApplyPatch xhci_hcd-suspend-resume.patch + +ApplyPatch fix-i8k-inline-asm.patch + +# rhbz#651264 (CVE-2010-3880) +ApplyPatch inet_diag-make-sure-we-run-the-same-bytecode-we-audited.patch +ApplyPatch netlink-make-nlmsg_find_attr-take-a-const-ptr.patch + +# rhbz#656264 +ApplyPatch posix-cpu-timers-workaround-to-suppress-problems-with-mt-exec.patch + +# CVE-2010-4077, CVE-2010-4075 (rhbz#648660, #648663) +ApplyPatch tty-make-tiocgicount-a-handler.patch +ApplyPatch tty-icount-changeover-for-other-main-devices.patch + +ApplyPatch tpm-autodetect-itpm-devices.patch + # backport some fixes for kswapd from mmotm, rhbz#649694 ApplyPatch mm-page-allocator-adjust-the-per-cpu-counter-threshold-when-memory-is-low.patch ApplyPatch mm-vmstat-use-a-single-setter-function-and-callback-for-adjusting-percpu-thresholds.patch @@ -1920,113 +1994,123 @@ fi # || || %changelog -* Wed Dec 08 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc5.git2.1 -- Linux 2.6.37-rc5-git2 +* Wed Dec 08 2010 Kyle McMartin <kyle@redhat.com> 2.6.36.2-12.rc1 +- Linux stable 2.6.36.2-rc1 +- Drop patches merged in stable series: + tty-dont-allow-reopen-when-ldisc-is-changing.patch + tty-ldisc-fix-open-flag-handling.patch + tty-open-hangup-race-fixup.patch + tty-restore-tty_ldisc_wait_idle.patch + hda_realtek-handle-unset-external-amp-bits.patch + ipc-shm-fix-information-leak-to-user.patch + ipc-zero-struct-memory-for-compat-fns.patch + linux-2.6-rcu-sched-warning.patch + pnpacpi-cope-with-invalid-device-ids.patch + radeon-mc-vram-map-needs-to-be-gt-pci-aperture.patch + +* Wed Dec 08 2010 Kyle McMartin <kyle@redhat.com> - sched-cure-more-NO_HZ-load-average-woes.patch: fix some of the complaints in 2.6.35+ about load average with dynticks. (rhbz#650934) -* Tue Dec 07 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc5.git0.1 -- Linux 2.6.37-rc5 - * Sat Dec 04 2010 Kyle McMartin <kyle@redhat.com> - Enable C++ symbol demangling with perf by linking against libiberty.a, which is LGPL2. -* Fri Dec 03 2010 Kyle McMartin <kyle@redhat.com> -- Linux 2.6.37-rc4-git3 -- Enable HP ILO on x86_64 for (#571329) -- Drop merged drm-fixes.patch, split out edp-fixes. -- tty-dont-allow-reopen-when-ldisc-is-changing.patch: upstream. -- tty-ldisc-fix-open-flag-handling.patch: upstream. -- Enable CIFS_ACL. +* Fri Dec 03 2010 Kyle McMartin <kyle@redhat.com> 2.6.36.1-11 +- Enable HP ILO on x86_64. (#571329) * Thu Dec 02 2010 Kyle McMartin <kyle@redhat.com> - Grab some of Mel's fixes from -mmotm to hopefully sort out #649694. - -* Wed Dec 01 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc4.git1.1 -- Linux 2.6.37-rc4-git1 -- Pull in DRM fixes that are queued for -rc5 [3074adc8] - + edp-fixes on top - -* Tue Nov 30 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc4.git0.1 -- Linux 2.6.37-rc4 + They've been tested by a few on that bug on 2.6.35, but let's push + it out to a bigger audience. * Mon Nov 29 2010 Kyle McMartin <kyle@redhat.com> -- Update debug-vm-would_have_oomkilled patch. +- PNP: log PNP resources, as we do for PCI [c1f3f281] + should help us debug resource conflicts (requested by bjorn.) -* Mon Nov 29 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc3.git6.1 -- Linux 2.6.37-rc3-git6 -- TTY: open/hangup race fixup (rhbz#630464) +* Mon Nov 29 2010 Kyle McMartin <kyle@redhat.com> 2.6.36.1-10 +- tpm-autodetect-itpm-devices.patch: Auto-fix TPM issues on various + laptops which prevented suspend/resume. (#647132) +- tty fixes from kernel-git (#630464) -* Fri Nov 26 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc3.git3.1 -- Linux 2.6.37-rc3-git3 -- Print tty->flags as well in debugging patch... +* Fri Nov 26 2010 Kyle McMartin <kyle@redhat.com> +- Quiet a build warning the previous INET_DIAG fix caused. * Fri Nov 26 2010 Kyle McMartin <kyle@redhat.com> -- Copy tty_open WARN_ON debugging patch from rawhide. +- Plug stack leaks in tty/serial drivers. (#648663, #648660) -* Fri Nov 26 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc3.git2.1 -- Linux 2.6.37-rc3-git2 -- CGROUP_MEM_RES_CTLR_SWAP_ENABLED is not set, so the cgroup memory - resource controller swap accounting is disabled by default. You can - enable it with 'swapaccount' if desired. -- TTY: don't allow reopen when ldisc is changing (rhbz#630464) +* Fri Nov 26 2010 Kyle McMartin <kyle@redhat.com> +- hda/realtek: handle unset external amp config (#657388) -* Wed Nov 24 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc3.git1.1 -- Linux 2.6.37-rc3-git1 +* Wed Nov 24 2010 Kyle McMartin <kyle@redhat.com> +- Disable FSCACHE for CIFS until issues are addressed. (#656498) -* Mon Nov 22 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc3.git0.1 -- Linux 2.6.37-rc3 +* Wed Nov 24 2010 Kyle McMartin <kyle@redhat.com> +- drm/radeon/kms: MC vram map needs to be >= pci aperture size (fdo#28402) -* Sat Nov 20 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc2.git7.1 -- Linux 2.6.37-rc2-git7 +* Wed Nov 24 2010 Kyle McMartin <kyle@redhat.com> +- Fix graphics on HP 2530p (korg#23542) -* Fri Nov 19 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc2.git5.1 -- Linux 2.6.37-rc2-git5 +* Tue Nov 23 2010 Kyle McMartin <kyle@redhat.com> +- zero struct memory in ipc compat (CVE-2010-4073) (#648658) +- zero struct memory in ipc shm (CVE-2010-4072) (#648656) +- fix logic error in INET_DIAG bytecode auditing (CVE-2010-3880) (#651264) +- posix-cpu-timers: workaround to suppress the problems with mt exec + (rhbz#656264) -* Thu Nov 18 2010 Kyle McMartin <kyle@redhat.com> -- Move %{fedora_build} in the un-released (ie: -git/-rc) kernel case for - a variety of reasons, principally so that: - 1: Bumping %baserelease isn't needed if we're just updating snapshots. - 2: %buildid will sort as newer so we don't need to bump baserelease when - building bugzilla fixes. +* Tue Nov 23 2010 Kyle McMartin <kyle@redhat.com> +- fix-i8k-inline-asm.patch: backport gcc miscompilation fix from git + [22d3243d, 6b4e81db] (rhbz#647677) -* Wed Nov 17 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc2.git2 -- Linux 2.6.37-rc2-git2 -- enable STRICT_DEVMEM on s390x. +* Mon Nov 22 2010 Kyle McMartin <kyle@redhat.com> +- Add a debugging patch to help track down which tty is being + poked by plymouth. -* Wed Nov 17 2010 Kyle McMartin <kyle@redhat.com> -- Make vmlinuz/System.map root read-write only by default. You can just - chmod 644 them later if you (unlikely) need them without root. +* Mon Nov 22 2010 Kyle McMartin <kyle@redhat.com> 2.6.36.1-9 +- Linux stable 2.6.36.1 + +* Mon Nov 22 2010 Kyle McMartin <kyle@redhat.com> 2.6.36.1-8.rc1 +- Merge 100eeae2 (TTY: restore tty_ldisc_wait_idle) which should fix the WARN + in tty_open in rawhide. + +* Mon Nov 22 2010 Kyle McMartin <kyle@redhat.com> 2.6.36.1-7.rc1 +- Make vmlinuz world readable again. -* Mon Nov 15 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc2.git0 -- Linux 2.6.37-rc2 +* Sat Nov 20 2010 Kyle McMartin <kyle@redhat.com> +- Merge patch from Aris to allow kernel-debuginfo to be multiply-installed + (means we had to move the build dir, kind of a bummer, but I verified + that a -gitN to -gitN+1 worked.) -* Sat Nov 13 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc1.git10 -- Linux 2.6.37-rc1-git10 -- SECURITY_DMESG_RESTRICT added, the principle of least surprise dictates - we should probably have it off. If you want to restrict dmesg access - you may use the kernel.dmesg_restrict sysctl. -- linux-2.6-bluetooth-autosuspend.patch: merged upstream. +* Sat Nov 20 2010 Chuck Ebbert <cebbert@redhat.com> 2.6.36.1-6.rc1 +- Linux 2.6.36.1-rc1 +- Comment out upstreamed patches: + secmark-do-not-return-early-if-there-was-no-error.patch -* Tue Nov 09 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc1.git7 -- Linux 2.6.37-rc1-git7 +* Sat Nov 20 2010 Kyle McMartin <kyle@redhat.com> +- secmark-do-not-return-early-if-there-was-no-error.patch: requested + by eparis@. (Fixes a BUG when using secmark.) -* Mon Nov 08 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc1.git5 -- Linux 2.6.37-rc1-git5 +* Wed Nov 17 2010 Kyle McMartin <kyle@redhat.com> 2.6.36-5 +- Disable drm/intel rebase until it can be fixed. + +* Wed Nov 17 2010 Kyle McMartin <kyle@redhat.com> +- Make vmlinuz/System.map root read-write only by default. You can just + chmod 644 them later if you (unlikely) need them without root. -* Mon Nov 08 2010 Kyle McMartin <kyle@redhat.com> -- Cherry-pick utrace-ptrace fixes from mayoung. Thanks! +* Tue Nov 16 2010 Kyle McMartin <kyle@redhat.com> 2.6.36-4 +- Disable parallel doc builds, they fail. Constantly. -* Tue Nov 02 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc1.git0 -- Linux 2.6.37-rc1 +* Tue Nov 16 2010 Kyle McMartin <kyle@redhat.com> 2.6.36-3 +- Rebase drm/intel to 2.6.37-rc2+edp_fixes, hopefully to sort out most of + the issues folks with eDP are having. +- Switch to release builds and turn on debugging flavours. -* Tue Oct 26 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc0.git8 -- Linux 2.6.36-git8 +* Mon Nov 15 2010 Kyle McMartin <kyle@redhat.com> +- rhbz#651019: pull in support for MBA3. -* Fri Oct 22 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc0.git2 -- Switch to tracking git snapshots of what will become 2.6.37. -- Fix context rejects in utrace and a few other patches. +* Mon Nov 15 2010 Kyle McMartin <kyle@redhat.com> 2.6.36-2 +- drm-i915-reprogram-power-monitoring-registers-on-resume.patch: fix intel_ips + driver. * Wed Oct 20 2010 Chuck Ebbert <cebbert@redhat.com> 2.6.36-1 - Linux 2.6.36 diff --git a/linux-2.6-32bit-mmap-exec-randomization.patch b/linux-2.6-32bit-mmap-exec-randomization.patch index d42638c27..fe91e0abf 100644 --- a/linux-2.6-32bit-mmap-exec-randomization.patch +++ b/linux-2.6-32bit-mmap-exec-randomization.patch @@ -14,9 +14,9 @@ --- b/mm/mmap.c +++ b/mm/mmap.c @@ -28,6 +28,7 @@ + #include <linux/rmap.h> #include <linux/mmu_notifier.h> #include <linux/perf_event.h> - #include <linux/audit.h> +#include <linux/random.h> #include <asm/uaccess.h> diff --git a/linux-2.6-bluetooth-autosuspend.patch b/linux-2.6-bluetooth-autosuspend.patch new file mode 100644 index 000000000..663b79979 --- /dev/null +++ b/linux-2.6-bluetooth-autosuspend.patch @@ -0,0 +1,159 @@ +commit 6aa42966dea9a1fc02a714211ea489c3278bf8d4 +Author: Matthew Garrett <mjg@redhat.com> +Date: Thu Sep 16 13:34:55 2010 -0400 + + bluetooth: Take a runtime pm reference on hid connections + + Bluetooth runtime PM interacts badly with input devices - the connection + will be dropped if the device becomes idle, resulting in noticable lag when + the user interacts with the input device again. Bump the pm runtime count + when the device is associated and release it when it's disassociated in + order to avoid this. + + Signed-off-by: Matthew Garrett <mjg@redhat.com> + +diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c +index bfe641b..a4489a7 100644 +--- a/net/bluetooth/hidp/core.c ++++ b/net/bluetooth/hidp/core.c +@@ -36,6 +36,7 @@ + #include <linux/file.h> + #include <linux/init.h> + #include <linux/wait.h> ++#include <linux/pm_runtime.h> + #include <net/sock.h> + + #include <linux/input.h> +@@ -622,6 +623,14 @@ static int hidp_session(void *arg) + return 0; + } + ++static struct hci_dev *hidp_get_hci(struct hidp_session *session) ++{ ++ bdaddr_t *src = &bt_sk(session->ctrl_sock->sk)->src; ++ bdaddr_t *dst = &bt_sk(session->ctrl_sock->sk)->dst; ++ ++ return hci_get_route(dst, src); ++} ++ + static struct device *hidp_get_device(struct hidp_session *session) + { + bdaddr_t *src = &bt_sk(session->ctrl_sock->sk)->src; +@@ -819,6 +828,7 @@ fault: + int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, struct socket *intr_sock) + { + struct hidp_session *session, *s; ++ struct hci_dev *hdev; + int err; + + BT_DBG(""); +@@ -889,6 +899,10 @@ int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, + hidp_input_event(session->input, EV_LED, 0, 0); + } + ++ hdev = hidp_get_hci(session); ++ pm_runtime_get(hdev->parent); ++ hci_dev_put(hdev); ++ + up_write(&hidp_session_sem); + return 0; + +@@ -925,6 +939,7 @@ failed: + int hidp_del_connection(struct hidp_conndel_req *req) + { + struct hidp_session *session; ++ struct hci_dev *hdev; + int err = 0; + + BT_DBG(""); +@@ -952,6 +967,9 @@ int hidp_del_connection(struct hidp_conndel_req *req) + } else + err = -ENOENT; + ++ hdev = hidp_get_hci(session); ++ pm_runtime_put(hdev->parent); ++ hci_dev_put(hdev); + up_read(&hidp_session_sem); + return err; + } + +commit 482eca592615e85b048753750b101d051b77fde9 +Author: Matthew Garrett <mjg@redhat.com> +Date: Thu Sep 16 13:49:24 2010 -0400 + + bluetooth: Remove some unnecessary error messages + + The main reason for these urbs to error out on submission is that runtime + pm has kicked in, which is unnecessary noise. Let's just drop them. + + Signed-off-by: Matthew Garrett <mjg@redhat.com> + +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index d22ce3c..3ace025 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -229,11 +229,8 @@ static void btusb_intr_complete(struct urb *urb) + usb_anchor_urb(urb, &data->intr_anchor); + + err = usb_submit_urb(urb, GFP_ATOMIC); +- if (err < 0) { +- BT_ERR("%s urb %p failed to resubmit (%d)", +- hdev->name, urb, -err); ++ if (err < 0) + usb_unanchor_urb(urb); +- } + } + + static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags) +@@ -313,11 +310,8 @@ static void btusb_bulk_complete(struct urb *urb) + usb_mark_last_busy(data->udev); + + err = usb_submit_urb(urb, GFP_ATOMIC); +- if (err < 0) { +- BT_ERR("%s urb %p failed to resubmit (%d)", +- hdev->name, urb, -err); ++ if (err < 0) + usb_unanchor_urb(urb); +- } + } + + static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags) +@@ -402,11 +396,8 @@ static void btusb_isoc_complete(struct urb *urb) + usb_anchor_urb(urb, &data->isoc_anchor); + + err = usb_submit_urb(urb, GFP_ATOMIC); +- if (err < 0) { +- BT_ERR("%s urb %p failed to resubmit (%d)", +- hdev->name, urb, -err); ++ if (err < 0) + usb_unanchor_urb(urb); +- } + } + + static void inline __fill_isoc_descriptor(struct urb *urb, int len, int mtu) + +commit fd763c5b14ed99ac2401f8e8f1a07c3687ae01cc +Author: Matthew Garrett <mjg@redhat.com> +Date: Thu Sep 16 13:37:38 2010 -0400 + + bluetooth: Enable USB autosuspend by default on btusb + + We've done this for a while in Fedora without any obvious problems other + than some interaction with input devices. Those should be fixed now, so + let's try this in mainline. + + Signed-off-by: Matthew Garrett <mjg@redhat.com> + +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index 3ace025..03b64e4 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -1014,6 +1014,8 @@ static int btusb_probe(struct usb_interface *intf, + + usb_set_intfdata(intf, data); + ++ usb_enable_autosuspend(interface_to_usbdev(intf)); ++ + return 0; + } + diff --git a/linux-2.6-crash-driver.patch b/linux-2.6-crash-driver.patch index 0f11aba0d..7b518bb88 100644 --- a/linux-2.6-crash-driver.patch +++ b/linux-2.6-crash-driver.patch @@ -233,6 +233,18 @@ index 3141dd3..153658c 100644 config LEGACY_PTY_COUNT int "Maximum number of legacy PTY in use" +diff --git a/drivers/char/Makefile b/drivers/char/Makefile +index f957edf..604c418 100644 +--- a/drivers/char/Makefile ++++ b/drivers/char/Makefile +@@ -111,6 +111,8 @@ obj-$(CONFIG_PS3_FLASH) += ps3flash.o + obj-$(CONFIG_JS_RTC) += js-rtc.o + js-rtc-y = rtc.o + ++obj-$(CONFIG_CRASH) += crash.o ++ + # Files generated that shall be removed upon make clean + clean-files := consolemap_deftbl.c defkeymap.c diff --git a/drivers/char/crash.c b/drivers/char/crash.c new file mode 100644 @@ -368,14 +380,6 @@ index 0000000..e5437de +module_exit(crash_cleanup_module); + +MODULE_LICENSE("GPL"); +-- +1.7.0.1 -diff --git a/drivers/char/Makefile b/drivers/char/Makefile -index ba53ec9..6588b33 100644 ---- a/drivers/char/Makefile -+++ b/drivers/char/Makefile -@@ -98,3 +98,5 @@ obj-$(CONFIG_RAMOOPS) += ramoops.o - - obj-$(CONFIG_JS_RTC) += js-rtc.o - js-rtc-y = rtc.o -+ -+obj-$(CONFIG_CRASH) += crash.o diff --git a/linux-2.6-enable-more-pci-autosuspend.patch b/linux-2.6-enable-more-pci-autosuspend.patch index 666ded640..b1f92b134 100644 --- a/linux-2.6-enable-more-pci-autosuspend.patch +++ b/linux-2.6-enable-more-pci-autosuspend.patch @@ -1,20 +1,7 @@ - drivers/acpi/acpica/aclocal.h | 7 +-- - drivers/acpi/acpica/evgpe.c | 75 +++++++++++++++----------------- - drivers/acpi/acpica/evgpeinit.c | 11 +---- - drivers/acpi/acpica/evgpeutil.c | 5 +- - drivers/acpi/acpica/evxface.c | 23 +++++----- - drivers/acpi/ec.c | 2 +- - drivers/acpi/pci_bind.c | 86 ++++++++++++++++++++++++++++++++++++++ - drivers/acpi/sleep.c | 2 +- - drivers/char/ipmi/ipmi_si_intf.c | 2 +- - include/acpi/acpixf.h | 3 +- - 10 files changed, 143 insertions(+), 73 deletions(-) - -diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h -index 2ceb0c0..3663362 100644 ---- a/drivers/acpi/acpica/aclocal.h -+++ b/drivers/acpi/acpica/aclocal.h -@@ -406,17 +406,16 @@ struct acpi_predefined_data { +diff -up linux-2.6.35.x86_64/drivers/acpi/acpica/aclocal.h.mjg linux-2.6.35.x86_64/drivers/acpi/acpica/aclocal.h +--- linux-2.6.35.x86_64/drivers/acpi/acpica/aclocal.h.mjg 2010-10-04 13:52:05.086789354 -0400 ++++ linux-2.6.35.x86_64/drivers/acpi/acpica/aclocal.h 2010-10-04 13:52:50.948801001 -0400 +@@ -406,16 +406,15 @@ struct acpi_predefined_data { * ****************************************************************************/ @@ -26,7 +13,6 @@ index 2ceb0c0..3663362 100644 void *context; /* Context to be passed to handler */ - struct acpi_namespace_node *method_node; /* Method node for this GPE level (saved) */ u8 orig_flags; /* Original misc info about this GPE */ - u8 orig_enabled; /* Set if the GPE was originally enabled */ }; -union acpi_gpe_dispatch_info { @@ -34,7 +20,7 @@ index 2ceb0c0..3663362 100644 struct acpi_namespace_node *method_node; /* Method node for this GPE level */ struct acpi_handler_info *handler; }; -@@ -426,7 +425,7 @@ union acpi_gpe_dispatch_info { +@@ -425,7 +424,7 @@ union acpi_gpe_dispatch_info { * NOTE: Important to keep this struct as small as possible. */ struct acpi_gpe_event_info { @@ -43,11 +29,10 @@ index 2ceb0c0..3663362 100644 struct acpi_gpe_register_info *register_info; /* Backpointer to register info */ u8 flags; /* Misc info about this GPE */ u8 gpe_number; /* This GPE */ -diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c -index f226eac..c4b1c4c 100644 ---- a/drivers/acpi/acpica/evgpe.c -+++ b/drivers/acpi/acpica/evgpe.c -@@ -474,9 +474,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) +diff -up linux-2.6.35.x86_64/drivers/acpi/acpica/evgpe.c.mjg linux-2.6.35.x86_64/drivers/acpi/acpica/evgpe.c +--- linux-2.6.35.x86_64/drivers/acpi/acpica/evgpe.c.mjg 2010-10-04 13:52:05.088789399 -0400 ++++ linux-2.6.35.x86_64/drivers/acpi/acpica/evgpe.c 2010-10-04 13:52:50.950801045 -0400 +@@ -474,9 +474,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_as * Must check for control method type dispatch one more time to avoid a * race with ev_gpe_install_handler */ @@ -58,7 +43,7 @@ index f226eac..c4b1c4c 100644 /* Allocate the evaluation information block */ info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info)); -@@ -575,41 +573,15 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number) +@@ -575,41 +573,15 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_eve } /* @@ -108,7 +93,7 @@ index f226eac..c4b1c4c 100644 /* * Disable the GPE, so it doesn't keep firing before the method has a * chance to run (it runs asynchronously with interrupts enabled). -@@ -634,10 +606,34 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number) +@@ -634,10 +606,34 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_eve "Unable to queue handler for GPE[0x%2X] - event disabled", gpe_number)); } @@ -126,7 +111,7 @@ index f226eac..c4b1c4c 100644 + dispatch. + handler-> + context); - ++ + /* It is now safe to clear level-triggered events. */ + + if ((gpe_event_info->flags & ACPI_GPE_XRUPT_TYPE_MASK) == @@ -140,12 +125,12 @@ index f226eac..c4b1c4c 100644 + } + } + } -+ + + if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK)) { /* * No handler or method to run! * 03/2010: This case should no longer be possible. We will not allow -@@ -658,7 +654,6 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number) +@@ -658,7 +654,6 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_eve gpe_number)); return_UINT32(ACPI_INTERRUPT_NOT_HANDLED); } @@ -153,11 +138,10 @@ index f226eac..c4b1c4c 100644 } return_UINT32(ACPI_INTERRUPT_HANDLED); -diff --git a/drivers/acpi/acpica/evgpeinit.c b/drivers/acpi/acpica/evgpeinit.c -index 2c7def9..9915b52 100644 ---- a/drivers/acpi/acpica/evgpeinit.c -+++ b/drivers/acpi/acpica/evgpeinit.c -@@ -386,16 +386,7 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle, +diff -up linux-2.6.35.x86_64/drivers/acpi/acpica/evgpeinit.c.mjg linux-2.6.35.x86_64/drivers/acpi/acpica/evgpeinit.c +--- linux-2.6.35.x86_64/drivers/acpi/acpica/evgpeinit.c.mjg 2010-10-04 13:52:05.089789421 -0400 ++++ linux-2.6.35.x86_64/drivers/acpi/acpica/evgpeinit.c 2010-10-04 13:52:50.951801067 -0400 +@@ -392,16 +392,7 @@ acpi_ev_match_gpe_method(acpi_handle obj return_ACPI_STATUS(AE_OK); } @@ -175,11 +159,10 @@ index 2c7def9..9915b52 100644 /* * If there is already a method, ignore this method. But check * for a type mismatch (if both the _Lxx AND _Exx exist) -diff --git a/drivers/acpi/acpica/evgpeutil.c b/drivers/acpi/acpica/evgpeutil.c -index 19a0e51..434ad1b 100644 ---- a/drivers/acpi/acpica/evgpeutil.c -+++ b/drivers/acpi/acpica/evgpeutil.c -@@ -323,12 +323,11 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info, +diff -up linux-2.6.35.x86_64/drivers/acpi/acpica/evgpeutil.c.mjg linux-2.6.35.x86_64/drivers/acpi/acpica/evgpeutil.c +--- linux-2.6.35.x86_64/drivers/acpi/acpica/evgpeutil.c.mjg 2010-10-04 13:52:05.090789443 -0400 ++++ linux-2.6.35.x86_64/drivers/acpi/acpica/evgpeutil.c 2010-10-04 13:52:50.952801089 -0400 +@@ -323,12 +323,11 @@ acpi_ev_delete_gpe_handlers(struct acpi_ ACPI_GPE_REGISTER_WIDTH) + j]; @@ -194,11 +177,10 @@ index 19a0e51..434ad1b 100644 } } } -diff --git a/drivers/acpi/acpica/evxface.c b/drivers/acpi/acpica/evxface.c -index 36af222..b097136 100644 ---- a/drivers/acpi/acpica/evxface.c -+++ b/drivers/acpi/acpica/evxface.c -@@ -662,6 +662,8 @@ ACPI_EXPORT_SYMBOL(acpi_remove_notify_handler) +diff -up linux-2.6.35.x86_64/drivers/acpi/acpica/evxface.c.mjg linux-2.6.35.x86_64/drivers/acpi/acpica/evxface.c +--- linux-2.6.35.x86_64/drivers/acpi/acpica/evxface.c.mjg 2010-10-04 13:52:05.092789487 -0400 ++++ linux-2.6.35.x86_64/drivers/acpi/acpica/evxface.c 2010-10-04 13:52:50.954801133 -0400 +@@ -662,6 +662,8 @@ ACPI_EXPORT_SYMBOL(acpi_remove_notify_ha * edge- or level-triggered interrupt. * Address - Address of the handler * Context - Value passed to the handler on each GPE @@ -207,7 +189,7 @@ index 36af222..b097136 100644 * * RETURN: Status * -@@ -671,7 +673,8 @@ ACPI_EXPORT_SYMBOL(acpi_remove_notify_handler) +@@ -671,7 +673,8 @@ ACPI_EXPORT_SYMBOL(acpi_remove_notify_ha acpi_status acpi_install_gpe_handler(acpi_handle gpe_device, u32 gpe_number, @@ -217,7 +199,7 @@ index 36af222..b097136 100644 { struct acpi_gpe_event_info *gpe_event_info; struct acpi_handler_info *handler; -@@ -711,8 +714,7 @@ acpi_install_gpe_handler(acpi_handle gpe_device, +@@ -711,8 +714,7 @@ acpi_install_gpe_handler(acpi_handle gpe /* Make sure that there isn't a handler there already */ @@ -227,7 +209,7 @@ index 36af222..b097136 100644 status = AE_ALREADY_EXISTS; goto free_and_exit; } -@@ -721,7 +723,6 @@ acpi_install_gpe_handler(acpi_handle gpe_device, +@@ -721,7 +723,6 @@ acpi_install_gpe_handler(acpi_handle gpe handler->address = address; handler->context = context; @@ -235,16 +217,15 @@ index 36af222..b097136 100644 handler->orig_flags = gpe_event_info->flags & (ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK); -@@ -732,7 +733,7 @@ acpi_install_gpe_handler(acpi_handle gpe_device, +@@ -733,17 +734,17 @@ acpi_install_gpe_handler(acpi_handle gpe */ if ((handler->orig_flags & ACPI_GPE_DISPATCH_METHOD) -- && gpe_event_info->runtime_count) { -+ && gpe_event_info->runtime_count && !keep_method) { - handler->orig_enabled = 1; +- && !(gpe_event_info->flags & ACPI_GPE_CAN_WAKE)) ++ && !(gpe_event_info->flags & ACPI_GPE_CAN_WAKE) && !keep_method) (void)acpi_raw_disable_gpe(gpe_event_info); - } -@@ -741,10 +742,10 @@ acpi_install_gpe_handler(acpi_handle gpe_device, + + /* Install the handler */ gpe_event_info->dispatch.handler = handler; @@ -258,7 +239,7 @@ index 36af222..b097136 100644 gpe_event_info->flags |= (u8) (type | ACPI_GPE_DISPATCH_HANDLER); acpi_os_release_lock(acpi_gbl_gpe_lock, flags); -@@ -813,8 +814,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_device, +@@ -812,8 +813,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_ /* Make sure that a handler is indeed installed */ @@ -268,7 +249,7 @@ index 36af222..b097136 100644 status = AE_NOT_EXIST; goto unlock_and_exit; } -@@ -830,9 +830,8 @@ acpi_remove_gpe_handler(acpi_handle gpe_device, +@@ -829,9 +829,8 @@ acpi_remove_gpe_handler(acpi_handle gpe_ handler = gpe_event_info->dispatch.handler; @@ -279,11 +260,10 @@ index 36af222..b097136 100644 gpe_event_info->flags &= ~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK); gpe_event_info->flags |= handler->orig_flags; -diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c -index 372ff80..9a39f82 100644 ---- a/drivers/acpi/ec.c -+++ b/drivers/acpi/ec.c -@@ -740,7 +740,7 @@ static int ec_install_handlers(struct acpi_ec *ec) +diff -up linux-2.6.35.x86_64/drivers/acpi/ec.c.mjg linux-2.6.35.x86_64/drivers/acpi/ec.c +--- linux-2.6.35.x86_64/drivers/acpi/ec.c.mjg 2010-10-04 13:52:05.094789531 -0400 ++++ linux-2.6.35.x86_64/drivers/acpi/ec.c 2010-10-04 13:52:50.955801156 -0400 +@@ -746,7 +746,7 @@ static int ec_install_handlers(struct ac return 0; status = acpi_install_gpe_handler(NULL, ec->gpe, ACPI_GPE_EDGE_TRIGGERED, @@ -292,10 +272,9 @@ index 372ff80..9a39f82 100644 if (ACPI_FAILURE(status)) return -ENODEV; -diff --git a/drivers/acpi/pci_bind.c b/drivers/acpi/pci_bind.c -index 2ef0409..8b3cc6a 100644 ---- a/drivers/acpi/pci_bind.c -+++ b/drivers/acpi/pci_bind.c +diff -up linux-2.6.35.x86_64/drivers/acpi/pci_bind.c.mjg linux-2.6.35.x86_64/drivers/acpi/pci_bind.c +--- linux-2.6.35.x86_64/drivers/acpi/pci_bind.c.mjg 2010-10-04 13:52:05.102789707 -0400 ++++ linux-2.6.35.x86_64/drivers/acpi/pci_bind.c 2010-10-04 13:52:50.962801311 -0400 @@ -28,6 +28,7 @@ #include <linux/pci.h> #include <linux/pci-acpi.h> @@ -348,7 +327,7 @@ index 2ef0409..8b3cc6a 100644 static int acpi_pci_unbind(struct acpi_device *device) { struct pci_dev *dev; -@@ -43,6 +81,30 @@ static int acpi_pci_unbind(struct acpi_device *device) +@@ -43,6 +81,30 @@ static int acpi_pci_unbind(struct acpi_d if (!dev) goto out; @@ -379,7 +358,7 @@ index 2ef0409..8b3cc6a 100644 device_set_run_wake(&dev->dev, false); pci_acpi_remove_pm_notifier(device); -@@ -71,6 +133,30 @@ static int acpi_pci_bind(struct acpi_device *device) +@@ -71,6 +133,30 @@ static int acpi_pci_bind(struct acpi_dev return 0; pci_acpi_add_pm_notifier(device, dev); @@ -410,24 +389,25 @@ index 2ef0409..8b3cc6a 100644 if (device->wakeup.flags.run_wake) device_set_run_wake(&dev->dev, true); -diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c -index 721d93b..b0ddef6 100644 ---- a/drivers/acpi/sleep.c -+++ b/drivers/acpi/sleep.c -@@ -643,7 +643,7 @@ int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p) - if (acpi_target_sleep_state != ACPI_STATE_S0 || - status != AE_NOT_FOUND) - d_max = d_min; +diff -up linux-2.6.35.x86_64/drivers/acpi/sleep.c.mjg linux-2.6.35.x86_64/drivers/acpi/sleep.c +--- linux-2.6.35.x86_64/drivers/acpi/sleep.c.mjg 2010-10-04 13:52:05.103789729 -0400 ++++ linux-2.6.35.x86_64/drivers/acpi/sleep.c 2010-10-04 13:52:50.963801333 -0400 +@@ -631,9 +631,9 @@ int acpi_pm_device_sleep_state(struct de + acpi_method[3] = 'W'; + status = acpi_evaluate_integer(handle, acpi_method, NULL, + &d_max); +- if (ACPI_FAILURE(status)) { ++ if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { + d_max = d_min; - } else if (d_max < d_min) { + } else if (ACPI_SUCCESS(status) && d_max < d_min) { /* Warn the user of the broken DSDT */ printk(KERN_WARNING "ACPI: Wrong value from %s\n", acpi_method); -diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c -index 035da9e..62a48b2 100644 ---- a/drivers/char/ipmi/ipmi_si_intf.c -+++ b/drivers/char/ipmi/ipmi_si_intf.c -@@ -1970,7 +1970,7 @@ static int acpi_gpe_irq_setup(struct smi_info *info) +diff -up linux-2.6.35.x86_64/drivers/char/ipmi/ipmi_si_intf.c.mjg linux-2.6.35.x86_64/drivers/char/ipmi/ipmi_si_intf.c +--- linux-2.6.35.x86_64/drivers/char/ipmi/ipmi_si_intf.c.mjg 2010-10-04 13:52:05.097789597 -0400 ++++ linux-2.6.35.x86_64/drivers/char/ipmi/ipmi_si_intf.c 2010-10-04 13:52:50.958801223 -0400 +@@ -1959,7 +1959,7 @@ static int acpi_gpe_irq_setup(struct smi info->irq, ACPI_GPE_LEVEL_TRIGGERED, &ipmi_acpi_gpe, @@ -436,11 +416,126 @@ index 035da9e..62a48b2 100644 if (status != AE_OK) { dev_warn(info->dev, "%s unable to claim ACPI GPE %d," " running polled\n", DEVICE_NAME, info->irq); -diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h -index 53b7cfd..740eb7e 100644 ---- a/include/acpi/acpixf.h -+++ b/include/acpi/acpixf.h -@@ -258,7 +258,8 @@ acpi_remove_address_space_handler(acpi_handle device, +diff -up linux-2.6.35.x86_64/drivers/pci/pci.c.mjg linux-2.6.35.x86_64/drivers/pci/pci.c +--- linux-2.6.35.x86_64/drivers/pci/pci.c.mjg 2010-10-04 13:52:05.105789773 -0400 ++++ linux-2.6.35.x86_64/drivers/pci/pci.c 2010-10-04 13:52:50.965801377 -0400 +@@ -38,6 +38,19 @@ EXPORT_SYMBOL(pci_pci_problems); + + unsigned int pci_pm_d3_delay; + ++static void pci_pme_list_scan(struct work_struct *work); ++ ++static LIST_HEAD(pci_pme_list); ++static DEFINE_MUTEX(pci_pme_list_mutex); ++static DECLARE_DELAYED_WORK(pci_pme_work, pci_pme_list_scan); ++ ++struct pci_pme_device { ++ struct list_head list; ++ struct pci_dev *dev; ++}; ++ ++#define PME_TIMEOUT 1000 /* How long between PME checks */ ++ + static void pci_dev_d3_sleep(struct pci_dev *dev) + { + unsigned int delay = dev->d3_delay; +@@ -1331,6 +1344,32 @@ bool pci_pme_capable(struct pci_dev *dev + return !!(dev->pme_support & (1 << state)); + } + ++static void pci_pme_list_scan(struct work_struct *work) ++{ ++ struct pci_pme_device *pme_dev; ++ ++ mutex_lock(&pci_pme_list_mutex); ++ if (!list_empty(&pci_pme_list)) { ++ list_for_each_entry(pme_dev, &pci_pme_list, list) ++ pci_pme_wakeup(pme_dev->dev, NULL); ++ schedule_delayed_work(&pci_pme_work, msecs_to_jiffies(PME_TIMEOUT)); ++ } ++ mutex_unlock(&pci_pme_list_mutex); ++} ++ ++/** ++ * pci_external_pme - is a device an external PCI PME source? ++ * @dev: PCI device to check ++ * ++ */ ++ ++static bool pci_external_pme(struct pci_dev *dev) ++{ ++ if (pci_is_pcie(dev) || dev->bus->number == 0) ++ return false; ++ return true; ++} ++ + /** + * pci_pme_active - enable or disable PCI device's PME# function + * @dev: PCI device to handle. +@@ -1354,6 +1393,44 @@ void pci_pme_active(struct pci_dev *dev, + + pci_write_config_word(dev, dev->pm_cap + PCI_PM_CTRL, pmcsr); + ++ /* PCI (as opposed to PCIe) PME requires that the device have ++ its PME# line hooked up correctly. Not all hardware vendors ++ do this, so the PME never gets delivered and the device ++ remains asleep. The easiest way around this is to ++ periodically walk the list of suspended devices and check ++ whether any have their PME flag set. The assumption is that ++ we'll wake up often enough anyway that this won't be a huge ++ hit, and the power savings from the devices will still be a ++ win. */ ++ ++ if (pci_external_pme(dev)) { ++ struct pci_pme_device *pme_dev; ++ if (enable) { ++ pme_dev = kmalloc(sizeof(struct pci_pme_device), ++ GFP_KERNEL); ++ if (!pme_dev) ++ goto out; ++ pme_dev->dev = dev; ++ mutex_lock(&pci_pme_list_mutex); ++ list_add(&pme_dev->list, &pci_pme_list); ++ if (list_is_singular(&pci_pme_list)) ++ schedule_delayed_work(&pci_pme_work, ++ msecs_to_jiffies(PME_TIMEOUT)); ++ mutex_unlock(&pci_pme_list_mutex); ++ } else { ++ mutex_lock(&pci_pme_list_mutex); ++ list_for_each_entry(pme_dev, &pci_pme_list, list) { ++ if (pme_dev->dev == dev) { ++ list_del(&pme_dev->list); ++ kfree(pme_dev); ++ break; ++ } ++ } ++ mutex_unlock(&pci_pme_list_mutex); ++ } ++ } ++ ++out: + dev_printk(KERN_DEBUG, &dev->dev, "PME# %s\n", + enable ? "enabled" : "disabled"); + } +diff -up linux-2.6.35.x86_64/drivers/pci/pci.h.mjg linux-2.6.35.x86_64/drivers/pci/pci.h +--- linux-2.6.35.x86_64/drivers/pci/pci.h.mjg 2010-10-04 13:52:05.100789663 -0400 ++++ linux-2.6.35.x86_64/drivers/pci/pci.h 2010-10-04 13:52:50.960801267 -0400 +@@ -63,11 +63,8 @@ struct pci_platform_pm_ops { + extern int pci_set_platform_pm(struct pci_platform_pm_ops *ops); + extern void pci_update_current_state(struct pci_dev *dev, pci_power_t state); + extern void pci_disable_enabled_device(struct pci_dev *dev); +-extern bool pci_check_pme_status(struct pci_dev *dev); + extern int pci_finish_runtime_suspend(struct pci_dev *dev); +-extern void pci_wakeup_event(struct pci_dev *dev); + extern int __pci_pme_wakeup(struct pci_dev *dev, void *ign); +-extern void pci_pme_wakeup_bus(struct pci_bus *bus); + extern void pci_pm_init(struct pci_dev *dev); + extern void platform_pci_wakeup_init(struct pci_dev *dev); + extern void pci_allocate_cap_save_buffers(struct pci_dev *dev); +diff -up linux-2.6.35.x86_64/include/acpi/acpixf.h.mjg linux-2.6.35.x86_64/include/acpi/acpixf.h +--- linux-2.6.35.x86_64/include/acpi/acpixf.h.mjg 2010-10-04 13:52:05.099789641 -0400 ++++ linux-2.6.35.x86_64/include/acpi/acpixf.h 2010-10-04 13:52:50.959801245 -0400 +@@ -253,7 +253,8 @@ acpi_remove_address_space_handler(acpi_h acpi_status acpi_install_gpe_handler(acpi_handle gpe_device, u32 gpe_number, @@ -450,3 +545,16 @@ index 53b7cfd..740eb7e 100644 acpi_status acpi_remove_gpe_handler(acpi_handle gpe_device, +diff -up linux-2.6.35.x86_64/include/linux/pci.h.mjg linux-2.6.35.x86_64/include/linux/pci.h +--- linux-2.6.35.x86_64/include/linux/pci.h.mjg 2010-10-04 13:52:05.101789685 -0400 ++++ linux-2.6.35.x86_64/include/linux/pci.h 2010-10-04 13:52:50.962801311 -0400 +@@ -819,6 +819,9 @@ pci_power_t pci_target_state(struct pci_ + int pci_prepare_to_sleep(struct pci_dev *dev); + int pci_back_from_sleep(struct pci_dev *dev); + bool pci_dev_run_wake(struct pci_dev *dev); ++bool pci_check_pme_status(struct pci_dev *dev); ++void pci_wakeup_event(struct pci_dev *dev); ++void pci_pme_wakeup_bus(struct pci_bus *bus); + + static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state, + bool enable) diff --git a/linux-2.6-i386-nx-emulation.patch b/linux-2.6-i386-nx-emulation.patch index 24a2ed500..094c5b845 100644 --- a/linux-2.6-i386-nx-emulation.patch +++ b/linux-2.6-i386-nx-emulation.patch @@ -394,8 +394,8 @@ --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c @@ -6,6 +6,7 @@ + #include <linux/interrupt.h> #include <linux/module.h> - #include <linux/cpu.h> +#include <asm/desc.h> #include <asm/tlbflush.h> diff --git a/linux-2.6-qcserial-autosuspend.patch b/linux-2.6-qcserial-autosuspend.patch new file mode 100644 index 000000000..524898813 --- /dev/null +++ b/linux-2.6-qcserial-autosuspend.patch @@ -0,0 +1,23 @@ +commit 0fe584342da141957c8642191b508ad39e9b19e6 +Author: Matthew Garrett <mjg@redhat.com> +Date: Thu Sep 16 13:39:31 2010 -0400 + + usbserial: Enable USB autosuspend by default on qcserial + + Seems to work fine in my testing. + + Signed-off-by: Matthew Garrett <mjg@redhat.com> + +diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c +index cde67ca..2846ad8 100644 +--- a/drivers/usb/serial/qcserial.c ++++ b/drivers/usb/serial/qcserial.c +@@ -118,6 +118,8 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) + + spin_lock_init(&data->susp_lock); + ++ usb_enable_autosuspend(serial->dev); ++ + switch (nintf) { + case 1: + /* QDL mode */ diff --git a/linux-2.6-utrace-ptrace.patch b/linux-2.6-utrace-ptrace.patch index caeae6760..a609fb628 100644 --- a/linux-2.6-utrace-ptrace.patch +++ b/linux-2.6-utrace-ptrace.patch @@ -29,9 +29,9 @@ index a85fb41..235c1b0 100644 - +extern void ptrace_notify_stop(struct task_struct *tracee); - extern long arch_ptrace(struct task_struct *child, long request, - unsigned long addr, unsigned long data); + extern long arch_ptrace(struct task_struct *child, long request, long addr, long data); extern int ptrace_traceme(void); + extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len); diff --git a/kernel/Makefile b/kernel/Makefile index 6004913..b09c9a5 100644 --- a/kernel/Makefile @@ -673,7 +673,7 @@ index ...a90078d 100644 + * under ptrace. + */ + retval = -ERESTARTNOINTR; -+ if (mutex_lock_interruptible(&task->signal->cred_guard_mutex)) ++ if (mutex_lock_interruptible(&task->cred_guard_mutex)) + goto out; + + task_lock(task); @@ -703,7 +703,7 @@ index ...a90078d 100644 +unlock_tasklist: + write_unlock_irq(&tasklist_lock); +unlock_creds: -+ mutex_unlock(&task->signal->cred_guard_mutex); ++ mutex_unlock(&task->cred_guard_mutex); +out: + return retval; +} @@ -1014,7 +1014,7 @@ index ...a90078d 100644 + struct iovec *kiov); + +int ptrace_request(struct task_struct *child, long request, -+ unsigned long addr, unsigned long data) ++ long addr, long data) +{ + struct utrace_engine *engine = ptrace_lookup_engine(child); + siginfo_t siginfo; @@ -1412,7 +1412,7 @@ index 23bde94..daed9e8 100644 +#define arch_ptrace_attach(child) do { } while (0) +#endif + -+SYSCALL_DEFINE4(ptrace, long, request, long, pid, unsigned long, addr, unsigned long, data) ++SYSCALL_DEFINE4(ptrace, long, request, long, pid, long, addr, long, data) +{ + struct task_struct *child; + long ret; @@ -1453,7 +1453,7 @@ index 23bde94..daed9e8 100644 + return ret; +} + -+int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr, unsigned long data) ++int generic_ptrace_peekdata(struct task_struct *tsk, long addr, long data) +{ + unsigned long tmp; + int copied; @@ -1464,7 +1464,7 @@ index 23bde94..daed9e8 100644 + return put_user(tmp, (unsigned long __user *)data); +} + -+int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr, unsigned long data) ++int generic_ptrace_pokedata(struct task_struct *tsk, long addr, long data) +{ + int copied; + @@ -1595,7 +1595,7 @@ index 23bde94..daed9e8 100644 unlock_tasklist: - write_unlock_irq(&tasklist_lock); -unlock_creds: -- mutex_unlock(&task->signal->cred_guard_mutex); +- mutex_unlock(&task->cred_guard_mutex); -out: - return retval; -} @@ -1656,7 +1656,7 @@ index 23bde94..daed9e8 100644 - * If it should reap itself, return true. + write_unlock_irq(&tasklist_lock); +unlock_creds: -+ mutex_unlock(&task->signal->cred_guard_mutex); ++ mutex_unlock(&task->cred_guard_mutex); +out: + return retval; +} @@ -1765,7 +1765,7 @@ index 23bde94..daed9e8 100644 - return copied; -} - - static int ptrace_setoptions(struct task_struct *child, unsigned long data) + static int ptrace_setoptions(struct task_struct *child, long data) { child->ptrace &= ~PT_TRACE_MASK; @@ -530,47 +677,6 @@ static int ptrace_resume(struct task_str @@ -1814,9 +1814,9 @@ index 23bde94..daed9e8 100644 -#endif - int ptrace_request(struct task_struct *child, long request, - unsigned long addr, unsigned long data) + long addr, long data) { -@@ -686,91 +792,7 @@ int ptrace_request(struct task_struct *c +@@ -686,88 +792,7 @@ int ptrace_request(struct task_struct *c return ret; } @@ -1839,8 +1839,7 @@ index 23bde94..daed9e8 100644 -#define arch_ptrace_attach(child) do { } while (0) -#endif - --SYSCALL_DEFINE4(ptrace, long, request, long, pid, unsigned long, addr, -- unsigned long, data) +-SYSCALL_DEFINE4(ptrace, long, request, long, pid, long, addr, long, data) -{ - struct task_struct *child; - long ret; @@ -1881,8 +1880,7 @@ index 23bde94..daed9e8 100644 - return ret; -} - --int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr, -- unsigned long data) +-int generic_ptrace_peekdata(struct task_struct *tsk, long addr, long data) -{ - unsigned long tmp; - int copied; @@ -1893,8 +1891,7 @@ index 23bde94..daed9e8 100644 - return put_user(tmp, (unsigned long __user *)data); -} - --int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr, -- unsigned long data) +-int generic_ptrace_pokedata(struct task_struct *tsk, long addr, long data) -{ - int copied; - diff --git a/linux-2.6-utrace.patch b/linux-2.6-utrace.patch index c50b83ea8..a12357e68 100644 --- a/linux-2.6-utrace.patch +++ b/linux-2.6-utrace.patch @@ -44,7 +44,7 @@ index 34929f2..884c36b 100644 +++ b/Documentation/DocBook/Makefile @@ -14,7 +14,7 @@ DOCBOOKS := z8530book.xml mcabook.xml de genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \ - 80211.xml debugobjects.xml sh.xml regulator.xml \ + mac80211.xml debugobjects.xml sh.xml regulator.xml \ alsa-driver-api.xml writing-an-alsa-driver.xml \ - tracepoint.xml media.xml drm.xml + tracepoint.xml utrace.xml media.xml drm.xml @@ -1636,9 +1636,9 @@ index 2de5b1c..a283086 100644 + kernel interface exported to kernel modules, to track events in + user threads, extract and change user thread state. + - source "kernel/irq/Kconfig" - menu "RCU Subsystem" + + choice diff --git a/kernel/Makefile b/kernel/Makefile index 0b72d1a..6004913 100644 --- a/kernel/Makefile diff --git a/linux-2.6-uvc-autosuspend.patch b/linux-2.6-uvc-autosuspend.patch new file mode 100644 index 000000000..6c965c62f --- /dev/null +++ b/linux-2.6-uvc-autosuspend.patch @@ -0,0 +1,22 @@ +commit 4a3757e0ae269f710292dd75013532c5a57ccb00 +Author: Matthew Garrett <mjg@redhat.com> +Date: Thu Sep 16 13:38:38 2010 -0400 + + uvc: Enable USB autosuspend by default on uvcvideo + + We've been doing this for a while in Fedora without any complaints. + + Signed-off-by: Matthew Garrett <mjg@redhat.com> + +diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c +index 8bdd940..28ed5b4 100644 +--- a/drivers/media/video/uvc/uvc_driver.c ++++ b/drivers/media/video/uvc/uvc_driver.c +@@ -1814,6 +1814,7 @@ static int uvc_probe(struct usb_interface *intf, + } + + uvc_trace(UVC_TRACE_PROBE, "UVC device initialized.\n"); ++ usb_enable_autosuspend(udev); + return 0; + + error: diff --git a/pci-crs-fixes.patch b/pci-crs-fixes.patch new file mode 100644 index 000000000..b4fd01502 --- /dev/null +++ b/pci-crs-fixes.patch @@ -0,0 +1,593 @@ + This revision is to address two problems found by Horst H. von Brand while + testing the v2 patches in Fedora: + https://bugzilla.redhat.com/show_bug.cgi?id=637647 + On his machine, we don't use _CRS by default, and the BIOS left some bridge + windows disabled. + + Problem 1: When we assigned space for the windows, we started at the top + and allocated [mem 0xffffffffffe00000-0xffffffffffffffff], which is + obviously useless because the CPU doesn't support physical addresses that + large. + + Problem 2: Subsequent allocations failed because I made an error in + find_resource(). We look for available space from [child->end + 1 to + root->end], and if the last child ends exactly at 0xffffffffffffffff, we + wrap around and start from zero. + + I made the top-down allocation conditional: an arch can select it at + boot-time, and there's a kernel command line option to change it for + debugging. + + +When we move PCI devices, we currently allocate space bottom-up, i.e., we look +at PCI bus resources in the order we found them, we look at gaps between child +resources bottom-up, and we align the new space at the bottom of an available +region. + +On x86, we move PCI devices more than we used to because we now pay attention +to the PCI host bridge windows from ACPI. For example, when we find a device +that's outside all the known host bridge windows, we try to move it into a +window, and we look for space starting at the bottom. + +Windows does similar device moves, but it looks for space top-down rather than +bottom-up. Since most machines are better-tested with Windows than Linux, this +difference means that Linux is more likely to trip over BIOS bugs in the PCI +host bridge window descriptions than Windows is. + +We've had several reports of Dell machines where the BIOS leaves the AHCI +controller outside the host bridge windows (BIOS bug #1), *and* the lowest +host bridge window includes an area that doesn't actually reach PCI (BIOS +bug #2). The result is that Windows (which moves AHCI to the top of a window) +works fine, while Linux (which moves AHCI to the bottom, buggy, area) doesn't +work. + +These patches change Linux to allocate space more like Windows does: + + 1) The x86 pcibios_align_resource() will choose space from the + end of an available area, not the beginning. + + 2) In the generic allocate_resource() path, we'll look for space + between existing children from the top, not from the bottom. + + 3) When pci_bus_alloc_resource() looks for available space, it + will start from the highest window, not the first one we found. + +This series fixes a 2.6.34 regression that prevents many Dell Precision +workstations from booting: + + https://bugzilla.kernel.org/show_bug.cgi?id=16228 + +Changes from v3 to v4: + - Use round_down() rather than adding ALIGN_DOWN(). + - Replace ARCH_HAS_TOP_DOWN_ALLOC #define with a boot-time architecture + choice and add a "resource_alloc_from_bottom" command line option to + revert to the old behavior (NOTE: this only affects allocate_resource(), + not pcibios_align_resource() or pci_bus_alloc_resource()). + - Fixed find_resource_from_top() again; it still didn't handle a child + that ended at the parent's end correctly. + +Changes from v2 to v3: + - Updated iomem_resource.end to reflect the end of usable physical address + space. Otherwise, we might allocate right up to 0xffffffff_ffffffff, + which isn't usable. + - Make allocate_resource() change conditional on ARCH_HAS_TOP_DOWN_ALLOC. + Without arch-specific changes like the above, it's too dangerous to + make this change for everybody at once. + - Fix 64-bit wraparound in find_resource(). If the last child happened + to end at ~0, we computed the highest available space as [child->end + 1, + root->end], which makes us think the available space started at 0, + which makes us return space that may already be allocated. + +Changes from v1 to v2: + - Moved check for allocating before the available area from + pcibios_align_resource() to find_resource(). Better to do it + after the alignment callback is done, and make it generic. + - Fixed pcibios_align_resource() alignment. If we start from the + end of the available area, we must align *downward*, not upward. + - Fixed pcibios_align_resource() ISA alias avoidance. Again, since + the starting point is the end of the area, we must align downward + when we avoid aliased areas. +--- + +Bjorn Helgaas (6): + resources: ensure alignment callback doesn't allocate below available start + resources: support allocating space within a region from the top down + PCI: allocate bus resources from the top down + x86/PCI: allocate space from the end of a region, not the beginning + x86: update iomem_resource end based on CPU physical address capabilities + x86: allocate space within a region top-down + + + Documentation/kernel-parameters.txt | 5 ++ + arch/x86/kernel/setup.c | 2 + + arch/x86/pci/i386.c | 17 ++++-- + drivers/pci/bus.c | 53 +++++++++++++++++-- + include/linux/ioport.h | 1 + kernel/resource.c | 99 ++++++++++++++++++++++++++++++++++- + 6 files changed, 163 insertions(+), 14 deletions(-) +-- +To unsubscribe from this list: send the line "unsubscribe linux-pci" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html +The alignment callback returns a proposed location, which may have been +adjusted to avoid ISA aliases or for other architecture-specific reasons. +We already had a check ("tmp.start < tmp.end") to make sure the callback +doesn't return a location above the available area. + +This patch adds a check to make sure the callback doesn't return something +*below* the available area, as may happen if the callback tries to allocate +top-down. + +Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com> +--- + + kernel/resource.c | 10 ++++++++-- + 1 files changed, 8 insertions(+), 2 deletions(-) + + +diff --git a/kernel/resource.c b/kernel/resource.c +index 7b36976..ace2269 100644 +--- a/kernel/resource.c ++++ b/kernel/resource.c +@@ -371,6 +371,7 @@ static int find_resource(struct resource *root, struct resource *new, + { + struct resource *this = root->child; + struct resource tmp = *new; ++ resource_size_t start; + + tmp.start = root->start; + /* +@@ -391,8 +392,13 @@ static int find_resource(struct resource *root, struct resource *new, + if (tmp.end > max) + tmp.end = max; + tmp.start = ALIGN(tmp.start, align); +- if (alignf) +- tmp.start = alignf(alignf_data, &tmp, size, align); ++ if (alignf) { ++ start = alignf(alignf_data, &tmp, size, align); ++ if (tmp.start <= start && start <= tmp.end) ++ tmp.start = start; ++ else ++ tmp.start = tmp.end; ++ } + if (tmp.start < tmp.end && tmp.end - tmp.start >= size - 1) { + new->start = tmp.start; + new->end = tmp.start + size - 1; + +-- +To unsubscribe from this list: send the line "unsubscribe linux-pci" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html +Allocate space from the top of a region first, then work downward, +if an architecture desires this. + +When we allocate space from a resource, we look for gaps between children +of the resource. Previously, we always looked at gaps from the bottom up. +For example, given this: + + [mem 0xbff00000-0xf7ffffff] PCI Bus 0000:00 + [mem 0xbff00000-0xbfffffff] gap -- available + [mem 0xc0000000-0xdfffffff] PCI Bus 0000:02 + [mem 0xe0000000-0xf7ffffff] gap -- available + +we attempted to allocate from the [mem 0xbff00000-0xbfffffff] gap first, +then the [mem 0xe0000000-0xf7ffffff] gap. + +With this patch an architecture can choose to allocate from the top gap +[mem 0xe0000000-0xf7ffffff] first. + +We can't do this across the board because iomem_resource.end is initialized +to 0xffffffff_ffffffff on 64-bit architectures, and most machines can't +address the entire 64-bit physical address space. Therefore, we only +allocate top-down if the arch requests it by clearing +"resource_alloc_from_bottom". + +Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com> +--- + + Documentation/kernel-parameters.txt | 5 ++ + include/linux/ioport.h | 1 + kernel/resource.c | 89 +++++++++++++++++++++++++++++++++++ + 3 files changed, 94 insertions(+), 1 deletions(-) + + +diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt +index 8dd7248..fe50cbd 100644 +--- a/Documentation/kernel-parameters.txt ++++ b/Documentation/kernel-parameters.txt +@@ -2156,6 +2156,11 @@ and is between 256 and 4096 characters. It is defined in the file + reset_devices [KNL] Force drivers to reset the underlying device + during initialization. + ++ resource_alloc_from_bottom ++ Allocate new resources from the beginning of available ++ space, not the end. If you need to use this, please ++ report a bug. ++ + resume= [SWSUSP] + Specify the partition device for software suspend + +diff --git a/include/linux/ioport.h b/include/linux/ioport.h +index b227902..d377ea8 100644 +--- a/include/linux/ioport.h ++++ b/include/linux/ioport.h +@@ -112,6 +112,7 @@ struct resource_list { + /* PC/ISA/whatever - the normal PC address spaces: IO and memory */ + extern struct resource ioport_resource; + extern struct resource iomem_resource; ++extern int resource_alloc_from_bottom; + + extern struct resource *request_resource_conflict(struct resource *root, struct resource *new); + extern int request_resource(struct resource *root, struct resource *new); +diff --git a/kernel/resource.c b/kernel/resource.c +index ace2269..8d337a9 100644 +--- a/kernel/resource.c ++++ b/kernel/resource.c +@@ -40,6 +40,23 @@ EXPORT_SYMBOL(iomem_resource); + + static DEFINE_RWLOCK(resource_lock); + ++/* ++ * By default, we allocate free space bottom-up. The architecture can request ++ * top-down by clearing this flag. The user can override the architecture's ++ * choice with the "resource_alloc_from_bottom" kernel boot option, but that ++ * should only be a debugging tool. ++ */ ++int resource_alloc_from_bottom = 1; ++ ++static __init int setup_alloc_from_bottom(char *s) ++{ ++ printk(KERN_INFO ++ "resource: allocating from bottom-up; please report a bug\n"); ++ resource_alloc_from_bottom = 1; ++ return 0; ++} ++early_param("resource_alloc_from_bottom", setup_alloc_from_bottom); ++ + static void *r_next(struct seq_file *m, void *v, loff_t *pos) + { + struct resource *p = v; +@@ -358,7 +375,74 @@ int __weak page_is_ram(unsigned long pfn) + } + + /* ++ * Find the resource before "child" in the sibling list of "root" children. ++ */ ++static struct resource *find_sibling_prev(struct resource *root, struct resource *child) ++{ ++ struct resource *this; ++ ++ for (this = root->child; this; this = this->sibling) ++ if (this->sibling == child) ++ return this; ++ ++ return NULL; ++} ++ ++/* ++ * Find empty slot in the resource tree given range and alignment. ++ * This version allocates from the end of the root resource first. ++ */ ++static int find_resource_from_top(struct resource *root, struct resource *new, ++ resource_size_t size, resource_size_t min, ++ resource_size_t max, resource_size_t align, ++ resource_size_t (*alignf)(void *, ++ const struct resource *, ++ resource_size_t, ++ resource_size_t), ++ void *alignf_data) ++{ ++ struct resource *this; ++ struct resource tmp = *new; ++ resource_size_t start; ++ ++ tmp.start = root->end; ++ tmp.end = root->end; ++ ++ this = find_sibling_prev(root, NULL); ++ for (;;) { ++ if (this) { ++ if (this->end < root->end) ++ tmp.start = this->end + 1; ++ } else ++ tmp.start = root->start; ++ if (tmp.start < min) ++ tmp.start = min; ++ if (tmp.end > max) ++ tmp.end = max; ++ tmp.start = ALIGN(tmp.start, align); ++ if (alignf) { ++ start = alignf(alignf_data, &tmp, size, align); ++ if (tmp.start <= start && start <= tmp.end) ++ tmp.start = start; ++ else ++ tmp.start = tmp.end; ++ } ++ if (tmp.start < tmp.end && tmp.end - tmp.start >= size - 1) { ++ new->start = tmp.start; ++ new->end = tmp.start + size - 1; ++ return 0; ++ } ++ if (!this || this->start == root->start) ++ break; ++ tmp.end = this->start - 1; ++ this = find_sibling_prev(root, this); ++ } ++ return -EBUSY; ++} ++ ++/* + * Find empty slot in the resource tree given range and alignment. ++ * This version allocates from the beginning of the root resource first. + */ + static int find_resource(struct resource *root, struct resource *new, + resource_size_t size, resource_size_t min, +@@ -435,7 +519,10 @@ int allocate_resource(struct resource *root, struct resource *new, + int err; + + write_lock(&resource_lock); +- err = find_resource(root, new, size, min, max, align, alignf, alignf_data); ++ if (resource_alloc_from_bottom) ++ err = find_resource(root, new, size, min, max, align, alignf, alignf_data); ++ else ++ err = find_resource_from_top(root, new, size, min, max, align, alignf, alignf_data); + if (err >= 0 && __request_resource(root, new)) + err = -EBUSY; + write_unlock(&resource_lock); + +-- +To unsubscribe from this list: send the line "unsubscribe linux-pci" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html +Allocate space from the highest-address PCI bus resource first, then work +downward. + +Previously, we looked for space in PCI host bridge windows in the order +we discovered the windows. For example, given the following windows +(discovered via an ACPI _CRS method): + + pci_root PNP0A03:00: host bridge window [mem 0x000a0000-0x000bffff] + pci_root PNP0A03:00: host bridge window [mem 0x000c0000-0x000effff] + pci_root PNP0A03:00: host bridge window [mem 0x000f0000-0x000fffff] + pci_root PNP0A03:00: host bridge window [mem 0xbff00000-0xf7ffffff] + pci_root PNP0A03:00: host bridge window [mem 0xff980000-0xff980fff] + pci_root PNP0A03:00: host bridge window [mem 0xff97c000-0xff97ffff] + pci_root PNP0A03:00: host bridge window [mem 0xfed20000-0xfed9ffff] + +we attempted to allocate from [mem 0x000a0000-0x000bffff] first, then +[mem 0x000c0000-0x000effff], and so on. + +With this patch, we allocate from [mem 0xff980000-0xff980fff] first, then +[mem 0xff97c000-0xff97ffff], [mem 0xfed20000-0xfed9ffff], etc. + +Allocating top-down follows Windows practice, so we're less likely to +trip over BIOS defects in the _CRS description. + +On the machine above (a Dell T3500), the [mem 0xbff00000-0xbfffffff] region +doesn't actually work and is likely a BIOS defect. The symptom is that we +move the AHCI controller to 0xbff00000, which leads to "Boot has failed, +sleeping forever," a BUG in ahci_stop_engine(), or some other boot failure. + +Reference: https://bugzilla.kernel.org/show_bug.cgi?id=16228#c43 +Reference: https://bugzilla.redhat.com/show_bug.cgi?id=620313 +Reference: https://bugzilla.redhat.com/show_bug.cgi?id=629933 +Reported-by: Brian Bloniarz <phunge0@hotmail.com> +Reported-and-tested-by: Stefan Becker <chemobejk@gmail.com> +Reported-by: Denys Vlasenko <dvlasenk@redhat.com> +Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com> +--- + + drivers/pci/bus.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++----- + 1 files changed, 48 insertions(+), 5 deletions(-) + + +diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c +index 7f0af0e..172bf26 100644 +--- a/drivers/pci/bus.c ++++ b/drivers/pci/bus.c +@@ -64,6 +64,49 @@ void pci_bus_remove_resources(struct pci_bus *bus) + } + } + ++/* ++ * Find the highest-address bus resource below the cursor "res". If the ++ * cursor is NULL, return the highest resource. ++ */ ++static struct resource *pci_bus_find_resource_prev(struct pci_bus *bus, ++ unsigned int type, ++ struct resource *res) ++{ ++ struct resource *r, *prev = NULL; ++ int i; ++ ++ pci_bus_for_each_resource(bus, r, i) { ++ if (!r) ++ continue; ++ ++ if ((r->flags & IORESOURCE_TYPE_BITS) != type) ++ continue; ++ ++ /* If this resource is at or past the cursor, skip it */ ++ if (res) { ++ if (r == res) ++ continue; ++ if (r->end > res->end) ++ continue; ++ if (r->end == res->end && r->start > res->start) ++ continue; ++ } ++ ++ if (!prev) ++ prev = r; ++ ++ /* ++ * A small resource is higher than a large one that ends at ++ * the same address. ++ */ ++ if (r->end > prev->end || ++ (r->end == prev->end && r->start > prev->start)) ++ prev = r; ++ } ++ ++ return prev; ++} ++ + /** + * pci_bus_alloc_resource - allocate a resource from a parent bus + * @bus: PCI bus +@@ -89,9 +132,10 @@ pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, + resource_size_t), + void *alignf_data) + { +- int i, ret = -ENOMEM; ++ int ret = -ENOMEM; + struct resource *r; + resource_size_t max = -1; ++ unsigned int type = res->flags & IORESOURCE_TYPE_BITS; + + type_mask |= IORESOURCE_IO | IORESOURCE_MEM; + +@@ -99,10 +143,9 @@ pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, + if (!(res->flags & IORESOURCE_MEM_64)) + max = PCIBIOS_MAX_MEM_32; + +- pci_bus_for_each_resource(bus, r, i) { +- if (!r) +- continue; +- ++ /* Look for space at highest addresses first */ ++ r = pci_bus_find_resource_prev(bus, type, NULL); ++ for ( ; r; r = pci_bus_find_resource_prev(bus, type, r)) { + /* type_mask must match */ + if ((res->flags ^ r->flags) & type_mask) + continue; + +-- +To unsubscribe from this list: send the line "unsubscribe linux-pci" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html +Allocate from the end of a region, not the beginning. + +For example, if we need to allocate 0x800 bytes for a device on bus +0000:00 given these resources: + + [mem 0xbff00000-0xdfffffff] PCI Bus 0000:00 + [mem 0xc0000000-0xdfffffff] PCI Bus 0000:02 + +the available space at [mem 0xbff00000-0xbfffffff] is passed to the +alignment callback (pcibios_align_resource()). Prior to this patch, we +would put the new 0x800 byte resource at the beginning of that available +space, i.e., at [mem 0xbff00000-0xbff007ff]. + +With this patch, we put it at the end, at [mem 0xbffff800-0xbfffffff]. + +Reference: https://bugzilla.kernel.org/show_bug.cgi?id=16228#c41 +Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com> +--- + + arch/x86/pci/i386.c | 17 +++++++++++------ + 1 files changed, 11 insertions(+), 6 deletions(-) + + +diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c +index 5525309..826140a 100644 +--- a/arch/x86/pci/i386.c ++++ b/arch/x86/pci/i386.c +@@ -65,16 +65,21 @@ pcibios_align_resource(void *data, const struct resource *res, + resource_size_t size, resource_size_t align) + { + struct pci_dev *dev = data; +- resource_size_t start = res->start; ++ resource_size_t start = round_down(res->end - size + 1, align); + + if (res->flags & IORESOURCE_IO) { +- if (skip_isa_ioresource_align(dev)) +- return start; +- if (start & 0x300) +- start = (start + 0x3ff) & ~0x3ff; ++ ++ /* ++ * If we're avoiding ISA aliases, the largest contiguous I/O ++ * port space is 256 bytes. Clearing bits 9 and 10 preserves ++ * all 256-byte and smaller alignments, so the result will ++ * still be correctly aligned. ++ */ ++ if (!skip_isa_ioresource_align(dev)) ++ start &= ~0x300; + } else if (res->flags & IORESOURCE_MEM) { + if (start < BIOS_END) +- start = BIOS_END; ++ start = res->end; /* fail; no space */ + } + return start; + } + +-- +To unsubscribe from this list: send the line "unsubscribe linux-pci" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html +The iomem_resource map reflects the available physical address space. +We statically initialize the end to -1, i.e., 0xffffffff_ffffffff, but +of course we can only use as much as the CPU can address. + +This patch updates the end based on the CPU capabilities, so we don't +mistakenly allocate space that isn't usable, as we're likely to do when +allocating from the top-down. + +Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com> +--- + + arch/x86/kernel/setup.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + + +diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c +index c3a4fbb..922b5a1 100644 +--- a/arch/x86/kernel/setup.c ++++ b/arch/x86/kernel/setup.c +@@ -788,6 +788,7 @@ void __init setup_arch(char **cmdline_p) + + x86_init.oem.arch_setup(); + ++ iomem_resource.end = (1ULL << boot_cpu_data.x86_phys_bits) - 1; + setup_memory_map(); + parse_setup_data(); + /* update the e820_saved too */ + +-- +To unsubscribe from this list: send the line "unsubscribe linux-pci" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html +Request that allocate_resource() use available space from high addresses +first, rather than the default of using low addresses first. + +The most common place this makes a difference is when we move or assign +new PCI device resources. Low addresses are generally scarce, so it's +better to use high addresses when possible. This follows Windows practice +for PCI allocation. + +Reference: https://bugzilla.kernel.org/show_bug.cgi?id=16228#c42 +Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com> +--- + + arch/x86/kernel/setup.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + + +diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c +index 922b5a1..0fe76df 100644 +--- a/arch/x86/kernel/setup.c ++++ b/arch/x86/kernel/setup.c +@@ -788,6 +788,7 @@ void __init setup_arch(char **cmdline_p) + + x86_init.oem.arch_setup(); + ++ resource_alloc_from_bottom = 0; + iomem_resource.end = (1ULL << boot_cpu_data.x86_phys_bits) - 1; + setup_memory_map(); + parse_setup_data(); + +-- +To unsubscribe from this list: send the line "unsubscribe linux-pci" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html
\ No newline at end of file diff --git a/runtime_pm_fixups.patch b/runtime_pm_fixups.patch index 789115810..6315dc176 100644 --- a/runtime_pm_fixups.patch +++ b/runtime_pm_fixups.patch @@ -110,5 +110,5 @@ index 4de84ce..284f43c 100644 -int acpi_disable_wakeup_device_power(struct acpi_device *dev); +int acpi_disable_wakeup_device_power(struct acpi_device *dev, int state); - #ifdef CONFIG_PM_OPS + #ifdef CONFIG_PM_SLEEP int acpi_pm_device_sleep_state(struct device *, int *); @@ -1,3 +1,3 @@ 61f3739a73afb6914cb007f37fb09b62 linux-2.6.36.tar.bz2 -a84cf559615b5168ec1d5591841601ed patch-2.6.37-rc5.bz2 -dbc90858467e28b39539ad6d3415a956 patch-2.6.37-rc5-git2.bz2 +dd38a6caf08df2822f93541ee95aed7d patch-2.6.36.1.bz2 +33b11b4b8fcd47601a0e1e51586c4b04 patch-2.6.36.2-rc1.bz2 diff --git a/wacom-01-add-fuzz-parameters-to-features.patch b/wacom-01-add-fuzz-parameters-to-features.patch new file mode 100644 index 000000000..4162726d3 --- /dev/null +++ b/wacom-01-add-fuzz-parameters-to-features.patch @@ -0,0 +1,69 @@ +From: Henrik Rydberg <rydberg@euromail.se> +Date: Sun, 5 Sep 2010 19:25:11 +0000 (-0700) +Subject: Input: wacom - add fuzz parameters to features +X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=fed87e655a2c20468d628b37424af58287803afe + +Input: wacom - add fuzz parameters to features + +The signal-to-noise ratio varies between devices, but currently all +devices are treated the same way. Add fuzz parameters to the feature +struct, allowing for tailored treatment of devices. + +Signed-off-by: Henrik Rydberg <rydberg@euromail.se> +Acked-by: Ping Cheng <pingc@wacom.com> +Signed-off-by: Dmitry Torokhov <dtor@mail.ru> +--- + +diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c +index 42ba369..e510e4f 100644 +--- a/drivers/input/tablet/wacom_sys.c ++++ b/drivers/input/tablet/wacom_sys.c +@@ -333,8 +333,12 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf, + struct usb_host_interface *interface = intf->cur_altsetting; + struct hid_descriptor *hid_desc; + +- /* default device to penabled */ ++ /* default features */ + features->device_type = BTN_TOOL_PEN; ++ features->x_fuzz = 4; ++ features->y_fuzz = 4; ++ features->pressure_fuzz = 0; ++ features->distance_fuzz = 0; + + /* only Tablet PCs need to retrieve the info */ + if ((features->type != TABLETPC) && (features->type != TABLETPC2FG)) +diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c +index 6e29bad..6d7e164 100644 +--- a/drivers/input/tablet/wacom_wac.c ++++ b/drivers/input/tablet/wacom_wac.c +@@ -951,9 +951,12 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev, + + __set_bit(BTN_TOUCH, input_dev->keybit); + +- input_set_abs_params(input_dev, ABS_X, 0, features->x_max, 4, 0); +- input_set_abs_params(input_dev, ABS_Y, 0, features->y_max, 4, 0); +- input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, 0, 0); ++ input_set_abs_params(input_dev, ABS_X, 0, features->x_max, ++ features->x_fuzz, 0); ++ input_set_abs_params(input_dev, ABS_Y, 0, features->y_max, ++ features->y_fuzz, 0); ++ input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, ++ features->pressure_fuzz, 0); + + __set_bit(ABS_MISC, input_dev->absbit); + +diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h +index 99e1a54..d769e9a 100644 +--- a/drivers/input/tablet/wacom_wac.h ++++ b/drivers/input/tablet/wacom_wac.h +@@ -73,6 +73,10 @@ struct wacom_features { + int y_phy; + unsigned char unit; + unsigned char unitExpo; ++ int x_fuzz; ++ int y_fuzz; ++ int pressure_fuzz; ++ int distance_fuzz; + }; + + struct wacom_shared { diff --git a/wacom-02-parse-the-bamboo-device-family.patch b/wacom-02-parse-the-bamboo-device-family.patch new file mode 100644 index 000000000..f24d04d01 --- /dev/null +++ b/wacom-02-parse-the-bamboo-device-family.patch @@ -0,0 +1,122 @@ +From: Ping Cheng <pinglinux@gmail.com> +Date: Sun, 5 Sep 2010 19:25:40 +0000 (-0700) +Subject: Input: wacom - parse the Bamboo device family +X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=4a88081e739a41d6d70bace7e0a027f9054ab540 + +Input: wacom - parse the Bamboo device family + +The Bamboo devices have multiple interfaces which need to be setup +separately. Use the HID parsing mechanism to achieve that. + +Signed-off-by: Ping Cheng <pinglinux@gmail.com> +Signed-off-by: Henrik Rydberg <rydberg@euromail.se> +Signed-off-by: Dmitry Torokhov <dtor@mail.ru> +--- + +diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c +index e510e4f..98cba08 100644 +--- a/drivers/input/tablet/wacom_sys.c ++++ b/drivers/input/tablet/wacom_sys.c +@@ -195,17 +195,30 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi + features->pktlen = WACOM_PKGLEN_TPC2FG; + features->device_type = BTN_TOOL_TRIPLETAP; + } +- features->x_max = +- get_unaligned_le16(&report[i + 3]); +- features->x_phy = +- get_unaligned_le16(&report[i + 6]); +- features->unit = report[i + 9]; +- features->unitExpo = report[i + 11]; +- i += 12; ++ if (features->type == BAMBOO_PT) { ++ /* need to reset back */ ++ features->pktlen = WACOM_PKGLEN_BBTOUCH; ++ features->device_type = BTN_TOOL_TRIPLETAP; ++ features->x_phy = ++ get_unaligned_le16(&report[i + 5]); ++ features->x_max = ++ get_unaligned_le16(&report[i + 8]); ++ i += 15; ++ } else { ++ features->x_max = ++ get_unaligned_le16(&report[i + 3]); ++ features->x_phy = ++ get_unaligned_le16(&report[i + 6]); ++ features->unit = report[i + 9]; ++ features->unitExpo = report[i + 11]; ++ i += 12; ++ } + } else if (pen) { + /* penabled only accepts exact bytes of data */ + if (features->type == TABLETPC2FG) + features->pktlen = WACOM_PKGLEN_GRAPHIRE; ++ if (features->type == BAMBOO_PT) ++ features->pktlen = WACOM_PKGLEN_BBFUN; + features->device_type = BTN_TOOL_PEN; + features->x_max = + get_unaligned_le16(&report[i + 3]); +@@ -234,6 +247,15 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi + features->y_phy = + get_unaligned_le16(&report[i + 6]); + i += 7; ++ } else if (features->type == BAMBOO_PT) { ++ /* need to reset back */ ++ features->pktlen = WACOM_PKGLEN_BBTOUCH; ++ features->device_type = BTN_TOOL_TRIPLETAP; ++ features->y_phy = ++ get_unaligned_le16(&report[i + 3]); ++ features->y_max = ++ get_unaligned_le16(&report[i + 6]); ++ i += 12; + } else { + features->y_max = + features->x_max; +@@ -245,6 +267,8 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi + /* penabled only accepts exact bytes of data */ + if (features->type == TABLETPC2FG) + features->pktlen = WACOM_PKGLEN_GRAPHIRE; ++ if (features->type == BAMBOO_PT) ++ features->pktlen = WACOM_PKGLEN_BBFUN; + features->device_type = BTN_TOOL_PEN; + features->y_max = + get_unaligned_le16(&report[i + 3]); +@@ -341,7 +365,8 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf, + features->distance_fuzz = 0; + + /* only Tablet PCs need to retrieve the info */ +- if ((features->type != TABLETPC) && (features->type != TABLETPC2FG)) ++ if ((features->type != TABLETPC) && (features->type != TABLETPC2FG) && ++ (features->type != BAMBOO_PT)) + goto out; + + if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) { +@@ -499,7 +524,8 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i + + strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name)); + +- if (features->type == TABLETPC || features->type == TABLETPC2FG) { ++ if (features->type == TABLETPC || features->type == TABLETPC2FG || ++ features->type == BAMBOO_PT) { + /* Append the device type to the name */ + strlcat(wacom_wac->name, + features->device_type == BTN_TOOL_PEN ? +diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h +index d769e9a..fb30895 100644 +--- a/drivers/input/tablet/wacom_wac.h ++++ b/drivers/input/tablet/wacom_wac.h +@@ -21,6 +21,7 @@ + #define WACOM_PKGLEN_INTUOS 10 + #define WACOM_PKGLEN_TPC1FG 5 + #define WACOM_PKGLEN_TPC2FG 14 ++#define WACOM_PKGLEN_BBTOUCH 20 + + /* device IDs */ + #define STYLUS_DEVICE_ID 0x02 +@@ -44,6 +45,7 @@ enum { + PTU, + PL, + DTU, ++ BAMBOO_PT, + INTUOS, + INTUOS3S, + INTUOS3, diff --git a/wacom-03-collect-device-quirks-into-single-function.patch b/wacom-03-collect-device-quirks-into-single-function.patch new file mode 100644 index 000000000..7bf768770 --- /dev/null +++ b/wacom-03-collect-device-quirks-into-single-function.patch @@ -0,0 +1,107 @@ +From: Henrik Rydberg <rydberg@euromail.se> +Date: Sun, 5 Sep 2010 19:26:16 +0000 (-0700) +Subject: Input: wacom - collect device quirks into single function +X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=bc73dd39e78dd6e5b34cd938b7f037a8bc041bdd + +Input: wacom - collect device quirks into single function + +Collect device-specific code into a single function, and use quirks to +flag specific behavior instead. + +Signed-off-by: Henrik Rydberg <rydberg@euromail.se> +Acked-by: Ping Cheng <pingc@wacom.com> +Signed-off-by: Dmitry Torokhov <dtor@mail.ru> +--- + +diff --git a/drivers/input/tablet/wacom.h b/drivers/input/tablet/wacom.h +index 284dfaa..de5adb1 100644 +--- a/drivers/input/tablet/wacom.h ++++ b/drivers/input/tablet/wacom.h +@@ -118,6 +118,7 @@ struct wacom { + extern const struct usb_device_id wacom_ids[]; + + void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len); ++void wacom_setup_device_quirks(struct wacom_features *features); + void wacom_setup_input_capabilities(struct input_dev *input_dev, + struct wacom_wac *wacom_wac); + #endif +diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c +index 98cba08..fc6fd53 100644 +--- a/drivers/input/tablet/wacom_sys.c ++++ b/drivers/input/tablet/wacom_sys.c +@@ -381,12 +381,6 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf, + if (error) + goto out; + +- /* touch device found but size is not defined. use default */ +- if (features->device_type == BTN_TOOL_DOUBLETAP && !features->x_max) { +- features->x_max = 1023; +- features->y_max = 1023; +- } +- + out: + return error; + } +@@ -522,10 +516,11 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i + if (error) + goto fail2; + ++ wacom_setup_device_quirks(features); ++ + strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name)); + +- if (features->type == TABLETPC || features->type == TABLETPC2FG || +- features->type == BAMBOO_PT) { ++ if (features->quirks & WACOM_QUIRK_MULTI_INPUT) { + /* Append the device type to the name */ + strlcat(wacom_wac->name, + features->device_type == BTN_TOOL_PEN ? +diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c +index 6d7e164..44b4a59 100644 +--- a/drivers/input/tablet/wacom_wac.c ++++ b/drivers/input/tablet/wacom_wac.c +@@ -941,6 +941,22 @@ static void wacom_setup_intuos(struct wacom_wac *wacom_wac) + input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0); + } + ++ ++void wacom_setup_device_quirks(struct wacom_features *features) ++{ ++ ++ /* touch device found but size is not defined. use default */ ++ if (features->device_type == BTN_TOOL_DOUBLETAP && !features->x_max) { ++ features->x_max = 1023; ++ features->y_max = 1023; ++ } ++ ++ /* these device have multiple inputs */ ++ if (features->type == TABLETPC || features->type == TABLETPC2FG || ++ features->type == BAMBOO_PT) ++ features->quirks |= WACOM_QUIRK_MULTI_INPUT; ++} ++ + void wacom_setup_input_capabilities(struct input_dev *input_dev, + struct wacom_wac *wacom_wac) + { +diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h +index fb30895..6a1ff10 100644 +--- a/drivers/input/tablet/wacom_wac.h ++++ b/drivers/input/tablet/wacom_wac.h +@@ -38,6 +38,9 @@ + #define WACOM_REPORT_TPC1FG 6 + #define WACOM_REPORT_TPC2FG 13 + ++/* device quirks */ ++#define WACOM_QUIRK_MULTI_INPUT 0x0001 ++ + enum { + PENPARTNER = 0, + GRAPHIRE, +@@ -79,6 +82,7 @@ struct wacom_features { + int y_fuzz; + int pressure_fuzz; + int distance_fuzz; ++ unsigned quirks; + }; + + struct wacom_shared { diff --git a/wacom-04-add-support-for-the-bamboo-touch-trackpad.patch b/wacom-04-add-support-for-the-bamboo-touch-trackpad.patch new file mode 100644 index 000000000..f104b2ce3 --- /dev/null +++ b/wacom-04-add-support-for-the-bamboo-touch-trackpad.patch @@ -0,0 +1,172 @@ +From: Henrik Rydberg <rydberg@euromail.se> +Date: Sun, 5 Sep 2010 19:53:16 +0000 (-0700) +Subject: Input: wacom - add support for the Bamboo Touch trackpad +X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=cb734c03680eaaad64a20a666300eafd1ac260b2 + +Input: wacom - add support for the Bamboo Touch trackpad + +Add support for the Bamboo Touch trackpad, and make it work with +both the Synaptics X Driver and the Multitouch X Driver. The device +uses MT slots internally, so the choice of protocol is a given. + +Signed-off-by: Henrik Rydberg <rydberg@euromail.se> +Acked-by: Ping Cheng <pingc@wacom.com> +Signed-off-by: Dmitry Torokhov <dtor@mail.ru> +--- + +diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c +index 44b4a59..4e9b1dd 100644 +--- a/drivers/input/tablet/wacom_wac.c ++++ b/drivers/input/tablet/wacom_wac.c +@@ -855,6 +855,53 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len) + return retval; + } + ++static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len) ++{ ++ struct input_dev *input = wacom->input; ++ unsigned char *data = wacom->data; ++ int sp = 0, sx = 0, sy = 0, count = 0; ++ int i; ++ ++ if (len != WACOM_PKGLEN_BBTOUCH) ++ return 0; ++ ++ for (i = 0; i < 2; i++) { ++ int p = data[9 * i + 2]; ++ input_mt_slot(input, i); ++ if (p) { ++ int x = get_unaligned_be16(&data[9 * i + 3]) & 0x7ff; ++ int y = get_unaligned_be16(&data[9 * i + 5]) & 0x7ff; ++ input_report_abs(input, ABS_MT_PRESSURE, p); ++ input_report_abs(input, ABS_MT_POSITION_X, x); ++ input_report_abs(input, ABS_MT_POSITION_Y, y); ++ if (wacom->id[i] < 0) ++ wacom->id[i] = wacom->trk_id++ & MAX_TRACKING_ID; ++ if (!count++) ++ sp = p, sx = x, sy = y; ++ } else { ++ wacom->id[i] = -1; ++ } ++ input_report_abs(input, ABS_MT_TRACKING_ID, wacom->id[i]); ++ } ++ ++ input_report_key(input, BTN_TOUCH, count > 0); ++ input_report_key(input, BTN_TOOL_FINGER, count == 1); ++ input_report_key(input, BTN_TOOL_DOUBLETAP, count == 2); ++ ++ input_report_abs(input, ABS_PRESSURE, sp); ++ input_report_abs(input, ABS_X, sx); ++ input_report_abs(input, ABS_Y, sy); ++ ++ input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0); ++ input_report_key(input, BTN_FORWARD, (data[1] & 0x04) != 0); ++ input_report_key(input, BTN_BACK, (data[1] & 0x02) != 0); ++ input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0); ++ ++ input_sync(input); ++ ++ return 0; ++} ++ + void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) + { + bool sync; +@@ -900,6 +947,10 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) + sync = wacom_tpc_irq(wacom_wac, len); + break; + ++ case BAMBOO_PT: ++ sync = wacom_bpt_irq(wacom_wac, len); ++ break; ++ + default: + sync = false; + break; +@@ -955,6 +1006,13 @@ void wacom_setup_device_quirks(struct wacom_features *features) + if (features->type == TABLETPC || features->type == TABLETPC2FG || + features->type == BAMBOO_PT) + features->quirks |= WACOM_QUIRK_MULTI_INPUT; ++ ++ /* quirks for bamboo touch */ ++ if (features->type == BAMBOO_PT && ++ features->device_type == BTN_TOOL_TRIPLETAP) { ++ features->pressure_max = 256; ++ features->pressure_fuzz = 16; ++ } + } + + void wacom_setup_input_capabilities(struct input_dev *input_dev, +@@ -1095,6 +1153,33 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev, + case PENPARTNER: + __set_bit(BTN_TOOL_RUBBER, input_dev->keybit); + break; ++ ++ case BAMBOO_PT: ++ __clear_bit(ABS_MISC, input_dev->absbit); ++ ++ if (features->device_type == BTN_TOOL_TRIPLETAP) { ++ __set_bit(BTN_LEFT, input_dev->keybit); ++ __set_bit(BTN_FORWARD, input_dev->keybit); ++ __set_bit(BTN_BACK, input_dev->keybit); ++ __set_bit(BTN_RIGHT, input_dev->keybit); ++ ++ __set_bit(BTN_TOOL_FINGER, input_dev->keybit); ++ __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); ++ ++ input_mt_create_slots(input_dev, 2); ++ input_set_abs_params(input_dev, ABS_MT_POSITION_X, ++ 0, features->x_max, ++ features->x_fuzz, 0); ++ input_set_abs_params(input_dev, ABS_MT_POSITION_Y, ++ 0, features->y_max, ++ features->y_fuzz, 0); ++ input_set_abs_params(input_dev, ABS_MT_PRESSURE, ++ 0, features->pressure_max, ++ features->pressure_fuzz, 0); ++ input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, ++ MAX_TRACKING_ID, 0, 0); ++ } ++ break; + } + } + +@@ -1232,6 +1317,8 @@ static const struct wacom_features wacom_features_0xE3 = + { "Wacom ISDv4 E3", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, 0, TABLETPC2FG }; + static const struct wacom_features wacom_features_0x47 = + { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 31, INTUOS }; ++static struct wacom_features wacom_features_0xD0 = ++ { "Wacom Bamboo 2FG", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT }; + + #define USB_DEVICE_WACOM(prod) \ + USB_DEVICE(USB_VENDOR_ID_WACOM, prod), \ +@@ -1296,6 +1383,7 @@ const struct usb_device_id wacom_ids[] = { + { USB_DEVICE_WACOM(0xC6) }, + { USB_DEVICE_WACOM(0xC7) }, + { USB_DEVICE_WACOM(0xCE) }, ++ { USB_DEVICE_WACOM(0xD0) }, + { USB_DEVICE_WACOM(0xF0) }, + { USB_DEVICE_WACOM(0xCC) }, + { USB_DEVICE_WACOM(0x90) }, +diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h +index 6a1ff10..a23d6a5 100644 +--- a/drivers/input/tablet/wacom_wac.h ++++ b/drivers/input/tablet/wacom_wac.h +@@ -41,6 +41,9 @@ + /* device quirks */ + #define WACOM_QUIRK_MULTI_INPUT 0x0001 + ++/* largest reported tracking id */ ++#define MAX_TRACKING_ID 0xfff ++ + enum { + PENPARTNER = 0, + GRAPHIRE, +@@ -96,6 +99,7 @@ struct wacom_wac { + int id[3]; + __u32 serial[2]; + int last_finger; ++ int trk_id; + struct wacom_features features; + struct wacom_shared *shared; + struct input_dev *input; diff --git a/wacom-05-add-a-quirk-for-low-resolution-bamboo-devices.patch b/wacom-05-add-a-quirk-for-low-resolution-bamboo-devices.patch new file mode 100644 index 000000000..1809ec03e --- /dev/null +++ b/wacom-05-add-a-quirk-for-low-resolution-bamboo-devices.patch @@ -0,0 +1,69 @@ +From: Henrik Rydberg <rydberg@euromail.se> +Date: Sun, 5 Sep 2010 19:57:13 +0000 (-0700) +Subject: Input: wacom - add a quirk for low resolution Bamboo devices +X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=f4ccbef2886968ed409939531f6dd0474d53a12a + +Input: wacom - add a quirk for low resolution Bamboo devices + +The Bamboo Touch reports a sub-screen resolution of 480x320. The +signal-to-noise ratio is only about 100, so filtering is needed in +order to reduce the jitter to a usable level. However, the low +resolution leads to round-off errors in the EWMA filter, resulting in +extremely jerky pointer motion. This patch explicitly sets a higher +resolution for those devices, and tells this to the completion handler +via a low-resolution quirk. + +Signed-off-by: Henrik Rydberg <rydberg@euromail.se> +Acked-by: Ping Cheng <pingc@wacom.com> +Signed-off-by: Dmitry Torokhov <dtor@mail.ru> +--- + +diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c +index 4e9b1dd..2f4411a 100644 +--- a/drivers/input/tablet/wacom_wac.c ++++ b/drivers/input/tablet/wacom_wac.c +@@ -857,6 +857,7 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len) + + static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len) + { ++ struct wacom_features *features = &wacom->features; + struct input_dev *input = wacom->input; + unsigned char *data = wacom->data; + int sp = 0, sx = 0, sy = 0, count = 0; +@@ -871,6 +872,10 @@ static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len) + if (p) { + int x = get_unaligned_be16(&data[9 * i + 3]) & 0x7ff; + int y = get_unaligned_be16(&data[9 * i + 5]) & 0x7ff; ++ if (features->quirks & WACOM_QUIRK_BBTOUCH_LOWRES) { ++ x <<= 5; ++ y <<= 5; ++ } + input_report_abs(input, ABS_MT_PRESSURE, p); + input_report_abs(input, ABS_MT_POSITION_X, x); + input_report_abs(input, ABS_MT_POSITION_Y, y); +@@ -1010,8 +1015,13 @@ void wacom_setup_device_quirks(struct wacom_features *features) + /* quirks for bamboo touch */ + if (features->type == BAMBOO_PT && + features->device_type == BTN_TOOL_TRIPLETAP) { ++ features->x_max <<= 5; ++ features->y_max <<= 5; ++ features->x_fuzz <<= 5; ++ features->y_fuzz <<= 5; + features->pressure_max = 256; + features->pressure_fuzz = 16; ++ features->quirks |= WACOM_QUIRK_BBTOUCH_LOWRES; + } + } + +diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h +index a23d6a5..00ca015 100644 +--- a/drivers/input/tablet/wacom_wac.h ++++ b/drivers/input/tablet/wacom_wac.h +@@ -40,6 +40,7 @@ + + /* device quirks */ + #define WACOM_QUIRK_MULTI_INPUT 0x0001 ++#define WACOM_QUIRK_BBTOUCH_LOWRES 0x0002 + + /* largest reported tracking id */ + #define MAX_TRACKING_ID 0xfff diff --git a/wacom-06-request-tablet-data-for-bamboo-pens.patch b/wacom-06-request-tablet-data-for-bamboo-pens.patch new file mode 100644 index 000000000..8b31d4eab --- /dev/null +++ b/wacom-06-request-tablet-data-for-bamboo-pens.patch @@ -0,0 +1,55 @@ +From: Chris Bagwell <chris@cnpbagwell.com> +Date: Sun, 12 Sep 2010 07:08:40 +0000 (-0700) +Subject: Input: wacom - request tablet data for Bamboo Pens +X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=3dc9f40de4dddf9147b80cf15be633189a2b70f4 + +Input: wacom - request tablet data for Bamboo Pens + +Bamboo P&T need to use second form of usb_set_report() to +ask to report tablet data. + +With previous addition of Bamboo Touch, BTN_TOOL_TRIPLETAP is now used +for both TABLETPC2FG and BAMBOO_PT types. So reduced check to +match type=TABLETPC2FG. + +This change shows redundant check for !TABLETPC2FG in else statement. + +Signed-off-by: Chris Bagwell <chris@cnpbagwell.com> +Acked-by: Ping Cheng <pingc@wacom.com> +Signed-off-by: Dmitry Torokhov <dtor@mail.ru> +--- + +diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c +index fc6fd53..1e3af29 100644 +--- a/drivers/input/tablet/wacom_sys.c ++++ b/drivers/input/tablet/wacom_sys.c +@@ -319,8 +319,9 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat + if (!rep_data) + return error; + +- /* ask to report tablet data if it is 2FGT or not a Tablet PC */ +- if (features->device_type == BTN_TOOL_TRIPLETAP) { ++ /* ask to report tablet data if it is 2FGT Tablet PC or ++ * not a Tablet PC */ ++ if (features->type == TABLETPC2FG) { + do { + rep_data[0] = 3; + rep_data[1] = 4; +@@ -332,7 +333,7 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat + WAC_HID_FEATURE_REPORT, report_id, + rep_data, 3); + } while ((error < 0 || rep_data[1] != 4) && limit++ < 5); +- } else if (features->type != TABLETPC && features->type != TABLETPC2FG) { ++ } else if (features->type != TABLETPC) { + do { + rep_data[0] = 2; + rep_data[1] = 2; +@@ -364,7 +365,7 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf, + features->pressure_fuzz = 0; + features->distance_fuzz = 0; + +- /* only Tablet PCs need to retrieve the info */ ++ /* only Tablet PCs and Bamboo P&T need to retrieve the info */ + if ((features->type != TABLETPC) && (features->type != TABLETPC2FG) && + (features->type != BAMBOO_PT)) + goto out; diff --git a/wacom-07-move-bamboo-touch-irq-to-its-own-function.patch b/wacom-07-move-bamboo-touch-irq-to-its-own-function.patch new file mode 100644 index 000000000..7495ac390 --- /dev/null +++ b/wacom-07-move-bamboo-touch-irq-to-its-own-function.patch @@ -0,0 +1,52 @@ +From: Chris Bagwell <chris@cnpbagwell.com> +Date: Sun, 12 Sep 2010 07:09:27 +0000 (-0700) +Subject: Input: wacom - move Bamboo Touch irq to its own function +X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=e1d38e49ad97eec5024342e1244279b645e36688 + +Input: wacom - move Bamboo Touch irq to its own function + +This is in preparation of pen support in same irq handler. + +Signed-off-by: Chris Bagwell <chris@cnpbagwell.com> +Acked-by: Ping Cheng <pingc@wacom.com> +Signed-off-by: Dmitry Torokhov <dtor@mail.ru> +--- + +diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c +index 2f4411a..2f7ed9a 100644 +--- a/drivers/input/tablet/wacom_wac.c ++++ b/drivers/input/tablet/wacom_wac.c +@@ -855,7 +855,7 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len) + return retval; + } + +-static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len) ++static int wacom_bpt_touch(struct wacom_wac *wacom) + { + struct wacom_features *features = &wacom->features; + struct input_dev *input = wacom->input; +@@ -863,9 +863,6 @@ static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len) + int sp = 0, sx = 0, sy = 0, count = 0; + int i; + +- if (len != WACOM_PKGLEN_BBTOUCH) +- return 0; +- + for (i = 0; i < 2; i++) { + int p = data[9 * i + 2]; + input_mt_slot(input, i); +@@ -907,6 +904,14 @@ static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len) + return 0; + } + ++static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len) ++{ ++ if (len == WACOM_PKGLEN_BBTOUCH) ++ return wacom_bpt_touch(wacom); ++ ++ return 0; ++} ++ + void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) + { + bool sync; diff --git a/wacom-08-add-support-for-bamboo-pen.patch b/wacom-08-add-support-for-bamboo-pen.patch new file mode 100644 index 000000000..319bf6c53 --- /dev/null +++ b/wacom-08-add-support-for-bamboo-pen.patch @@ -0,0 +1,130 @@ +From: Chris Bagwell <chris@cnpbagwell.com> +Date: Sun, 12 Sep 2010 07:11:35 +0000 (-0700) +Subject: Input: wacom - add support for Bamboo Pen +X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=2aaacb153689dbe9064e4db7e9d00de0edfc1fa0 + +Input: wacom - add support for Bamboo Pen + +This adds support for Pen on Bamboo Pen and Bamboo Pen&Touch devices. +Touchpad is handled by previous Bamboo Touch logic. + +Signed-off-by: Chris Bagwell <chris@cnpbagwell.com> +Acked-by: Ping Cheng <pingc@wacom.com> +Signed-off-by: Dmitry Torokhov <dtor@mail.ru> +--- + +diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c +index 2f7ed9a..536156b 100644 +--- a/drivers/input/tablet/wacom_wac.c ++++ b/drivers/input/tablet/wacom_wac.c +@@ -904,10 +904,75 @@ static int wacom_bpt_touch(struct wacom_wac *wacom) + return 0; + } + ++static int wacom_bpt_pen(struct wacom_wac *wacom) ++{ ++ struct input_dev *input = wacom->input; ++ unsigned char *data = wacom->data; ++ int prox = 0, x = 0, y = 0, p = 0, d = 0, pen = 0, btn1 = 0, btn2 = 0; ++ ++ /* ++ * Similar to Graphire protocol, data[1] & 0x20 is proximity and ++ * data[1] & 0x18 is tool ID. 0x30 is safety check to ignore ++ * 2 unused tool ID's. ++ */ ++ prox = (data[1] & 0x30) == 0x30; ++ ++ /* ++ * All reports shared between PEN and RUBBER tool must be ++ * forced to a known starting value (zero) when transitioning to ++ * out-of-prox. ++ * ++ * If not reset then, to userspace, it will look like lost events ++ * if new tool comes in-prox with same values as previous tool sent. ++ * ++ * Hardware does report zero in most out-of-prox cases but not all. ++ */ ++ if (prox) { ++ if (!wacom->shared->stylus_in_proximity) { ++ if (data[1] & 0x08) { ++ wacom->tool[0] = BTN_TOOL_RUBBER; ++ wacom->id[0] = ERASER_DEVICE_ID; ++ } else { ++ wacom->tool[0] = BTN_TOOL_PEN; ++ wacom->id[0] = STYLUS_DEVICE_ID; ++ } ++ wacom->shared->stylus_in_proximity = true; ++ } ++ x = le16_to_cpup((__le16 *)&data[2]); ++ y = le16_to_cpup((__le16 *)&data[4]); ++ p = le16_to_cpup((__le16 *)&data[6]); ++ d = data[8]; ++ pen = data[1] & 0x01; ++ btn1 = data[1] & 0x02; ++ btn2 = data[1] & 0x04; ++ } ++ ++ input_report_key(input, BTN_TOUCH, pen); ++ input_report_key(input, BTN_STYLUS, btn1); ++ input_report_key(input, BTN_STYLUS2, btn2); ++ ++ input_report_abs(input, ABS_X, x); ++ input_report_abs(input, ABS_Y, y); ++ input_report_abs(input, ABS_PRESSURE, p); ++ input_report_abs(input, ABS_DISTANCE, d); ++ ++ if (!prox) { ++ wacom->id[0] = 0; ++ wacom->shared->stylus_in_proximity = false; ++ } ++ ++ input_report_key(input, wacom->tool[0], prox); /* PEN or RUBBER */ ++ input_report_abs(input, ABS_MISC, wacom->id[0]); /* TOOL ID */ ++ ++ return 1; ++} ++ + static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len) + { + if (len == WACOM_PKGLEN_BBTOUCH) + return wacom_bpt_touch(wacom); ++ else if (len == WACOM_PKGLEN_BBFUN) ++ return wacom_bpt_pen(wacom); + + return 0; + } +@@ -1193,6 +1258,11 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev, + features->pressure_fuzz, 0); + input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, + MAX_TRACKING_ID, 0, 0); ++ } else if (features->device_type == BTN_TOOL_PEN) { ++ __set_bit(BTN_TOOL_RUBBER, input_dev->keybit); ++ __set_bit(BTN_TOOL_PEN, input_dev->keybit); ++ __set_bit(BTN_STYLUS, input_dev->keybit); ++ __set_bit(BTN_STYLUS2, input_dev->keybit); + } + break; + } +@@ -1334,6 +1404,12 @@ static const struct wacom_features wacom_features_0x47 = + { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 31, INTUOS }; + static struct wacom_features wacom_features_0xD0 = + { "Wacom Bamboo 2FG", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT }; ++static struct wacom_features wacom_features_0xD1 = ++ { "Wacom Bamboo 2FG 4x5", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT }; ++static struct wacom_features wacom_features_0xD2 = ++ { "Wacom Bamboo Craft", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT }; ++static struct wacom_features wacom_features_0xD3 = ++ { "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT }; + + #define USB_DEVICE_WACOM(prod) \ + USB_DEVICE(USB_VENDOR_ID_WACOM, prod), \ +@@ -1399,6 +1475,9 @@ const struct usb_device_id wacom_ids[] = { + { USB_DEVICE_WACOM(0xC7) }, + { USB_DEVICE_WACOM(0xCE) }, + { USB_DEVICE_WACOM(0xD0) }, ++ { USB_DEVICE_WACOM(0xD1) }, ++ { USB_DEVICE_WACOM(0xD2) }, ++ { USB_DEVICE_WACOM(0xD3) }, + { USB_DEVICE_WACOM(0xF0) }, + { USB_DEVICE_WACOM(0xCC) }, + { USB_DEVICE_WACOM(0x90) }, diff --git a/wacom-09-disable-bamboo-touchpad-when-pen-is-being-used.patch b/wacom-09-disable-bamboo-touchpad-when-pen-is-being-used.patch new file mode 100644 index 000000000..e14954031 --- /dev/null +++ b/wacom-09-disable-bamboo-touchpad-when-pen-is-being-used.patch @@ -0,0 +1,31 @@ +From: Chris Bagwell <chris@cnpbagwell.com> +Date: Sun, 12 Sep 2010 07:12:28 +0000 (-0700) +Subject: Input: wacom - disable Bamboo touchpad when pen is being used +X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=33d5f713a19b0f5cb93e0594f7206d2730cf39da + +Input: wacom - disable Bamboo touchpad when pen is being used + +Signed-off-by: Chris Bagwell <chris@cnpbagwell.com> +Acked-by: Ping Cheng <pingc@wacom.com> +Signed-off-by: Dmitry Torokhov <dtor@mail.ru> +--- + +diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c +index 536156b..e1b65ba 100644 +--- a/drivers/input/tablet/wacom_wac.c ++++ b/drivers/input/tablet/wacom_wac.c +@@ -866,7 +866,13 @@ static int wacom_bpt_touch(struct wacom_wac *wacom) + for (i = 0; i < 2; i++) { + int p = data[9 * i + 2]; + input_mt_slot(input, i); +- if (p) { ++ /* ++ * Touch events need to be disabled while stylus is ++ * in proximity because user's hand is resting on touchpad ++ * and sending unwanted events. User expects tablet buttons ++ * to continue working though. ++ */ ++ if (p && !wacom->shared->stylus_in_proximity) { + int x = get_unaligned_be16(&data[9 * i + 3]) & 0x7ff; + int y = get_unaligned_be16(&data[9 * i + 5]) & 0x7ff; + if (features->quirks & WACOM_QUIRK_BBTOUCH_LOWRES) { diff --git a/xhci_hcd-suspend-resume.patch b/xhci_hcd-suspend-resume.patch new file mode 100644 index 000000000..2f8816973 --- /dev/null +++ b/xhci_hcd-suspend-resume.patch @@ -0,0 +1,1289 @@ +commit 5e5563661948c57f72cc16b3a0cc5dc205ed4900 +Author: Andiry Xu <andiry.xu@amd.com> +Date: Thu Oct 14 07:23:06 2010 -0700 + + USB: xHCI: PCI power management implementation + + This patch implements the PCI suspend/resume. + + Please refer to xHCI spec for doing the suspend/resume operation. + + For S3, CSS/SRS in USBCMD is used to save/restore the internal state. + However, an error maybe occurs while restoring the internal state. + In this case, it means that HC internal state is wrong and HC will be + re-initialized. + + Signed-off-by: Libin Yang <libin.yang@amd.com> + Signed-off-by: Dong Nguyen <dong.nguyen@amd.com> + Signed-off-by: Andiry Xu <andiry.xu@amd.com> + Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> + Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +commit 96520f33d383c9a3ba1ca571cac5fa75325728f5 +Author: Andiry Xu <andiry.xu@amd.com> +Date: Thu Oct 14 07:23:03 2010 -0700 + + USB: xHCI: bus power management implementation + + This patch implements xHCI bus suspend/resume function hook. + + In the patch it goes through all the ports and suspend/resume + the ports if needed. + + If any port is in remote wakeup, abort bus suspend as what ehci/ohci do. + + Signed-off-by: Libin Yang <libin.yang@amd.com> + Signed-off-by: Crane Cai <crane.cai@amd.com> + Signed-off-by: Andiry Xu <andiry.xu@amd.com> + Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> + Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +commit 7b29198e193ab6f5e8bfcd48c59340b8c7689f5c +Author: Andiry Xu <andiry.xu@amd.com> +Date: Thu Oct 14 07:23:00 2010 -0700 + + USB: xHCI: port remote wakeup implementation + + This commit implements port remote wakeup. + + When a port is in U3 state and resume signaling is detected from a device, + the port transitions to the Resume state, and the xHC generates a Port Status + Change Event. + + For USB3 port, software write a '0' to the PLS field to complete the resume + signaling. For USB2 port, the resume should be signaling for at least 20ms, + irq handler set a timer for port remote wakeup, and then finishes process in + hub_control GetPortStatus. + + Some codes are borrowed from EHCI code. + + Signed-off-by: Andiry Xu <andiry.xu@amd.com> + Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> + Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +commit 9ada0dec259dfe796a757ff2c9b63a05e6408e5f +Author: Andiry Xu <andiry.xu@amd.com> +Date: Thu Oct 14 07:22:57 2010 -0700 + + USB: xHCI: port power management implementation + + Add software trigger USB device suspend resume function hook. + Do port suspend & resume in terms of xHCI spec. + + Port Suspend: + Stop all endpoints via Stop Endpoint Command with Suspend (SP) flag set. + Place individual ports into suspend mode by writing '3' for Port Link State + (PLS) field into PORTSC register. This can only be done when the port is in + Enabled state. When writing, the Port Link State Write Strobe (LWS) bit shall + be set to '1'. + Allocate an xhci_command and stash it in xhci_virt_device to wait completion for + the last Stop Endpoint Command. Use the Suspend bit in TRB to indicate the Stop + Endpoint Command is for port suspend. Based on Sarah's suggestion. + + Port Resume: + Write '0' in PLS field, device will transition to running state. + Ring an endpoints' doorbell to restart it. + + Ref: USB device remote wake need another patch to implement. For details of + how USB subsystem do power management, please see: + Documentation/usb/power-management.txt + + Signed-off-by: Crane Cai <crane.cai@amd.com> + Signed-off-by: Libin Yang <libin.yang@amd.com> + Signed-off-by: Andiry Xu <andiry.xu@amd.com> + Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> + Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + + drivers/usb/host/xhci-hub.c | 424 +++++++++++++++++++++++++++++++++++++++++- + drivers/usb/host/xhci-mem.c | 4 + + drivers/usb/host/xhci-pci.c | 36 ++++- + drivers/usb/host/xhci-ring.c | 101 +++++++++- + drivers/usb/host/xhci.c | 212 +++++++++++++++++++++- + drivers/usb/host/xhci.h | 46 +++++- + 6 files changed, 805 insertions(+), 18 deletions(-) + +diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c +index a1a7a97..7f2f63c 100644 +--- a/drivers/usb/host/xhci-hub.c ++++ b/drivers/usb/host/xhci-hub.c +@@ -24,6 +24,10 @@ + + #include "xhci.h" + ++#define PORT_WAKE_BITS (PORT_WKOC_E | PORT_WKDISC_E | PORT_WKCONN_E) ++#define PORT_RWC_BITS (PORT_CSC | PORT_PEC | PORT_WRC | PORT_OCC | \ ++ PORT_RC | PORT_PLC | PORT_PE) ++ + static void xhci_hub_descriptor(struct xhci_hcd *xhci, + struct usb_hub_descriptor *desc) + { +@@ -123,12 +127,105 @@ static unsigned int xhci_port_speed(unsigned int port_status) + * writing a 0 clears the bit and writing a 1 sets the bit (RWS). + * For all other types (RW1S, RW1CS, RW, and RZ), writing a '0' has no effect. + */ +-static u32 xhci_port_state_to_neutral(u32 state) ++u32 xhci_port_state_to_neutral(u32 state) + { + /* Save read-only status and port state */ + return (state & XHCI_PORT_RO) | (state & XHCI_PORT_RWS); + } + ++/* ++ * find slot id based on port number. ++ */ ++int xhci_find_slot_id_by_port(struct xhci_hcd *xhci, u16 port) ++{ ++ int slot_id; ++ int i; ++ ++ slot_id = 0; ++ for (i = 0; i < MAX_HC_SLOTS; i++) { ++ if (!xhci->devs[i]) ++ continue; ++ if (xhci->devs[i]->port == port) { ++ slot_id = i; ++ break; ++ } ++ } ++ ++ return slot_id; ++} ++ ++/* ++ * Stop device ++ * It issues stop endpoint command for EP 0 to 30. And wait the last command ++ * to complete. ++ * suspend will set to 1, if suspend bit need to set in command. ++ */ ++static int xhci_stop_device(struct xhci_hcd *xhci, int slot_id, int suspend) ++{ ++ struct xhci_virt_device *virt_dev; ++ struct xhci_command *cmd; ++ unsigned long flags; ++ int timeleft; ++ int ret; ++ int i; ++ ++ ret = 0; ++ virt_dev = xhci->devs[slot_id]; ++ cmd = xhci_alloc_command(xhci, false, true, GFP_NOIO); ++ if (!cmd) { ++ xhci_dbg(xhci, "Couldn't allocate command structure.\n"); ++ return -ENOMEM; ++ } ++ ++ spin_lock_irqsave(&xhci->lock, flags); ++ for (i = LAST_EP_INDEX; i > 0; i--) { ++ if (virt_dev->eps[i].ring && virt_dev->eps[i].ring->dequeue) ++ xhci_queue_stop_endpoint(xhci, slot_id, i, suspend); ++ } ++ cmd->command_trb = xhci->cmd_ring->enqueue; ++ list_add_tail(&cmd->cmd_list, &virt_dev->cmd_list); ++ xhci_queue_stop_endpoint(xhci, slot_id, 0, suspend); ++ xhci_ring_cmd_db(xhci); ++ spin_unlock_irqrestore(&xhci->lock, flags); ++ ++ /* Wait for last stop endpoint command to finish */ ++ timeleft = wait_for_completion_interruptible_timeout( ++ cmd->completion, ++ USB_CTRL_SET_TIMEOUT); ++ if (timeleft <= 0) { ++ xhci_warn(xhci, "%s while waiting for stop endpoint command\n", ++ timeleft == 0 ? "Timeout" : "Signal"); ++ spin_lock_irqsave(&xhci->lock, flags); ++ /* The timeout might have raced with the event ring handler, so ++ * only delete from the list if the item isn't poisoned. ++ */ ++ if (cmd->cmd_list.next != LIST_POISON1) ++ list_del(&cmd->cmd_list); ++ spin_unlock_irqrestore(&xhci->lock, flags); ++ ret = -ETIME; ++ goto command_cleanup; ++ } ++ ++command_cleanup: ++ xhci_free_command(xhci, cmd); ++ return ret; ++} ++ ++/* ++ * Ring device, it rings the all doorbells unconditionally. ++ */ ++void xhci_ring_device(struct xhci_hcd *xhci, int slot_id) ++{ ++ int i; ++ ++ for (i = 0; i < LAST_EP_INDEX + 1; i++) ++ if (xhci->devs[slot_id]->eps[i].ring && ++ xhci->devs[slot_id]->eps[i].ring->dequeue) ++ xhci_ring_ep_doorbell(xhci, slot_id, i, 0); ++ ++ return; ++} ++ + static void xhci_disable_port(struct xhci_hcd *xhci, u16 wIndex, + u32 __iomem *addr, u32 port_status) + { +@@ -162,6 +259,10 @@ static void xhci_clear_port_change_bit(struct xhci_hcd *xhci, u16 wValue, + status = PORT_PEC; + port_change_bit = "enable/disable"; + break; ++ case USB_PORT_FEAT_C_SUSPEND: ++ status = PORT_PLC; ++ port_change_bit = "suspend/resume"; ++ break; + default: + /* Should never happen */ + return; +@@ -179,9 +280,10 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + int ports; + unsigned long flags; +- u32 temp, status; ++ u32 temp, temp1, status; + int retval = 0; + u32 __iomem *addr; ++ int slot_id; + + ports = HCS_MAX_PORTS(xhci->hcs_params1); + +@@ -211,9 +313,49 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + if ((temp & PORT_OCC)) + status |= USB_PORT_STAT_C_OVERCURRENT << 16; + /* +- * FIXME ignoring suspend, reset, and USB 2.1/3.0 specific ++ * FIXME ignoring reset and USB 2.1/3.0 specific + * changes + */ ++ if ((temp & PORT_PLS_MASK) == XDEV_U3 ++ && (temp & PORT_POWER)) ++ status |= 1 << USB_PORT_FEAT_SUSPEND; ++ if ((temp & PORT_PLS_MASK) == XDEV_RESUME) { ++ if ((temp & PORT_RESET) || !(temp & PORT_PE)) ++ goto error; ++ if (!DEV_SUPERSPEED(temp) && time_after_eq(jiffies, ++ xhci->resume_done[wIndex])) { ++ xhci_dbg(xhci, "Resume USB2 port %d\n", ++ wIndex + 1); ++ xhci->resume_done[wIndex] = 0; ++ temp1 = xhci_port_state_to_neutral(temp); ++ temp1 &= ~PORT_PLS_MASK; ++ temp1 |= PORT_LINK_STROBE | XDEV_U0; ++ xhci_writel(xhci, temp1, addr); ++ ++ xhci_dbg(xhci, "set port %d resume\n", ++ wIndex + 1); ++ slot_id = xhci_find_slot_id_by_port(xhci, ++ wIndex + 1); ++ if (!slot_id) { ++ xhci_dbg(xhci, "slot_id is zero\n"); ++ goto error; ++ } ++ xhci_ring_device(xhci, slot_id); ++ xhci->port_c_suspend[wIndex >> 5] |= ++ 1 << (wIndex & 31); ++ xhci->suspended_ports[wIndex >> 5] &= ++ ~(1 << (wIndex & 31)); ++ } ++ } ++ if ((temp & PORT_PLS_MASK) == XDEV_U0 ++ && (temp & PORT_POWER) ++ && (xhci->suspended_ports[wIndex >> 5] & ++ (1 << (wIndex & 31)))) { ++ xhci->suspended_ports[wIndex >> 5] &= ++ ~(1 << (wIndex & 31)); ++ xhci->port_c_suspend[wIndex >> 5] |= ++ 1 << (wIndex & 31); ++ } + if (temp & PORT_CONNECT) { + status |= USB_PORT_STAT_CONNECTION; + status |= xhci_port_speed(temp); +@@ -226,6 +368,8 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + status |= USB_PORT_STAT_RESET; + if (temp & PORT_POWER) + status |= USB_PORT_STAT_POWER; ++ if (xhci->port_c_suspend[wIndex >> 5] & (1 << (wIndex & 31))) ++ status |= 1 << USB_PORT_FEAT_C_SUSPEND; + xhci_dbg(xhci, "Get port status returned 0x%x\n", status); + put_unaligned(cpu_to_le32(status), (__le32 *) buf); + break; +@@ -238,6 +382,42 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + temp = xhci_readl(xhci, addr); + temp = xhci_port_state_to_neutral(temp); + switch (wValue) { ++ case USB_PORT_FEAT_SUSPEND: ++ temp = xhci_readl(xhci, addr); ++ /* In spec software should not attempt to suspend ++ * a port unless the port reports that it is in the ++ * enabled (PED = ‘1’,PLS < ‘3’) state. ++ */ ++ if ((temp & PORT_PE) == 0 || (temp & PORT_RESET) ++ || (temp & PORT_PLS_MASK) >= XDEV_U3) { ++ xhci_warn(xhci, "USB core suspending device " ++ "not in U0/U1/U2.\n"); ++ goto error; ++ } ++ ++ slot_id = xhci_find_slot_id_by_port(xhci, wIndex + 1); ++ if (!slot_id) { ++ xhci_warn(xhci, "slot_id is zero\n"); ++ goto error; ++ } ++ /* unlock to execute stop endpoint commands */ ++ spin_unlock_irqrestore(&xhci->lock, flags); ++ xhci_stop_device(xhci, slot_id, 1); ++ spin_lock_irqsave(&xhci->lock, flags); ++ ++ temp = xhci_port_state_to_neutral(temp); ++ temp &= ~PORT_PLS_MASK; ++ temp |= PORT_LINK_STROBE | XDEV_U3; ++ xhci_writel(xhci, temp, addr); ++ ++ spin_unlock_irqrestore(&xhci->lock, flags); ++ msleep(10); /* wait device to enter */ ++ spin_lock_irqsave(&xhci->lock, flags); ++ ++ temp = xhci_readl(xhci, addr); ++ xhci->suspended_ports[wIndex >> 5] |= ++ 1 << (wIndex & (31)); ++ break; + case USB_PORT_FEAT_POWER: + /* + * Turn on ports, even if there isn't per-port switching. +@@ -271,6 +451,52 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + temp = xhci_readl(xhci, addr); + temp = xhci_port_state_to_neutral(temp); + switch (wValue) { ++ case USB_PORT_FEAT_SUSPEND: ++ temp = xhci_readl(xhci, addr); ++ xhci_dbg(xhci, "clear USB_PORT_FEAT_SUSPEND\n"); ++ xhci_dbg(xhci, "PORTSC %04x\n", temp); ++ if (temp & PORT_RESET) ++ goto error; ++ if (temp & XDEV_U3) { ++ if ((temp & PORT_PE) == 0) ++ goto error; ++ if (DEV_SUPERSPEED(temp)) { ++ temp = xhci_port_state_to_neutral(temp); ++ temp &= ~PORT_PLS_MASK; ++ temp |= PORT_LINK_STROBE | XDEV_U0; ++ xhci_writel(xhci, temp, addr); ++ xhci_readl(xhci, addr); ++ } else { ++ temp = xhci_port_state_to_neutral(temp); ++ temp &= ~PORT_PLS_MASK; ++ temp |= PORT_LINK_STROBE | XDEV_RESUME; ++ xhci_writel(xhci, temp, addr); ++ ++ spin_unlock_irqrestore(&xhci->lock, ++ flags); ++ msleep(20); ++ spin_lock_irqsave(&xhci->lock, flags); ++ ++ temp = xhci_readl(xhci, addr); ++ temp = xhci_port_state_to_neutral(temp); ++ temp &= ~PORT_PLS_MASK; ++ temp |= PORT_LINK_STROBE | XDEV_U0; ++ xhci_writel(xhci, temp, addr); ++ } ++ xhci->port_c_suspend[wIndex >> 5] |= ++ 1 << (wIndex & 31); ++ } ++ ++ slot_id = xhci_find_slot_id_by_port(xhci, wIndex + 1); ++ if (!slot_id) { ++ xhci_dbg(xhci, "slot_id is zero\n"); ++ goto error; ++ } ++ xhci_ring_device(xhci, slot_id); ++ break; ++ case USB_PORT_FEAT_C_SUSPEND: ++ xhci->port_c_suspend[wIndex >> 5] &= ++ ~(1 << (wIndex & 31)); + case USB_PORT_FEAT_C_RESET: + case USB_PORT_FEAT_C_CONNECTION: + case USB_PORT_FEAT_C_OVER_CURRENT: +@@ -306,6 +532,7 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf) + { + unsigned long flags; + u32 temp, status; ++ u32 mask; + int i, retval; + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + int ports; +@@ -318,13 +545,18 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf) + memset(buf, 0, retval); + status = 0; + ++ mask = PORT_CSC | PORT_PEC | PORT_OCC; ++ + spin_lock_irqsave(&xhci->lock, flags); + /* For each port, did anything change? If so, set that bit in buf. */ + for (i = 0; i < ports; i++) { + addr = &xhci->op_regs->port_status_base + + NUM_PORT_REGS*i; + temp = xhci_readl(xhci, addr); +- if (temp & (PORT_CSC | PORT_PEC | PORT_OCC)) { ++ if ((temp & mask) != 0 || ++ (xhci->port_c_suspend[i >> 5] & 1 << (i & 31)) || ++ (xhci->resume_done[i] && time_after_eq( ++ jiffies, xhci->resume_done[i]))) { + buf[(i + 1) / 8] |= 1 << (i + 1) % 8; + status = 1; + } +@@ -332,3 +564,187 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf) + spin_unlock_irqrestore(&xhci->lock, flags); + return status ? retval : 0; + } ++ ++#ifdef CONFIG_PM ++ ++int xhci_bus_suspend(struct usb_hcd *hcd) ++{ ++ struct xhci_hcd *xhci = hcd_to_xhci(hcd); ++ int port; ++ unsigned long flags; ++ ++ xhci_dbg(xhci, "suspend root hub\n"); ++ ++ spin_lock_irqsave(&xhci->lock, flags); ++ ++ if (hcd->self.root_hub->do_remote_wakeup) { ++ port = HCS_MAX_PORTS(xhci->hcs_params1); ++ while (port--) { ++ if (xhci->resume_done[port] != 0) { ++ spin_unlock_irqrestore(&xhci->lock, flags); ++ xhci_dbg(xhci, "suspend failed because " ++ "port %d is resuming\n", ++ port + 1); ++ return -EBUSY; ++ } ++ } ++ } ++ ++ port = HCS_MAX_PORTS(xhci->hcs_params1); ++ xhci->bus_suspended = 0; ++ while (port--) { ++ /* suspend the port if the port is not suspended */ ++ u32 __iomem *addr; ++ u32 t1, t2; ++ int slot_id; ++ ++ addr = &xhci->op_regs->port_status_base + ++ NUM_PORT_REGS * (port & 0xff); ++ t1 = xhci_readl(xhci, addr); ++ t2 = xhci_port_state_to_neutral(t1); ++ ++ if ((t1 & PORT_PE) && !(t1 & PORT_PLS_MASK)) { ++ xhci_dbg(xhci, "port %d not suspended\n", port); ++ slot_id = xhci_find_slot_id_by_port(xhci, port + 1); ++ if (slot_id) { ++ spin_unlock_irqrestore(&xhci->lock, flags); ++ xhci_stop_device(xhci, slot_id, 1); ++ spin_lock_irqsave(&xhci->lock, flags); ++ } ++ t2 &= ~PORT_PLS_MASK; ++ t2 |= PORT_LINK_STROBE | XDEV_U3; ++ set_bit(port, &xhci->bus_suspended); ++ } ++ if (hcd->self.root_hub->do_remote_wakeup) { ++ if (t1 & PORT_CONNECT) { ++ t2 |= PORT_WKOC_E | PORT_WKDISC_E; ++ t2 &= ~PORT_WKCONN_E; ++ } else { ++ t2 |= PORT_WKOC_E | PORT_WKCONN_E; ++ t2 &= ~PORT_WKDISC_E; ++ } ++ } else ++ t2 &= ~PORT_WAKE_BITS; ++ ++ t1 = xhci_port_state_to_neutral(t1); ++ if (t1 != t2) ++ xhci_writel(xhci, t2, addr); ++ ++ if (DEV_HIGHSPEED(t1)) { ++ /* enable remote wake up for USB 2.0 */ ++ u32 __iomem *addr; ++ u32 tmp; ++ ++ addr = &xhci->op_regs->port_power_base + ++ NUM_PORT_REGS * (port & 0xff); ++ tmp = xhci_readl(xhci, addr); ++ tmp |= PORT_RWE; ++ xhci_writel(xhci, tmp, addr); ++ } ++ } ++ hcd->state = HC_STATE_SUSPENDED; ++ xhci->next_statechange = jiffies + msecs_to_jiffies(10); ++ spin_unlock_irqrestore(&xhci->lock, flags); ++ return 0; ++} ++ ++int xhci_bus_resume(struct usb_hcd *hcd) ++{ ++ struct xhci_hcd *xhci = hcd_to_xhci(hcd); ++ int port; ++ u32 temp; ++ unsigned long flags; ++ ++ xhci_dbg(xhci, "resume root hub\n"); ++ ++ if (time_before(jiffies, xhci->next_statechange)) ++ msleep(5); ++ ++ spin_lock_irqsave(&xhci->lock, flags); ++ if (!HCD_HW_ACCESSIBLE(hcd)) { ++ spin_unlock_irqrestore(&xhci->lock, flags); ++ return -ESHUTDOWN; ++ } ++ ++ /* delay the irqs */ ++ temp = xhci_readl(xhci, &xhci->op_regs->command); ++ temp &= ~CMD_EIE; ++ xhci_writel(xhci, temp, &xhci->op_regs->command); ++ ++ port = HCS_MAX_PORTS(xhci->hcs_params1); ++ while (port--) { ++ /* Check whether need resume ports. If needed ++ resume port and disable remote wakeup */ ++ u32 __iomem *addr; ++ u32 temp; ++ int slot_id; ++ ++ addr = &xhci->op_regs->port_status_base + ++ NUM_PORT_REGS * (port & 0xff); ++ temp = xhci_readl(xhci, addr); ++ if (DEV_SUPERSPEED(temp)) ++ temp &= ~(PORT_RWC_BITS | PORT_CEC | PORT_WAKE_BITS); ++ else ++ temp &= ~(PORT_RWC_BITS | PORT_WAKE_BITS); ++ if (test_bit(port, &xhci->bus_suspended) && ++ (temp & PORT_PLS_MASK)) { ++ if (DEV_SUPERSPEED(temp)) { ++ temp = xhci_port_state_to_neutral(temp); ++ temp &= ~PORT_PLS_MASK; ++ temp |= PORT_LINK_STROBE | XDEV_U0; ++ xhci_writel(xhci, temp, addr); ++ } else { ++ temp = xhci_port_state_to_neutral(temp); ++ temp &= ~PORT_PLS_MASK; ++ temp |= PORT_LINK_STROBE | XDEV_RESUME; ++ xhci_writel(xhci, temp, addr); ++ ++ spin_unlock_irqrestore(&xhci->lock, flags); ++ msleep(20); ++ spin_lock_irqsave(&xhci->lock, flags); ++ ++ temp = xhci_readl(xhci, addr); ++ temp = xhci_port_state_to_neutral(temp); ++ temp &= ~PORT_PLS_MASK; ++ temp |= PORT_LINK_STROBE | XDEV_U0; ++ xhci_writel(xhci, temp, addr); ++ } ++ slot_id = xhci_find_slot_id_by_port(xhci, port + 1); ++ if (slot_id) ++ xhci_ring_device(xhci, slot_id); ++ } else ++ xhci_writel(xhci, temp, addr); ++ ++ if (DEV_HIGHSPEED(temp)) { ++ /* disable remote wake up for USB 2.0 */ ++ u32 __iomem *addr; ++ u32 tmp; ++ ++ addr = &xhci->op_regs->port_power_base + ++ NUM_PORT_REGS * (port & 0xff); ++ tmp = xhci_readl(xhci, addr); ++ tmp &= ~PORT_RWE; ++ xhci_writel(xhci, tmp, addr); ++ } ++ } ++ ++ (void) xhci_readl(xhci, &xhci->op_regs->command); ++ ++ xhci->next_statechange = jiffies + msecs_to_jiffies(5); ++ hcd->state = HC_STATE_RUNNING; ++ /* re-enable irqs */ ++ temp = xhci_readl(xhci, &xhci->op_regs->command); ++ temp |= CMD_EIE; ++ xhci_writel(xhci, temp, &xhci->op_regs->command); ++ temp = xhci_readl(xhci, &xhci->op_regs->command); ++ ++ spin_unlock_irqrestore(&xhci->lock, flags); ++ return 0; ++} ++ ++#else ++ ++#define xhci_bus_suspend NULL ++#define xhci_bus_resume NULL ++ ++#endif +diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c +index 4e51343..cef8d81 100644 +--- a/drivers/usb/host/xhci-mem.c ++++ b/drivers/usb/host/xhci-mem.c +@@ -866,6 +866,7 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud + top_dev = top_dev->parent) + /* Found device below root hub */; + slot_ctx->dev_info2 |= (u32) ROOT_HUB_PORT(top_dev->portnum); ++ dev->port = top_dev->portnum; + xhci_dbg(xhci, "Set root hub portnum to %d\n", top_dev->portnum); + + /* Is this a LS/FS device under a HS hub? */ +@@ -1443,6 +1444,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) + scratchpad_free(xhci); + xhci->page_size = 0; + xhci->page_shift = 0; ++ xhci->bus_suspended = 0; + } + + static int xhci_test_trb_in_td(struct xhci_hcd *xhci, +@@ -1801,6 +1803,8 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) + init_completion(&xhci->addr_dev); + for (i = 0; i < MAX_HC_SLOTS; ++i) + xhci->devs[i] = NULL; ++ for (i = 0; i < MAX_HC_PORTS; ++i) ++ xhci->resume_done[i] = 0; + + if (scratchpad_alloc(xhci, flags)) + goto fail; +diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c +index f7efe02..e3a5924 100644 +--- a/drivers/usb/host/xhci-pci.c ++++ b/drivers/usb/host/xhci-pci.c +@@ -116,6 +116,30 @@ static int xhci_pci_setup(struct usb_hcd *hcd) + return xhci_pci_reinit(xhci, pdev); + } + ++#ifdef CONFIG_PM ++static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup) ++{ ++ struct xhci_hcd *xhci = hcd_to_xhci(hcd); ++ int retval = 0; ++ ++ if (hcd->state != HC_STATE_SUSPENDED) ++ return -EINVAL; ++ ++ retval = xhci_suspend(xhci); ++ ++ return retval; ++} ++ ++static int xhci_pci_resume(struct usb_hcd *hcd, bool hibernated) ++{ ++ struct xhci_hcd *xhci = hcd_to_xhci(hcd); ++ int retval = 0; ++ ++ retval = xhci_resume(xhci, hibernated); ++ return retval; ++} ++#endif /* CONFIG_PM */ ++ + static const struct hc_driver xhci_pci_hc_driver = { + .description = hcd_name, + .product_desc = "xHCI Host Controller", +@@ -132,7 +156,10 @@ static const struct hc_driver xhci_pci_hc_driver = { + */ + .reset = xhci_pci_setup, + .start = xhci_run, +- /* suspend and resume implemented later */ ++#ifdef CONFIG_PM ++ .pci_suspend = xhci_pci_suspend, ++ .pci_resume = xhci_pci_resume, ++#endif + .stop = xhci_stop, + .shutdown = xhci_shutdown, + +@@ -162,6 +189,8 @@ static const struct hc_driver xhci_pci_hc_driver = { + /* Root hub support */ + .hub_control = xhci_hub_control, + .hub_status_data = xhci_hub_status_data, ++ .bus_suspend = xhci_bus_suspend, ++ .bus_resume = xhci_bus_resume, + }; + + /*-------------------------------------------------------------------------*/ +@@ -186,6 +215,11 @@ static struct pci_driver xhci_pci_driver = { + /* suspend and resume implemented later */ + + .shutdown = usb_hcd_pci_shutdown, ++#ifdef CONFIG_PM_SLEEP ++ .driver = { ++ .pm = &usb_hcd_pci_pm_ops ++ }, ++#endif + }; + + int xhci_register_pci(void) +diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c +index 48e60d1..9f3115e 100644 +--- a/drivers/usb/host/xhci-ring.c ++++ b/drivers/usb/host/xhci-ring.c +@@ -68,6 +68,10 @@ + #include <linux/slab.h> + #include "xhci.h" + ++static int handle_cmd_in_cmd_wait_list(struct xhci_hcd *xhci, ++ struct xhci_virt_device *virt_dev, ++ struct xhci_event_cmd *event); ++ + /* + * Returns zero if the TRB isn't in this segment, otherwise it returns the DMA + * address of the TRB. +@@ -313,7 +317,7 @@ void xhci_ring_cmd_db(struct xhci_hcd *xhci) + xhci_readl(xhci, &xhci->dba->doorbell[0]); + } + +-static void ring_ep_doorbell(struct xhci_hcd *xhci, ++void xhci_ring_ep_doorbell(struct xhci_hcd *xhci, + unsigned int slot_id, + unsigned int ep_index, + unsigned int stream_id) +@@ -353,7 +357,7 @@ static void ring_doorbell_for_active_rings(struct xhci_hcd *xhci, + /* A ring has pending URBs if its TD list is not empty */ + if (!(ep->ep_state & EP_HAS_STREAMS)) { + if (!(list_empty(&ep->ring->td_list))) +- ring_ep_doorbell(xhci, slot_id, ep_index, 0); ++ xhci_ring_ep_doorbell(xhci, slot_id, ep_index, 0); + return; + } + +@@ -361,7 +365,8 @@ static void ring_doorbell_for_active_rings(struct xhci_hcd *xhci, + stream_id++) { + struct xhci_stream_info *stream_info = ep->stream_info; + if (!list_empty(&stream_info->stream_rings[stream_id]->td_list)) +- ring_ep_doorbell(xhci, slot_id, ep_index, stream_id); ++ xhci_ring_ep_doorbell(xhci, slot_id, ep_index, ++ stream_id); + } + } + +@@ -626,10 +631,11 @@ static void xhci_giveback_urb_in_irq(struct xhci_hcd *xhci, + * bit cleared) so that the HW will skip over them. + */ + static void handle_stopped_endpoint(struct xhci_hcd *xhci, +- union xhci_trb *trb) ++ union xhci_trb *trb, struct xhci_event_cmd *event) + { + unsigned int slot_id; + unsigned int ep_index; ++ struct xhci_virt_device *virt_dev; + struct xhci_ring *ep_ring; + struct xhci_virt_ep *ep; + struct list_head *entry; +@@ -638,6 +644,21 @@ static void handle_stopped_endpoint(struct xhci_hcd *xhci, + + struct xhci_dequeue_state deq_state; + ++ if (unlikely(TRB_TO_SUSPEND_PORT( ++ xhci->cmd_ring->dequeue->generic.field[3]))) { ++ slot_id = TRB_TO_SLOT_ID( ++ xhci->cmd_ring->dequeue->generic.field[3]); ++ virt_dev = xhci->devs[slot_id]; ++ if (virt_dev) ++ handle_cmd_in_cmd_wait_list(xhci, virt_dev, ++ event); ++ else ++ xhci_warn(xhci, "Stop endpoint command " ++ "completion for disabled slot %u\n", ++ slot_id); ++ return; ++ } ++ + memset(&deq_state, 0, sizeof(deq_state)); + slot_id = TRB_TO_SLOT_ID(trb->generic.field[3]); + ep_index = TRB_TO_EP_INDEX(trb->generic.field[3]); +@@ -1091,7 +1112,7 @@ bandwidth_change: + complete(&xhci->addr_dev); + break; + case TRB_TYPE(TRB_STOP_RING): +- handle_stopped_endpoint(xhci, xhci->cmd_ring->dequeue); ++ handle_stopped_endpoint(xhci, xhci->cmd_ring->dequeue, event); + break; + case TRB_TYPE(TRB_SET_DEQ): + handle_set_deq_completion(xhci, event, xhci->cmd_ring->dequeue); +@@ -1144,17 +1165,72 @@ static void handle_vendor_event(struct xhci_hcd *xhci, + static void handle_port_status(struct xhci_hcd *xhci, + union xhci_trb *event) + { ++ struct usb_hcd *hcd = xhci_to_hcd(xhci); + u32 port_id; ++ u32 temp, temp1; ++ u32 __iomem *addr; ++ int ports; ++ int slot_id; + + /* Port status change events always have a successful completion code */ + if (GET_COMP_CODE(event->generic.field[2]) != COMP_SUCCESS) { + xhci_warn(xhci, "WARN: xHC returned failed port status event\n"); + xhci->error_bitmask |= 1 << 8; + } +- /* FIXME: core doesn't care about all port link state changes yet */ + port_id = GET_PORT_ID(event->generic.field[0]); + xhci_dbg(xhci, "Port Status Change Event for port %d\n", port_id); + ++ ports = HCS_MAX_PORTS(xhci->hcs_params1); ++ if ((port_id <= 0) || (port_id > ports)) { ++ xhci_warn(xhci, "Invalid port id %d\n", port_id); ++ goto cleanup; ++ } ++ ++ addr = &xhci->op_regs->port_status_base + NUM_PORT_REGS * (port_id - 1); ++ temp = xhci_readl(xhci, addr); ++ if ((temp & PORT_CONNECT) && (hcd->state == HC_STATE_SUSPENDED)) { ++ xhci_dbg(xhci, "resume root hub\n"); ++ usb_hcd_resume_root_hub(hcd); ++ } ++ ++ if ((temp & PORT_PLC) && (temp & PORT_PLS_MASK) == XDEV_RESUME) { ++ xhci_dbg(xhci, "port resume event for port %d\n", port_id); ++ ++ temp1 = xhci_readl(xhci, &xhci->op_regs->command); ++ if (!(temp1 & CMD_RUN)) { ++ xhci_warn(xhci, "xHC is not running.\n"); ++ goto cleanup; ++ } ++ ++ if (DEV_SUPERSPEED(temp)) { ++ xhci_dbg(xhci, "resume SS port %d\n", port_id); ++ temp = xhci_port_state_to_neutral(temp); ++ temp &= ~PORT_PLS_MASK; ++ temp |= PORT_LINK_STROBE | XDEV_U0; ++ xhci_writel(xhci, temp, addr); ++ slot_id = xhci_find_slot_id_by_port(xhci, port_id); ++ if (!slot_id) { ++ xhci_dbg(xhci, "slot_id is zero\n"); ++ goto cleanup; ++ } ++ xhci_ring_device(xhci, slot_id); ++ xhci_dbg(xhci, "resume SS port %d finished\n", port_id); ++ /* Clear PORT_PLC */ ++ temp = xhci_readl(xhci, addr); ++ temp = xhci_port_state_to_neutral(temp); ++ temp |= PORT_PLC; ++ xhci_writel(xhci, temp, addr); ++ } else { ++ xhci_dbg(xhci, "resume HS port %d\n", port_id); ++ xhci->resume_done[port_id - 1] = jiffies + ++ msecs_to_jiffies(20); ++ mod_timer(&hcd->rh_timer, ++ xhci->resume_done[port_id - 1]); ++ /* Do the rest in GetPortStatus */ ++ } ++ } ++ ++cleanup: + /* Update event ring dequeue pointer before dropping the lock */ + inc_deq(xhci, xhci->event_ring, true); + +@@ -2347,7 +2423,7 @@ static void giveback_first_trb(struct xhci_hcd *xhci, int slot_id, + */ + wmb(); + start_trb->field[3] |= start_cycle; +- ring_ep_doorbell(xhci, slot_id, ep_index, stream_id); ++ xhci_ring_ep_doorbell(xhci, slot_id, ep_index, stream_id); + } + + /* +@@ -2931,7 +3007,7 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, + wmb(); + start_trb->field[3] |= start_cycle; + +- ring_ep_doorbell(xhci, slot_id, ep_index, urb->stream_id); ++ xhci_ring_ep_doorbell(xhci, slot_id, ep_index, urb->stream_id); + return 0; + } + +@@ -3108,15 +3184,20 @@ int xhci_queue_evaluate_context(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, + false); + } + ++/* ++ * Suspend is set to indicate "Stop Endpoint Command" is being issued to stop ++ * activity on an endpoint that is about to be suspended. ++ */ + int xhci_queue_stop_endpoint(struct xhci_hcd *xhci, int slot_id, +- unsigned int ep_index) ++ unsigned int ep_index, int suspend) + { + u32 trb_slot_id = SLOT_ID_FOR_TRB(slot_id); + u32 trb_ep_index = EP_ID_FOR_TRB(ep_index); + u32 type = TRB_TYPE(TRB_STOP_RING); ++ u32 trb_suspend = SUSPEND_PORT_FOR_TRB(suspend); + + return queue_command(xhci, 0, 0, 0, +- trb_slot_id | trb_ep_index | type, false); ++ trb_slot_id | trb_ep_index | type | trb_suspend, false); + } + + /* Set Transfer Ring Dequeue Pointer command. +diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c +index d5c550e..34f1b3b 100644 +--- a/drivers/usb/host/xhci.c ++++ b/drivers/usb/host/xhci.c +@@ -551,6 +551,216 @@ void xhci_shutdown(struct usb_hcd *hcd) + xhci_readl(xhci, &xhci->op_regs->status)); + } + ++static void xhci_save_registers(struct xhci_hcd *xhci) ++{ ++ xhci->s3.command = xhci_readl(xhci, &xhci->op_regs->command); ++ xhci->s3.dev_nt = xhci_readl(xhci, &xhci->op_regs->dev_notification); ++ xhci->s3.dcbaa_ptr = xhci_read_64(xhci, &xhci->op_regs->dcbaa_ptr); ++ xhci->s3.config_reg = xhci_readl(xhci, &xhci->op_regs->config_reg); ++ xhci->s3.irq_pending = xhci_readl(xhci, &xhci->ir_set->irq_pending); ++ xhci->s3.irq_control = xhci_readl(xhci, &xhci->ir_set->irq_control); ++ xhci->s3.erst_size = xhci_readl(xhci, &xhci->ir_set->erst_size); ++ xhci->s3.erst_base = xhci_read_64(xhci, &xhci->ir_set->erst_base); ++ xhci->s3.erst_dequeue = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); ++} ++ ++static void xhci_restore_registers(struct xhci_hcd *xhci) ++{ ++ xhci_writel(xhci, xhci->s3.command, &xhci->op_regs->command); ++ xhci_writel(xhci, xhci->s3.dev_nt, &xhci->op_regs->dev_notification); ++ xhci_write_64(xhci, xhci->s3.dcbaa_ptr, &xhci->op_regs->dcbaa_ptr); ++ xhci_writel(xhci, xhci->s3.config_reg, &xhci->op_regs->config_reg); ++ xhci_writel(xhci, xhci->s3.irq_pending, &xhci->ir_set->irq_pending); ++ xhci_writel(xhci, xhci->s3.irq_control, &xhci->ir_set->irq_control); ++ xhci_writel(xhci, xhci->s3.erst_size, &xhci->ir_set->erst_size); ++ xhci_write_64(xhci, xhci->s3.erst_base, &xhci->ir_set->erst_base); ++} ++ ++/* ++ * Stop HC (not bus-specific) ++ * ++ * This is called when the machine transition into S3/S4 mode. ++ * ++ */ ++int xhci_suspend(struct xhci_hcd *xhci) ++{ ++ int rc = 0; ++ struct usb_hcd *hcd = xhci_to_hcd(xhci); ++ u32 command; ++ ++ spin_lock_irq(&xhci->lock); ++ clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); ++ /* step 1: stop endpoint */ ++ /* skipped assuming that port suspend has done */ ++ ++ /* step 2: clear Run/Stop bit */ ++ command = xhci_readl(xhci, &xhci->op_regs->command); ++ command &= ~CMD_RUN; ++ xhci_writel(xhci, command, &xhci->op_regs->command); ++ if (handshake(xhci, &xhci->op_regs->status, ++ STS_HALT, STS_HALT, 100*100)) { ++ xhci_warn(xhci, "WARN: xHC CMD_RUN timeout\n"); ++ spin_unlock_irq(&xhci->lock); ++ return -ETIMEDOUT; ++ } ++ ++ /* step 3: save registers */ ++ xhci_save_registers(xhci); ++ ++ /* step 4: set CSS flag */ ++ command = xhci_readl(xhci, &xhci->op_regs->command); ++ command |= CMD_CSS; ++ xhci_writel(xhci, command, &xhci->op_regs->command); ++ if (handshake(xhci, &xhci->op_regs->status, STS_SAVE, 0, 10*100)) { ++ xhci_warn(xhci, "WARN: xHC CMD_CSS timeout\n"); ++ spin_unlock_irq(&xhci->lock); ++ return -ETIMEDOUT; ++ } ++ /* step 5: remove core well power */ ++ xhci_cleanup_msix(xhci); ++ spin_unlock_irq(&xhci->lock); ++ ++ return rc; ++} ++ ++/* ++ * start xHC (not bus-specific) ++ * ++ * This is called when the machine transition from S3/S4 mode. ++ * ++ */ ++int xhci_resume(struct xhci_hcd *xhci, bool hibernated) ++{ ++ u32 command, temp = 0; ++ struct usb_hcd *hcd = xhci_to_hcd(xhci); ++ struct pci_dev *pdev = to_pci_dev(hcd->self.controller); ++ u64 val_64; ++ int old_state, retval; ++ ++ old_state = hcd->state; ++ if (time_before(jiffies, xhci->next_statechange)) ++ msleep(100); ++ ++ spin_lock_irq(&xhci->lock); ++ ++ if (!hibernated) { ++ /* step 1: restore register */ ++ xhci_restore_registers(xhci); ++ /* step 2: initialize command ring buffer */ ++ val_64 = xhci_read_64(xhci, &xhci->op_regs->cmd_ring); ++ val_64 = (val_64 & (u64) CMD_RING_RSVD_BITS) | ++ (xhci_trb_virt_to_dma(xhci->cmd_ring->deq_seg, ++ xhci->cmd_ring->dequeue) & ++ (u64) ~CMD_RING_RSVD_BITS) | ++ xhci->cmd_ring->cycle_state; ++ xhci_dbg(xhci, "// Setting command ring address to 0x%llx\n", ++ (long unsigned long) val_64); ++ xhci_write_64(xhci, val_64, &xhci->op_regs->cmd_ring); ++ /* step 3: restore state and start state*/ ++ /* step 3: set CRS flag */ ++ command = xhci_readl(xhci, &xhci->op_regs->command); ++ command |= CMD_CRS; ++ xhci_writel(xhci, command, &xhci->op_regs->command); ++ if (handshake(xhci, &xhci->op_regs->status, ++ STS_RESTORE, 0, 10*100)) { ++ xhci_dbg(xhci, "WARN: xHC CMD_CSS timeout\n"); ++ spin_unlock_irq(&xhci->lock); ++ return -ETIMEDOUT; ++ } ++ temp = xhci_readl(xhci, &xhci->op_regs->status); ++ } ++ ++ /* If restore operation fails, re-initialize the HC during resume */ ++ if ((temp & STS_SRE) || hibernated) { ++ usb_root_hub_lost_power(hcd->self.root_hub); ++ ++ xhci_dbg(xhci, "Stop HCD\n"); ++ xhci_halt(xhci); ++ xhci_reset(xhci); ++ if (hibernated) ++ xhci_cleanup_msix(xhci); ++ spin_unlock_irq(&xhci->lock); ++ ++#ifdef CONFIG_USB_XHCI_HCD_DEBUGGING ++ /* Tell the event ring poll function not to reschedule */ ++ xhci->zombie = 1; ++ del_timer_sync(&xhci->event_ring_timer); ++#endif ++ ++ xhci_dbg(xhci, "// Disabling event ring interrupts\n"); ++ temp = xhci_readl(xhci, &xhci->op_regs->status); ++ xhci_writel(xhci, temp & ~STS_EINT, &xhci->op_regs->status); ++ temp = xhci_readl(xhci, &xhci->ir_set->irq_pending); ++ xhci_writel(xhci, ER_IRQ_DISABLE(temp), ++ &xhci->ir_set->irq_pending); ++ xhci_print_ir_set(xhci, xhci->ir_set, 0); ++ ++ xhci_dbg(xhci, "cleaning up memory\n"); ++ xhci_mem_cleanup(xhci); ++ xhci_dbg(xhci, "xhci_stop completed - status = %x\n", ++ xhci_readl(xhci, &xhci->op_regs->status)); ++ ++ xhci_dbg(xhci, "Initialize the HCD\n"); ++ retval = xhci_init(hcd); ++ if (retval) ++ return retval; ++ ++ xhci_dbg(xhci, "Start the HCD\n"); ++ retval = xhci_run(hcd); ++ if (!retval) ++ set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); ++ hcd->state = HC_STATE_SUSPENDED; ++ return retval; ++ } ++ ++ /* Re-setup MSI-X */ ++ if (hcd->irq) ++ free_irq(hcd->irq, hcd); ++ hcd->irq = -1; ++ ++ retval = xhci_setup_msix(xhci); ++ if (retval) ++ /* fall back to msi*/ ++ retval = xhci_setup_msi(xhci); ++ ++ if (retval) { ++ /* fall back to legacy interrupt*/ ++ retval = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED, ++ hcd->irq_descr, hcd); ++ if (retval) { ++ xhci_err(xhci, "request interrupt %d failed\n", ++ pdev->irq); ++ return retval; ++ } ++ hcd->irq = pdev->irq; ++ } ++ ++ /* step 4: set Run/Stop bit */ ++ command = xhci_readl(xhci, &xhci->op_regs->command); ++ command |= CMD_RUN; ++ xhci_writel(xhci, command, &xhci->op_regs->command); ++ handshake(xhci, &xhci->op_regs->status, STS_HALT, ++ 0, 250 * 1000); ++ ++ /* step 5: walk topology and initialize portsc, ++ * portpmsc and portli ++ */ ++ /* this is done in bus_resume */ ++ ++ /* step 6: restart each of the previously ++ * Running endpoints by ringing their doorbells ++ */ ++ ++ set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); ++ if (!hibernated) ++ hcd->state = old_state; ++ else ++ hcd->state = HC_STATE_SUSPENDED; ++ ++ spin_unlock_irq(&xhci->lock); ++ return 0; ++} ++ + /*-------------------------------------------------------------------------*/ + + /** +@@ -956,7 +1166,7 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) + ep->stop_cmd_timer.expires = jiffies + + XHCI_STOP_EP_CMD_TIMEOUT * HZ; + add_timer(&ep->stop_cmd_timer); +- xhci_queue_stop_endpoint(xhci, urb->dev->slot_id, ep_index); ++ xhci_queue_stop_endpoint(xhci, urb->dev->slot_id, ep_index, 0); + xhci_ring_cmd_db(xhci); + } + done: +diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h +index 34a60d9..b6d8033 100644 +--- a/drivers/usb/host/xhci.h ++++ b/drivers/usb/host/xhci.h +@@ -191,7 +191,7 @@ struct xhci_op_regs { + /* bits 4:6 are reserved (and should be preserved on writes). */ + /* light reset (port status stays unchanged) - reset completed when this is 0 */ + #define CMD_LRESET (1 << 7) +-/* FIXME: ignoring host controller save/restore state for now. */ ++/* host controller save/restore state. */ + #define CMD_CSS (1 << 8) + #define CMD_CRS (1 << 9) + /* Enable Wrap Event - '1' means xHC generates an event when MFINDEX wraps. */ +@@ -269,6 +269,10 @@ struct xhci_op_regs { + * A read gives the current link PM state of the port, + * a write with Link State Write Strobe set sets the link state. + */ ++#define PORT_PLS_MASK (0xf << 5) ++#define XDEV_U0 (0x0 << 5) ++#define XDEV_U3 (0x3 << 5) ++#define XDEV_RESUME (0xf << 5) + /* true: port has power (see HCC_PPC) */ + #define PORT_POWER (1 << 9) + /* bits 10:13 indicate device speed: +@@ -353,6 +357,8 @@ struct xhci_op_regs { + #define PORT_U2_TIMEOUT(p) (((p) & 0xff) << 8) + /* Bits 24:31 for port testing */ + ++/* USB2 Protocol PORTSPMSC */ ++#define PORT_RWE (1 << 0x3) + + /** + * struct xhci_intr_reg - Interrupt Register Set +@@ -510,6 +516,7 @@ struct xhci_slot_ctx { + #define MAX_EXIT (0xffff) + /* Root hub port number that is needed to access the USB device */ + #define ROOT_HUB_PORT(p) (((p) & 0xff) << 16) ++#define DEVINFO_TO_ROOT_HUB_PORT(p) (((p) >> 16) & 0xff) + /* Maximum number of ports under a hub device */ + #define XHCI_MAX_PORTS(p) (((p) & 0xff) << 24) + +@@ -751,6 +758,7 @@ struct xhci_virt_device { + /* Status of the last command issued for this device */ + u32 cmd_status; + struct list_head cmd_list; ++ u8 port; + }; + + +@@ -881,6 +889,10 @@ struct xhci_event_cmd { + #define TRB_TO_EP_INDEX(p) ((((p) & (0x1f << 16)) >> 16) - 1) + #define EP_ID_FOR_TRB(p) ((((p) + 1) & 0x1f) << 16) + ++#define SUSPEND_PORT_FOR_TRB(p) (((p) & 1) << 23) ++#define TRB_TO_SUSPEND_PORT(p) (((p) & (1 << 23)) >> 23) ++#define LAST_EP_INDEX 30 ++ + /* Set TR Dequeue Pointer command TRB fields */ + #define TRB_TO_STREAM_ID(p) ((((p) & (0xffff << 16)) >> 16)) + #define STREAM_ID_FOR_TRB(p) ((((p)) & 0xffff) << 16) +@@ -1115,6 +1127,17 @@ struct urb_priv { + #define XHCI_STOP_EP_CMD_TIMEOUT 5 + /* XXX: Make these module parameters */ + ++struct s3_save { ++ u32 command; ++ u32 dev_nt; ++ u64 dcbaa_ptr; ++ u32 config_reg; ++ u32 irq_pending; ++ u32 irq_control; ++ u32 erst_size; ++ u64 erst_base; ++ u64 erst_dequeue; ++}; + + /* There is one ehci_hci structure per controller */ + struct xhci_hcd { +@@ -1178,6 +1201,12 @@ struct xhci_hcd { + #endif + /* Host controller watchdog timer structures */ + unsigned int xhc_state; ++ ++ unsigned long bus_suspended; ++ unsigned long next_statechange; ++ ++ u32 command; ++ struct s3_save s3; + /* Host controller is dying - not responding to commands. "I'm not dead yet!" + * + * xHC interrupts have been disabled and a watchdog timer will (or has already) +@@ -1199,6 +1228,10 @@ struct xhci_hcd { + /* Array of pointers to USB 2.0 PORTSC registers */ + u32 __iomem **usb2_ports; + unsigned int num_usb2_ports; ++ u32 port_c_suspend[8]; /* port suspend change*/ ++ u32 suspended_ports[8]; /* which ports are ++ suspended */ ++ unsigned long resume_done[MAX_HC_PORTS]; + }; + + /* For testing purposes */ +@@ -1369,6 +1402,8 @@ int xhci_init(struct usb_hcd *hcd); + int xhci_run(struct usb_hcd *hcd); + void xhci_stop(struct usb_hcd *hcd); + void xhci_shutdown(struct usb_hcd *hcd); ++int xhci_suspend(struct xhci_hcd *xhci); ++int xhci_resume(struct xhci_hcd *xhci, bool hibernated); + int xhci_get_frame(struct usb_hcd *hcd); + irqreturn_t xhci_irq(struct usb_hcd *hcd); + irqreturn_t xhci_msi_irq(int irq, struct usb_hcd *hcd); +@@ -1406,7 +1441,7 @@ int xhci_queue_address_device(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, + int xhci_queue_vendor_command(struct xhci_hcd *xhci, + u32 field1, u32 field2, u32 field3, u32 field4); + int xhci_queue_stop_endpoint(struct xhci_hcd *xhci, int slot_id, +- unsigned int ep_index); ++ unsigned int ep_index, int suspend); + int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, struct urb *urb, + int slot_id, unsigned int ep_index); + int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, struct urb *urb, +@@ -1436,11 +1471,18 @@ void xhci_queue_config_ep_quirk(struct xhci_hcd *xhci, + unsigned int slot_id, unsigned int ep_index, + struct xhci_dequeue_state *deq_state); + void xhci_stop_endpoint_command_watchdog(unsigned long arg); ++void xhci_ring_ep_doorbell(struct xhci_hcd *xhci, unsigned int slot_id, ++ unsigned int ep_index, unsigned int stream_id); + + /* xHCI roothub code */ + int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wIndex, + char *buf, u16 wLength); + int xhci_hub_status_data(struct usb_hcd *hcd, char *buf); ++int xhci_bus_suspend(struct usb_hcd *hcd); ++int xhci_bus_resume(struct usb_hcd *hcd); ++u32 xhci_port_state_to_neutral(u32 state); ++int xhci_find_slot_id_by_port(struct xhci_hcd *xhci, u16 port); ++void xhci_ring_device(struct xhci_hcd *xhci, int slot_id); + + /* xHCI contexts */ + struct xhci_input_control_ctx *xhci_get_input_control_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx); |