Compare commits
148 Commits
Author | SHA1 | Date |
---|---|---|
Chuck Ebbert | 1ca726dd20 | |
Chuck Ebbert | af9cec82a3 | |
Chuck Ebbert | 29f13318a3 | |
Chuck Ebbert | fdc263cb21 | |
Chuck Ebbert | 07dec24ea7 | |
Kyle McMartin | 7adc359067 | |
Chuck Ebbert | 7e1109112b | |
Chuck Ebbert | a3c890edbe | |
Kyle McMartin | fbc978be69 | |
Kyle McMartin | 2f8c0be373 | |
Chuck Ebbert | dda4c8ded1 | |
Matthew Garrett | 786d460759 | |
Chuck Ebbert | d9bdee82eb | |
Kyle McMartin | 365577d418 | |
Kyle McMartin | 7c8aa2a2c4 | |
Chuck Ebbert | 455ee889cb | |
Chuck Ebbert | f4a2bd612d | |
Chuck Ebbert | 8cb12224b9 | |
Chuck Ebbert | c5251bc7fb | |
Chuck Ebbert | ce15d645be | |
Kyle McMartin | a96313e196 | |
Chuck Ebbert | 16efe059d7 | |
Kyle McMartin | 5bd23aa290 | |
Neil Horman | 7907a3cd74 | |
Chuck Ebbert | 736de833de | |
Chuck Ebbert | 88a3381ac4 | |
Chuck Ebbert | 60a8a27c70 | |
Chuck Ebbert | d7c19e06c0 | |
Chuck Ebbert | 45a782f6d3 | |
Chuck Ebbert | 7a0a7db74d | |
Chuck Ebbert | 16bd76171d | |
Chuck Ebbert | 4d7c6b9018 | |
Chuck Ebbert | 6685a27880 | |
Chuck Ebbert | ed56c73082 | |
Chuck Ebbert | fa44e9fd9f | |
Chuck Ebbert | 2c7b199d8c | |
Chuck Ebbert | 31ece0102d | |
Chuck Ebbert | 5cef509b77 | |
Chuck Ebbert | c140072f7f | |
Kyle McMartin | 7dec002956 | |
Kyle McMartin | 4b57f309c7 | |
Kyle McMartin | 4038895354 | |
Kyle McMartin | fd3a50f30a | |
Kyle McMartin | de118fdb83 | |
Kyle McMartin | ce005fe2dc | |
Kyle McMartin | c1c4696c55 | |
Kyle McMartin | 9d066c5537 | |
Kyle McMartin | bc35d5cf3a | |
Kyle McMartin | ebd7718e1d | |
kyle | 081d17d5e9 | |
kyle | 4dbe3951c0 | |
John W. Linville | 3e45ced8ed | |
Kyle McMartin | dcba3e47ae | |
Kyle McMartin | 54c8f25d8d | |
Kyle McMartin | 92cce7f8f6 | |
Kyle McMartin | c35eb60a60 | |
Kyle McMartin | 9e245ead59 | |
Kyle McMartin | 8394f9abcf | |
Kyle McMartin | d5bf5dcc70 | |
Kyle McMartin | 4663ea7ac2 | |
Kyle McMartin | e40a76c139 | |
Kyle McMartin | c7228d304b | |
kyle | a9e5080da8 | |
Kyle McMartin | 06186dfdff | |
Neil Horman | ab959db97c | |
Neil Horman | a6964caecf | |
Chuck Ebbert | 2968963f0b | |
Ben Skeggs | 5c3c16ba28 | |
Ben Skeggs | 35a02f9ac3 | |
Chuck Ebbert | 7076c92c23 | |
Chuck Ebbert | 8f093d8c96 | |
Chuck Ebbert | 084d5cbca7 | |
Chuck Ebbert | b8bf1362de | |
Chuck Ebbert | 487e4d78da | |
Chuck Ebbert | fac9fd36ec | |
Chuck Ebbert | 5bfd09461d | |
Chuck Ebbert | dfcfe74aa7 | |
Chuck Ebbert | f63cfaf93a | |
Kyle McMartin | a1aa854d8c | |
Chuck Ebbert | 07eead3546 | |
Ben Skeggs | 37128f56c6 | |
Ben Skeggs | ba4f7f5014 | |
Kyle McMartin | 2f0935ad4f | |
Kyle McMartin | a43ca81f7b | |
Kyle McMartin | 73a35b993e | |
Jarod Wilson | 94adc799cb | |
Jarod Wilson | c08b49e452 | |
Jarod Wilson | 3ebffba4f6 | |
Chuck Ebbert | fb84bd51fb | |
Chuck Ebbert | c22521011c | |
Chuck Ebbert | 5613a02468 | |
Chuck Ebbert | b9c237fd69 | |
Chuck Ebbert | 3ff22b9f26 | |
Chuck Ebbert | e00d73683c | |
Kyle McMartin | 45fbfae2b4 | |
Kyle McMartin | 7ffcbba219 | |
Kyle McMartin | 5bfb0a6fb8 | |
Kyle McMartin | 867bebcea9 | |
Kyle McMartin | f0bdb962de | |
Kyle McMartin | 38c97e08f7 | |
Chuck Ebbert | a950d805dc | |
Chuck Ebbert | 9f10c3d7e5 | |
Chuck Ebbert | 7898ca3d1b | |
Chuck Ebbert | ffcfd3fb76 | |
Dave Airlie | c940e9b1b0 | |
Chuck Ebbert | 769f573dc2 | |
Chuck Ebbert | 9a3ee122e6 | |
Chuck Ebbert | fd60595ce9 | |
Chuck Ebbert | 7533b162d1 | |
Chuck Ebbert | 905bf1d52c | |
Chuck Ebbert | 7467be68cd | |
Chuck Ebbert | 222a8ce2e6 | |
Chuck Ebbert | e6201b5216 | |
Ben Skeggs | a05a042168 | |
Chuck Ebbert | c8ed7db337 | |
Chuck Ebbert | 2310eda43d | |
Chuck Ebbert | 78d3eaee97 | |
Jarod Wilson | 7371a35ab0 | |
Dave Jones | d759c9159e | |
Kyle McMartin | 07cce39b2f | |
Chuck Ebbert | 6dfffa5898 | |
Ben Skeggs | f3e16bdf3c | |
Chuck Ebbert | 5161ff7728 | |
Chuck Ebbert | d47af17904 | |
Chuck Ebbert | 3a4b7f0c66 | |
Chuck Ebbert | 4f6241e91f | |
Ben Skeggs | f2d0da0d23 | |
Chuck Ebbert | 52c0e26861 | |
Chuck Ebbert | f81c481b2b | |
Chuck Ebbert | f690b02b0d | |
Ben Skeggs | bace4b33bc | |
Ben Skeggs | fdc8afc978 | |
Chuck Ebbert | 8b8c89b0d5 | |
Chuck Ebbert | bb314e4958 | |
Chuck Ebbert | 4e7843a1f2 | |
Chuck Ebbert | fd554cc70a | |
Chuck Ebbert | ebfcf6e0d7 | |
Chuck Ebbert | 0bf6d25f41 | |
Chuck Ebbert | 76fc9b8a7b | |
Chuck Ebbert | ee4b78d86a | |
Chuck Ebbert | 5ad0e98752 | |
Chuck Ebbert | e573f4aa51 | |
Chuck Ebbert | 8e2ce3ce88 | |
Chuck Ebbert | cec1fd6cfe | |
Chuck Ebbert | 78cf92dcac | |
Roland McGrath | 13cbc19d00 | |
Chuck Ebbert | cf83d0d22d | |
Jesse Keating | 3494df0003 |
|
@ -0,0 +1,5 @@
|
||||||
|
linux-*.tar.bz2
|
||||||
|
patch-*.bz2
|
||||||
|
clog
|
||||||
|
*.rpm
|
||||||
|
kernel-2.6.*/
|
|
@ -0,0 +1,301 @@
|
||||||
|
# Makefile for source rpm: kernel
|
||||||
|
SPECFILE := kernel.spec
|
||||||
|
|
||||||
|
# use noarch for make prep instead of the current CPU
|
||||||
|
# noarch creates and checks all config files not just the current one,
|
||||||
|
# in addition "i386" isn't a valid kernel target
|
||||||
|
PREPARCH = noarch
|
||||||
|
|
||||||
|
# we only check the .sign signatures
|
||||||
|
UPSTREAM_CHECKS = sign
|
||||||
|
|
||||||
|
.PHONY: help
|
||||||
|
help:
|
||||||
|
%:
|
||||||
|
@echo "Try fedpkg $@ or something like that"
|
||||||
|
@exit 1
|
||||||
|
|
||||||
|
include Makefile.config
|
||||||
|
|
||||||
|
ifndef KVERSION
|
||||||
|
KVERSION := $(shell awk '$$1 == "%define" && $$2 == "base_sublevel" { \
|
||||||
|
print "2.6." $$3 \
|
||||||
|
}' $(SPECFILE))
|
||||||
|
endif
|
||||||
|
|
||||||
|
prep:
|
||||||
|
fedpkg -v prep --arch=$(PREPARCH)
|
||||||
|
|
||||||
|
extremedebug:
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_PAGEALLOC is not set/CONFIG_DEBUG_PAGEALLOC=y/' config-nodebug
|
||||||
|
|
||||||
|
debug:
|
||||||
|
@perl -pi -e 's/# CONFIG_SLUB_DEBUG_ON is not set/CONFIG_SLUB_DEBUG_ON=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_LOCK_STAT is not set/CONFIG_LOCK_STAT=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_STACK_USAGE is not set/CONFIG_DEBUG_STACK_USAGE=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_SLAB is not set/CONFIG_DEBUG_SLAB=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_MUTEXES is not set/CONFIG_DEBUG_MUTEXES=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_RT_MUTEXES is not set/CONFIG_DEBUG_RT_MUTEXES=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_RWSEMS is not set/CONFIG_DEBUG_RWSEMS=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_LOCK_ALLOC is not set/CONFIG_DEBUG_LOCK_ALLOC=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_PROVE_LOCKING is not set/CONFIG_PROVE_LOCKING=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_PROVE_RCU is not set/CONFIG_PROVE_RCU=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_SPINLOCK is not set/CONFIG_DEBUG_SPINLOCK=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_VM is not set/CONFIG_DEBUG_VM=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_SLEEP_IN_IRQ is not set/CONFIG_DEBUG_SLEEP_IN_IRQ=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_FAULT_INJECTION is not set/CONFIG_FAULT_INJECTION=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_FAILSLAB is not set/CONFIG_FAILSLAB=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_FAIL_PAGE_ALLOC is not set/CONFIG_FAIL_PAGE_ALLOC=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_FAIL_IO_TIMEOUT is not set/CONFIG_FAIL_IO_TIMEOUT=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_FAIL_MAKE_REQUEST is not set/CONFIG_FAIL_MAKE_REQUEST=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_FAULT_INJECTION_DEBUG_FS is not set/CONFIG_FAULT_INJECTION_DEBUG_FS=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set/CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_SG is not set/CONFIG_DEBUG_SG=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_WRITECOUNT is not set/CONFIG_DEBUG_WRITECOUNT=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_OBJECTS is not set/CONFIG_DEBUG_OBJECTS=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_OBJECTS_FREE is not set/CONFIG_DEBUG_OBJECTS_FREE=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_OBJECTS_TIMERS is not set/CONFIG_DEBUG_OBJECTS_TIMERS=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_X86_PTDUMP is not set/CONFIG_X86_PTDUMP=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_CAN_DEBUG_DEVICES is not set/CONFIG_CAN_DEBUG_DEVICES=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_MODULE_FORCE_UNLOAD is not set/CONFIG_MODULE_FORCE_UNLOAD=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_SYSCTL_SYSCALL_CHECK is not set/CONFIG_SYSCTL_SYSCALL_CHECK=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_NOTIFIERS is not set/CONFIG_DEBUG_NOTIFIERS=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DMA_API_DEBUG is not set/CONFIG_DMA_API_DEBUG=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_PM_TEST_SUSPEND is not set/CONFIG_PM_TEST_SUSPEND=y/' config-generic
|
||||||
|
@perl -pi -e 's/# CONFIG_PM_ADVANCED_DEBUG is not set/CONFIG_PM_ADVANCED_DEBUG=y/' config-generic
|
||||||
|
@perl -pi -e 's/# CONFIG_BOOT_TRACER is not set/CONFIG_BOOT_TRACER=y/' config-generic
|
||||||
|
@perl -pi -e 's/# CONFIG_B43_DEBUG is not set/CONFIG_B43_DEBUG=y/' config-generic
|
||||||
|
@perl -pi -e 's/# CONFIG_B43LEGACY_DEBUG is not set/CONFIG_B43LEGACY_DEBUG=y/' config-generic
|
||||||
|
@perl -pi -e 's/# CONFIG_MMIOTRACE is not set/CONFIG_MMIOTRACE=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_STRIP_ASM_SYMS=y/# CONFIG_STRIP_ASM_SYMS is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_CREDENTIALS is not set/CONFIG_DEBUG_CREDENTIALS=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set/CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_ACPI_DEBUG is not set/CONFIG_ACPI_DEBUG=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_EXT4_DEBUG is not set/CONFIG_EXT4_DEBUG=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_PERF_USE_VMALLOC is not set/CONFIG_DEBUG_PERF_USE_VMALLOC=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_JBD2_DEBUG is not set/CONFIG_JBD2_DEBUG=y/' config-nodebug
|
||||||
|
@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_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_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
|
||||||
|
@perl -pi -e 's/# CONFIG_CPU_NOTIFIER_ERROR_INJECT is not set/CONFIG_CPU_NOTIFIER_ERROR_INJECT=m/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_PER_CPU_MAPS is not set/CONFIG_DEBUG_PER_CPU_MAPS=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
|
||||||
|
|
||||||
|
@perl -pi -e 's/CONFIG_NR_CPUS=256/CONFIG_NR_CPUS=512/' config-x86_64-generic
|
||||||
|
|
||||||
|
@perl -pi -e 's/^%define debugbuildsenabled 1/%define debugbuildsenabled 0/' kernel.spec
|
||||||
|
@perl -pi -e 's/^%define rawhide_skip_docs 0/%define rawhide_skip_docs 1/' kernel.spec
|
||||||
|
|
||||||
|
nodebuginfo:
|
||||||
|
@perl -pi -e 's/^%define with_debuginfo %\{\?_without_debuginfo: 0\} %\{\?\!_without_debuginfo: 1\}/%define with_debuginfo %\{\?_without_debuginfo: 0\} %\{\?\!_without_debuginfo: 0\}/' kernel.spec
|
||||||
|
nodebug: release
|
||||||
|
@perl -pi -e 's/^%define debugbuildsenabled 1/%define debugbuildsenabled 0/' kernel.spec
|
||||||
|
release:
|
||||||
|
@perl -pi -e 's/CONFIG_SLUB_DEBUG_ON=y/# CONFIG_SLUB_DEBUG_ON is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_LOCK_STAT=y/# CONFIG_LOCK_STAT is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_STACK_USAGE=y/# CONFIG_DEBUG_STACK_USAGE is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_SLAB=y/# CONFIG_DEBUG_SLAB is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_MUTEXES=y/# CONFIG_DEBUG_MUTEXES is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_RT_MUTEXES=y/# CONFIG_DEBUG_RT_MUTEXES is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_RWSEMS=y/# CONFIG_DEBUG_RWSEMS is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_LOCK_ALLOC=y/# CONFIG_DEBUG_LOCK_ALLOC is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_PROVE_LOCKING=y/# CONFIG_PROVE_LOCKING is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_PROVE_RCU=y/# CONFIG_PROVE_RCU is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_SPINLOCK=y/# CONFIG_DEBUG_SPINLOCK is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_VM=y/# CONFIG_DEBUG_VM is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_SLEEP_IN_IRQ=y/# CONFIG_DEBUG_SLEEP_IN_IRQ is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_FAULT_INJECTION=y/# CONFIG_FAULT_INJECTION is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_FAILSLAB=y/# CONFIG_FAILSLAB is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_FAIL_PAGE_ALLOC=y/# CONFIG_FAIL_PAGE_ALLOC is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_FAIL_IO_TIMEOUT=y/# CONFIG_FAIL_IO_TIMEOUT is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_FAIL_MAKE_REQUEST=y/# CONFIG_FAIL_MAKE_REQUEST is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_FAULT_INJECTION_DEBUG_FS=y/# CONFIG_FAULT_INJECTION_DEBUG_FS is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y/# CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_SG=y/# CONFIG_DEBUG_SG is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_WRITECOUNT=y/# CONFIG_DEBUG_WRITECOUNT is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_OBJECTS=y/# CONFIG_DEBUG_OBJECTS is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_OBJECTS_FREE=y/# CONFIG_DEBUG_OBJECTS_FREE is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_OBJECTS_TIMERS=y/# CONFIG_DEBUG_OBJECTS_TIMERS is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_X86_PTDUMP=y/# CONFIG_X86_PTDUMP is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_CAN_DEBUG_DEVICES=y/# CONFIG_CAN_DEBUG_DEVICES is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_MODULE_FORCE_UNLOAD=y/# CONFIG_MODULE_FORCE_UNLOAD is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_SYSCTL_SYSCALL_CHECK=y/# CONFIG_SYSCTL_SYSCALL_CHECK is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_NOTIFIERS=y/# CONFIG_DEBUG_NOTIFIERS is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DMA_API_DEBUG=y/# CONFIG_DMA_API_DEBUG is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_PM_TEST_SUSPEND=y/#\ CONFIG_PM_TEST_SUSPEND\ is\ not\ set/' config-generic
|
||||||
|
@perl -pi -e 's/CONFIG_PM_ADVANCED_DEBUG=y/#\ CONFIG_PM_ADVANCED_DEBUG\ is\ not\ set/' config-generic
|
||||||
|
@perl -pi -e 's/CONFIG_BOOT_TRACER=y/#\ CONFIG_BOOT_TRACER\ is\ not\ set/' config-generic
|
||||||
|
@perl -pi -e 's/CONFIG_B43_DEBUG=y/# CONFIG_B43_DEBUG is not set/' config-generic
|
||||||
|
@perl -pi -e 's/CONFIG_B43LEGACY_DEBUG=y/# CONFIG_B43LEGACY_DEBUG is not set/' config-generic
|
||||||
|
@perl -pi -e 's/CONFIG_MMIOTRACE=y/# CONFIG_MMIOTRACE is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/# CONFIG_STRIP_ASM_SYMS is not set/CONFIG_STRIP_ASM_SYMS=y/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_CREDENTIALS=y/# CONFIG_DEBUG_CREDENTIALS is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y/# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_ACPI_DEBUG=y/# CONFIG_ACPI_DEBUG is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_EXT4_DEBUG=y/# CONFIG_EXT4_DEBUG is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_DEBUG_PERF_USE_VMALLOC=y/# CONFIG_DEBUG_PERF_USE_VMALLOC is not set/' config-nodebug
|
||||||
|
@perl -pi -e 's/CONFIG_JBD2_DEBUG=y/# CONFIG_JBD2_DEBUG is not set/' config-nodebug
|
||||||
|
@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_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_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
|
||||||
|
#@perl -pi -e 's/CONFIG_KDB_KEYBOARD=y/# CONFIG_KDB_KEYBOARD is not set/' config-nodebug
|
||||||
|
@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_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
|
||||||
|
|
||||||
|
@perl -pi -e 's/CONFIG_NR_CPUS=512/CONFIG_NR_CPUS=256/' config-x86_64-generic
|
||||||
|
|
||||||
|
@perl -pi -e 's/^%define debugbuildsenabled 0/%define debugbuildsenabled 1/' kernel.spec
|
||||||
|
@perl -pi -e 's/^%define rawhide_skip_docs 1/%define rawhide_skip_docs 0/' kernel.spec
|
||||||
|
|
||||||
|
reconfig:
|
||||||
|
@rm -f kernel-*-config
|
||||||
|
@VERSION=$(KVERSION) make -f Makefile.config configs
|
||||||
|
@scripts/reconfig.sh
|
||||||
|
|
||||||
|
unused-kernel-patches:
|
||||||
|
@for f in *.patch; do if [ -e $$f ]; then (egrep -q "^Patch[[:digit:]]+:[[:space:]]+$$f" $(SPECFILE) || echo "Unused: $$f") && egrep -q "^ApplyPatch[[:space:]]+$$f|^ApplyOptionalPatch[[:space:]]+$$f" $(SPECFILE) || echo "Unapplied: $$f"; fi; done
|
||||||
|
|
||||||
|
# since i386 isn't a target...
|
||||||
|
compile compile-short: DIST_DEFINES += --target $(shell uname -m)
|
||||||
|
|
||||||
|
# 'make local' also needs to build the noarch firmware package
|
||||||
|
local: noarch
|
||||||
|
|
||||||
|
#
|
||||||
|
# Hacks for building vanilla (unpatched) kernel rpms.
|
||||||
|
# Use "make vanilla-TARGET" like "make TARGET" (make vanilla-scratch-build).
|
||||||
|
#
|
||||||
|
vanilla-%: $(SPECFILE:.spec=-vanilla.spec)
|
||||||
|
@$(MAKE) $* SPECFILE=$<
|
||||||
|
|
||||||
|
$(SPECFILE:.spec=-vanilla.spec): $(SPECFILE)
|
||||||
|
@rm -f $@
|
||||||
|
(echo %define nopatches 1; cat $<) > $@
|
||||||
|
|
||||||
|
#scratch-build: NAME = $(shell rpm $(RPM_DEFINES) $(DIST_DEFINES) -q --qf "%{NAME}\n" --specfile $(SPECFILE)| head -1)
|
||||||
|
#scratch-build: test-srpm
|
||||||
|
# $(BUILD_CLIENT) build $(BUILD_FLAGS) --scratch $(TARGET) \
|
||||||
|
# $(SRCRPMDIR)/$(NAME)-$(VERSION)-$(RELEASE).src.rpm
|
||||||
|
|
||||||
|
# Dismal kludge for building via brew from cvs after "make vanilla-tag".
|
||||||
|
ifdef BEEHIVE_SRPM_BUILD
|
||||||
|
export CHECKOUT_TAG ?= $(shell sed s/^.// CVS/Tag)
|
||||||
|
tag-pattern = $(TAG_NAME)-$(TAG_VERSION)-0_%_$(TAG_RELEASE)
|
||||||
|
ifeq (,$(filter-out $(tag-pattern),$(CHECKOUT_TAG)))
|
||||||
|
variant := $(patsubst $(tag-pattern),%,$(CHECKOUT_TAG))
|
||||||
|
srpm: SPECFILE := $(wildcard $(SPECFILE:.spec=-$(variant).spec) \
|
||||||
|
$(SPECFILE:.spec=.t.$(variant).spec))
|
||||||
|
srpm beehive-sprm: RELEASE := 0.$(variant).$(RELEASE)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
#
|
||||||
|
# Hacks for building kernel rpms from upstream code plus local GIT branches.
|
||||||
|
# Use "make git/BRANCH/TARGET" like "make TARGET".
|
||||||
|
# Use "make git/BRANCH-fedora/TARGET" to include Fedora patches on top.
|
||||||
|
#
|
||||||
|
ifndef GIT_SPEC
|
||||||
|
git/%:
|
||||||
|
@$(MAKE) GIT_SPEC=$(subst /,-,$(*D)) git-$(*F)
|
||||||
|
else
|
||||||
|
git-%: $(SPECFILE:.spec=.t.$(GIT_SPEC).spec)
|
||||||
|
@$(MAKE) GIT_SPEC= $* SPECFILE=$<
|
||||||
|
endif
|
||||||
|
|
||||||
|
#
|
||||||
|
# Your git-branches.mk file can define GIT_DIR, e.g.:
|
||||||
|
# GIT_DIR = ${HOME}/kernel/.git
|
||||||
|
# Make sure GIT_AUTHOR_NAME and GIT_AUTHOR_EMAIL are also set
|
||||||
|
# or your rpm changelogs will look like crap.
|
||||||
|
#
|
||||||
|
# For each branch it can define a variable branch-BRANCH or tag-BRANCH
|
||||||
|
# giving the parent of BRANCH to diff against in a separate patch. If
|
||||||
|
# the parent is unknown, it will use $(branch-upstream) defaulting to
|
||||||
|
# "refs/remotes/upstream/master".
|
||||||
|
#
|
||||||
|
# Defining tag-BRANCH means the tag corresponds to an upstream patch in
|
||||||
|
# the sources file, so that is used instead of generating a patch with
|
||||||
|
# git. If there is no tag-upstream defined, it will figure out a vNNN
|
||||||
|
# tag or vNNN-gitN pseudo-tag from the last patch in the sources file.
|
||||||
|
# For example:
|
||||||
|
# tag-some-hacks = v2.6.21-rc5
|
||||||
|
# branch-more-hacks = some-hacks
|
||||||
|
# Leads to patches:
|
||||||
|
# git diff v2.6.21-rc5..more-hacks > linux-2.6.21-rc5-some-hacks.patch
|
||||||
|
# git diff some-hacks..more-hacks > linux-2.6.21-rc5-more-hacks.patch
|
||||||
|
# Whereas having no git-branches.mk at all but doing
|
||||||
|
# "make GIT_DIR=... git/mybranch/test-srpm" does:
|
||||||
|
# id=`cat patch-2.6.21-rc5-git4.id` # auto-fetched via upstream file
|
||||||
|
# git diff $id..upstream > linux-2.6.21-rc5-git4-upstream.patch
|
||||||
|
# git diff upstream..mybranch > linux-2.6.21-rc5-git4-mybranch.patch
|
||||||
|
# If the upstream patch (or any branch patch) is empty it's left out.
|
||||||
|
#
|
||||||
|
git-branches.mk:;
|
||||||
|
-include git-branches.mk
|
||||||
|
|
||||||
|
branch-upstream ?= refs/remotes/upstream/master
|
||||||
|
|
||||||
|
ifdef GIT_DIR
|
||||||
|
export GIT_DIR
|
||||||
|
export GIT_AUTHOR_NAME
|
||||||
|
export GIT_AUTHOR_EMAIL
|
||||||
|
gen-patches ?= gen-patches
|
||||||
|
|
||||||
|
ifndef havespec
|
||||||
|
$(SPECFILE:.spec=.t.%-fedora.spec): $(SPECFILE) $(gen-patches) FORCE
|
||||||
|
./$(gen-patches) --fedora < $< > $@ $(gen-patches-args)
|
||||||
|
$(SPECFILE:.spec=.t.%.spec): $(SPECFILE) $(gen-patches) FORCE
|
||||||
|
./$(gen-patches) < $< > $@ $(gen-patches-args)
|
||||||
|
.PRECIOUS: $(SPECFILE:.spec=.t.%.spec) $(SPECFILE:.spec=.t.%-fedora.spec)
|
||||||
|
endif
|
||||||
|
|
||||||
|
spec-%: $(SPECFILE:.spec=.t.%.spec) ;
|
||||||
|
$(SPECFILE):;
|
||||||
|
FORCE:;
|
||||||
|
|
||||||
|
branch-of-* = $(firstword $(head-$*) $*)
|
||||||
|
gen-patches-args = --name $* v$(KVERSION) $(call heads,$(branch-of-*))
|
||||||
|
define heads
|
||||||
|
$(if $(tag-$1),$(filter-out v$(KVERSION),$(tag-$1)),\
|
||||||
|
$(call heads,$(firstword $(branch-$1) $(branch-upstream)))) $1
|
||||||
|
endef
|
||||||
|
|
||||||
|
files-%-fedora:
|
||||||
|
@echo $(SPECFILE:.spec=.t.$*-fedora.spec)
|
||||||
|
@$(call list-patches,$(branch-of-*))
|
||||||
|
files-%:
|
||||||
|
@echo $(SPECFILE:.spec=.t.$*.spec)
|
||||||
|
@$(call list-patches,$(branch-of-*))
|
||||||
|
define list-patches
|
||||||
|
$(if $(tag-$1),version=$(patsubst v%,%,$(tag-$1)),\
|
||||||
|
$(call list-patches,$(firstword $(branch-$1) $(branch-upstream)))); \
|
||||||
|
echo linux-$${version}-$(patsubst refs/remotes/%/master,%,$1).patch
|
||||||
|
endef
|
||||||
|
|
||||||
|
ifndef tag-$(branch-upstream)
|
||||||
|
tag-$(branch-upstream) := $(shell \
|
||||||
|
sed -n 's/^.* *//;s/\.bz2$$//;s/patch-/v/;/^v/h;$${g;p}' sources)
|
||||||
|
endif
|
||||||
|
endif
|
|
@ -0,0 +1,105 @@
|
||||||
|
# Make rules for configuration files.
|
||||||
|
#
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
CFG = kernel-$(VERSION)
|
||||||
|
|
||||||
|
CONFIGFILES = \
|
||||||
|
$(CFG)-i686.config $(CFG)-i686-debug.config \
|
||||||
|
$(CFG)-i686-PAE.config $(CFG)-i686-PAEdebug.config \
|
||||||
|
$(CFG)-x86_64.config $(CFG)-x86_64-debug.config \
|
||||||
|
$(CFG)-s390x.config $(CFG)-arm.config \
|
||||||
|
$(CFG)-ppc.config $(CFG)-ppc-smp.config \
|
||||||
|
$(CFG)-sparc64.config \
|
||||||
|
$(CFG)-ppc64.config $(CFG)-ppc64-debug.config \
|
||||||
|
$(CFG)-ia64.config
|
||||||
|
|
||||||
|
PLATFORMS = x86 x86_64 powerpc powerpc32 powerpc64 s390x ia64 sparc64
|
||||||
|
TEMPFILES = $(addprefix temp-, $(addsuffix -generic, $(PLATFORMS)))
|
||||||
|
|
||||||
|
configs: $(CONFIGFILES)
|
||||||
|
@rm -f kernel-*-config
|
||||||
|
@rm -f $(TEMPFILES)
|
||||||
|
@rm -f temp-generic temp-*-generic temp-*-generic-tmp
|
||||||
|
|
||||||
|
# Augment the clean target to clean up our own cruft
|
||||||
|
clean ::
|
||||||
|
@rm -fv $(CONFIGFILES) $(TEMPFILES) temp-generic kernel-$(VERSION)*config
|
||||||
|
|
||||||
|
temp-generic: config-generic
|
||||||
|
cat config-generic config-nodebug > temp-generic
|
||||||
|
|
||||||
|
temp-debug-generic: config-generic
|
||||||
|
cat config-generic config-debug > temp-debug-generic
|
||||||
|
|
||||||
|
temp-x86-generic: config-x86-generic temp-generic
|
||||||
|
perl merge.pl $^ > $@
|
||||||
|
|
||||||
|
temp-x86-debug-generic: config-x86-generic temp-debug-generic
|
||||||
|
perl merge.pl $^ > $@
|
||||||
|
|
||||||
|
temp-x86_64-generic: config-x86_64-generic temp-generic
|
||||||
|
perl merge.pl $^ > $@
|
||||||
|
|
||||||
|
temp-x86_64-debug-generic: config-x86_64-generic temp-debug-generic
|
||||||
|
perl merge.pl $^ > $@
|
||||||
|
|
||||||
|
temp-sparc64-generic: config-sparc64-generic temp-generic
|
||||||
|
perl merge.pl $^ > $@
|
||||||
|
|
||||||
|
temp-powerpc-generic: config-powerpc-generic temp-generic
|
||||||
|
perl merge.pl $^ > $@
|
||||||
|
|
||||||
|
temp-powerpc-debug-generic: config-powerpc-generic temp-debug-generic
|
||||||
|
perl merge.pl $^ > $@
|
||||||
|
|
||||||
|
temp-powerpc32-generic: config-powerpc32-generic temp-powerpc-generic
|
||||||
|
perl merge.pl $^ > $@
|
||||||
|
|
||||||
|
temp-s390-generic: config-s390x temp-generic
|
||||||
|
perl merge.pl $^ > $@
|
||||||
|
|
||||||
|
temp-ia64-generic: config-ia64-generic temp-generic
|
||||||
|
perl merge.pl $^ > $@
|
||||||
|
|
||||||
|
kernel-$(VERSION)-i686-PAE.config: config-i686-PAE temp-x86-generic
|
||||||
|
perl merge.pl $^ i386 > $@
|
||||||
|
|
||||||
|
kernel-$(VERSION)-i686-PAEdebug.config: config-i686-PAE temp-x86-debug-generic
|
||||||
|
perl merge.pl $^ i386 > $@
|
||||||
|
|
||||||
|
kernel-$(VERSION)-i686.config: /dev/null temp-x86-generic
|
||||||
|
perl merge.pl $^ i386 > $@
|
||||||
|
|
||||||
|
kernel-$(VERSION)-i686-debug.config: /dev/null temp-x86-debug-generic
|
||||||
|
perl merge.pl $^ i386 > $@
|
||||||
|
|
||||||
|
kernel-$(VERSION)-x86_64.config: /dev/null temp-x86_64-generic
|
||||||
|
perl merge.pl $^ x86_64 > $@
|
||||||
|
|
||||||
|
kernel-$(VERSION)-x86_64-debug.config: /dev/null temp-x86_64-debug-generic
|
||||||
|
perl merge.pl $^ x86_64 > $@
|
||||||
|
|
||||||
|
kernel-$(VERSION)-sparc64.config: /dev/null temp-sparc64-generic
|
||||||
|
perl merge.pl $^ sparc64 > $@
|
||||||
|
|
||||||
|
kernel-$(VERSION)-ppc64.config: config-powerpc64 temp-powerpc-generic
|
||||||
|
perl merge.pl $^ powerpc > $@
|
||||||
|
|
||||||
|
kernel-$(VERSION)-ppc64-debug.config: config-powerpc64 temp-powerpc-debug-generic
|
||||||
|
perl merge.pl $^ powerpc > $@
|
||||||
|
|
||||||
|
kernel-$(VERSION)-s390x.config: config-s390x temp-s390-generic
|
||||||
|
perl merge.pl $^ s390 > $@
|
||||||
|
|
||||||
|
kernel-$(VERSION)-arm.config: config-arm temp-generic
|
||||||
|
perl merge.pl $^ arm > $@
|
||||||
|
|
||||||
|
kernel-$(VERSION)-ppc.config: /dev/null temp-powerpc32-generic
|
||||||
|
perl merge.pl $^ powerpc > $@
|
||||||
|
|
||||||
|
kernel-$(VERSION)-ppc-smp.config: config-powerpc32-smp temp-powerpc32-generic
|
||||||
|
perl merge.pl $^ powerpc > $@
|
||||||
|
|
||||||
|
kernel-$(VERSION)-ia64.config: /dev/null temp-ia64-generic
|
||||||
|
perl merge.pl $^ ia64 > $@
|
|
@ -0,0 +1,67 @@
|
||||||
|
|
||||||
|
Kernel package tips & tricks.
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The kernel is one of the more complicated packages in the distro, and
|
||||||
|
for the newcomer, some of the voodoo in the spec file can be somewhat scary.
|
||||||
|
This file attempts to document some of the magic.
|
||||||
|
|
||||||
|
|
||||||
|
Speeding up make prep
|
||||||
|
---------------------
|
||||||
|
The kernel is nearly 500MB of source code, and as such, 'make prep'
|
||||||
|
takes a while. The spec file employs some trickery so that repeated
|
||||||
|
invocations of make prep don't take as long. Ordinarily the %prep
|
||||||
|
phase of a package will delete the tree it is about to untar/patch.
|
||||||
|
The kernel %prep keeps around an unpatched version of the tree,
|
||||||
|
and makes a symlink tree clone of that clean tree and than applies
|
||||||
|
the patches listed in the spec to the symlink tree.
|
||||||
|
This makes a huge difference if you're doing multiple make preps a day.
|
||||||
|
As an added bonus, doing a diff between the clean tree and the symlink
|
||||||
|
tree is slightly faster than it would be doing two proper copies of the tree.
|
||||||
|
|
||||||
|
|
||||||
|
build logs.
|
||||||
|
-----------
|
||||||
|
There's a convenience helper script in scripts/grab-logs.sh
|
||||||
|
that will grab the build logs from koji for the kernel version reported
|
||||||
|
by make verrel
|
||||||
|
|
||||||
|
|
||||||
|
config heirarchy.
|
||||||
|
-----------------
|
||||||
|
Instead of having to maintain a config file for every arch variant we build on,
|
||||||
|
the kernel spec uses a nested system of configs. At the top level, is
|
||||||
|
config-generic. Add options here that should be present in every possible
|
||||||
|
config on all architectures.
|
||||||
|
Beneath this are per-arch overrides. For example config-x86-generic add
|
||||||
|
additional x86 specific options, and also _override_ any options that were
|
||||||
|
set in config-generic.
|
||||||
|
There exist two additional overrides, config-debug, and config-nodebug,
|
||||||
|
which override -generic, and the per-arch overrides. It is documented
|
||||||
|
further below.
|
||||||
|
|
||||||
|
debug options.
|
||||||
|
--------------
|
||||||
|
This is a little complicated, as the purpose & meaning of this changes
|
||||||
|
depending on where we are in the release cycle.
|
||||||
|
If we are building for a current stable release, 'make release' has
|
||||||
|
typically been run already, which sets up the following..
|
||||||
|
- Two builds occur, a 'kernel' and a 'kernel-debug' flavor.
|
||||||
|
- kernel-debug will get various heavyweight debugging options like
|
||||||
|
lockdep etc turned on.
|
||||||
|
|
||||||
|
If we are building for rawhide, 'make debug' has been run, which changes
|
||||||
|
the status quo to:
|
||||||
|
- We only build one kernel 'kernel'
|
||||||
|
- The debug options from 'config-debug' are always turned on.
|
||||||
|
This is done to increase coverage testing, as not many people actually
|
||||||
|
run kernel-debug.
|
||||||
|
|
||||||
|
To add new debug options, add an option to _both_ config-debug and config-nodebug,
|
||||||
|
and also new stanzas to the Makefile 'debug' and 'release' targets.
|
||||||
|
|
||||||
|
Sometimes debug options get added to config-generic, or per-arch overrides
|
||||||
|
instead of config-[no]debug. In this instance, the options should have no
|
||||||
|
discernable performance impact, otherwise they belong in the debug files.
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
https://bugzilla.kernel.org/show_bug.cgi?id=14733#c41
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
|
||||||
|
index 27e0b92..09fbb69 100644
|
||||||
|
--- a/drivers/acpi/ec.c
|
||||||
|
+++ b/drivers/acpi/ec.c
|
||||||
|
@@ -226,6 +226,7 @@ static int ec_poll(struct acpi_ec *ec)
|
||||||
|
if (ec_transaction_done(ec))
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
+ msleep(1);
|
||||||
|
if (wait_event_timeout(ec->wait,
|
||||||
|
ec_transaction_done(ec),
|
||||||
|
msecs_to_jiffies(1)))
|
||||||
|
@@ -233,8 +234,8 @@ static int ec_poll(struct acpi_ec *ec)
|
||||||
|
}
|
||||||
|
advance_transaction(ec, acpi_ec_read_status(ec));
|
||||||
|
} while (time_before(jiffies, delay));
|
||||||
|
- if (acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF)
|
||||||
|
- break;
|
||||||
|
+// if (acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF)
|
||||||
|
+// break;
|
||||||
|
pr_debug(PREFIX "controller reset, restart transaction\n");
|
||||||
|
spin_lock_irqsave(&ec->curr_lock, flags);
|
||||||
|
start_transaction(ec);
|
||||||
|
@@ -271,15 +272,25 @@ static int ec_check_ibf0(struct acpi_ec *ec)
|
||||||
|
return (status & ACPI_EC_FLAG_IBF) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* try to clean input buffer with burst_disable transaction */
|
||||||
|
+static int acpi_ec_clean_buffer(struct acpi_ec *ec)
|
||||||
|
+{
|
||||||
|
+ struct transaction t = {.command = ACPI_EC_BURST_DISABLE,
|
||||||
|
+ .wdata = NULL, .rdata = NULL,
|
||||||
|
+ .wlen = 0, .rlen = 0};
|
||||||
|
+ return acpi_ec_transaction_unlocked(ec, &t);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int ec_wait_ibf0(struct acpi_ec *ec)
|
||||||
|
{
|
||||||
|
+
|
||||||
|
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),
|
||||||
|
msecs_to_jiffies(1)))
|
||||||
|
return 0;
|
||||||
|
- return -ETIME;
|
||||||
|
+ return acpi_ec_clean_buffer(ec);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
|
|
@ -0,0 +1,215 @@
|
||||||
|
From: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Date: Thu, 8 Apr 2010 23:39:40 +0000 (+0200)
|
||||||
|
Subject: ACPI / EC / PM: Fix race between EC transactions and system suspend
|
||||||
|
X-Git-Tag: v2.6.35-rc2~39^2~3
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=d5a64513c6a171262082c250592c062e97a2c693
|
||||||
|
|
||||||
|
ACPI / EC / PM: Fix race between EC transactions and system suspend
|
||||||
|
|
||||||
|
There still is a race that may result in suspending the system in
|
||||||
|
the middle of an EC transaction in progress, which leads to problems
|
||||||
|
(like the kernel thinking that the ACPI global lock is held during
|
||||||
|
resume while in fact it's not).
|
||||||
|
|
||||||
|
To remove the race condition, modify the ACPI platform suspend and
|
||||||
|
hibernate callbacks so that EC transactions are blocked right after
|
||||||
|
executing the _PTS global control method and are allowed to happen
|
||||||
|
again right after the low-level wakeup.
|
||||||
|
|
||||||
|
Introduce acpi_pm_freeze() that will disable GPEs, wait until the
|
||||||
|
event queues are empty and block EC transactions. Use it wherever
|
||||||
|
GPEs are disabled in preparation for switching local interrupts off.
|
||||||
|
Introduce acpi_pm_thaw() that will allow EC transactions to happen
|
||||||
|
again and enable runtime GPEs. Use it to balance acpi_pm_freeze()
|
||||||
|
wherever necessary.
|
||||||
|
|
||||||
|
In addition to that use acpi_ec_resume_transactions_early() to
|
||||||
|
unblock EC transactions as early as reasonably possible during
|
||||||
|
resume. Also unblock EC transactions in acpi_hibernation_finish()
|
||||||
|
and in the analogous suspend routine to make sure that the EC
|
||||||
|
transactions are enabled in all error paths.
|
||||||
|
|
||||||
|
Fixes https://bugzilla.kernel.org/show_bug.cgi?id=14668
|
||||||
|
|
||||||
|
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Reported-and-tested-by: Maxim Levitsky <maximlevitsky@gmail.com>
|
||||||
|
Signed-off-by: Len Brown <len.brown@intel.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
|
||||||
|
index f2234db..2c2b73a 100644
|
||||||
|
--- a/drivers/acpi/ec.c
|
||||||
|
+++ b/drivers/acpi/ec.c
|
||||||
|
@@ -485,6 +485,16 @@ void acpi_ec_resume_transactions(void)
|
||||||
|
mutex_unlock(&ec->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
+void acpi_ec_resume_transactions_early(void)
|
||||||
|
+{
|
||||||
|
+ /*
|
||||||
|
+ * Allow transactions to happen again (this function is called from
|
||||||
|
+ * atomic context during wakeup, so we don't need to acquire the mutex).
|
||||||
|
+ */
|
||||||
|
+ if (first_ec)
|
||||||
|
+ clear_bit(EC_FLAGS_FROZEN, &first_ec->flags);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int acpi_ec_query_unlocked(struct acpi_ec *ec, u8 * data)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
|
||||||
|
index e284113..0ec48c7 100644
|
||||||
|
--- a/drivers/acpi/internal.h
|
||||||
|
+++ b/drivers/acpi/internal.h
|
||||||
|
@@ -51,6 +51,7 @@ int acpi_ec_ecdt_probe(void);
|
||||||
|
int acpi_boot_ec_enable(void);
|
||||||
|
void acpi_ec_suspend_transactions(void);
|
||||||
|
void acpi_ec_resume_transactions(void);
|
||||||
|
+void acpi_ec_resume_transactions_early(void);
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------
|
||||||
|
Suspend/Resume
|
||||||
|
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
|
||||||
|
index baa76bb..24741ac 100644
|
||||||
|
--- a/drivers/acpi/sleep.c
|
||||||
|
+++ b/drivers/acpi/sleep.c
|
||||||
|
@@ -110,11 +110,13 @@ void __init acpi_old_suspend_ordering(void)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
- * acpi_pm_disable_gpes - Disable the GPEs.
|
||||||
|
+ * acpi_pm_freeze - Disable the GPEs and suspend EC transactions.
|
||||||
|
*/
|
||||||
|
-static int acpi_pm_disable_gpes(void)
|
||||||
|
+static int acpi_pm_freeze(void)
|
||||||
|
{
|
||||||
|
acpi_disable_all_gpes();
|
||||||
|
+ acpi_os_wait_events_complete(NULL);
|
||||||
|
+ acpi_ec_suspend_transactions();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -142,7 +144,8 @@ static int acpi_pm_prepare(void)
|
||||||
|
int error = __acpi_pm_prepare();
|
||||||
|
|
||||||
|
if (!error)
|
||||||
|
- acpi_disable_all_gpes();
|
||||||
|
+ acpi_pm_freeze();
|
||||||
|
+
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -275,6 +278,8 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
|
||||||
|
* acpi_leave_sleep_state will reenable specific GPEs later
|
||||||
|
*/
|
||||||
|
acpi_disable_all_gpes();
|
||||||
|
+ /* Allow EC transactions to happen. */
|
||||||
|
+ acpi_ec_resume_transactions_early();
|
||||||
|
|
||||||
|
local_irq_restore(flags);
|
||||||
|
printk(KERN_DEBUG "Back to C!\n");
|
||||||
|
@@ -286,6 +291,12 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
|
||||||
|
return ACPI_SUCCESS(status) ? 0 : -EFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void acpi_suspend_finish(void)
|
||||||
|
+{
|
||||||
|
+ acpi_ec_resume_transactions();
|
||||||
|
+ acpi_pm_finish();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int acpi_suspend_state_valid(suspend_state_t pm_state)
|
||||||
|
{
|
||||||
|
u32 acpi_state;
|
||||||
|
@@ -307,7 +318,7 @@ static struct platform_suspend_ops acpi_suspend_ops = {
|
||||||
|
.begin = acpi_suspend_begin,
|
||||||
|
.prepare_late = acpi_pm_prepare,
|
||||||
|
.enter = acpi_suspend_enter,
|
||||||
|
- .wake = acpi_pm_finish,
|
||||||
|
+ .wake = acpi_suspend_finish,
|
||||||
|
.end = acpi_pm_end,
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -333,9 +344,9 @@ static int acpi_suspend_begin_old(suspend_state_t pm_state)
|
||||||
|
static struct platform_suspend_ops acpi_suspend_ops_old = {
|
||||||
|
.valid = acpi_suspend_state_valid,
|
||||||
|
.begin = acpi_suspend_begin_old,
|
||||||
|
- .prepare_late = acpi_pm_disable_gpes,
|
||||||
|
+ .prepare_late = acpi_pm_freeze,
|
||||||
|
.enter = acpi_suspend_enter,
|
||||||
|
- .wake = acpi_pm_finish,
|
||||||
|
+ .wake = acpi_suspend_finish,
|
||||||
|
.end = acpi_pm_end,
|
||||||
|
.recover = acpi_pm_finish,
|
||||||
|
};
|
||||||
|
@@ -586,6 +597,7 @@ static int acpi_hibernation_enter(void)
|
||||||
|
static void acpi_hibernation_finish(void)
|
||||||
|
{
|
||||||
|
hibernate_nvs_free();
|
||||||
|
+ acpi_ec_resume_transactions();
|
||||||
|
acpi_pm_finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -606,17 +618,11 @@ static void acpi_hibernation_leave(void)
|
||||||
|
}
|
||||||
|
/* Restore the NVS memory area */
|
||||||
|
hibernate_nvs_restore();
|
||||||
|
+ /* Allow EC transactions to happen. */
|
||||||
|
+ acpi_ec_resume_transactions_early();
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int acpi_pm_pre_restore(void)
|
||||||
|
-{
|
||||||
|
- acpi_disable_all_gpes();
|
||||||
|
- acpi_os_wait_events_complete(NULL);
|
||||||
|
- acpi_ec_suspend_transactions();
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static void acpi_pm_restore_cleanup(void)
|
||||||
|
+static void acpi_pm_thaw(void)
|
||||||
|
{
|
||||||
|
acpi_ec_resume_transactions();
|
||||||
|
acpi_enable_all_runtime_gpes();
|
||||||
|
@@ -630,8 +636,8 @@ static struct platform_hibernation_ops acpi_hibernation_ops = {
|
||||||
|
.prepare = acpi_pm_prepare,
|
||||||
|
.enter = acpi_hibernation_enter,
|
||||||
|
.leave = acpi_hibernation_leave,
|
||||||
|
- .pre_restore = acpi_pm_pre_restore,
|
||||||
|
- .restore_cleanup = acpi_pm_restore_cleanup,
|
||||||
|
+ .pre_restore = acpi_pm_freeze,
|
||||||
|
+ .restore_cleanup = acpi_pm_thaw,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -663,12 +669,9 @@ static int acpi_hibernation_begin_old(void)
|
||||||
|
|
||||||
|
static int acpi_hibernation_pre_snapshot_old(void)
|
||||||
|
{
|
||||||
|
- int error = acpi_pm_disable_gpes();
|
||||||
|
-
|
||||||
|
- if (!error)
|
||||||
|
- hibernate_nvs_save();
|
||||||
|
-
|
||||||
|
- return error;
|
||||||
|
+ acpi_pm_freeze();
|
||||||
|
+ hibernate_nvs_save();
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -680,11 +683,11 @@ static struct platform_hibernation_ops acpi_hibernation_ops_old = {
|
||||||
|
.end = acpi_pm_end,
|
||||||
|
.pre_snapshot = acpi_hibernation_pre_snapshot_old,
|
||||||
|
.finish = acpi_hibernation_finish,
|
||||||
|
- .prepare = acpi_pm_disable_gpes,
|
||||||
|
+ .prepare = acpi_pm_freeze,
|
||||||
|
.enter = acpi_hibernation_enter,
|
||||||
|
.leave = acpi_hibernation_leave,
|
||||||
|
- .pre_restore = acpi_pm_pre_restore,
|
||||||
|
- .restore_cleanup = acpi_pm_restore_cleanup,
|
||||||
|
+ .pre_restore = acpi_pm_freeze,
|
||||||
|
+ .restore_cleanup = acpi_pm_thaw,
|
||||||
|
.recover = acpi_pm_finish,
|
||||||
|
};
|
||||||
|
#endif /* CONFIG_HIBERNATION */
|
|
@ -0,0 +1,666 @@
|
||||||
|
From e2e8fc4ed31157e9e9e9cbc70febf08c77233aea Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@dreadnought.i.jkkm.org>
|
||||||
|
Date: Thu, 20 May 2010 10:17:58 -0400
|
||||||
|
Subject: add-appleir-driver
|
||||||
|
|
||||||
|
---
|
||||||
|
Documentation/input/appleir.txt | 45 ++++
|
||||||
|
drivers/hid/hid-apple.c | 4 -
|
||||||
|
drivers/hid/hid-core.c | 9 +-
|
||||||
|
drivers/hid/hid-ids.h | 1 +
|
||||||
|
drivers/hid/usbhid/hid-core.c | 1 +
|
||||||
|
drivers/input/misc/Kconfig | 13 ++
|
||||||
|
drivers/input/misc/Makefile | 1 +
|
||||||
|
drivers/input/misc/appleir.c | 453 +++++++++++++++++++++++++++++++++++++++
|
||||||
|
include/linux/hid.h | 2 +
|
||||||
|
9 files changed, 522 insertions(+), 7 deletions(-)
|
||||||
|
create mode 100644 Documentation/input/appleir.txt
|
||||||
|
create mode 100644 drivers/input/misc/appleir.c
|
||||||
|
|
||||||
|
diff --git a/Documentation/input/appleir.txt b/Documentation/input/appleir.txt
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..0267a4b
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/input/appleir.txt
|
||||||
|
@@ -0,0 +1,45 @@
|
||||||
|
+Apple IR receiver Driver (appleir)
|
||||||
|
+----------------------------------
|
||||||
|
+ Copyright (C) 2009 Bastien Nocera <hadess@hadess.net>
|
||||||
|
+
|
||||||
|
+The appleir driver is a kernel input driver to handle Apple's IR
|
||||||
|
+receivers (and associated remotes) in the kernel.
|
||||||
|
+
|
||||||
|
+The driver is an input driver which only handles "official" remotes
|
||||||
|
+as built and sold by Apple.
|
||||||
|
+
|
||||||
|
+Authors
|
||||||
|
+-------
|
||||||
|
+
|
||||||
|
+James McKenzie (original driver)
|
||||||
|
+Alex Karpenko (05ac:8242 support)
|
||||||
|
+Greg Kroah-Hartman (cleanups and original submission)
|
||||||
|
+Bastien Nocera (further cleanups and suspend support)
|
||||||
|
+
|
||||||
|
+Supported hardware
|
||||||
|
+------------------
|
||||||
|
+
|
||||||
|
+- All Apple laptops and desktops from 2005 onwards, except:
|
||||||
|
+ - the unibody Macbook (2009)
|
||||||
|
+ - Mac Pro (all versions)
|
||||||
|
+- Apple TV (all revisions)
|
||||||
|
+
|
||||||
|
+The remote will only support the 6 buttons of the original remotes
|
||||||
|
+as sold by Apple. See the next section if you want to use other remotes
|
||||||
|
+or want to use lirc with the device instead of the kernel driver.
|
||||||
|
+
|
||||||
|
+Using lirc (native) instead of the kernel driver
|
||||||
|
+------------------------------------------------
|
||||||
|
+
|
||||||
|
+First, you will need to disable the kernel driver for the receiver.
|
||||||
|
+
|
||||||
|
+This can be achieved by passing quirks to the usbhid driver.
|
||||||
|
+The quirk line would be:
|
||||||
|
+usbhid.quirks=0x05ac:0x8242:0x40000010
|
||||||
|
+
|
||||||
|
+With 0x05ac being the vendor ID (Apple, you shouldn't need to change this)
|
||||||
|
+With 0x8242 being the product ID (check the output of lsusb for your hardware)
|
||||||
|
+And 0x10 being "HID_QUIRK_HIDDEV_FORCE" and 0x40000000 being "HID_QUIRK_NO_IGNORE"
|
||||||
|
+
|
||||||
|
+This should force the creation of a hiddev device for the receiver, and
|
||||||
|
+make it usable under lirc.
|
||||||
|
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c
|
||||||
|
index bba05d0..0059d5a 100644
|
||||||
|
--- a/drivers/hid/hid-apple.c
|
||||||
|
+++ b/drivers/hid/hid-apple.c
|
||||||
|
@@ -361,10 +361,6 @@ static void apple_remove(struct hid_device *hdev)
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct hid_device_id apple_devices[] = {
|
||||||
|
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL),
|
||||||
|
- .driver_data = APPLE_HIDDEV | APPLE_IGNORE_HIDINPUT },
|
||||||
|
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4),
|
||||||
|
- .driver_data = APPLE_HIDDEV | APPLE_IGNORE_HIDINPUT },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE),
|
||||||
|
.driver_data = APPLE_MIGHTYMOUSE | APPLE_INVERT_HWHEEL },
|
||||||
|
|
||||||
|
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
|
||||||
|
index 143e788..387bb59 100644
|
||||||
|
--- a/drivers/hid/hid-core.c
|
||||||
|
+++ b/drivers/hid/hid-core.c
|
||||||
|
@@ -1167,6 +1167,8 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
|
||||||
|
unsigned int i;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
+ if (hdev->quirks & HID_QUIRK_HIDDEV_FORCE)
|
||||||
|
+ connect_mask |= (HID_CONNECT_HIDDEV_FORCE | HID_CONNECT_HIDDEV);
|
||||||
|
if (hdev->bus != BUS_USB)
|
||||||
|
connect_mask &= ~HID_CONNECT_HIDDEV;
|
||||||
|
if (hid_hiddev(hdev))
|
||||||
|
@@ -1248,8 +1250,6 @@ static const struct hid_device_id hid_blacklist[] = {
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
|
||||||
|
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
|
||||||
|
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) },
|
||||||
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICMOUSE) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) },
|
||||||
|
@@ -1553,6 +1553,9 @@ static const struct hid_device_id hid_ignore_list[] = {
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_T91MT)},
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_LCM)},
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_LCM2)},
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL) },
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) },
|
||||||
|
@@ -1757,7 +1760,7 @@ int hid_add_device(struct hid_device *hdev)
|
||||||
|
|
||||||
|
/* we need to kill them here, otherwise they will stay allocated to
|
||||||
|
* wait for coming driver */
|
||||||
|
- if (hid_ignore(hdev))
|
||||||
|
+ if (!(hdev->quirks & HID_QUIRK_NO_IGNORE) && hid_ignore(hdev))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
/* XXX hack, any other cleaner solution after the driver core
|
||||||
|
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
||||||
|
index 09d2764..7275a9d 100644
|
||||||
|
--- a/drivers/hid/hid-ids.h
|
||||||
|
+++ b/drivers/hid/hid-ids.h
|
||||||
|
@@ -97,6 +97,7 @@
|
||||||
|
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b
|
||||||
|
#define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a
|
||||||
|
#define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b
|
||||||
|
+#define USB_DEVICE_ID_APPLE_IRCONTROL 0x8240
|
||||||
|
#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241
|
||||||
|
#define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242
|
||||||
|
|
||||||
|
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
|
||||||
|
index 7b85b69..66b512c 100644
|
||||||
|
--- a/drivers/hid/usbhid/hid-core.c
|
||||||
|
+++ b/drivers/hid/usbhid/hid-core.c
|
||||||
|
@@ -1133,6 +1133,7 @@ static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *
|
||||||
|
hid->vendor = le16_to_cpu(dev->descriptor.idVendor);
|
||||||
|
hid->product = le16_to_cpu(dev->descriptor.idProduct);
|
||||||
|
hid->name[0] = 0;
|
||||||
|
+ hid->quirks = usbhid_lookup_quirk(hid->vendor, hid->product);
|
||||||
|
if (intf->cur_altsetting->desc.bInterfaceProtocol ==
|
||||||
|
USB_INTERFACE_PROTOCOL_MOUSE)
|
||||||
|
hid->type = HID_TYPE_USBMOUSE;
|
||||||
|
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
|
||||||
|
index 23140a3..46614b2 100644
|
||||||
|
--- a/drivers/input/misc/Kconfig
|
||||||
|
+++ b/drivers/input/misc/Kconfig
|
||||||
|
@@ -159,6 +159,19 @@ config INPUT_KEYSPAN_REMOTE
|
||||||
|
To compile this driver as a module, choose M here: the module will
|
||||||
|
be called keyspan_remote.
|
||||||
|
|
||||||
|
+config INPUT_APPLEIR
|
||||||
|
+ tristate "Apple infrared receiver (built in)"
|
||||||
|
+ depends on USB_ARCH_HAS_HCD
|
||||||
|
+ select USB
|
||||||
|
+ help
|
||||||
|
+ Say Y here if you want to use a Apple infrared remote control. All
|
||||||
|
+ the Apple computers from 2005 onwards include such a port, except
|
||||||
|
+ the unibody Macbook (2009), and Mac Pros. This receiver is also
|
||||||
|
+ used in the Apple TV set-top box.
|
||||||
|
+
|
||||||
|
+ To compile this driver as a module, choose M here: the module will
|
||||||
|
+ be called appleir.
|
||||||
|
+
|
||||||
|
config INPUT_POWERMATE
|
||||||
|
tristate "Griffin PowerMate and Contour Jog support"
|
||||||
|
depends on USB_ARCH_HAS_HCD
|
||||||
|
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
|
||||||
|
index 7e95a5d..3fa4404 100644
|
||||||
|
--- a/drivers/input/misc/Makefile
|
||||||
|
+++ b/drivers/input/misc/Makefile
|
||||||
|
@@ -6,6 +6,7 @@
|
||||||
|
|
||||||
|
obj-$(CONFIG_INPUT_88PM860X_ONKEY) += 88pm860x_onkey.o
|
||||||
|
obj-$(CONFIG_INPUT_APANEL) += apanel.o
|
||||||
|
+obj-$(CONFIG_INPUT_APPLEIR) += appleir.o
|
||||||
|
obj-$(CONFIG_INPUT_ATI_REMOTE) += ati_remote.o
|
||||||
|
obj-$(CONFIG_INPUT_ATI_REMOTE2) += ati_remote2.o
|
||||||
|
obj-$(CONFIG_INPUT_ATLAS_BTNS) += atlas_btns.o
|
||||||
|
diff --git a/drivers/input/misc/appleir.c b/drivers/input/misc/appleir.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..cff4df6
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/input/misc/appleir.c
|
||||||
|
@@ -0,0 +1,453 @@
|
||||||
|
+/*
|
||||||
|
+ * appleir: USB driver for the apple ir device
|
||||||
|
+ *
|
||||||
|
+ * Original driver written by James McKenzie
|
||||||
|
+ * Ported to recent 2.6 kernel versions by Greg Kroah-Hartman <gregkh@suse.de>
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2006 James McKenzie
|
||||||
|
+ * Copyright (C) 2008 Greg Kroah-Hartman <greg@kroah.com>
|
||||||
|
+ * Copyright (C) 2008 Novell Inc.
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can redistribute it and/or modify it
|
||||||
|
+ * under the terms of the GNU General Public License as published by the Free
|
||||||
|
+ * Software Foundation, version 2.
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/kernel.h>
|
||||||
|
+#include <linux/slab.h>
|
||||||
|
+#include <linux/input.h>
|
||||||
|
+#include <linux/usb/input.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/init.h>
|
||||||
|
+#include <linux/usb.h>
|
||||||
|
+#include <linux/usb/input.h>
|
||||||
|
+#include <asm/unaligned.h>
|
||||||
|
+#include <asm/byteorder.h>
|
||||||
|
+
|
||||||
|
+#define DRIVER_VERSION "v1.2"
|
||||||
|
+#define DRIVER_AUTHOR "James McKenzie"
|
||||||
|
+#define DRIVER_DESC "Apple infrared receiver driver"
|
||||||
|
+#define DRIVER_LICENSE "GPL"
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||||
|
+MODULE_DESCRIPTION(DRIVER_DESC);
|
||||||
|
+MODULE_LICENSE(DRIVER_LICENSE);
|
||||||
|
+
|
||||||
|
+#define USB_VENDOR_ID_APPLE 0x05ac
|
||||||
|
+#define USB_DEVICE_ID_APPLE_IRCONTROL 0x8240
|
||||||
|
+#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241
|
||||||
|
+#define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242
|
||||||
|
+
|
||||||
|
+#define URB_SIZE 32
|
||||||
|
+
|
||||||
|
+#define MAX_KEYS 8
|
||||||
|
+#define MAX_KEYS_MASK (MAX_KEYS - 1)
|
||||||
|
+
|
||||||
|
+#define dbginfo(dev, format, arg...) do { if (debug) dev_info(dev , format , ## arg); } while (0)
|
||||||
|
+
|
||||||
|
+static int debug;
|
||||||
|
+module_param(debug, int, 0644);
|
||||||
|
+MODULE_PARM_DESC(debug, "Enable extra debug messages and information");
|
||||||
|
+
|
||||||
|
+/* I have two devices both of which report the following */
|
||||||
|
+/* 25 87 ee 83 0a + */
|
||||||
|
+/* 25 87 ee 83 0c - */
|
||||||
|
+/* 25 87 ee 83 09 << */
|
||||||
|
+/* 25 87 ee 83 06 >> */
|
||||||
|
+/* 25 87 ee 83 05 >" */
|
||||||
|
+/* 25 87 ee 83 03 menu */
|
||||||
|
+/* 26 00 00 00 00 for key repeat*/
|
||||||
|
+
|
||||||
|
+/* Thomas Glanzmann reports the following responses */
|
||||||
|
+/* 25 87 ee ca 0b + */
|
||||||
|
+/* 25 87 ee ca 0d - */
|
||||||
|
+/* 25 87 ee ca 08 << */
|
||||||
|
+/* 25 87 ee ca 07 >> */
|
||||||
|
+/* 25 87 ee ca 04 >" */
|
||||||
|
+/* 25 87 ee ca 02 menu */
|
||||||
|
+/* 26 00 00 00 00 for key repeat*/
|
||||||
|
+/* He also observes the following event sometimes */
|
||||||
|
+/* sent after a key is release, which I interpret */
|
||||||
|
+/* as a flat battery message */
|
||||||
|
+/* 25 87 e0 ca 06 flat battery */
|
||||||
|
+
|
||||||
|
+/* Alexandre Karpenko reports the following responses for Device ID 0x8242 */
|
||||||
|
+/* 25 87 ee 47 0b + */
|
||||||
|
+/* 25 87 ee 47 0d - */
|
||||||
|
+/* 25 87 ee 47 08 << */
|
||||||
|
+/* 25 87 ee 47 07 >> */
|
||||||
|
+/* 25 87 ee 47 04 >" */
|
||||||
|
+/* 25 87 ee 47 02 menu */
|
||||||
|
+/* 26 87 ee 47 ** for key repeat (** is the code of the key being held) */
|
||||||
|
+
|
||||||
|
+static const unsigned short appleir_key_table[] = {
|
||||||
|
+ KEY_RESERVED,
|
||||||
|
+ KEY_MENU,
|
||||||
|
+ KEY_PLAYPAUSE,
|
||||||
|
+ KEY_FORWARD,
|
||||||
|
+ KEY_BACK,
|
||||||
|
+ KEY_VOLUMEUP,
|
||||||
|
+ KEY_VOLUMEDOWN,
|
||||||
|
+ KEY_RESERVED,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct appleir {
|
||||||
|
+ struct input_dev *input_dev;
|
||||||
|
+ unsigned short keymap[ARRAY_SIZE(appleir_key_table)];
|
||||||
|
+ u8 *data;
|
||||||
|
+ dma_addr_t dma_buf;
|
||||||
|
+ struct usb_device *usbdev;
|
||||||
|
+ unsigned int flags;
|
||||||
|
+ struct urb *urb;
|
||||||
|
+ struct timer_list key_up_timer;
|
||||||
|
+ int current_key;
|
||||||
|
+ char phys[32];
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static DEFINE_MUTEX(appleir_mutex);
|
||||||
|
+
|
||||||
|
+enum {
|
||||||
|
+ APPLEIR_OPENED = 0x1,
|
||||||
|
+ APPLEIR_SUSPENDED = 0x2,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct usb_device_id appleir_ids[] = {
|
||||||
|
+ { USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL) },
|
||||||
|
+ { USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
|
||||||
|
+ { USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
|
||||||
|
+ {}
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(usb, appleir_ids);
|
||||||
|
+
|
||||||
|
+static void dump_packet(struct appleir *appleir, char *msg, u8 *data, int len)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ printk(KERN_ERR "appleir: %s (%d bytes)", msg, len);
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < len; ++i)
|
||||||
|
+ printk(" %02x", data[i]);
|
||||||
|
+ printk("\n");
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void key_up(struct appleir *appleir, int key)
|
||||||
|
+{
|
||||||
|
+ dbginfo(&appleir->input_dev->dev, "key %d up\n", key);
|
||||||
|
+ input_report_key(appleir->input_dev, key, 0);
|
||||||
|
+ input_sync(appleir->input_dev);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void key_down(struct appleir *appleir, int key)
|
||||||
|
+{
|
||||||
|
+ dbginfo(&appleir->input_dev->dev, "key %d down\n", key);
|
||||||
|
+ input_report_key(appleir->input_dev, key, 1);
|
||||||
|
+ input_sync(appleir->input_dev);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void battery_flat(struct appleir *appleir)
|
||||||
|
+{
|
||||||
|
+ dev_err(&appleir->input_dev->dev, "possible flat battery?\n");
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void key_up_tick(unsigned long data)
|
||||||
|
+{
|
||||||
|
+ struct appleir *appleir = (struct appleir *)data;
|
||||||
|
+
|
||||||
|
+ if (appleir->current_key) {
|
||||||
|
+ key_up(appleir, appleir->current_key);
|
||||||
|
+ appleir->current_key = 0;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void new_data(struct appleir *appleir, u8 *data, int len)
|
||||||
|
+{
|
||||||
|
+ static const u8 keydown[] = { 0x25, 0x87, 0xee };
|
||||||
|
+ static const u8 keyrepeat[] = { 0x26, };
|
||||||
|
+ static const u8 flatbattery[] = { 0x25, 0x87, 0xe0 };
|
||||||
|
+
|
||||||
|
+ if (debug)
|
||||||
|
+ dump_packet(appleir, "received", data, len);
|
||||||
|
+
|
||||||
|
+ if (len != 5)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (!memcmp(data, keydown, sizeof(keydown))) {
|
||||||
|
+ /* If we already have a key down, take it up before marking
|
||||||
|
+ this one down */
|
||||||
|
+ if (appleir->current_key)
|
||||||
|
+ key_up(appleir, appleir->current_key);
|
||||||
|
+ appleir->current_key = appleir->keymap[(data[4] >> 1) & MAX_KEYS_MASK];
|
||||||
|
+
|
||||||
|
+ key_down(appleir, appleir->current_key);
|
||||||
|
+ /* Remote doesn't do key up, either pull them up, in the test
|
||||||
|
+ above, or here set a timer which pulls them up after 1/8 s */
|
||||||
|
+ mod_timer(&appleir->key_up_timer, jiffies + HZ / 8);
|
||||||
|
+
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!memcmp(data, keyrepeat, sizeof(keyrepeat))) {
|
||||||
|
+ key_down(appleir, appleir->current_key);
|
||||||
|
+ /* Remote doesn't do key up, either pull them up, in the test
|
||||||
|
+ above, or here set a timer which pulls them up after 1/8 s */
|
||||||
|
+ mod_timer(&appleir->key_up_timer, jiffies + HZ / 8);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!memcmp(data, flatbattery, sizeof(flatbattery))) {
|
||||||
|
+ battery_flat(appleir);
|
||||||
|
+ /* Fall through */
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ dump_packet(appleir, "unknown packet", data, len);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void appleir_urb(struct urb *urb)
|
||||||
|
+{
|
||||||
|
+ struct appleir *appleir = urb->context;
|
||||||
|
+ int status = urb->status;
|
||||||
|
+ int retval;
|
||||||
|
+
|
||||||
|
+ switch (status) {
|
||||||
|
+ case 0:
|
||||||
|
+ new_data(appleir, urb->transfer_buffer, urb->actual_length);
|
||||||
|
+ break;
|
||||||
|
+ case -ECONNRESET:
|
||||||
|
+ case -ENOENT:
|
||||||
|
+ case -ESHUTDOWN:
|
||||||
|
+ /* This urb is terminated, clean up */
|
||||||
|
+ dbginfo(&appleir->input_dev->dev, "%s - urb shutting down with status: %d", __func__,
|
||||||
|
+ urb->status);
|
||||||
|
+ return;
|
||||||
|
+ default:
|
||||||
|
+ dbginfo(&appleir->input_dev->dev, "%s - nonzero urb status received: %d", __func__,
|
||||||
|
+ urb->status);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ retval = usb_submit_urb(urb, GFP_ATOMIC);
|
||||||
|
+ if (retval)
|
||||||
|
+ err("%s - usb_submit_urb failed with result %d", __func__,
|
||||||
|
+ retval);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int appleir_open(struct input_dev *dev)
|
||||||
|
+{
|
||||||
|
+ struct appleir *appleir = input_get_drvdata(dev);
|
||||||
|
+ struct usb_interface *intf = usb_ifnum_to_if(appleir->usbdev, 0);
|
||||||
|
+ int r;
|
||||||
|
+
|
||||||
|
+ r = usb_autopm_get_interface(intf);
|
||||||
|
+ if (r) {
|
||||||
|
+ dev_err(&intf->dev,
|
||||||
|
+ "%s(): usb_autopm_get_interface() = %d\n", __func__, r);
|
||||||
|
+ return r;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ mutex_lock(&appleir_mutex);
|
||||||
|
+
|
||||||
|
+ if (usb_submit_urb(appleir->urb, GFP_ATOMIC)) {
|
||||||
|
+ r = -EIO;
|
||||||
|
+ goto fail;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ appleir->flags |= APPLEIR_OPENED;
|
||||||
|
+
|
||||||
|
+ mutex_unlock(&appleir_mutex);
|
||||||
|
+
|
||||||
|
+ usb_autopm_put_interface(intf);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+fail:
|
||||||
|
+ mutex_unlock(&appleir_mutex);
|
||||||
|
+ usb_autopm_put_interface(intf);
|
||||||
|
+ return r;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void appleir_close(struct input_dev *dev)
|
||||||
|
+{
|
||||||
|
+ struct appleir *appleir = input_get_drvdata(dev);
|
||||||
|
+
|
||||||
|
+ mutex_lock(&appleir_mutex);
|
||||||
|
+
|
||||||
|
+ if (!(appleir->flags & APPLEIR_SUSPENDED)) {
|
||||||
|
+ usb_kill_urb(appleir->urb);
|
||||||
|
+ del_timer_sync(&appleir->key_up_timer);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ appleir->flags &= ~APPLEIR_OPENED;
|
||||||
|
+
|
||||||
|
+ mutex_unlock(&appleir_mutex);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int appleir_probe(struct usb_interface *intf,
|
||||||
|
+ const struct usb_device_id *id)
|
||||||
|
+{
|
||||||
|
+ struct usb_device *dev = interface_to_usbdev(intf);
|
||||||
|
+ struct usb_endpoint_descriptor *endpoint;
|
||||||
|
+ struct appleir *appleir = NULL;
|
||||||
|
+ struct input_dev *input_dev;
|
||||||
|
+ int retval = -ENOMEM;
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ appleir = kzalloc(sizeof(struct appleir), GFP_KERNEL);
|
||||||
|
+ if (!appleir)
|
||||||
|
+ goto allocfail;
|
||||||
|
+
|
||||||
|
+ appleir->data = usb_buffer_alloc(dev, URB_SIZE, GFP_KERNEL,
|
||||||
|
+ &appleir->dma_buf);
|
||||||
|
+ if (!appleir->data)
|
||||||
|
+ goto usbfail;
|
||||||
|
+
|
||||||
|
+ appleir->urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||||
|
+ if (!appleir->urb)
|
||||||
|
+ goto urbfail;
|
||||||
|
+
|
||||||
|
+ appleir->usbdev = dev;
|
||||||
|
+
|
||||||
|
+ input_dev = input_allocate_device();
|
||||||
|
+ if (!input_dev)
|
||||||
|
+ goto inputfail;
|
||||||
|
+
|
||||||
|
+ appleir->input_dev = input_dev;
|
||||||
|
+
|
||||||
|
+ usb_make_path(dev, appleir->phys, sizeof(appleir->phys));
|
||||||
|
+ strlcpy(appleir->phys, "/input0", sizeof(appleir->phys));
|
||||||
|
+
|
||||||
|
+ input_dev->name = "Apple Infrared Remote Controller";
|
||||||
|
+ input_dev->phys = appleir->phys;
|
||||||
|
+ usb_to_input_id(dev, &input_dev->id);
|
||||||
|
+ input_dev->dev.parent = &intf->dev;
|
||||||
|
+ input_dev->keycode = appleir->keymap;
|
||||||
|
+ input_dev->keycodesize = sizeof(unsigned short);
|
||||||
|
+ input_dev->keycodemax = ARRAY_SIZE(appleir->keymap);
|
||||||
|
+
|
||||||
|
+ input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
|
||||||
|
+
|
||||||
|
+ memcpy(appleir->keymap, appleir_key_table, sizeof(appleir->keymap));
|
||||||
|
+ for (i = 0; i < ARRAY_SIZE(appleir_key_table); i++)
|
||||||
|
+ set_bit(appleir->keymap[i], input_dev->keybit);
|
||||||
|
+ clear_bit(KEY_RESERVED, input_dev->keybit);
|
||||||
|
+
|
||||||
|
+ input_set_drvdata(input_dev, appleir);
|
||||||
|
+ input_dev->open = appleir_open;
|
||||||
|
+ input_dev->close = appleir_close;
|
||||||
|
+
|
||||||
|
+ endpoint = &intf->cur_altsetting->endpoint[0].desc;
|
||||||
|
+
|
||||||
|
+ usb_fill_int_urb(appleir->urb, dev,
|
||||||
|
+ usb_rcvintpipe(dev, endpoint->bEndpointAddress),
|
||||||
|
+ appleir->data, 8,
|
||||||
|
+ appleir_urb, appleir, endpoint->bInterval);
|
||||||
|
+
|
||||||
|
+ appleir->urb->transfer_dma = appleir->dma_buf;
|
||||||
|
+ appleir->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||||
|
+
|
||||||
|
+ setup_timer(&appleir->key_up_timer,
|
||||||
|
+ key_up_tick, (unsigned long) appleir);
|
||||||
|
+
|
||||||
|
+ retval = input_register_device(appleir->input_dev);
|
||||||
|
+ if (retval)
|
||||||
|
+ goto inputfail;
|
||||||
|
+
|
||||||
|
+ usb_set_intfdata(intf, appleir);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+inputfail:
|
||||||
|
+ input_free_device(appleir->input_dev);
|
||||||
|
+
|
||||||
|
+urbfail:
|
||||||
|
+ usb_free_urb(appleir->urb);
|
||||||
|
+
|
||||||
|
+usbfail:
|
||||||
|
+ usb_buffer_free(dev, URB_SIZE, appleir->data,
|
||||||
|
+ appleir->dma_buf);
|
||||||
|
+
|
||||||
|
+allocfail:
|
||||||
|
+ kfree(appleir);
|
||||||
|
+
|
||||||
|
+ return retval;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void appleir_disconnect(struct usb_interface *intf)
|
||||||
|
+{
|
||||||
|
+ struct appleir *appleir = usb_get_intfdata(intf);
|
||||||
|
+
|
||||||
|
+ usb_set_intfdata(intf, NULL);
|
||||||
|
+ input_unregister_device(appleir->input_dev);
|
||||||
|
+ usb_free_urb(appleir->urb);
|
||||||
|
+ usb_buffer_free(interface_to_usbdev(intf), URB_SIZE,
|
||||||
|
+ appleir->data, appleir->dma_buf);
|
||||||
|
+ kfree(appleir);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int appleir_suspend(struct usb_interface *interface,
|
||||||
|
+ pm_message_t message)
|
||||||
|
+{
|
||||||
|
+ struct appleir *appleir = usb_get_intfdata(interface);
|
||||||
|
+
|
||||||
|
+ mutex_lock(&appleir_mutex);
|
||||||
|
+ if (appleir->flags & APPLEIR_OPENED)
|
||||||
|
+ usb_kill_urb(appleir->urb);
|
||||||
|
+
|
||||||
|
+ appleir->flags |= APPLEIR_SUSPENDED;
|
||||||
|
+
|
||||||
|
+ mutex_unlock(&appleir_mutex);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int appleir_resume(struct usb_interface *interface)
|
||||||
|
+{
|
||||||
|
+ struct appleir *appleir;
|
||||||
|
+ int r = 0;
|
||||||
|
+
|
||||||
|
+ appleir = usb_get_intfdata(interface);
|
||||||
|
+
|
||||||
|
+ mutex_lock(&appleir_mutex);
|
||||||
|
+ if (appleir->flags & APPLEIR_OPENED) {
|
||||||
|
+ struct usb_endpoint_descriptor *endpoint;
|
||||||
|
+
|
||||||
|
+ endpoint = &interface->cur_altsetting->endpoint[0].desc;
|
||||||
|
+ usb_fill_int_urb(appleir->urb, appleir->usbdev,
|
||||||
|
+ usb_rcvintpipe(appleir->usbdev, endpoint->bEndpointAddress),
|
||||||
|
+ appleir->data, 8,
|
||||||
|
+ appleir_urb, appleir, endpoint->bInterval);
|
||||||
|
+ appleir->urb->transfer_dma = appleir->dma_buf;
|
||||||
|
+ appleir->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||||
|
+
|
||||||
|
+ /* And reset the USB device */
|
||||||
|
+ if (usb_submit_urb(appleir->urb, GFP_ATOMIC))
|
||||||
|
+ r = -EIO;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ appleir->flags &= ~APPLEIR_SUSPENDED;
|
||||||
|
+
|
||||||
|
+ mutex_unlock(&appleir_mutex);
|
||||||
|
+
|
||||||
|
+ return r;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct usb_driver appleir_driver = {
|
||||||
|
+ .name = "appleir",
|
||||||
|
+ .probe = appleir_probe,
|
||||||
|
+ .disconnect = appleir_disconnect,
|
||||||
|
+ .suspend = appleir_suspend,
|
||||||
|
+ .resume = appleir_resume,
|
||||||
|
+ .reset_resume = appleir_resume,
|
||||||
|
+ .id_table = appleir_ids,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int __init appleir_init(void)
|
||||||
|
+{
|
||||||
|
+ return usb_register(&appleir_driver);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void __exit appleir_exit(void)
|
||||||
|
+{
|
||||||
|
+ usb_deregister(&appleir_driver);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+module_init(appleir_init);
|
||||||
|
+module_exit(appleir_exit);
|
||||||
|
diff --git a/include/linux/hid.h b/include/linux/hid.h
|
||||||
|
index b1344ec..f1f2b6f 100644
|
||||||
|
--- a/include/linux/hid.h
|
||||||
|
+++ b/include/linux/hid.h
|
||||||
|
@@ -308,11 +308,13 @@ struct hid_item {
|
||||||
|
#define HID_QUIRK_NOTOUCH 0x00000002
|
||||||
|
#define HID_QUIRK_IGNORE 0x00000004
|
||||||
|
#define HID_QUIRK_NOGET 0x00000008
|
||||||
|
+#define HID_QUIRK_HIDDEV_FORCE 0x00000010
|
||||||
|
#define HID_QUIRK_BADPAD 0x00000020
|
||||||
|
#define HID_QUIRK_MULTI_INPUT 0x00000040
|
||||||
|
#define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000
|
||||||
|
#define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000
|
||||||
|
#define HID_QUIRK_NO_INIT_REPORTS 0x20000000
|
||||||
|
+#define HID_QUIRK_NO_IGNORE 0x40000000
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the global environment of the parser. This information is
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
From: Vasiliy Kulikov <segoon@openwall.com>
|
||||||
|
Date: Thu, 14 Apr 2011 16:55:16 +0000 (+0400)
|
||||||
|
Subject: agp: fix arbitrary kernel memory writes
|
||||||
|
X-Git-Tag: v2.6.39-rc5~29^2
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=194b3da873fd334ef183806db751473512af29ce
|
||||||
|
|
||||||
|
agp: fix arbitrary kernel memory writes
|
||||||
|
|
||||||
|
pg_start is copied from userspace on AGPIOC_BIND and AGPIOC_UNBIND ioctl
|
||||||
|
cmds of agp_ioctl() and passed to agpioc_bind_wrap(). As said in the
|
||||||
|
comment, (pg_start + mem->page_count) may wrap in case of AGPIOC_BIND,
|
||||||
|
and it is not checked at all in case of AGPIOC_UNBIND. As a result, user
|
||||||
|
with sufficient privileges (usually "video" group) may generate either
|
||||||
|
local DoS or privilege escalation.
|
||||||
|
|
||||||
|
Signed-off-by: Vasiliy Kulikov <segoon@openwall.com>
|
||||||
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c
|
||||||
|
index 850a643..b072648 100644
|
||||||
|
--- a/drivers/char/agp/generic.c
|
||||||
|
+++ b/drivers/char/agp/generic.c
|
||||||
|
@@ -1095,8 +1095,8 @@ int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type)
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* AK: could wrap */
|
||||||
|
- if ((pg_start + mem->page_count) > num_entries)
|
||||||
|
+ if (((pg_start + mem->page_count) > num_entries) ||
|
||||||
|
+ ((pg_start + mem->page_count) < pg_start))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
j = pg_start;
|
||||||
|
@@ -1130,7 +1130,7 @@ int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
struct agp_bridge_data *bridge;
|
||||||
|
- int mask_type;
|
||||||
|
+ int mask_type, num_entries;
|
||||||
|
|
||||||
|
bridge = mem->bridge;
|
||||||
|
if (!bridge)
|
||||||
|
@@ -1142,6 +1142,11 @@ int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
|
||||||
|
if (type != mem->type)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
+ num_entries = agp_num_entries();
|
||||||
|
+ if (((pg_start + mem->page_count) > num_entries) ||
|
||||||
|
+ ((pg_start + mem->page_count) < pg_start))
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
mask_type = bridge->driver->agp_type_to_mask_type(bridge, type);
|
||||||
|
if (mask_type != 0) {
|
||||||
|
/* The generic routines know nothing of memory types */
|
|
@ -0,0 +1,56 @@
|
||||||
|
From: Vasiliy Kulikov <segoon@openwall.com>
|
||||||
|
Date: Thu, 14 Apr 2011 16:55:19 +0000 (+0400)
|
||||||
|
Subject: agp: fix OOM and buffer overflow
|
||||||
|
X-Git-Tag: v2.6.39-rc5~29^2~1
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=b522f02184b413955f3bc952e3776ce41edc6355
|
||||||
|
|
||||||
|
agp: fix OOM and buffer overflow
|
||||||
|
|
||||||
|
page_count is copied from userspace. agp_allocate_memory() tries to
|
||||||
|
check whether this number is too big, but doesn't take into account the
|
||||||
|
wrap case. Also agp_create_user_memory() doesn't check whether
|
||||||
|
alloc_size is calculated from num_agp_pages variable without overflow.
|
||||||
|
This may lead to allocation of too small buffer with following buffer
|
||||||
|
overflow.
|
||||||
|
|
||||||
|
Another problem in agp code is not addressed in the patch - kernel memory
|
||||||
|
exhaustion (AGPIOC_RESERVE and AGPIOC_ALLOCATE ioctls). It is not checked
|
||||||
|
whether requested pid is a pid of the caller (no check in agpioc_reserve_wrap()).
|
||||||
|
Each allocation is limited to 16KB, though, there is no per-process limit.
|
||||||
|
This might lead to OOM situation, which is not even solved in case of the
|
||||||
|
caller death by OOM killer - the memory is allocated for another (faked) process.
|
||||||
|
|
||||||
|
Signed-off-by: Vasiliy Kulikov <segoon@openwall.com>
|
||||||
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c
|
||||||
|
index 012cba0..850a643 100644
|
||||||
|
--- a/drivers/char/agp/generic.c
|
||||||
|
+++ b/drivers/char/agp/generic.c
|
||||||
|
@@ -115,6 +115,9 @@ static struct agp_memory *agp_create_user_memory(unsigned long num_agp_pages)
|
||||||
|
struct agp_memory *new;
|
||||||
|
unsigned long alloc_size = num_agp_pages*sizeof(struct page *);
|
||||||
|
|
||||||
|
+ if (INT_MAX/sizeof(struct page *) < num_agp_pages)
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
new = kzalloc(sizeof(struct agp_memory), GFP_KERNEL);
|
||||||
|
if (new == NULL)
|
||||||
|
return NULL;
|
||||||
|
@@ -234,11 +237,14 @@ struct agp_memory *agp_allocate_memory(struct agp_bridge_data *bridge,
|
||||||
|
int scratch_pages;
|
||||||
|
struct agp_memory *new;
|
||||||
|
size_t i;
|
||||||
|
+ int cur_memory;
|
||||||
|
|
||||||
|
if (!bridge)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
- if ((atomic_read(&bridge->current_memory_agp) + page_count) > bridge->max_memory_agp)
|
||||||
|
+ cur_memory = atomic_read(&bridge->current_memory_agp);
|
||||||
|
+ if ((cur_memory + page_count > bridge->max_memory_agp) ||
|
||||||
|
+ (cur_memory + page_count < page_count))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (type >= AGP_USER_TYPES) {
|
|
@ -0,0 +1,62 @@
|
||||||
|
From: Tim Gardner <tim.gardner@canonical.com>
|
||||||
|
Date: Fri, 9 Jul 2010 20:48:50 +0000 (-0600)
|
||||||
|
Subject: agp/intel: Use the correct mask to detect i830 aperture size.
|
||||||
|
X-Git-Tag: v2.6.35~33^2~4
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=e7b96f28c58ca09f15f6c2e8ccbb889a30fab4f7
|
||||||
|
|
||||||
|
agp/intel: Use the correct mask to detect i830 aperture size.
|
||||||
|
|
||||||
|
BugLink: https://bugs.launchpad.net/bugs/597075
|
||||||
|
|
||||||
|
commit f1befe71fa7a79ab733011b045639d8d809924ad introduced a
|
||||||
|
regression when detecting aperture size of some i915 adapters, e.g.,
|
||||||
|
those on the Intel Q35 chipset.
|
||||||
|
|
||||||
|
The original report: https://bugzilla.kernel.org/show_bug.cgi?id=15733
|
||||||
|
The regression report: https://bugzilla.kernel.org/show_bug.cgi?id=16294
|
||||||
|
|
||||||
|
According to the specification found at
|
||||||
|
http://intellinuxgraphics.org/VOL_1_graphics_core.pdf, the PCI config
|
||||||
|
space register I830_GMCH_CTRL is a mirror of GMCH Graphics
|
||||||
|
Control. The correct macro for isolating the aperture size bits is
|
||||||
|
therefore I830_GMCH_GMS_MASK along with the attendant changes to the
|
||||||
|
case statement.
|
||||||
|
|
||||||
|
Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
|
||||||
|
Tested-by: Kees Cook <kees.cook@canonical.com>
|
||||||
|
Cc: Chris Wilson <chris@chris-wilson.co.uk>
|
||||||
|
Cc: Eric Anholt <eric@anholt.net>
|
||||||
|
Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
|
||||||
|
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c
|
||||||
|
index 9344216..a754715 100644
|
||||||
|
--- a/drivers/char/agp/intel-gtt.c
|
||||||
|
+++ b/drivers/char/agp/intel-gtt.c
|
||||||
|
@@ -1216,17 +1216,20 @@ static int intel_i915_get_gtt_size(void)
|
||||||
|
|
||||||
|
/* G33's GTT size defined in gmch_ctrl */
|
||||||
|
pci_read_config_word(agp_bridge->dev, I830_GMCH_CTRL, &gmch_ctrl);
|
||||||
|
- switch (gmch_ctrl & G33_PGETBL_SIZE_MASK) {
|
||||||
|
- case G33_PGETBL_SIZE_1M:
|
||||||
|
+ switch (gmch_ctrl & I830_GMCH_GMS_MASK) {
|
||||||
|
+ case I830_GMCH_GMS_STOLEN_512:
|
||||||
|
+ size = 512;
|
||||||
|
+ break;
|
||||||
|
+ case I830_GMCH_GMS_STOLEN_1024:
|
||||||
|
size = 1024;
|
||||||
|
break;
|
||||||
|
- case G33_PGETBL_SIZE_2M:
|
||||||
|
- size = 2048;
|
||||||
|
+ case I830_GMCH_GMS_STOLEN_8192:
|
||||||
|
+ size = 8*1024;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
dev_info(&agp_bridge->dev->dev,
|
||||||
|
"unknown page table size 0x%x, assuming 512KB\n",
|
||||||
|
- (gmch_ctrl & G33_PGETBL_SIZE_MASK));
|
||||||
|
+ (gmch_ctrl & I830_GMCH_GMS_MASK));
|
||||||
|
size = 512;
|
||||||
|
}
|
||||||
|
} else {
|
|
@ -0,0 +1,28 @@
|
||||||
|
From: Vasiliy Kulikov <segoon@openwall.com>
|
||||||
|
Date: Mon, 14 Feb 2011 10:54:31 +0000 (+0300)
|
||||||
|
Subject: Bluetooth: bnep: fix buffer overflow
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=43629f8f5ea32a998d06d1bb41eefa0e821ff573
|
||||||
|
|
||||||
|
Bluetooth: bnep: fix buffer overflow
|
||||||
|
|
||||||
|
Struct ca is copied from userspace. It is not checked whether the "device"
|
||||||
|
field is NULL terminated. This potentially leads to BUG() inside of
|
||||||
|
alloc_netdev_mqs() and/or information leak by creating a device with a name
|
||||||
|
made of contents of kernel stack.
|
||||||
|
|
||||||
|
Signed-off-by: Vasiliy Kulikov <segoon@openwall.com>
|
||||||
|
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/net/bluetooth/bnep/sock.c b/net/bluetooth/bnep/sock.c
|
||||||
|
index 2862f53..d935da7 100644
|
||||||
|
--- a/net/bluetooth/bnep/sock.c
|
||||||
|
+++ b/net/bluetooth/bnep/sock.c
|
||||||
|
@@ -88,6 +88,7 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
|
||||||
|
sockfd_put(nsock);
|
||||||
|
return -EBADFD;
|
||||||
|
}
|
||||||
|
+ ca.device[sizeof(ca.device)-1] = 0;
|
||||||
|
|
||||||
|
err = bnep_add_connection(&ca, nsock);
|
||||||
|
if (!err) {
|
|
@ -0,0 +1,42 @@
|
||||||
|
bridge: Fix mglist corruption that leads to memory corruption
|
||||||
|
|
||||||
|
The list mp->mglist is used to indicate whether a multicast group
|
||||||
|
is active on the bridge interface itself as opposed to one of the
|
||||||
|
constituent interfaces in the bridge.
|
||||||
|
|
||||||
|
Unfortunately the operation that adds the mp->mglist node to the
|
||||||
|
list neglected to check whether it has already been added. This
|
||||||
|
leads to list corruption in the form of nodes pointing to itself.
|
||||||
|
|
||||||
|
Normally this would be quite obvious as it would cause an infinite
|
||||||
|
loop when walking the list. However, as this list is never actually
|
||||||
|
walked (which means that we don't really need it, I'll get rid of
|
||||||
|
it in a subsequent patch), this instead is hidden until we perform
|
||||||
|
a delete operation on the affected nodes.
|
||||||
|
|
||||||
|
As the same node may now be pointed to by more than one node, the
|
||||||
|
delete operations can then cause modification of freed memory.
|
||||||
|
|
||||||
|
This was observed in practice to cause corruption in 512-byte slabs,
|
||||||
|
most commonly leading to crashes in jbd2.
|
||||||
|
|
||||||
|
Thanks to Josef Bacik for pointing me in the right direction.
|
||||||
|
|
||||||
|
Reported-by: Ian Page Hands <ihands@redhat.com>
|
||||||
|
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||||
|
|
||||||
|
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
|
||||||
|
index f701a21..802d3f8 100644
|
||||||
|
--- a/net/bridge/br_multicast.c
|
||||||
|
+++ b/net/bridge/br_multicast.c
|
||||||
|
@@ -719,7 +719,8 @@ static int br_multicast_add_group(struct net_bridge *br,
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
if (!port) {
|
||||||
|
- hlist_add_head(&mp->mglist, &br->mglist);
|
||||||
|
+ if (hlist_unhashed(&mp->mglist))
|
||||||
|
+ hlist_add_head(&mp->mglist, &br->mglist);
|
||||||
|
mod_timer(&mp->timer, now + br->multicast_membership_interval);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
From: Shi Weihua <shiwh@cn.fujitsu.com>
|
||||||
|
Date: Tue, 18 May 2010 00:51:54 +0000 (+0000)
|
||||||
|
Subject: Btrfs: prohibit a operation of changing acl's mask when noacl mount option used
|
||||||
|
X-Git-Tag: v2.6.35-rc3~3^2~3
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=731e3d1b
|
||||||
|
|
||||||
|
Btrfs: prohibit a operation of changing acl's mask when noacl mount option used
|
||||||
|
|
||||||
|
when used Posix File System Test Suite(pjd-fstest) to test btrfs,
|
||||||
|
some cases about setfacl failed when noacl mount option used.
|
||||||
|
I simplified used commands in pjd-fstest, and the following steps
|
||||||
|
can reproduce it.
|
||||||
|
------------------------
|
||||||
|
# cd btrfs-part/
|
||||||
|
# mkdir aaa
|
||||||
|
# setfacl -m m::rw aaa <- successed, but not expected by pjd-fstest.
|
||||||
|
------------------------
|
||||||
|
I checked ext3, a warning message occured, like as:
|
||||||
|
setfacl: aaa/: Operation not supported
|
||||||
|
Certainly, it's expected by pjd-fstest.
|
||||||
|
|
||||||
|
So, i compared acl.c of btrfs and ext3. Based on that, a patch created.
|
||||||
|
Fortunately, it works.
|
||||||
|
|
||||||
|
Signed-off-by: Shi Weihua <shiwh@cn.fujitsu.com>
|
||||||
|
Signed-off-by: Chris Mason <chris.mason@oracle.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c
|
||||||
|
index 6b4d0cc..a372985 100644
|
||||||
|
--- a/fs/btrfs/acl.c
|
||||||
|
+++ b/fs/btrfs/acl.c
|
||||||
|
@@ -163,6 +163,9 @@ static int btrfs_xattr_acl_set(struct dentry *dentry, const char *name,
|
||||||
|
if (!is_owner_or_cap(dentry->d_inode))
|
||||||
|
return -EPERM;
|
||||||
|
|
||||||
|
+ if (!IS_POSIXACL(dentry->d_inode))
|
||||||
|
+ return -EOPNOTSUPP;
|
||||||
|
+
|
||||||
|
if (value) {
|
||||||
|
acl = posix_acl_from_xattr(value, size);
|
||||||
|
if (acl == NULL) {
|
|
@ -0,0 +1,110 @@
|
||||||
|
CONFIG_ARM=y
|
||||||
|
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||||
|
# CONFIG_SMP is not set
|
||||||
|
|
||||||
|
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||||
|
|
||||||
|
CONFIG_ARCH_VERSATILE=y
|
||||||
|
CONFIG_ARCH_VERSATILE_PB=y
|
||||||
|
CONFIG_MACH_VERSATILE_AB=y
|
||||||
|
|
||||||
|
CONFIG_HIGHMEM=y
|
||||||
|
# CONFIG_HIGHPTE is not set
|
||||||
|
|
||||||
|
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||||
|
# CONFIG_CPU_DCACHE_DISABLE is not set
|
||||||
|
# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
|
||||||
|
# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
|
||||||
|
|
||||||
|
CONFIG_ZBOOT_ROM_TEXT=0
|
||||||
|
CONFIG_ZBOOT_ROM_BSS=0
|
||||||
|
|
||||||
|
# CONFIG_XIP_KERNEL is not set
|
||||||
|
|
||||||
|
CONFIG_ATAGS_PROC=y
|
||||||
|
|
||||||
|
# CONFIG_FPE_NWFPE is not set
|
||||||
|
CONFIG_FPE_FASTFPE=y
|
||||||
|
CONFIG_VFP=y
|
||||||
|
|
||||||
|
CONFIG_PM=y
|
||||||
|
# CONFIG_PM_DEBUG is not set
|
||||||
|
# CONFIG_PM_TRACE is not set
|
||||||
|
CONFIG_SUSPEND=y
|
||||||
|
# CONFIG_PM_TEST_SUSPEND is not set
|
||||||
|
CONFIG_APM_EMULATION=y
|
||||||
|
|
||||||
|
CONFIG_ARM_THUMB=y
|
||||||
|
|
||||||
|
CONFIG_AEABI=y
|
||||||
|
CONFIG_OABI_COMPAT=y
|
||||||
|
|
||||||
|
# CONFIG_UACCESS_WITH_MEMCPY is not set
|
||||||
|
|
||||||
|
CONFIG_CMDLINE="console=ttyAM0,115200 root=/dev/sda1 rootdelay=20"
|
||||||
|
|
||||||
|
CONFIG_NO_HZ=y
|
||||||
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
|
||||||
|
# CONFIG_CPU_IDLE is not set
|
||||||
|
|
||||||
|
CONFIG_LEDS=y
|
||||||
|
CONFIG_LEDS_CPU=y
|
||||||
|
|
||||||
|
CONFIG_MTD_AFS_PARTS=y
|
||||||
|
CONFIG_MTD_ARM_INTEGRATOR=y
|
||||||
|
CONFIG_MTD_IMPA7=y
|
||||||
|
|
||||||
|
CONFIG_AX88796=m
|
||||||
|
CONFIG_AX88796_93CX6=y
|
||||||
|
CONFIG_SMC91X=m
|
||||||
|
CONFIG_DM9000=m
|
||||||
|
CONFIG_DM9000_DEBUGLEVEL=4
|
||||||
|
# CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL is not set
|
||||||
|
CONFIG_SMC911X=m
|
||||||
|
CONFIG_SMSC911X=m
|
||||||
|
|
||||||
|
CONFIG_SERIO_AMBAKMI=m
|
||||||
|
|
||||||
|
CONFIG_SERIAL_AMBA_PL011=y
|
||||||
|
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||||
|
|
||||||
|
CONFIG_I2C_VERSATILE=y
|
||||||
|
|
||||||
|
CONFIG_THERMAL=y
|
||||||
|
|
||||||
|
# CONFIG_MFD_T7L66XB is not set
|
||||||
|
# CONFIG_MFD_TC6387XB is not set
|
||||||
|
|
||||||
|
CONFIG_FB_ARMCLCD=m
|
||||||
|
|
||||||
|
CONFIG_SND_ARM=y
|
||||||
|
CONFIG_SND_ARMAACI=m
|
||||||
|
|
||||||
|
CONFIG_USB_MUSB_HDRC=m
|
||||||
|
# CONFIG_MUSB_PIO_ONLY is not set
|
||||||
|
CONFIG_USB_TUSB6010=y
|
||||||
|
# CONFIG_USB_MUSB_DEBUG is not set
|
||||||
|
|
||||||
|
CONFIG_MMC_ARMMMCI=m
|
||||||
|
|
||||||
|
CONFIG_RTC_DRV_PL030=m
|
||||||
|
CONFIG_RTC_DRV_PL031=m
|
||||||
|
|
||||||
|
# CONFIG_SGI_IOC4 is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_USER is not set
|
||||||
|
# CONFIG_DEBUG_ERRORS is not set
|
||||||
|
# CONFIG_DEBUG_LL is not set
|
||||||
|
|
||||||
|
CONFIG_ARM_UNWIND=y
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=32
|
||||||
|
|
||||||
|
# CONFIG_USB_ULPI is not set
|
||||||
|
# CONFIG_OC_ETM is not set
|
||||||
|
|
||||||
|
# CONFIG_MTD_PISMO is not set
|
||||||
|
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
|
CONFIG_PERF_COUNTERS=y
|
|
@ -0,0 +1,83 @@
|
||||||
|
CONFIG_SND_VERBOSE_PRINTK=y
|
||||||
|
CONFIG_SND_DEBUG=y
|
||||||
|
CONFIG_SND_PCM_XRUN_DEBUG=y
|
||||||
|
|
||||||
|
CONFIG_DEBUG_MUTEXES=y
|
||||||
|
CONFIG_DEBUG_RT_MUTEXES=y
|
||||||
|
CONFIG_DEBUG_LOCK_ALLOC=y
|
||||||
|
CONFIG_PROVE_LOCKING=y
|
||||||
|
CONFIG_DEBUG_VM=y
|
||||||
|
CONFIG_DEBUG_SPINLOCK=y
|
||||||
|
CONFIG_PROVE_RCU=y
|
||||||
|
|
||||||
|
CONFIG_FAULT_INJECTION=y
|
||||||
|
CONFIG_FAILSLAB=y
|
||||||
|
CONFIG_FAIL_PAGE_ALLOC=y
|
||||||
|
CONFIG_FAIL_MAKE_REQUEST=y
|
||||||
|
CONFIG_FAULT_INJECTION_DEBUG_FS=y
|
||||||
|
CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y
|
||||||
|
CONFIG_FAIL_IO_TIMEOUT=y
|
||||||
|
|
||||||
|
CONFIG_SLUB_DEBUG_ON=y
|
||||||
|
|
||||||
|
CONFIG_LOCK_STAT=y
|
||||||
|
|
||||||
|
CONFIG_DEBUG_STACK_USAGE=y
|
||||||
|
|
||||||
|
CONFIG_ACPI_DEBUG=y
|
||||||
|
# CONFIG_ACPI_DEBUG_FUNC_TRACE is not set
|
||||||
|
|
||||||
|
CONFIG_DEBUG_SG=y
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_PAGEALLOC is not set
|
||||||
|
|
||||||
|
CONFIG_DEBUG_WRITECOUNT=y
|
||||||
|
CONFIG_DEBUG_OBJECTS=y
|
||||||
|
# CONFIG_DEBUG_OBJECTS_SELFTEST is not set
|
||||||
|
CONFIG_DEBUG_OBJECTS_FREE=y
|
||||||
|
CONFIG_DEBUG_OBJECTS_TIMERS=y
|
||||||
|
CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
|
||||||
|
|
||||||
|
CONFIG_X86_PTDUMP=y
|
||||||
|
|
||||||
|
CONFIG_CAN_DEBUG_DEVICES=y
|
||||||
|
|
||||||
|
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||||
|
|
||||||
|
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||||
|
|
||||||
|
CONFIG_DEBUG_NOTIFIERS=y
|
||||||
|
|
||||||
|
CONFIG_DMA_API_DEBUG=y
|
||||||
|
|
||||||
|
CONFIG_MMIOTRACE=y
|
||||||
|
|
||||||
|
CONFIG_DEBUG_CREDENTIALS=y
|
||||||
|
|
||||||
|
CONFIG_EXT4_DEBUG=y
|
||||||
|
|
||||||
|
CONFIG_DEBUG_PERF_USE_VMALLOC=y
|
||||||
|
|
||||||
|
# off in both production debug and nodebug builds,
|
||||||
|
# on in rawhide nodebug builds
|
||||||
|
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
|
||||||
|
|
||||||
|
CONFIG_JBD2_DEBUG=y
|
||||||
|
|
||||||
|
CONFIG_DEBUG_CFQ_IOSCHED=y
|
||||||
|
|
||||||
|
CONFIG_DRBD_FAULT_INJECTION=y
|
||||||
|
|
||||||
|
CONFIG_ATH_DEBUG=y
|
||||||
|
CONFIG_IWLWIFI_DEVICE_TRACING=y
|
||||||
|
|
||||||
|
CONFIG_DEBUG_OBJECTS_WORK=y
|
||||||
|
# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
|
||||||
|
|
||||||
|
CONFIG_DMADEVICES_DEBUG=y
|
||||||
|
CONFIG_DMADEVICES_VDEBUG=y
|
||||||
|
|
||||||
|
CONFIG_PM_ADVANCED_DEBUG=y
|
||||||
|
|
||||||
|
CONFIG_CEPH_FS_PRETTYDEBUG=y
|
||||||
|
CONFIG_QUOTA_DEBUG=y
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,8 @@
|
||||||
|
# CONFIG_HIGHMEM4G is not set
|
||||||
|
CONFIG_HIGHMEM64G=y
|
||||||
|
|
||||||
|
CONFIG_XEN_DEV_EVTCHN=m
|
||||||
|
CONFIG_XEN_SYS_HYPERVISOR=y
|
||||||
|
|
||||||
|
# I2O only works on non-PAE 32-bit x86
|
||||||
|
# CONFIG_I2O is not set
|
|
@ -0,0 +1,205 @@
|
||||||
|
#
|
||||||
|
# Automatically generated make config: don't edit
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Processor type and features
|
||||||
|
#
|
||||||
|
CONFIG_IA64=y
|
||||||
|
CONFIG_64BIT=y
|
||||||
|
# CONFIG_XEN is not set
|
||||||
|
CONFIG_MMU=y
|
||||||
|
CONFIG_EFI=y
|
||||||
|
# CONFIG_ITANIUM is not set
|
||||||
|
CONFIG_MCKINLEY=y
|
||||||
|
CONFIG_IA64_GENERIC=y
|
||||||
|
# CONFIG_IA64_DIG is not set
|
||||||
|
# CONFIG_IA64_HP_ZX1 is not set
|
||||||
|
# CONFIG_IA64_SGI_SN2 is not set
|
||||||
|
CONFIG_IA64_ESI=y
|
||||||
|
CONFIG_IA64_HP_AML_NFW=y
|
||||||
|
CONFIG_MSPEC=y
|
||||||
|
# CONFIG_IA64_HP_SIM is not set
|
||||||
|
# CONFIG_IA64_PAGE_SIZE_4KB is not set
|
||||||
|
# CONFIG_IA64_PAGE_SIZE_8KB is not set
|
||||||
|
CONFIG_IA64_PAGE_SIZE_16KB=y
|
||||||
|
# CONFIG_IA64_PAGE_SIZE_64KB is not set
|
||||||
|
CONFIG_IA64_L1_CACHE_SHIFT=7
|
||||||
|
CONFIG_NUMA=y
|
||||||
|
# CONFIG_VIRTUAL_MEM_MAP is not set
|
||||||
|
CONFIG_SPARSEMEM_MANUAL=y
|
||||||
|
CONFIG_SPARSEMEM=y
|
||||||
|
CONFIG_MEMORY_HOTPLUG=y
|
||||||
|
CONFIG_MEMORY_HOTREMOVE=y
|
||||||
|
CONFIG_IA64_MCA_RECOVERY=m
|
||||||
|
CONFIG_IA64_CYCLONE=y
|
||||||
|
CONFIG_MMTIMER=y
|
||||||
|
CONFIG_IOSAPIC=y
|
||||||
|
CONFIG_FORCE_MAX_ZONEORDER=18
|
||||||
|
CONFIG_NR_CPUS=1024
|
||||||
|
# CONFIG_IA32_SUPPORT is not set
|
||||||
|
# CONFIG_COMPAT is not set
|
||||||
|
CONFIG_PERFMON=y
|
||||||
|
CONFIG_IA64_PALINFO=y
|
||||||
|
CONFIG_EFI_VARS=y
|
||||||
|
CONFIG_SERIAL_8250_RUNTIME_UARTS=16
|
||||||
|
CONFIG_EFI_PCDP=y
|
||||||
|
#
|
||||||
|
# Block devices
|
||||||
|
#
|
||||||
|
# CONFIG_BLK_DEV_FD is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# IDE chipset support/bugfixes
|
||||||
|
#
|
||||||
|
CONFIG_BLK_DEV_SGIIOC4=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Character devices
|
||||||
|
#
|
||||||
|
CONFIG_TCG_INFINEON=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# Watchdog Cards
|
||||||
|
#
|
||||||
|
# CONFIG_HW_RANDOM is not set
|
||||||
|
# CONFIG_GEN_RTC is not set
|
||||||
|
CONFIG_EFI_RTC=y
|
||||||
|
CONFIG_RTC_DRV_EFI=y
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# AGP
|
||||||
|
#
|
||||||
|
CONFIG_AGP_I460=y
|
||||||
|
CONFIG_AGP_HP_ZX1=y
|
||||||
|
CONFIG_AGP_SGI_TIOCA=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# HP Simulator drivers
|
||||||
|
#
|
||||||
|
# CONFIG_HP_SIMETH is not set
|
||||||
|
# CONFIG_HP_SIMSERIAL is not set
|
||||||
|
# CONFIG_HP_SIMSCSI is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Kernel hacking
|
||||||
|
#
|
||||||
|
# CONFIG_IA64_PRINT_HAZARDS is not set
|
||||||
|
# CONFIG_DISABLE_VHPT is not set
|
||||||
|
# CONFIG_IA64_DEBUG_CMPXCHG is not set
|
||||||
|
# CONFIG_IA64_DEBUG_IRQ is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Memory Technology Devices (MTD)
|
||||||
|
#
|
||||||
|
# CONFIG_MTD is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# SGI
|
||||||
|
#
|
||||||
|
CONFIG_SGI_SNSC=y
|
||||||
|
CONFIG_SGI_TIOCX=y
|
||||||
|
CONFIG_SGI_MBCS=m
|
||||||
|
CONFIG_SGI_IOC3=m
|
||||||
|
CONFIG_SGI_IOC4=y
|
||||||
|
CONFIG_SGI_XP=m
|
||||||
|
CONFIG_SGI_GRU=m
|
||||||
|
# CONFIG_SGI_GRU_DEBUG is not set
|
||||||
|
CONFIG_SERIAL_SGI_L1_CONSOLE=y
|
||||||
|
CONFIG_SERIAL_SGI_IOC3=m
|
||||||
|
CONFIG_SERIAL_SGI_IOC4=m
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# SCSI low-level drivers
|
||||||
|
#
|
||||||
|
# CONFIG_SCSI_BUSLOGIC is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
CONFIG_ACPI=y
|
||||||
|
CONFIG_ACPI_AC=y
|
||||||
|
# CONFIG_ACPI_ASUS is not set
|
||||||
|
CONFIG_ACPI_PROCFS_POWER=y
|
||||||
|
CONFIG_ACPI_SYSFS_POWER=y
|
||||||
|
# CONFIG_ACPI_BATTERY is not set
|
||||||
|
CONFIG_ACPI_BLACKLIST_YEAR=0
|
||||||
|
CONFIG_ACPI_BUTTON=y
|
||||||
|
# CONFIG_ACPI_DOCK is not set
|
||||||
|
CONFIG_ACPI_FAN=y
|
||||||
|
CONFIG_ACPI_HOTPLUG_MEMORY=y
|
||||||
|
CONFIG_ACPI_NUMA=y
|
||||||
|
CONFIG_ACPI_POWER=y
|
||||||
|
CONFIG_ACPI_PROCESSOR=y
|
||||||
|
CONFIG_ACPI_PROCFS=y
|
||||||
|
CONFIG_ACPI_SLEEP=y
|
||||||
|
CONFIG_ACPI_THERMAL=y
|
||||||
|
# CONFIG_ACPI_TOSHIBA is not set
|
||||||
|
CONFIG_ACPI_VIDEO=m
|
||||||
|
# CONFIG_ACPI_PROC_EVENT is not set
|
||||||
|
|
||||||
|
CONFIG_PM=y
|
||||||
|
CONFIG_HOTPLUG_PCI=y
|
||||||
|
# CONFIG_HPET is not set
|
||||||
|
# CONFIG_HOTPLUG_PCI_CPCI is not set
|
||||||
|
CONFIG_HOTPLUG_PCI_SHPC=m
|
||||||
|
CONFIG_HOTPLUG_PCI_SGI=m
|
||||||
|
CONFIG_PNPACPI=y
|
||||||
|
|
||||||
|
CONFIG_SCHED_SMT=y
|
||||||
|
|
||||||
|
CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
|
||||||
|
|
||||||
|
CONFIG_CPU_FREQ=y
|
||||||
|
CONFIG_CPU_FREQ_DEBUG=y
|
||||||
|
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_USERSPACE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_ONDEMAND=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
|
||||||
|
CONFIG_CPU_FREQ_STAT=m
|
||||||
|
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||||
|
|
||||||
|
CONFIG_IA64_ACPI_CPUFREQ=m
|
||||||
|
|
||||||
|
# CONFIG_PERMIT_BSP_REMOVE is not set
|
||||||
|
# CONFIG_FORCE_CPEI_RETARGET is not set
|
||||||
|
|
||||||
|
CONFIG_NODES_SHIFT=10
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_HW_RANDOM_INTEL=m
|
||||||
|
|
||||||
|
CONFIG_CRASH_DUMP=y
|
||||||
|
CONFIG_PROC_VMCORE=y
|
||||||
|
|
||||||
|
# drivers/media/video/usbvision/usbvision-i2c.c:64:39: error: macro "outb" passed 4 arguments, but takes just 2
|
||||||
|
# CONFIG_VIDEO_USBVISION is not set
|
||||||
|
|
||||||
|
# CONFIG_IA64_MC_ERR_INJECT is not set
|
||||||
|
|
||||||
|
CONFIG_DMIID=y
|
||||||
|
|
||||||
|
CONFIG_SENSORS_I5K_AMB=m
|
||||||
|
|
||||||
|
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||||
|
|
||||||
|
CONFIG_FRAME_WARN=2048
|
||||||
|
|
||||||
|
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||||
|
CONFIG_VIRTUALIZATION=y
|
||||||
|
CONFIG_KVM=m
|
||||||
|
CONFIG_KVM_INTEL=m
|
||||||
|
|
||||||
|
CONFIG_HP_ILO=m
|
||||||
|
|
||||||
|
CONFIG_PARAVIRT_GUEST=y
|
||||||
|
CONFIG_PARAVIRT=y
|
||||||
|
|
||||||
|
CONFIG_DMAR_DEFAULT_ON=y
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=64
|
||||||
|
|
||||||
|
CONFIG_ACPI_POWER_METER=m
|
||||||
|
CONFIG_I2C_SCMI=m
|
|
@ -0,0 +1,83 @@
|
||||||
|
CONFIG_SND_VERBOSE_PRINTK=y
|
||||||
|
CONFIG_SND_DEBUG=y
|
||||||
|
CONFIG_SND_PCM_XRUN_DEBUG=y
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_MUTEXES is not set
|
||||||
|
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||||
|
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||||
|
# CONFIG_PROVE_LOCKING is not set
|
||||||
|
# CONFIG_DEBUG_VM is not set
|
||||||
|
# CONFIG_DEBUG_SPINLOCK is not set
|
||||||
|
# CONFIG_PROVE_RCU is not set
|
||||||
|
|
||||||
|
# CONFIG_FAULT_INJECTION is not set
|
||||||
|
# CONFIG_FAILSLAB is not set
|
||||||
|
# CONFIG_FAIL_PAGE_ALLOC is not set
|
||||||
|
# CONFIG_FAIL_MAKE_REQUEST is not set
|
||||||
|
# CONFIG_FAULT_INJECTION_DEBUG_FS is not set
|
||||||
|
# CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set
|
||||||
|
# CONFIG_FAIL_IO_TIMEOUT is not set
|
||||||
|
|
||||||
|
# CONFIG_SLUB_DEBUG_ON is not set
|
||||||
|
|
||||||
|
# CONFIG_LOCK_STAT is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||||
|
|
||||||
|
# CONFIG_ACPI_DEBUG is not set
|
||||||
|
# CONFIG_ACPI_DEBUG_FUNC_TRACE is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_SG is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_PAGEALLOC is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_WRITECOUNT is not set
|
||||||
|
# CONFIG_DEBUG_OBJECTS is not set
|
||||||
|
# CONFIG_DEBUG_OBJECTS_SELFTEST is not set
|
||||||
|
# CONFIG_DEBUG_OBJECTS_FREE is not set
|
||||||
|
# CONFIG_DEBUG_OBJECTS_TIMERS is not set
|
||||||
|
CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
|
||||||
|
|
||||||
|
# CONFIG_X86_PTDUMP is not set
|
||||||
|
|
||||||
|
# CONFIG_CAN_DEBUG_DEVICES is not set
|
||||||
|
|
||||||
|
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||||
|
|
||||||
|
# CONFIG_SYSCTL_SYSCALL_CHECK is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_NOTIFIERS is not set
|
||||||
|
|
||||||
|
# CONFIG_DMA_API_DEBUG is not set
|
||||||
|
|
||||||
|
# CONFIG_MMIOTRACE is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_CREDENTIALS is not set
|
||||||
|
|
||||||
|
# off in both production debug and nodebug builds,
|
||||||
|
# on in rawhide nodebug builds
|
||||||
|
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
|
||||||
|
|
||||||
|
# CONFIG_EXT4_DEBUG is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
|
||||||
|
|
||||||
|
# CONFIG_JBD2_DEBUG is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_CFQ_IOSCHED is not set
|
||||||
|
|
||||||
|
# CONFIG_DRBD_FAULT_INJECTION is not set
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# CONFIG_DMADEVICES_DEBUG is not set
|
||||||
|
# CONFIG_DMADEVICES_VDEBUG is not set
|
||||||
|
|
||||||
|
CONFIG_PM_ADVANCED_DEBUG=y
|
||||||
|
|
||||||
|
# CONFIG_CEPH_FS_PRETTYDEBUG is not set
|
||||||
|
# CONFIG_QUOTA_DEBUG is not set
|
|
@ -0,0 +1,331 @@
|
||||||
|
# Most PowerPC kernels we build are SMP
|
||||||
|
CONFIG_SMP=y
|
||||||
|
CONFIG_IRQ_ALL_CPUS=y
|
||||||
|
CONFIG_PPC=y
|
||||||
|
CONFIG_WATCHDOG_RTAS=m
|
||||||
|
CONFIG_DEBUGGER=y
|
||||||
|
CONFIG_GENERIC_NVRAM=y
|
||||||
|
CONFIG_ALTIVEC=y
|
||||||
|
|
||||||
|
CONFIG_TAU=y
|
||||||
|
# CONFIG_TAU_INT is not set
|
||||||
|
CONFIG_TAU_AVERAGE=y
|
||||||
|
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
|
|
||||||
|
CONFIG_CPU_FREQ=y
|
||||||
|
CONFIG_CPU_FREQ_DEBUG=y
|
||||||
|
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
|
||||||
|
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_USERSPACE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_ONDEMAND=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
|
||||||
|
CONFIG_CPU_FREQ_TABLE=y
|
||||||
|
CONFIG_CPU_FREQ_STAT=m
|
||||||
|
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||||
|
|
||||||
|
CONFIG_PM=y
|
||||||
|
|
||||||
|
CONFIG_PM_STD_PARTITION=""
|
||||||
|
|
||||||
|
CONFIG_SUSPEND=y
|
||||||
|
CONFIG_HIBERNATION=y
|
||||||
|
# CONFIG_RTC is not set
|
||||||
|
# CONFIG_GEN_RTC is not set
|
||||||
|
# CONFIG_GEN_RTC_X is not set
|
||||||
|
CONFIG_RTC_DRV_GENERIC=y
|
||||||
|
CONFIG_PROC_DEVICETREE=y
|
||||||
|
# CONFIG_CMDLINE_BOOL is not set
|
||||||
|
|
||||||
|
CONFIG_ADB=y
|
||||||
|
CONFIG_ADB_PMU=y
|
||||||
|
CONFIG_WINDFARM=y
|
||||||
|
CONFIG_WINDFARM_PM112=y
|
||||||
|
CONFIG_I2C_POWERMAC=y
|
||||||
|
CONFIG_APPLE_AIRPORT=m
|
||||||
|
CONFIG_SERIAL_PMACZILOG=m
|
||||||
|
# CONFIG_SERIAL_PMACZILOG_TTYS is not set
|
||||||
|
CONFIG_AGP_UNINORTH=y
|
||||||
|
CONFIG_FB_OF=y
|
||||||
|
# CONFIG_FB_CONTROL is not set
|
||||||
|
CONFIG_FB_IBM_GXT4500=y
|
||||||
|
CONFIG_FB_RADEON=y
|
||||||
|
CONFIG_FB_MATROX=y
|
||||||
|
CONFIG_FB_NVIDIA=m
|
||||||
|
# CONFIG_FB_VGA16 is not set
|
||||||
|
CONFIG_FB_ATY128_BACKLIGHT=y
|
||||||
|
CONFIG_FB_ATY_BACKLIGHT=y
|
||||||
|
CONFIG_FB_RADEON_BACKLIGHT=y
|
||||||
|
CONFIG_FB_RIVA_BACKLIGHT=y
|
||||||
|
CONFIG_FB_NVIDIA_BACKLIGHT=y
|
||||||
|
|
||||||
|
CONFIG_SND_POWERMAC=m
|
||||||
|
CONFIG_SND_POWERMAC_AUTO_DRC=y
|
||||||
|
CONFIG_SND_AOA=m
|
||||||
|
CONFIG_SND_AOA_SOUNDBUS=m
|
||||||
|
CONFIG_SND_AOA_FABRIC_LAYOUT=m
|
||||||
|
CONFIG_SND_AOA_ONYX=m
|
||||||
|
CONFIG_SND_AOA_TAS=m
|
||||||
|
CONFIG_SND_AOA_TOONIE=m
|
||||||
|
CONFIG_SND_AOA_SOUNDBUS_I2S=m
|
||||||
|
|
||||||
|
CONFIG_XMON=y
|
||||||
|
# CONFIG_XMON_DEFAULT is not set
|
||||||
|
CONFIG_XMON_DISASSEMBLY=y
|
||||||
|
|
||||||
|
CONFIG_BOOTX_TEXT=y
|
||||||
|
CONFIG_MAC_EMUMOUSEBTN=y
|
||||||
|
CONFIG_CAPI_EICON=y
|
||||||
|
|
||||||
|
CONFIG_NVRAM=y
|
||||||
|
|
||||||
|
# CONFIG_PCMCIA_M8XX is not set
|
||||||
|
# CONFIG_SCSI_AHA1542 is not set
|
||||||
|
# CONFIG_SCSI_IN2000 is not set
|
||||||
|
# CONFIG_SCSI_IPS is not set
|
||||||
|
# CONFIG_NI52 is not set
|
||||||
|
# CONFIG_NI65 is not set
|
||||||
|
# CONFIG_LANCE is not set
|
||||||
|
# CONFIG_3C515 is not set
|
||||||
|
# CONFIG_ELPLUS is not set
|
||||||
|
|
||||||
|
CONFIG_MEMORY_HOTPLUG=y
|
||||||
|
|
||||||
|
# Stuff which wants bus_to_virt() or virt_to_bus()
|
||||||
|
# CONFIG_BLK_CPQ_DA is not set
|
||||||
|
# CONFIG_VIDEO_STRADIS is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN is not set
|
||||||
|
# CONFIG_ATM_HORIZON is not set
|
||||||
|
# CONFIG_ATM_FIRESTREAM is not set
|
||||||
|
# CONFIG_ATM_AMBASSADOR is not set
|
||||||
|
# CONFIG_SCSI_DC390T is not set
|
||||||
|
# CONFIG_SCSI_BUSLOGIC is not set
|
||||||
|
|
||||||
|
|
||||||
|
# CONFIG_PPC_EARLY_DEBUG is not set
|
||||||
|
|
||||||
|
# CONFIG_PMAC_BACKLIGHT_LEGACY is not set
|
||||||
|
CONFIG_LEDS_TRIGGER_TIMER=m
|
||||||
|
CONFIG_LEDS_TRIGGER_HEARTBEAT=m
|
||||||
|
CONFIG_LEDS_TRIGGER_GPIO=m
|
||||||
|
|
||||||
|
# FIXME: Should depend on IA64/x86
|
||||||
|
# CONFIG_SGI_IOC4 is not set
|
||||||
|
|
||||||
|
CONFIG_PPC_EFIKA=y
|
||||||
|
CONFIG_PPC_MEDIA5200=y
|
||||||
|
|
||||||
|
# CONFIG_PPC_LITE5200 is not set
|
||||||
|
CONFIG_PPC_BESTCOMM=y
|
||||||
|
CONFIG_PMAC_RACKMETER=m
|
||||||
|
CONFIG_USB_OHCI_HCD_PPC_SOC=y
|
||||||
|
CONFIG_USB_OHCI_HCD_PCI=y
|
||||||
|
CONFIG_USB_OHCI_HCD_PPC_OF=y
|
||||||
|
CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
|
||||||
|
CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
|
||||||
|
|
||||||
|
CONFIG_SERIAL_UARTLITE=m
|
||||||
|
CONFIG_SERIAL_UARTLITE_CONSOLE=y
|
||||||
|
|
||||||
|
CONFIG_SENSORS_AMS=m
|
||||||
|
CONFIG_SENSORS_AMS_PMU=y
|
||||||
|
CONFIG_SENSORS_AMS_I2C=y
|
||||||
|
|
||||||
|
CONFIG_IDE=y
|
||||||
|
CONFIG_BLK_DEV_IDE=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Please see Documentation/ide.txt for help/info on IDE drives
|
||||||
|
#
|
||||||
|
# CONFIG_BLK_DEV_IDE_SATA is not set
|
||||||
|
# CONFIG_BLK_DEV_IDECS is not set
|
||||||
|
CONFIG_BLK_DEV_IDECD=m
|
||||||
|
# CONFIG_BLK_DEV_IDETAPE is not set
|
||||||
|
CONFIG_IDE_TASK_IOCTL=y
|
||||||
|
#
|
||||||
|
# IDE chipset support/bugfixes
|
||||||
|
#
|
||||||
|
# CONFIG_IDE_GENERIC is not set
|
||||||
|
# CONFIG_BLK_DEV_IDEPNP is not set
|
||||||
|
# CONFIG_BLK_DEV_IDEPCI is not set
|
||||||
|
# CONFIG_BLK_DEV_AEC62XX is not set
|
||||||
|
# CONFIG_BLK_DEV_ALI15X3 is not set
|
||||||
|
# CONFIG_BLK_DEV_AMD74XX is not set
|
||||||
|
# CONFIG_BLK_DEV_CMD64X is not set
|
||||||
|
# CONFIG_BLK_DEV_TRIFLEX is not set
|
||||||
|
# CONFIG_BLK_DEV_CY82C693 is not set
|
||||||
|
# CONFIG_BLK_DEV_CS5520 is not set
|
||||||
|
# CONFIG_BLK_DEV_CS5530 is not set
|
||||||
|
# CONFIG_BLK_DEV_HPT366 is not set
|
||||||
|
# CONFIG_BLK_DEV_JMICRON is not set
|
||||||
|
# CONFIG_BLK_DEV_SC1200 is not set
|
||||||
|
# CONFIG_BLK_DEV_PIIX is not set
|
||||||
|
# CONFIG_BLK_DEV_IT821X is not set
|
||||||
|
# CONFIG_BLK_DEV_NS87415 is not set
|
||||||
|
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
|
||||||
|
# CONFIG_BLK_DEV_PDC202XX_NEW is not set
|
||||||
|
# CONFIG_BLK_DEV_SVWKS is not set
|
||||||
|
# CONFIG_BLK_DEV_SIIMAGE is not set
|
||||||
|
# CONFIG_BLK_DEV_SL82C105 is not set
|
||||||
|
# CONFIG_BLK_DEV_SLC90E66 is not set
|
||||||
|
# CONFIG_BLK_DEV_TRM290 is not set
|
||||||
|
# CONFIG_BLK_DEV_VIA82CXXX is not set
|
||||||
|
CONFIG_BLK_DEV_IDE_PMAC=y
|
||||||
|
CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
|
||||||
|
CONFIG_BLK_DEV_IDEDMA=y
|
||||||
|
# CONFIG_BLK_DEV_HD is not set
|
||||||
|
# CONFIG_USB_STORAGE_ISD200 is not set
|
||||||
|
CONFIG_MTD_PHYSMAP_OF=m
|
||||||
|
CONFIG_IDE_PROC_FS=y
|
||||||
|
CONFIG_MACINTOSH_DRIVERS=y
|
||||||
|
|
||||||
|
CONFIG_PPC_PASEMI_MDIO=m
|
||||||
|
CONFIG_SPU_FS_64K_LS=y
|
||||||
|
CONFIG_PPC_PASEMI_CPUFREQ=y
|
||||||
|
CONFIG_PMAC_APM_EMU=m
|
||||||
|
CONFIG_HW_RANDOM_PASEMI=m
|
||||||
|
|
||||||
|
CONFIG_EDAC=y
|
||||||
|
# CONFIG_EDAC_DEBUG is not set
|
||||||
|
CONFIG_EDAC_MM_EDAC=m
|
||||||
|
CONFIG_EDAC_PASEMI=m
|
||||||
|
CONFIG_EDAC_AMD8131=m
|
||||||
|
CONFIG_EDAC_AMD8111=m
|
||||||
|
|
||||||
|
CONFIG_AXON_RAM=m
|
||||||
|
CONFIG_OPROFILE_CELL=y
|
||||||
|
|
||||||
|
CONFIG_SUSPEND_FREEZER=y
|
||||||
|
# CONFIG_IDEPCI_PCIBUS_ORDER is not set
|
||||||
|
CONFIG_PATA_PLATFORM=m
|
||||||
|
CONFIG_PATA_OF_PLATFORM=m
|
||||||
|
CONFIG_USB_EHCI_HCD_PPC_OF=y
|
||||||
|
|
||||||
|
# CONFIG_MPC5121_ADS is not set
|
||||||
|
# CONFIG_MPC5121_GENERIC is not set
|
||||||
|
CONFIG_MTD_OF_PARTS=m
|
||||||
|
# CONFIG_MTD_NAND_FSL_ELBC is not set
|
||||||
|
CONFIG_THERMAL=y
|
||||||
|
|
||||||
|
# CONFIG_MEMORY_HOTREMOVE is not set
|
||||||
|
|
||||||
|
CONFIG_DMADEVICES=y
|
||||||
|
# CONFIG_FSL_DMA is not set
|
||||||
|
|
||||||
|
CONFIG_SND_PPC=y
|
||||||
|
|
||||||
|
CONFIG_PPC_82xx=y
|
||||||
|
CONFIG_PPC_83xx=y
|
||||||
|
CONFIG_PPC_86xx=y
|
||||||
|
CONFIG_EXTRA_TARGETS=""
|
||||||
|
# CONFIG_CODE_PATCHING_SELFTEST is not set
|
||||||
|
# CONFIG_FTR_FIXUP_SELFTEST is not set
|
||||||
|
|
||||||
|
# CONFIG_MATH_EMULATION is not set
|
||||||
|
# CONFIG_RAPIDIO is not set
|
||||||
|
# CONFIG_FS_ENET is not set
|
||||||
|
# CONFIG_UCC_GETH is not set
|
||||||
|
# CONFIG_KEYBOARD_MATRIX is not set
|
||||||
|
# CONFIG_SERIAL_CPM is not set
|
||||||
|
# CONFIG_SERIAL_QE is not set
|
||||||
|
# CONFIG_I2C_CPM is not set
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_SERIO_XILINX_XPS_PS2=m
|
||||||
|
|
||||||
|
# CONFIG_PPC_SMLPAR is not set
|
||||||
|
|
||||||
|
CONFIG_MGCOGE=y
|
||||||
|
CONFIG_GEF_SBC610=y
|
||||||
|
CONFIG_GEF_PPC9A=y
|
||||||
|
CONFIG_GEF_SBC310=y
|
||||||
|
|
||||||
|
CONFIG_QUICC_ENGINE=y
|
||||||
|
CONFIG_QE_GPIO=y
|
||||||
|
CONFIG_MPC8xxx_GPIO=y
|
||||||
|
|
||||||
|
CONFIG_IDE_GD=y
|
||||||
|
CONFIG_IDE_GD_ATA=y
|
||||||
|
CONFIG_IDE_GD_ATAPI=y
|
||||||
|
|
||||||
|
CONFIG_MCU_MPC8349EMITX=m
|
||||||
|
|
||||||
|
CONFIG_GPIO_XILINX=y
|
||||||
|
|
||||||
|
CONFIG_PMIC_DA903X=y
|
||||||
|
CONFIG_BACKLIGHT_DA903X=m
|
||||||
|
CONFIG_LEDS_DA903X=m
|
||||||
|
|
||||||
|
CONFIG_MSI_BITMAP_SELFTEST=y
|
||||||
|
|
||||||
|
CONFIG_RELOCATABLE=y
|
||||||
|
|
||||||
|
# CONFIG_HVC_UDBG is not set
|
||||||
|
CONFIG_PRINT_STACK_DEPTH=64
|
||||||
|
|
||||||
|
CONFIG_BATTERY_DA9030=m
|
||||||
|
# CONFIG_TWL4030_CORE is not set
|
||||||
|
|
||||||
|
CONFIG_BLK_DEV_IT8172=m
|
||||||
|
CONFIG_TOUCHSCREEN_DA9034=m
|
||||||
|
|
||||||
|
CONFIG_SIMPLE_GPIO=y
|
||||||
|
|
||||||
|
CONFIG_FSL_PQ_MDIO=m
|
||||||
|
|
||||||
|
CONFIG_PS3_VRAM=m
|
||||||
|
CONFIG_MDIO_GPIO=m
|
||||||
|
CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL=m
|
||||||
|
# CONFIG_DEBUG_GPIO is not set
|
||||||
|
CONFIG_GPIO_PCA953X=m
|
||||||
|
CONFIG_GPIO_PCF857X=m
|
||||||
|
|
||||||
|
# CONFIG_USB_FHCI_HCD is not set
|
||||||
|
# CONFIG_FHCI_DEBUG is not set
|
||||||
|
|
||||||
|
# CONFIG_DRM_RADEON_KMS is not set
|
||||||
|
|
||||||
|
# CONFIG_AMIGAONE is not set
|
||||||
|
|
||||||
|
CONFIG_PPC_OF_BOOT_TRAMPOLINE=y
|
||||||
|
|
||||||
|
CONFIG_DTL=y
|
||||||
|
|
||||||
|
CONFIG_MMC_SDHCI_OF=m
|
||||||
|
|
||||||
|
# CONFIG_CONSISTENT_SIZE_BOOL is not set
|
||||||
|
|
||||||
|
CONFIG_CAN_SJA1000_OF_PLATFORM=m
|
||||||
|
|
||||||
|
CONFIG_PPC_EMULATED_STATS=y
|
||||||
|
|
||||||
|
CONFIG_SWIOTLB=y
|
||||||
|
|
||||||
|
# CONFIG_RDS is not set
|
||||||
|
|
||||||
|
CONFIG_PPC_DISABLE_WERROR=y
|
||||||
|
|
||||||
|
CONFIG_XILINX_EMACLITE=m
|
||||||
|
|
||||||
|
CONFIG_GPIO_WM831X=m
|
||||||
|
# CONFIG_GPIO_LANGWELL is not set
|
||||||
|
# CONFIG_GPIO_UCB1400 is not set
|
||||||
|
CONFIG_EDAC_MPC85XX=m
|
||||||
|
|
||||||
|
CONFIG_NR_IRQS=512
|
||||||
|
CONFIG_SPARSE_IRQ=y
|
||||||
|
|
||||||
|
CONFIG_PPC_MPC5200_LPBFIFO=m
|
||||||
|
CONFIG_CAN_MSCAN=m
|
||||||
|
CONFIG_CAN_MPC5XXX=m
|
||||||
|
CONFIG_PATA_MACIO=m
|
||||||
|
CONFIG_SERIAL_GRLIB_GAISLER_APBUART=m
|
||||||
|
# CONFIG_PMIC_ADP5520 is not set
|
||||||
|
# CONFIG_MFD_88PM8607 is not set
|
||||||
|
# CONFIG_XPS_USB_HCD_XILINX is not set
|
||||||
|
# CONFIG_MMC_SDHCI_OF_ESDHC is not set
|
||||||
|
# CONFIG_MMC_SDHCI_OF_HLWD is not set
|
||||||
|
|
||||||
|
# CONFIG_GPIO_SCH is not set
|
|
@ -0,0 +1,182 @@
|
||||||
|
# CONFIG_SMP is not set
|
||||||
|
CONFIG_PPC32=y
|
||||||
|
# CONFIG_PPC64 is not set
|
||||||
|
# CONFIG_RTAS_PROC is not set
|
||||||
|
# CONFIG_PCMCIA_M8XX is not set
|
||||||
|
# CONFIG_HOTPLUG_PCI is not set
|
||||||
|
CONFIG_CPU_FREQ_PMAC=y
|
||||||
|
CONFIG_PPC_CHRP=y
|
||||||
|
CONFIG_PPC_PMAC=y
|
||||||
|
CONFIG_PPC_MPC52xx=y
|
||||||
|
CONFIG_PPC_PREP=y
|
||||||
|
|
||||||
|
# CONFIG_PPC_MPC5200_SIMPLE is not set
|
||||||
|
CONFIG_SATA_FSL=m
|
||||||
|
# CONFIG_SATA_NV is not set
|
||||||
|
|
||||||
|
# busted in .28git1
|
||||||
|
# ERROR: "cacheable_memzero" [drivers/net/gianfar_driver.ko] undefined!
|
||||||
|
# CONFIG_GIANFAR is not set
|
||||||
|
CONFIG_USB_EHCI_FSL=y
|
||||||
|
|
||||||
|
CONFIG_PMAC_APM_EMU=y
|
||||||
|
CONFIG_PMAC_BACKLIGHT=y
|
||||||
|
|
||||||
|
CONFIG_HIGHMEM=y
|
||||||
|
# CONFIG_HIGHMEM_START_BOOL is not set
|
||||||
|
# CONFIG_LOWMEM_SIZE_BOOL is not set
|
||||||
|
# CONFIG_TASK_SIZE_BOOL is not set
|
||||||
|
# CONFIG_KERNEL_START_BOOL is not set
|
||||||
|
# CONFIG_PPC601_SYNC_FIX is not set
|
||||||
|
CONFIG_ADVANCED_OPTIONS=y
|
||||||
|
CONFIG_SCSI_MESH=m
|
||||||
|
CONFIG_SCSI_MESH_SYNC_RATE=5
|
||||||
|
CONFIG_SCSI_MESH_RESET_DELAY_MS=4000
|
||||||
|
|
||||||
|
CONFIG_SCSI_MAC53C94=m
|
||||||
|
CONFIG_ADB_CUDA=y
|
||||||
|
CONFIG_ADB_MACIO=y
|
||||||
|
CONFIG_INPUT_ADBHID=y
|
||||||
|
CONFIG_ADB_PMU_LED=y
|
||||||
|
CONFIG_ADB_PMU_LED_IDE=y
|
||||||
|
|
||||||
|
CONFIG_PMAC_MEDIABAY=y
|
||||||
|
CONFIG_BMAC=m
|
||||||
|
CONFIG_MACE=m
|
||||||
|
# CONFIG_MACE_AAUI_PORT is not set
|
||||||
|
CONFIG_MV643XX_ETH=m
|
||||||
|
CONFIG_I2C_HYDRA=m
|
||||||
|
CONFIG_I2C_MPC=m
|
||||||
|
CONFIG_THERM_WINDTUNNEL=m
|
||||||
|
CONFIG_THERM_ADT746X=m
|
||||||
|
# CONFIG_ANSLCD is not set
|
||||||
|
|
||||||
|
CONFIG_FB_PLATINUM=y
|
||||||
|
CONFIG_FB_VALKYRIE=y
|
||||||
|
CONFIG_FB_CT65550=y
|
||||||
|
# CONFIG_BDI_SWITCH is not set
|
||||||
|
|
||||||
|
CONFIG_MAC_FLOPPY=m
|
||||||
|
# CONFIG_BLK_DEV_FD is not set
|
||||||
|
|
||||||
|
CONFIG_FB_ATY128=y
|
||||||
|
CONFIG_FB_ATY=y
|
||||||
|
CONFIG_FB_MATROX=y
|
||||||
|
# CONFIG_KEXEC is not set
|
||||||
|
|
||||||
|
# CONFIG_HVC_RTAS is not set
|
||||||
|
|
||||||
|
# CONFIG_UDBG_RTAS_CONSOLE is not set
|
||||||
|
CONFIG_BRIQ_PANEL=m
|
||||||
|
|
||||||
|
# CONFIG_ATA_PIIX is not set
|
||||||
|
# CONFIG_PATA_AMD is not set
|
||||||
|
# CONFIG_PATA_ATIIXP is not set
|
||||||
|
CONFIG_PATA_MPC52xx=m
|
||||||
|
# CONFIG_PATA_MPIIX is not set
|
||||||
|
# CONFIG_PATA_OLDPIIX is not set
|
||||||
|
# CONFIG_PATA_OPTI is not set
|
||||||
|
# CONFIG_PATA_SERVERWORKS is not set
|
||||||
|
|
||||||
|
CONFIG_SERIAL_MPC52xx=y
|
||||||
|
CONFIG_SERIAL_MPC52xx_CONSOLE=y
|
||||||
|
CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=115200
|
||||||
|
# CONFIG_MPC5200_WDT is not set
|
||||||
|
CONFIG_8xxx_WDT=m
|
||||||
|
CONFIG_GEF_WDT=m
|
||||||
|
|
||||||
|
CONFIG_PPC_MPC5200_BUGFIX=y
|
||||||
|
CONFIG_FEC_MPC52xx=m
|
||||||
|
#CHECK: This may later become a tristate.
|
||||||
|
CONFIG_FEC_MPC52xx_MDIO=y
|
||||||
|
CONFIG_PPC_MPC5200_GPIO=y
|
||||||
|
CONFIG_MDIO_GPIO=m
|
||||||
|
|
||||||
|
CONFIG_SERIAL_OF_PLATFORM=y
|
||||||
|
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||||
|
|
||||||
|
# CONFIG_EMBEDDED6xx is not set
|
||||||
|
CONFIG_NO_HZ=y
|
||||||
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
|
||||||
|
# CONFIG_BLK_DEV_PLATFORM is not set
|
||||||
|
# CONFIG_BLK_DEV_4DRIVES is not set
|
||||||
|
# CONFIG_BLK_DEV_ALI14XX is not set
|
||||||
|
# CONFIG_BLK_DEV_DTC2278 is not set
|
||||||
|
# CONFIG_BLK_DEV_HT6560B is not set
|
||||||
|
# CONFIG_BLK_DEV_QD65XX is not set
|
||||||
|
# CONFIG_BLK_DEV_UMC8672 is not set
|
||||||
|
|
||||||
|
# CONFIG_VIRQ_DEBUG is not set
|
||||||
|
|
||||||
|
CONFIG_PPC_BESTCOMM_ATA=m
|
||||||
|
CONFIG_PPC_BESTCOMM_FEC=m
|
||||||
|
CONFIG_PPC_BESTCOMM_GEN_BD=m
|
||||||
|
|
||||||
|
CONFIG_FORCE_MAX_ZONEORDER=11
|
||||||
|
# CONFIG_PAGE_OFFSET_BOOL is not set
|
||||||
|
# CONFIG_FB_FSL_DIU is not set
|
||||||
|
CONFIG_IRQSTACKS=y
|
||||||
|
CONFIG_VIRTUALIZATION=y
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_GPIO is not set
|
||||||
|
# CONFIG_GPIO_PCA953X is not set
|
||||||
|
# CONFIG_GPIO_PCF857X is not set
|
||||||
|
# CONFIG_HTC_EGPIO is not set
|
||||||
|
|
||||||
|
# CONFIG_TIFM_CORE is not set
|
||||||
|
|
||||||
|
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||||
|
# CONFIG_CISS_SCSI_TAPE is not set
|
||||||
|
|
||||||
|
# CONFIG_I2C_NFORCE2 is not set
|
||||||
|
|
||||||
|
# CONFIG_SND_INTEL8X0 is not set
|
||||||
|
# CONFIG_SND_INTEL8X0M is not set
|
||||||
|
|
||||||
|
# CONFIG_MEMSTICK is not set
|
||||||
|
|
||||||
|
# CONFIG_IPMI_HANDLER is not set
|
||||||
|
# CONFIG_TCG_TPM is not set
|
||||||
|
|
||||||
|
# PPC gets sad with debug alloc (bz 448598)
|
||||||
|
# CONFIG_DEBUG_PAGEALLOC is not set
|
||||||
|
|
||||||
|
CONFIG_SND_ISA=y
|
||||||
|
CONFIG_CRYPTO_DEV_TALITOS=m
|
||||||
|
|
||||||
|
CONFIG_FSL_EMB_PERFMON=y
|
||||||
|
CONFIG_MPC8272_ADS=y
|
||||||
|
CONFIG_PQ2FADS=y
|
||||||
|
CONFIG_EP8248E=y
|
||||||
|
CONFIG_MPC831x_RDB=y
|
||||||
|
CONFIG_MPC832x_MDS=y
|
||||||
|
CONFIG_MPC832x_RDB=y
|
||||||
|
CONFIG_MPC834x_MDS=y
|
||||||
|
CONFIG_MPC834x_ITX=y
|
||||||
|
CONFIG_MPC836x_MDS=y
|
||||||
|
CONFIG_MPC836x_RDK=y
|
||||||
|
CONFIG_MPC837x_MDS=y
|
||||||
|
CONFIG_MPC837x_RDB=y
|
||||||
|
CONFIG_SBC834x=y
|
||||||
|
CONFIG_ASP834x=y
|
||||||
|
CONFIG_KMETER1=y
|
||||||
|
CONFIG_MPC8641_HPCN=y
|
||||||
|
CONFIG_SBC8641D=y
|
||||||
|
CONFIG_MPC8610_HPCD=y
|
||||||
|
|
||||||
|
# CONFIG_USB_MUSB_HDRC is not set
|
||||||
|
|
||||||
|
# busted in 2.6.27
|
||||||
|
# drivers/mtd/maps/sbc8240.c: In function 'init_sbc8240_mtd':
|
||||||
|
# drivers/mtd/maps/sbc8240.c:172: warning: passing argument 1 of 'simple_map_init' from incompatible pointer type
|
||||||
|
# drivers/mtd/maps/sbc8240.c:177: error: 'struct mtd_info' has no member named 'module'
|
||||||
|
|
||||||
|
CONFIG_MTD_NAND_FSL_UPM=m
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=32
|
||||||
|
|
||||||
|
CONFIG_PERF_COUNTERS=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
|
CONFIG_EVENT_PROFILE=y
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
CONFIG_SMP=y
|
||||||
|
# CONFIG_HOTPLUG_CPU is not set
|
||||||
|
CONFIG_NR_CPUS=4
|
||||||
|
# CONFIG_BATTERY_PMU is not set
|
|
@ -0,0 +1,184 @@
|
||||||
|
CONFIG_WINDFARM_PM81=y
|
||||||
|
CONFIG_WINDFARM_PM91=y
|
||||||
|
CONFIG_WINDFARM_PM121=y
|
||||||
|
CONFIG_PPC_PMAC64=y
|
||||||
|
CONFIG_PPC_MAPLE=y
|
||||||
|
CONFIG_PPC_CELL=y
|
||||||
|
CONFIG_PPC_IBM_CELL_BLADE=y
|
||||||
|
CONFIG_PPC_ISERIES=y
|
||||||
|
CONFIG_PPC_PSERIES=y
|
||||||
|
CONFIG_PPC_PMAC=y
|
||||||
|
CONFIG_PPC_PASEMI=y
|
||||||
|
# CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE is not set
|
||||||
|
CONFIG_PPC_PS3=y
|
||||||
|
CONFIG_PPC_CELLEB=y
|
||||||
|
CONFIG_PPC_CELL_QPACE=y
|
||||||
|
CONFIG_PS3_HTAB_SIZE=20
|
||||||
|
# CONFIG_PS3_DYNAMIC_DMA is not set
|
||||||
|
CONFIG_PS3_ADVANCED=y
|
||||||
|
CONFIG_PS3_HTAB_SIZE=20
|
||||||
|
# CONFIG_PS3_DYNAMIC_DMA is not set
|
||||||
|
CONFIG_PS3_VUART=y
|
||||||
|
CONFIG_PS3_PS3AV=y
|
||||||
|
CONFIG_PS3_STORAGE=m
|
||||||
|
CONFIG_PS3_DISK=m
|
||||||
|
CONFIG_PS3_ROM=m
|
||||||
|
CONFIG_PS3_FLASH=m
|
||||||
|
CONFIG_PS3_LPM=y
|
||||||
|
CONFIG_SND_PS3=m
|
||||||
|
CONFIG_SND_PS3_DEFAULT_START_DELAY=1000
|
||||||
|
CONFIG_GELIC_NET=m
|
||||||
|
CONFIG_GELIC_WIRELESS=y
|
||||||
|
CONFIG_GELIC_WIRELESS_OLD_PSK_INTERFACE=y
|
||||||
|
CONFIG_CBE_THERM=m
|
||||||
|
CONFIG_CBE_CPUFREQ=m
|
||||||
|
CONFIG_CBE_CPUFREQ_PMI=m
|
||||||
|
CONFIG_CBE_CPUFREQ_PMI_ENABLE=y
|
||||||
|
CONFIG_PMAC_RACKMETER=m
|
||||||
|
CONFIG_IBMEBUS=y
|
||||||
|
CONFIG_SPU_FS=m
|
||||||
|
CONFIG_RTAS_FLASH=y
|
||||||
|
CONFIG_PPC_SPLPAR=y
|
||||||
|
CONFIG_SCANLOG=y
|
||||||
|
CONFIG_LPARCFG=y
|
||||||
|
CONFIG_SERIAL_ICOM=m
|
||||||
|
CONFIG_HVCS=m
|
||||||
|
CONFIG_HVC_CONSOLE=y
|
||||||
|
CONFIG_HOTPLUG_PCI=y
|
||||||
|
CONFIG_THERM_PM72=y
|
||||||
|
CONFIG_IBMVETH=m
|
||||||
|
CONFIG_SCSI_IBMVSCSI=m
|
||||||
|
# CONFIG_HOTPLUG_PCI_CPCI is not set
|
||||||
|
CONFIG_HOTPLUG_PCI_SHPC=m
|
||||||
|
CONFIG_HOTPLUG_PCI_RPA=m
|
||||||
|
CONFIG_HOTPLUG_PCI_RPA_DLPAR=y
|
||||||
|
CONFIG_ADB_PMU_LED=y
|
||||||
|
CONFIG_ADB_PMU_LED_IDE=y
|
||||||
|
CONFIG_PMAC_SMU=y
|
||||||
|
CONFIG_CPU_FREQ_PMAC64=y
|
||||||
|
CONFIG_SCSI_IPR=m
|
||||||
|
CONFIG_SCSI_IPR_TRACE=y
|
||||||
|
CONFIG_SCSI_IPR_DUMP=y
|
||||||
|
CONFIG_SPIDER_NET=m
|
||||||
|
CONFIG_HVC_RTAS=y
|
||||||
|
CONFIG_HVC_ISERIES=y
|
||||||
|
CONFIG_CBE_RAS=y
|
||||||
|
|
||||||
|
# iSeries device drivers
|
||||||
|
#
|
||||||
|
CONFIG_ISERIES_VETH=m
|
||||||
|
CONFIG_VIODASD=m
|
||||||
|
CONFIG_VIOCD=m
|
||||||
|
CONFIG_VIOTAPE=m
|
||||||
|
|
||||||
|
CONFIG_PASEMI_MAC=m
|
||||||
|
CONFIG_SERIAL_OF_PLATFORM=m
|
||||||
|
|
||||||
|
CONFIG_PPC_PASEMI_IOMMU=y
|
||||||
|
CONFIG_SERIAL_TXX9=y
|
||||||
|
CONFIG_SERIAL_TXX9_NR_UARTS=6
|
||||||
|
CONFIG_SERIAL_TXX9_CONSOLE=y
|
||||||
|
|
||||||
|
CONFIG_HVC_BEAT=y
|
||||||
|
|
||||||
|
CONFIG_FB_PS3=y
|
||||||
|
CONFIG_FB_PS3_DEFAULT_SIZE_M=18
|
||||||
|
|
||||||
|
CONFIG_PPC_PMI=m
|
||||||
|
CONFIG_PS3_SYS_MANAGER=y
|
||||||
|
# CONFIG_BLK_DEV_CELLEB is not set
|
||||||
|
|
||||||
|
CONFIG_PATA_SCC=m
|
||||||
|
|
||||||
|
CONFIG_APM_EMULATION=m
|
||||||
|
|
||||||
|
CONFIG_PPC64=y
|
||||||
|
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||||
|
CONFIG_NR_CPUS=128
|
||||||
|
# CONFIG_FB_PLATINUM is not set
|
||||||
|
# CONFIG_FB_VALKYRIE is not set
|
||||||
|
# CONFIG_FB_CT65550 is not set
|
||||||
|
# CONFIG_FB_VGA16 is not set
|
||||||
|
# CONFIG_FB_ATY128 is not set
|
||||||
|
# CONFIG_FB_ATY is not set
|
||||||
|
|
||||||
|
# CONFIG_POWER4_ONLY is not set
|
||||||
|
|
||||||
|
CONFIG_RTAS_PROC=y
|
||||||
|
CONFIG_IOMMU_VMERGE=y
|
||||||
|
CONFIG_NUMA=y
|
||||||
|
# CONFIG_PPC_64K_PAGES is not set
|
||||||
|
CONFIG_SCHED_SMT=y
|
||||||
|
|
||||||
|
# CONFIG_MV643XX_ETH is not set
|
||||||
|
CONFIG_IRQSTACKS=y
|
||||||
|
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||||
|
# CONFIG_INPUT_PCSPKR is not set
|
||||||
|
|
||||||
|
CONFIG_EHEA=m
|
||||||
|
CONFIG_INFINIBAND_EHCA=m
|
||||||
|
|
||||||
|
CONFIG_HCALL_STATS=y
|
||||||
|
|
||||||
|
CONFIG_XMON_DISASSEMBLY=y
|
||||||
|
|
||||||
|
CONFIG_SCSI_IBMVSCSIS=m
|
||||||
|
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
|
|
||||||
|
CONFIG_TUNE_CELL=y
|
||||||
|
CONFIG_NO_HZ=y
|
||||||
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
# CONFIG_BLK_DEV_PLATFORM is not set
|
||||||
|
CONFIG_IBM_NEW_EMAC=m
|
||||||
|
CONFIG_IBM_NEW_EMAC_RXB=128
|
||||||
|
CONFIG_IBM_NEW_EMAC_TXB=64
|
||||||
|
CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
|
||||||
|
CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
|
||||||
|
CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
|
||||||
|
# CONFIG_IBM_NEW_EMAC_DEBUG is not set
|
||||||
|
|
||||||
|
# CONFIG_VIRQ_DEBUG is not set
|
||||||
|
CONFIG_ELECTRA_CF=m
|
||||||
|
|
||||||
|
CONFIG_MTD_NAND_PASEMI=m
|
||||||
|
CONFIG_EDAC_CELL=m
|
||||||
|
CONFIG_EDAC_CPC925=m
|
||||||
|
CONFIG_FRAME_WARN=2048
|
||||||
|
|
||||||
|
CONFIG_PHYP_DUMP=y
|
||||||
|
CONFIG_FORCE_MAX_ZONEORDER=13
|
||||||
|
CONFIG_VIRTUALIZATION=y
|
||||||
|
|
||||||
|
CONFIG_VSX=y
|
||||||
|
|
||||||
|
CONFIG_SCSI_IBMVFC=m
|
||||||
|
# CONFIG_SCSI_IBMVFC_TRACE is not set
|
||||||
|
CONFIG_IBM_BSR=m
|
||||||
|
|
||||||
|
CONFIG_SERIO_XILINX_XPS_PS2=m
|
||||||
|
|
||||||
|
CONFIG_PPC_IBM_CELL_RESETBUTTON=y
|
||||||
|
CONFIG_PPC_IBM_CELL_POWERBUTTON=m
|
||||||
|
CONFIG_CBE_CPUFREQ_SPU_GOVERNOR=m
|
||||||
|
|
||||||
|
CONFIG_RTC_DRV_PS3=y
|
||||||
|
|
||||||
|
CONFIG_CRASH_DUMP=y
|
||||||
|
CONFIG_RELOCATABLE=y
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=64
|
||||||
|
|
||||||
|
CONFIG_PERF_COUNTERS=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
|
CONFIG_EVENT_PROFILE=y
|
||||||
|
|
||||||
|
CONFIG_KVM_BOOK3S_64=m
|
||||||
|
# CONFIG_KVM_EXIT_TIMING is not set
|
||||||
|
|
||||||
|
#-- bz#607175
|
||||||
|
#-- active memory sharing
|
||||||
|
CONFIG_PPC_SMLPAR=y
|
||||||
|
CONFIG_CMM=y
|
||||||
|
#-- DLPAR memory remove
|
||||||
|
# CONFIG_SPARSEMEM_VMEMMAP is not set
|
|
@ -0,0 +1,205 @@
|
||||||
|
# CONFIG_ISA is not set
|
||||||
|
# CONFIG_ISAPNP is not set
|
||||||
|
# CONFIG_I2C_PCA_ISA is not set
|
||||||
|
|
||||||
|
# CONFIG_SCSI_BUSLOGIC is not set
|
||||||
|
# CONFIG_SCSI_INIA100 is not set
|
||||||
|
# CONFIG_SCSI_ADVANSYS is not set
|
||||||
|
# CONFIG_SCSI_AHA1542 is not set
|
||||||
|
# CONFIG_SCSI_FUTURE_DOMAIN is not set
|
||||||
|
# CONFIG_SCSI_IN2000 is not set
|
||||||
|
# CONFIG_SCSI_QLOGIC_FAS is not set
|
||||||
|
# CONFIG_SCSI_DC390T is not set
|
||||||
|
|
||||||
|
# CONFIG_ATALK is not set
|
||||||
|
# CONFIG_DEV_APPLETALK is not set
|
||||||
|
# CONFIG_LTPC is not set
|
||||||
|
# CONFIG_COPS is not set
|
||||||
|
# CONFIG_IPX is not set
|
||||||
|
# CONFIG_IPDDP is not set
|
||||||
|
# CONFIG_DECNET is not set
|
||||||
|
# CONFIG_PLIP is not set
|
||||||
|
|
||||||
|
# CONFIG_PCMCIA_AHA152X is not set
|
||||||
|
# CONFIG_PCMCIA_NINJA_SCSI is not set
|
||||||
|
# CONFIG_PCMCIA_QLOGIC is not set
|
||||||
|
# CONFIG_PCMCIA_SYM53C500 is not set
|
||||||
|
|
||||||
|
# CONFIG_EL2 is not set
|
||||||
|
# CONFIG_ELPLUS is not set
|
||||||
|
# CONFIG_WD80x3 is not set
|
||||||
|
# CONFIG_I82092 is not set
|
||||||
|
# CONFIG_YELLOWFIN is not set
|
||||||
|
# CONFIG_SUNDANCE is not set
|
||||||
|
# CONFIG_ULTRA is not set
|
||||||
|
# CONFIG_SKFP is not set
|
||||||
|
# CONFIG_DE600 is not set
|
||||||
|
# CONFIG_DE620 is not set
|
||||||
|
# CONFIG_CS89x0 is not set
|
||||||
|
# CONFIG_AC3200 is not set
|
||||||
|
# CONFIG_NI52 is not set
|
||||||
|
# CONFIG_NI65 is not set
|
||||||
|
# CONFIG_LANCE is not set
|
||||||
|
# CONFIG_EL16 is not set
|
||||||
|
# CONFIG_EL3 is not set
|
||||||
|
# CONFIG_3C515 is not set
|
||||||
|
# CONFIG_HAMACHI is not set
|
||||||
|
# CONFIG_HP100 is not set
|
||||||
|
# CONFIG_EQUALIZER is not set
|
||||||
|
# CONFIG_NET_SB1000 is not set
|
||||||
|
# CONFIG_DEPCA is not set
|
||||||
|
# CONFIG_ATP is not set
|
||||||
|
|
||||||
|
# CONFIG_TR is not set
|
||||||
|
|
||||||
|
# CONFIG_GAMEPORT is not set
|
||||||
|
|
||||||
|
# CONFIG_SND_AD1816A is not set
|
||||||
|
# CONFIG_SND_AD1848 is not set
|
||||||
|
# CONFIG_SND_CS4231 is not set
|
||||||
|
# CONFIG_SND_CS4236 is not set
|
||||||
|
# CONFIG_SND_ES968 is not set
|
||||||
|
# CONFIG_SND_ES1688 is not set
|
||||||
|
# CONFIG_SND_ES18XX is not set
|
||||||
|
# CONFIG_SND_GUSCLASSIC is not set
|
||||||
|
# CONFIG_SND_GUSEXTREME is not set
|
||||||
|
# CONFIG_SND_GUSMAX is not set
|
||||||
|
# CONFIG_SND_INTERWAVE is not set
|
||||||
|
# CONFIG_SND_INTERWAVE_STB is not set
|
||||||
|
# CONFIG_SND_OPTI92X_AD1848 is not set
|
||||||
|
# CONFIG_SND_OPTI92X_CS4231 is not set
|
||||||
|
# CONFIG_SND_OPTI93X is not set
|
||||||
|
# CONFIG_SND_MIRO is not set
|
||||||
|
# CONFIG_SND_SB8 is not set
|
||||||
|
# CONFIG_SND_SB16 is not set
|
||||||
|
# CONFIG_SND_SBAWE is not set
|
||||||
|
# CONFIG_SND_SB16_CSP is not set
|
||||||
|
# CONFIG_SND_WAVEFRONT is not set
|
||||||
|
# CONFIG_SND_ALS100 is not set
|
||||||
|
# CONFIG_SND_AZT2320 is not set
|
||||||
|
# CONFIG_SND_CMI8330 is not set
|
||||||
|
# CONFIG_SND_DT019X is not set
|
||||||
|
# CONFIG_SND_OPL3SA2 is not set
|
||||||
|
# CONFIG_SND_SGALAXY is not set
|
||||||
|
# CONFIG_SND_SSCAPE is not set
|
||||||
|
|
||||||
|
# CONFIG_WAN_ROUTER is not set
|
||||||
|
|
||||||
|
# CONFIG_BINFMT_AOUT is not set
|
||||||
|
|
||||||
|
# CONFIG_DRM_TDFX is not set
|
||||||
|
# CONFIG_DRM_SIS is not set
|
||||||
|
|
||||||
|
# CONFIG_BLK_DEV_UMEM is not set
|
||||||
|
# CONFIG_BLK_DEV_NBD is not set
|
||||||
|
# CONFIG_BLK_DEV_DAC960 is not set
|
||||||
|
|
||||||
|
# CONFIG_PARIDE is not set
|
||||||
|
|
||||||
|
# CONFIG_I2O is not set
|
||||||
|
|
||||||
|
# CONFIG_MWAVE is not set
|
||||||
|
|
||||||
|
# CONFIG_ROCKETPORT is not set
|
||||||
|
# CONFIG_R3964 is not set
|
||||||
|
|
||||||
|
# CONFIG_JOYSTICK_ANALOG is not set
|
||||||
|
# CONFIG_JOYSTICK_A3D is not set
|
||||||
|
# CONFIG_JOYSTICK_ADI is not set
|
||||||
|
# CONFIG_JOYSTICK_COBRA is not set
|
||||||
|
# CONFIG_JOYSTICK_GF2K is not set
|
||||||
|
# CONFIG_JOYSTICK_GRIP is not set
|
||||||
|
# CONFIG_JOYSTICK_GRIP_MP is not set
|
||||||
|
# CONFIG_JOYSTICK_GUILLEMOT is not set
|
||||||
|
# CONFIG_JOYSTICK_INTERACT is not set
|
||||||
|
# CONFIG_JOYSTICK_SIDEWINDER is not set
|
||||||
|
# CONFIG_JOYSTICK_TMDC is not set
|
||||||
|
# CONFIG_JOYSTICK_IFORCE is not set
|
||||||
|
# CONFIG_JOYSTICK_WARRIOR is not set
|
||||||
|
# CONFIG_JOYSTICK_MAGELLAN is not set
|
||||||
|
# CONFIG_JOYSTICK_SPACEORB is not set
|
||||||
|
# CONFIG_JOYSTICK_SPACEBALL is not set
|
||||||
|
# CONFIG_JOYSTICK_STINGER is not set
|
||||||
|
# CONFIG_JOYSTICK_DB9 is not set
|
||||||
|
# CONFIG_JOYSTICK_GAMECON is not set
|
||||||
|
# CONFIG_JOYSTICK_TURBOGRAFX is not set
|
||||||
|
|
||||||
|
# CONFIG_RADIO_CADET is not set
|
||||||
|
# CONFIG_RADIO_RTRACK is not set
|
||||||
|
# CONFIG_RADIO_RTRACK2 is not set
|
||||||
|
# CONFIG_RADIO_AZTECH is not set
|
||||||
|
# CONFIG_RADIO_GEMTEK is not set
|
||||||
|
# CONFIG_RADIO_GEMTEK_PCI is not set
|
||||||
|
# CONFIG_RADIO_MAXIRADIO is not set
|
||||||
|
# CONFIG_RADIO_MAESTRO is not set
|
||||||
|
# CONFIG_RADIO_MIROPCM20 is not set
|
||||||
|
# CONFIG_RADIO_SF16FMI is not set
|
||||||
|
# CONFIG_RADIO_SF16FMR2 is not set
|
||||||
|
# CONFIG_RADIO_TERRATEC is not set
|
||||||
|
# CONFIG_RADIO_TRUST is not set
|
||||||
|
# CONFIG_RADIO_TYPHOON is not set
|
||||||
|
# CONFIG_RADIO_ZOLTRIX is not set
|
||||||
|
|
||||||
|
|
||||||
|
# CONFIG_VIDEO_PMS is not set
|
||||||
|
# CONFIG_VIDEO_BWQCAM is not set
|
||||||
|
# CONFIG_VIDEO_CQCAM is not set
|
||||||
|
# CONFIG_VIDEO_W9966 is not set
|
||||||
|
# CONFIG_VIDEO_CPIA is not set
|
||||||
|
# CONFIG_VIDEO_CPIA_PP is not set
|
||||||
|
# CONFIG_VIDEO_CPIA_USB is not set
|
||||||
|
# CONFIG_VIDEO_SAA5249 is not set
|
||||||
|
# CONFIG_VIDEO_STRADIS is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN_BUZ is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN_DC10 is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN_DC30 is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN_LML33 is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN_LML33R10 is not set
|
||||||
|
# CONFIG_VIDEO_MEYE is not set
|
||||||
|
# CONFIG_VIDEO_SAA7134 is not set
|
||||||
|
# CONFIG_VIDEO_MXB is not set
|
||||||
|
# CONFIG_VIDEO_HEXIUM_ORION is not set
|
||||||
|
# CONFIG_VIDEO_HEXIUM_GEMINI is not set
|
||||||
|
# CONFIG_VIDEO_CX88 is not set
|
||||||
|
# CONFIG_VIDEO_SAA5246A is not set
|
||||||
|
|
||||||
|
# CONFIG_INFTL is not set
|
||||||
|
# CONFIG_MTD_DOC2000 is not set
|
||||||
|
# CONFIG_MTD_DOC2001PLUS is not set
|
||||||
|
# CONFIG_MTD_PMC551 is not set
|
||||||
|
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
|
||||||
|
# CONFIG_MTD_PCI is not set
|
||||||
|
|
||||||
|
# CONFIG_FB_MATROX is not set
|
||||||
|
# CONFIG_FB_3DFX is not set
|
||||||
|
# CONFIG_FB_HGA is not set
|
||||||
|
# CONFIG_FB_ATY is not set
|
||||||
|
# CONFIG_FB_TRIDENT is not set
|
||||||
|
# CONFIG_FB_VOODOO1 is not set
|
||||||
|
# CONFIG_FB_ATY128 is not set
|
||||||
|
# CONFIG_FB_RADEON is not set
|
||||||
|
# CONFIG_FB_NEOMAGIC is not set
|
||||||
|
# CONFIG_FB_ASILIANT is not set
|
||||||
|
# CONFIG_FB_HGA_ACCEL is not set
|
||||||
|
# CONFIG_FB_3DFX_ACCEL is not set
|
||||||
|
|
||||||
|
# CONFIG_JFS_FS is not set
|
||||||
|
# CONFIG_NCP_FS is not set
|
||||||
|
# CONFIG_CODA_FS is not set
|
||||||
|
# CONFIG_REISERFS_FS is not set
|
||||||
|
# CONFIG_XFS_FS is not set
|
||||||
|
# CONFIG_AFFS_FS is not set
|
||||||
|
# CONFIG_BEFS_FS is not set
|
||||||
|
# CONFIG_EFS_FS is not set
|
||||||
|
# CONFIG_BFS_FS is not set
|
||||||
|
# CONFIG_QNX4FS_FS is not set
|
||||||
|
# CONFIG_SYSV_FS is not set
|
||||||
|
# CONFIG_UFS_FS is not set
|
||||||
|
# CONFIG_ROMFS_FS is not set
|
||||||
|
# CONFIG_MINIX_FS is not set
|
||||||
|
# CONFIG_9P_FS is not set
|
||||||
|
# CONFIG_OCFS2_FS is not set
|
||||||
|
# CONFIG_HFS_FS is not set
|
||||||
|
# CONFIG_HFSPLUS_FS is not set
|
||||||
|
|
|
@ -0,0 +1,227 @@
|
||||||
|
CONFIG_64BIT=y
|
||||||
|
# CONFIG_MARCH_G5 is not set
|
||||||
|
# CONFIG_MARCH_Z900 is not set
|
||||||
|
CONFIG_MARCH_Z9_109=y
|
||||||
|
# CONFIG_MARCH_Z990 is not set
|
||||||
|
|
||||||
|
CONFIG_NR_CPUS=64
|
||||||
|
CONFIG_COMPAT=y
|
||||||
|
|
||||||
|
# See bug 496596
|
||||||
|
CONFIG_HZ_100=y
|
||||||
|
# See bug 496605
|
||||||
|
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||||
|
|
||||||
|
CONFIG_MMU=y
|
||||||
|
|
||||||
|
CONFIG_LOG_BUF_SHIFT=16
|
||||||
|
CONFIG_NO_IDLE_HZ=y
|
||||||
|
|
||||||
|
CONFIG_SMP=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# I/O subsystem configuration
|
||||||
|
#
|
||||||
|
CONFIG_QDIO=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# Misc
|
||||||
|
#
|
||||||
|
CONFIG_IPL=y
|
||||||
|
# CONFIG_IPL_TAPE is not set
|
||||||
|
CONFIG_IPL_VM=y
|
||||||
|
# CONFIG_PROCESS_DEBUG is not set
|
||||||
|
CONFIG_PFAULT=y
|
||||||
|
CONFIG_SHARED_KERNEL=y
|
||||||
|
CONFIG_CMM=m
|
||||||
|
CONFIG_CMM_PROC=y
|
||||||
|
# CONFIG_NETIUCV is not set
|
||||||
|
CONFIG_SMSGIUCV=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# SCSI low-level drivers
|
||||||
|
#
|
||||||
|
CONFIG_ZFCP=m
|
||||||
|
CONFIG_ZFCPDUMP=y
|
||||||
|
CONFIG_CCW=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# S/390 block device drivers
|
||||||
|
#
|
||||||
|
CONFIG_DCSSBLK=m
|
||||||
|
CONFIG_BLK_DEV_XPRAM=m
|
||||||
|
CONFIG_DASD=m
|
||||||
|
CONFIG_DASD_PROFILE=y
|
||||||
|
CONFIG_DASD_ECKD=m
|
||||||
|
CONFIG_DASD_FBA=m
|
||||||
|
CONFIG_DASD_DIAG=m
|
||||||
|
CONFIG_DASD_EER=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# S/390 character device drivers
|
||||||
|
#
|
||||||
|
CONFIG_TN3270=y
|
||||||
|
CONFIG_TN3270_CONSOLE=y
|
||||||
|
CONFIG_TN3215=y
|
||||||
|
CONFIG_TN3215_CONSOLE=y
|
||||||
|
CONFIG_CCW_CONSOLE=y
|
||||||
|
CONFIG_SCLP_TTY=y
|
||||||
|
CONFIG_SCLP_CONSOLE=y
|
||||||
|
CONFIG_SCLP_VT220_TTY=y
|
||||||
|
CONFIG_SCLP_VT220_CONSOLE=y
|
||||||
|
CONFIG_SCLP_CPI=m
|
||||||
|
CONFIG_SCLP_ASYNC=m
|
||||||
|
CONFIG_S390_TAPE=m
|
||||||
|
CONFIG_S390_TAPE_3590=m
|
||||||
|
|
||||||
|
CONFIG_APPLDATA_BASE=y
|
||||||
|
CONFIG_APPLDATA_MEM=m
|
||||||
|
CONFIG_APPLDATA_OS=m
|
||||||
|
CONFIG_APPLDATA_NET_SUM=m
|
||||||
|
CONFIG_TN3270_TTY=y
|
||||||
|
CONFIG_TN3270_FS=m
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# S/390 tape interface support
|
||||||
|
#
|
||||||
|
CONFIG_S390_TAPE_BLOCK=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# S/390 tape hardware support
|
||||||
|
#
|
||||||
|
CONFIG_S390_TAPE_34XX=m
|
||||||
|
|
||||||
|
# CONFIG_PPP is not set
|
||||||
|
# CONFIG_SLIP is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Token Ring devices
|
||||||
|
#
|
||||||
|
CONFIG_TR=y
|
||||||
|
CONFIG_NETCONSOLE=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# Wan interfaces
|
||||||
|
#
|
||||||
|
# CONFIG_WAN is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# S/390 network device drivers
|
||||||
|
#
|
||||||
|
CONFIG_LCS=m
|
||||||
|
CONFIG_CTC=m
|
||||||
|
CONFIG_IUCV=m
|
||||||
|
CONFIG_QETH=m
|
||||||
|
CONFIG_QETH_IPV6=y
|
||||||
|
CONFIG_CCWGROUP=m
|
||||||
|
|
||||||
|
# CONFIG_IRDA is not set
|
||||||
|
# CONFIG_BT is not set
|
||||||
|
# CONFIG_WIRELESS_EXT is not set
|
||||||
|
# CONFIG_MAC80211 is not set
|
||||||
|
# CONFIG_B44 is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Partition Types
|
||||||
|
#
|
||||||
|
CONFIG_PARTITION_ADVANCED=y
|
||||||
|
# CONFIG_OSF_PARTITION is not set
|
||||||
|
CONFIG_IBM_PARTITION=y
|
||||||
|
# CONFIG_MAC_PARTITION is not set
|
||||||
|
CONFIG_MSDOS_PARTITION=y
|
||||||
|
# CONFIG_SGI_PARTITION is not set
|
||||||
|
# CONFIG_SUN_PARTITION is not set
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# S390 crypto hw
|
||||||
|
#
|
||||||
|
CONFIG_CRYPTO_SHA1_S390=m
|
||||||
|
CONFIG_CRYPTO_SHA256_S390=m
|
||||||
|
CONFIG_CRYPTO_DES_S390=m
|
||||||
|
CONFIG_CRYPTO_AES_S390=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# Kernel hacking
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# S390 specific stack options; needs gcc 3.5 so off for now
|
||||||
|
#
|
||||||
|
CONFIG_PACK_STACK=y
|
||||||
|
CONFIG_CHECK_STACK=y
|
||||||
|
# CONFIG_WARN_STACK is not set
|
||||||
|
# CONFIG_SMALL_STACK is not set
|
||||||
|
|
||||||
|
CONFIG_ZVM_WATCHDOG=m
|
||||||
|
CONFIG_VMLOGRDR=m
|
||||||
|
CONFIG_MONREADER=m
|
||||||
|
|
||||||
|
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||||
|
|
||||||
|
# CONFIG_CLAW is not set
|
||||||
|
|
||||||
|
CONFIG_VMCP=m
|
||||||
|
|
||||||
|
# CONFIG_ATMEL is not set
|
||||||
|
|
||||||
|
# CONFIG_CDROM_PKTCDVD is not set
|
||||||
|
# CONFIG_ATA_OVER_ETH is not set
|
||||||
|
# CONFIG_MII is not set
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_STACK_GUARD=256
|
||||||
|
CONFIG_CMM_IUCV=y
|
||||||
|
|
||||||
|
# CONFIG_DETECT_SOFTLOCKUP is not set
|
||||||
|
|
||||||
|
CONFIG_S390_HYPFS_FS=y
|
||||||
|
|
||||||
|
CONFIG_MONWRITER=m
|
||||||
|
CONFIG_ZCRYPT=m
|
||||||
|
CONFIG_ZCRYPT_MONOLITHIC=y
|
||||||
|
|
||||||
|
CONFIG_S390_EXEC_PROTECT=y
|
||||||
|
CONFIG_AFIUCV=m
|
||||||
|
CONFIG_S390_PRNG=m
|
||||||
|
|
||||||
|
CONFIG_S390_VMUR=m
|
||||||
|
|
||||||
|
# CONFIG_THERMAL is not set
|
||||||
|
|
||||||
|
CONFIG_NO_HZ=y
|
||||||
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
CONFIG_CTCM=m
|
||||||
|
CONFIG_QETH_L2=m
|
||||||
|
CONFIG_QETH_L3=m
|
||||||
|
CONFIG_CRYPTO_SHA512_S390=m
|
||||||
|
CONFIG_VIRTUALIZATION=y
|
||||||
|
CONFIG_KVM=m
|
||||||
|
CONFIG_S390_GUEST=y
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_MEMORY_HOTPLUG=y
|
||||||
|
CONFIG_MEMORY_HOTREMOVE=y
|
||||||
|
CONFIG_CHSC_SCH=m
|
||||||
|
|
||||||
|
# drivers/isdn/hardware/mISDN/hfcmulti.c:5255:2: error: #error "not running on big endian machines now"
|
||||||
|
# CONFIG_MISDN_HFCMULTI is not set
|
||||||
|
|
||||||
|
CONFIG_HVC_IUCV=y
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=64
|
||||||
|
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
|
|
||||||
|
CONFIG_PM=y
|
||||||
|
CONFIG_HIBERNATION=y
|
||||||
|
CONFIG_PM_STD_PARTITION="/dev/jokes"
|
||||||
|
|
||||||
|
CONFIG_PERF_COUNTERS=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
|
CONFIG_EVENT_PROFILE=y
|
||||||
|
|
||||||
|
CONFIG_SMSGIUCV_EVENT=m
|
||||||
|
|
||||||
|
# CONFIG_PREEMPT_TRACER is not set
|
|
@ -0,0 +1,201 @@
|
||||||
|
CONFIG_SMP=y
|
||||||
|
CONFIG_SPARC=y
|
||||||
|
CONFIG_SPARC64=y
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
|
CONFIG_HZ_100=y
|
||||||
|
# CONFIG_HZ_1000 is not set
|
||||||
|
CONFIG_HZ=100
|
||||||
|
|
||||||
|
CONFIG_NO_HZ=y
|
||||||
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
CONFIG_CPU_FREQ=y
|
||||||
|
CONFIG_CPU_FREQ_TABLE=m
|
||||||
|
CONFIG_CPU_FREQ_DEBUG=y
|
||||||
|
# CONFIG_CPU_FREQ_STAT is not set
|
||||||
|
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
|
||||||
|
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
|
||||||
|
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
|
||||||
|
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_USERSPACE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_ONDEMAND=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
|
||||||
|
CONFIG_US3_FREQ=m
|
||||||
|
CONFIG_US2E_FREQ=m
|
||||||
|
|
||||||
|
CONFIG_SUN_LDOMS=y
|
||||||
|
CONFIG_SCHED_SMT=y
|
||||||
|
CONFIG_SCHED_MC=y
|
||||||
|
CONFIG_64BIT=y
|
||||||
|
# CONFIG_BBC_I2C is not set
|
||||||
|
CONFIG_HUGETLB_PAGE_SIZE_4MB=y
|
||||||
|
# CONFIG_HUGETLB_PAGE_SIZE_512K is not set
|
||||||
|
# CONFIG_HUGETLB_PAGE_SIZE_64K is not set
|
||||||
|
CONFIG_NR_CPUS=256
|
||||||
|
CONFIG_US3_FREQ=m
|
||||||
|
CONFIG_US2E_FREQ=m
|
||||||
|
CONFIG_SUN_OPENPROMFS=m
|
||||||
|
CONFIG_COMPAT=y
|
||||||
|
CONFIG_UID16=y
|
||||||
|
CONFIG_BINFMT_ELF32=y
|
||||||
|
CONFIG_ENVCTRL=m
|
||||||
|
CONFIG_DISPLAY7SEG=m
|
||||||
|
CONFIG_WATCHDOG_CP1XXX=m
|
||||||
|
CONFIG_WATCHDOG_RIO=m
|
||||||
|
# CONFIG_CMDLINE_BOOL is not set
|
||||||
|
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
||||||
|
# CONFIG_PARPORT is not set
|
||||||
|
# CONFIG_BLK_DEV_FD is not set
|
||||||
|
# CONFIG_LIRC_PARALLEL is not set
|
||||||
|
# CONFIG_I2C_NFORCE2 is not set
|
||||||
|
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||||
|
# CONFIG_I2C_SIMTEC is not set
|
||||||
|
CONFIG_I2C_ALI1535=m
|
||||||
|
# CONFIG_VGASTATE is not set
|
||||||
|
# CONFIG_FB_DDC is not set
|
||||||
|
# CONFIG_FB_BW2 is not set
|
||||||
|
CONFIG_FB_CG3=y
|
||||||
|
CONFIG_FB_CG6=y
|
||||||
|
# CONFIG_FB_RIVA is not set
|
||||||
|
# CONFIG_FB_MATROX is not set
|
||||||
|
# CONFIG_FB_RADEON is not set
|
||||||
|
CONFIG_FB_ATY=y
|
||||||
|
# CONFIG_FB_S3 is not set
|
||||||
|
# CONFIG_FB_SAVAGE is not set
|
||||||
|
# CONFIG_FB_SIS is not set
|
||||||
|
# CONFIG_FB_NEOMAGIC is not set
|
||||||
|
# CONFIG_FB_3DFX is not set
|
||||||
|
# CONFIG_FB_VOODOO1 is not set
|
||||||
|
# CONFIG_FB_TRIDENT is not set
|
||||||
|
CONFIG_FB_SBUS=y
|
||||||
|
CONFIG_FB_FFB=y
|
||||||
|
# CONFIG_FB_TCX is not set
|
||||||
|
# CONFIG_FB_CG14 is not set
|
||||||
|
CONFIG_FB_PM2=y
|
||||||
|
CONFIG_FB_P9100=y
|
||||||
|
# CONFIG_FB_LEO is not set
|
||||||
|
CONFIG_FB_XVR500=y
|
||||||
|
CONFIG_FB_XVR2500=y
|
||||||
|
# CONFIG_VGASTATE is not set
|
||||||
|
# CONFIG_FB_DDC is not set
|
||||||
|
# CONFIG_FB_CIRRUS is not set
|
||||||
|
# CONFIG_FB_ATY128 is not set
|
||||||
|
# CONFIG_FB_KYRO is not set
|
||||||
|
# CONFIG_AGP is not set
|
||||||
|
# CONFIG_DRM_NOUVEAU is not set
|
||||||
|
# CONFIG_MDA_CONSOLE is not set
|
||||||
|
CONFIG_FONTS=y
|
||||||
|
# CONFIG_FONT_8x8 is not set
|
||||||
|
# CONFIG_FONT_8x16 is not set
|
||||||
|
# CONFIG_FONT_7x14 is not set
|
||||||
|
# CONFIG_FONT_10x18 is not set
|
||||||
|
# CONFIG_FONT_6x11 is not set
|
||||||
|
# CONFIG_FONT_SUN12x22 is not set
|
||||||
|
# CONFIG_FONT_PEARL_8x8 is not set
|
||||||
|
# CONFIG_FONT_ACORN_8x8 is not set
|
||||||
|
CONFIG_FONT_SUN8x16=y
|
||||||
|
CONFIG_FONT_SUN12x22=y
|
||||||
|
# CONFIG_LOGO_LINUX_CLUT224 is not set
|
||||||
|
# CONFIG_SERIAL_8250 is not set
|
||||||
|
CONFIG_SERIAL_SUNZILOG=y
|
||||||
|
CONFIG_SERIAL_SUNZILOG_CONSOLE=y
|
||||||
|
CONFIG_SERIAL_SUNSU=y
|
||||||
|
CONFIG_SERIAL_SUNSU_CONSOLE=y
|
||||||
|
CONFIG_SERIAL_SUNSAB=y
|
||||||
|
CONFIG_SERIAL_SUNSAB_CONSOLE=y
|
||||||
|
CONFIG_SERIAL_SUNHV=y
|
||||||
|
CONFIG_SUN_OPENPROMIO=y
|
||||||
|
CONFIG_OBP_FLASH=m
|
||||||
|
# CONFIG_SERIO_SERPORT is not set
|
||||||
|
CONFIG_BLK_DEV_FD=y
|
||||||
|
CONFIG_SUNVDC=m
|
||||||
|
CONFIG_SUNVNET=m
|
||||||
|
# CONFIG_BLK_DEV_AEC62XX is not set
|
||||||
|
# CONFIG_BLK_DEV_HPT366 is not set
|
||||||
|
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
|
||||||
|
# CONFIG_BLK_DEV_PDC202XX_NEW is not set
|
||||||
|
# CONFIG_BLK_DEV_SIIMAGE is not set
|
||||||
|
# CONFIG_BLK_DEV_SLC90E66 is not set
|
||||||
|
# CONFIG_BLK_DEV_VIA82CXXX is not set
|
||||||
|
# CONFIG_SCSI_ADVANSYS is not set
|
||||||
|
# CONFIG_SCSI_BUSLOGIC is not set
|
||||||
|
# CONFIG_SCSI_EATA is not set
|
||||||
|
# CONFIG_SCSI_GDTH is not set
|
||||||
|
# CONFIG_SCSI_AIC7XXX is not set
|
||||||
|
# CONFIG_SCSI_AIC79XX is not set
|
||||||
|
# CONFIG_SCSI_FUTURE_DOMAIN is not set
|
||||||
|
CONFIG_SCSI_QLOGICPTI=m
|
||||||
|
CONFIG_SCSI_SUNESP=m
|
||||||
|
CONFIG_SUNLANCE=m
|
||||||
|
CONFIG_SUNBMAC=m
|
||||||
|
CONFIG_SUNQE=m
|
||||||
|
# CONFIG_DM9102 is not set
|
||||||
|
# CONFIG_HAMACHI is not set
|
||||||
|
# CONFIG_R8169 is not set
|
||||||
|
CONFIG_ATM_FORE200E_USE_TASKLET=y
|
||||||
|
CONFIG_ATM_FORE200E_DEBUG=0
|
||||||
|
CONFIG_ATM_FORE200E_TX_RETRY=16
|
||||||
|
# CONFIG_DRM_TDFX is not set
|
||||||
|
CONFIG_KEYBOARD_ATKBD=y
|
||||||
|
CONFIG_KEYBOARD_SUNKBD=y
|
||||||
|
# CONFIG_INPUT_PCSPKR is not set
|
||||||
|
CONFIG_INPUT_SPARCSPKR=m
|
||||||
|
# CONFIG_SOUND_PRIME is not set
|
||||||
|
# CONFIG_SND_SUN_AMD7930 is not set
|
||||||
|
CONFIG_SND_SUN_CS4231=m
|
||||||
|
# CONFIG_SND_SUN_DBRI is not set
|
||||||
|
CONFIG_PARPORT_SUNBPP=m
|
||||||
|
CONFIG_LOGO_SUN_CLUT224=y
|
||||||
|
CONFIG_MTD_SUN_UFLASH=m
|
||||||
|
CONFIG_MYRI_SBUS=m
|
||||||
|
# CONFIG_SGI_IOC4 is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN is not set
|
||||||
|
# CONFIG_VIDEO_STRADIS is not set
|
||||||
|
# CONFIG_IEEE1394_SBP2 is not set
|
||||||
|
# CONFIG_USB_NET2280 is not set
|
||||||
|
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||||
|
# CONFIG_DEBUG_DCFLUSH is not set
|
||||||
|
# CONFIG_DEBUG_BOOTMEM is not set
|
||||||
|
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||||
|
# CONFIG_PROVE_LOCKING is not set
|
||||||
|
# CONFIG_LOCK_STAT is not set
|
||||||
|
# CONFIG_LOCKDEP is not set
|
||||||
|
# CONFIG_STACK_DEBUG is not set
|
||||||
|
|
||||||
|
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||||
|
|
||||||
|
# CONFIG_THERMAL is not set
|
||||||
|
|
||||||
|
CONFIG_FRAME_WARN=2048
|
||||||
|
|
||||||
|
CONFIG_NUMA=y
|
||||||
|
|
||||||
|
CONFIG_SND_SPARC=y
|
||||||
|
|
||||||
|
CONFIG_HW_RANDOM_N2RNG=m
|
||||||
|
|
||||||
|
# drivers/isdn/hardware/mISDN/hfcmulti.c:5255:2: error: #error "not running on big endian machines now"
|
||||||
|
# CONFIG_MISDN_HFCMULTI is not set
|
||||||
|
|
||||||
|
CONFIG_US3_MC=y
|
||||||
|
CONFIG_SENSORS_ULTRA45=m
|
||||||
|
CONFIG_LEDS_SUNFIRE=m
|
||||||
|
CONFIG_TADPOLE_TS102_UCTRL=m
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=64
|
||||||
|
|
||||||
|
CONFIG_LIRC_ENE0100=m
|
||||||
|
# CONFIG_BATTERY_DS2782 is not set
|
||||||
|
CONFIG_USB_GSPCA_SN9C20X=m
|
||||||
|
CONFIG_USB_GSPCA_SN9C20X_EVDEV=y
|
||||||
|
CONFIG_LSM_MMAP_MIN_ADDR=65536
|
||||||
|
|
||||||
|
CONFIG_PERF_COUNTERS=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
|
CONFIG_EVENT_PROFILE=y
|
||||||
|
|
||||||
|
CONFIG_EARLYFB=y
|
||||||
|
CONFIG_SERIAL_GRLIB_GAISLER_APBUART=m
|
||||||
|
|
||||||
|
CONFIG_GRETH=m
|
||||||
|
CONFIG_FB_XVR1000=y
|
|
@ -0,0 +1,483 @@
|
||||||
|
CONFIG_UID16=y
|
||||||
|
# CONFIG_64BIT is not set
|
||||||
|
# CONFIG_KERNEL_LZMA is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Processor type and features
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Enable summit and co via the generic arch
|
||||||
|
#
|
||||||
|
CONFIG_X86_EXTENDED_PLATFORM=y
|
||||||
|
CONFIG_X86_32_NON_STANDARD=y
|
||||||
|
|
||||||
|
# CONFIG_X86_ELAN is not set
|
||||||
|
# CONFIG_X86_NUMAQ is not set
|
||||||
|
# CONFIG_X86_SUMMIT is not set
|
||||||
|
CONFIG_X86_BIGSMP=y
|
||||||
|
# CONFIG_X86_VISWS is not set
|
||||||
|
# CONFIG_X86_RDC321X is not set
|
||||||
|
# CONFIG_X86_ES7000 is not set
|
||||||
|
# CONFIG_M386 is not set
|
||||||
|
# CONFIG_M486 is not set
|
||||||
|
# CONFIG_M586 is not set
|
||||||
|
# CONFIG_M586TSC is not set
|
||||||
|
# CONFIG_M586MMX is not set
|
||||||
|
CONFIG_M686=y
|
||||||
|
# CONFIG_MPENTIUMII is not set
|
||||||
|
# CONFIG_MPENTIUMIII is not set
|
||||||
|
# CONFIG_MPENTIUMM is not set
|
||||||
|
# CONFIG_MPENTIUM4 is not set
|
||||||
|
# CONFIG_MK6 is not set
|
||||||
|
# CONFIG_MK7 is not set
|
||||||
|
# CONFIG_MK8 is not set
|
||||||
|
# CONFIG_MCRUSOE is not set
|
||||||
|
# CONFIG_MWINCHIPC6 is not set
|
||||||
|
# CONFIG_MWINCHIP3D is not set
|
||||||
|
# CONFIG_MCYRIXIII is not set
|
||||||
|
# CONFIG_MVIAC3_2 is not set
|
||||||
|
CONFIG_SMP=y
|
||||||
|
CONFIG_NR_CPUS=32
|
||||||
|
CONFIG_X86_GENERIC=y
|
||||||
|
# CONFIG_X86_PPRO_FENCE is not set
|
||||||
|
CONFIG_HPET=y
|
||||||
|
CONFIG_HPET_TIMER=y
|
||||||
|
# CONFIG_HPET_MMAP is not set
|
||||||
|
CONFIG_X86_MCE=y
|
||||||
|
CONFIG_TOSHIBA=m
|
||||||
|
CONFIG_I8K=m
|
||||||
|
CONFIG_SONYPI=m
|
||||||
|
CONFIG_SONYPI_COMPAT=y
|
||||||
|
CONFIG_MICROCODE=m
|
||||||
|
CONFIG_X86_MSR=y
|
||||||
|
CONFIG_X86_CPUID=y
|
||||||
|
CONFIG_EDD=m
|
||||||
|
# CONFIG_EDD_OFF is not set
|
||||||
|
# CONFIG_NUMA is not set
|
||||||
|
|
||||||
|
# CONFIG_NOHIGHMEM is not set
|
||||||
|
CONFIG_HIGHMEM4G=y
|
||||||
|
# CONFIG_HIGHMEM64G is not set
|
||||||
|
CONFIG_HIGHMEM=y
|
||||||
|
CONFIG_HIGHPTE=y
|
||||||
|
|
||||||
|
# CONFIG_MATH_EMULATION is not set
|
||||||
|
CONFIG_MTRR=y
|
||||||
|
CONFIG_X86_PAT=y
|
||||||
|
CONFIG_X86_PM_TIMER=y
|
||||||
|
|
||||||
|
CONFIG_EFI=y
|
||||||
|
CONFIG_EFI_VARS=y
|
||||||
|
CONFIG_EFI_PCDP=y
|
||||||
|
CONFIG_FB_EFI=y
|
||||||
|
# CONFIG_FB_N411 is not set
|
||||||
|
|
||||||
|
CONFIG_DMAR=y
|
||||||
|
CONFIG_DMAR_BROKEN_GFX_WA=y
|
||||||
|
CONFIG_DMAR_FLOPPY_WA=y
|
||||||
|
CONFIG_DMAR_DEFAULT_ON=y
|
||||||
|
|
||||||
|
CONFIG_FB_GEODE=y
|
||||||
|
CONFIG_FB_GEODE_LX=y
|
||||||
|
CONFIG_FB_GEODE_GX=y
|
||||||
|
# CONFIG_FB_GEODE_GX1 is not set
|
||||||
|
|
||||||
|
# CONFIG_PCI_GOBIOS is not set
|
||||||
|
# CONFIG_PCI_GODIRECT is not set
|
||||||
|
# CONFIG_PCI_GOMMCONFIG is not set
|
||||||
|
CONFIG_PCI_GOANY=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# x86 specific drivers
|
||||||
|
#
|
||||||
|
CONFIG_PCMCIA_FDOMAIN=m
|
||||||
|
CONFIG_SCSI_FUTURE_DOMAIN=m
|
||||||
|
CONFIG_SCSI_ADVANSYS=m
|
||||||
|
|
||||||
|
CONFIG_CC_STACKPROTECTOR=y
|
||||||
|
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
|
|
||||||
|
CONFIG_CAPI_EICON=y
|
||||||
|
|
||||||
|
# I2O enabled only for 32-bit x86, disabled for PAE kernel
|
||||||
|
CONFIG_I2O=m
|
||||||
|
CONFIG_I2O_BLOCK=m
|
||||||
|
CONFIG_I2O_SCSI=m
|
||||||
|
CONFIG_I2O_PROC=m
|
||||||
|
CONFIG_I2O_CONFIG=y
|
||||||
|
CONFIG_I2O_EXT_ADAPTEC=y
|
||||||
|
CONFIG_I2O_CONFIG_OLD_IOCTL=y
|
||||||
|
CONFIG_I2O_BUS=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# APM (Advanced Power Management) BIOS Support
|
||||||
|
#
|
||||||
|
CONFIG_APM=y
|
||||||
|
# CONFIG_APM_IGNORE_USER_SUSPEND is not set
|
||||||
|
# CONFIG_APM_DO_ENABLE is not set
|
||||||
|
CONFIG_APM_CPU_IDLE=y
|
||||||
|
# CONFIG_APM_DISPLAY_BLANK is not set
|
||||||
|
# CONFIG_APM_ALLOW_INTS is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Kernel debugging
|
||||||
|
#
|
||||||
|
CONFIG_X86_MPPARSE=y
|
||||||
|
|
||||||
|
CONFIG_ACPI=y
|
||||||
|
CONFIG_ACPI_AC=y
|
||||||
|
# CONFIG_ACPI_ASUS is not set
|
||||||
|
CONFIG_ACPI_PROCFS_POWER=y
|
||||||
|
CONFIG_ACPI_SYSFS_POWER=y
|
||||||
|
CONFIG_ACPI_BATTERY=y
|
||||||
|
CONFIG_ACPI_BLACKLIST_YEAR=1999
|
||||||
|
CONFIG_ACPI_BUTTON=y
|
||||||
|
CONFIG_ACPI_CONTAINER=m
|
||||||
|
CONFIG_ACPI_DOCK=y
|
||||||
|
CONFIG_ACPI_FAN=y
|
||||||
|
CONFIG_ACPI_NUMA=y
|
||||||
|
CONFIG_ACPI_PROCESSOR=y
|
||||||
|
CONFIG_ACPI_POWER=y
|
||||||
|
CONFIG_ACPI_PROCFS=y
|
||||||
|
CONFIG_ACPI_SBS=m
|
||||||
|
CONFIG_ACPI_SLEEP=y
|
||||||
|
CONFIG_ACPI_THERMAL=y
|
||||||
|
CONFIG_TOPSTAR_LAPTOP=m
|
||||||
|
CONFIG_ACPI_TOSHIBA=m
|
||||||
|
CONFIG_ACPI_VIDEO=m
|
||||||
|
# Disable in F9.
|
||||||
|
CONFIG_ACPI_PROC_EVENT=y
|
||||||
|
CONFIG_PNPACPI=y
|
||||||
|
CONFIG_ACPI_POWER_METER=m
|
||||||
|
CONFIG_ACPI_PROCESSOR_AGGREGATOR=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# CPUFreq processor drivers
|
||||||
|
#
|
||||||
|
CONFIG_CPU_FREQ=y
|
||||||
|
CONFIG_CPU_FREQ_DEBUG=y
|
||||||
|
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
|
||||||
|
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_USERSPACE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_ONDEMAND=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
|
||||||
|
CONFIG_CPU_FREQ_TABLE=y
|
||||||
|
CONFIG_CPU_FREQ_STAT=m
|
||||||
|
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||||
|
|
||||||
|
CONFIG_X86_ACPI_CPUFREQ=m
|
||||||
|
CONFIG_X86_PCC_CPUFREQ=m
|
||||||
|
# CONFIG_X86_POWERNOW_K6 is not set
|
||||||
|
CONFIG_X86_POWERNOW_K7=y
|
||||||
|
CONFIG_X86_POWERNOW_K8=m
|
||||||
|
# CONFIG_X86_GX_SUSPMOD is not set
|
||||||
|
# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
|
||||||
|
CONFIG_X86_SPEEDSTEP_ICH=y
|
||||||
|
CONFIG_X86_SPEEDSTEP_SMI=y
|
||||||
|
CONFIG_X86_SPEEDSTEP_LIB=y
|
||||||
|
# CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK is not set
|
||||||
|
CONFIG_X86_P4_CLOCKMOD=m
|
||||||
|
CONFIG_X86_LONGRUN=y
|
||||||
|
# CONFIG_X86_LONGHAUL is not set
|
||||||
|
# CONFIG_X86_CPUFREQ_NFORCE2 is not set
|
||||||
|
# e_powersaver is dangerous
|
||||||
|
# CONFIG_X86_E_POWERSAVER is not set
|
||||||
|
|
||||||
|
CONFIG_X86_HT=y
|
||||||
|
CONFIG_X86_TRAMPOLINE=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# various x86 specific drivers
|
||||||
|
#
|
||||||
|
CONFIG_NVRAM=y
|
||||||
|
CONFIG_IBM_ASM=m
|
||||||
|
CONFIG_CRYPTO_AES_586=m
|
||||||
|
CONFIG_CRYPTO_TWOFISH_586=m
|
||||||
|
CONFIG_CRYPTO_DEV_PADLOCK=m
|
||||||
|
CONFIG_CRYPTO_DEV_PADLOCK_AES=m
|
||||||
|
CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
|
||||||
|
|
||||||
|
CONFIG_GENERIC_ISA_DMA=y
|
||||||
|
CONFIG_SCHED_SMT=y
|
||||||
|
CONFIG_SUSPEND=y
|
||||||
|
CONFIG_HIBERNATION=y
|
||||||
|
CONFIG_PM_STD_PARTITION=""
|
||||||
|
|
||||||
|
CONFIG_DEBUG_RODATA=y
|
||||||
|
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||||
|
# CONFIG_4KSTACKS is not set
|
||||||
|
CONFIG_DEBUG_NMI_TIMEOUT=5
|
||||||
|
|
||||||
|
CONFIG_PCI_DIRECT=y
|
||||||
|
CONFIG_PCI_MMCONFIG=y
|
||||||
|
CONFIG_PCI_BIOS=y
|
||||||
|
|
||||||
|
CONFIG_HOTPLUG_PCI=y
|
||||||
|
CONFIG_HOTPLUG_PCI_COMPAQ=m
|
||||||
|
# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set
|
||||||
|
CONFIG_HOTPLUG_PCI_IBM=m
|
||||||
|
# CONFIG_HOTPLUG_PCI_CPCI is not set
|
||||||
|
# SHPC has half-arsed PCI probing, which makes it load on too many systems
|
||||||
|
# CONFIG_HOTPLUG_PCI_SHPC is not set
|
||||||
|
CONFIG_PM=y
|
||||||
|
|
||||||
|
CONFIG_IPW2100=m
|
||||||
|
CONFIG_IPW2100_MONITOR=y
|
||||||
|
CONFIG_IPW2200=m
|
||||||
|
CONFIG_IPW2200_MONITOR=y
|
||||||
|
CONFIG_IPW2200_RADIOTAP=y
|
||||||
|
CONFIG_IPW2200_PROMISCUOUS=y
|
||||||
|
CONFIG_IPW2200_QOS=y
|
||||||
|
|
||||||
|
CONFIG_BLK_DEV_AMD74XX=y
|
||||||
|
|
||||||
|
CONFIG_I2C_ALI1535=m
|
||||||
|
CONFIG_I2C_ALI15X3=m
|
||||||
|
CONFIG_I2C_ALI1563=m
|
||||||
|
CONFIG_I2C_AMD756=m
|
||||||
|
CONFIG_I2C_AMD756_S4882=m
|
||||||
|
CONFIG_I2C_AMD8111=m
|
||||||
|
CONFIG_I2C_I801=m
|
||||||
|
CONFIG_I2C_ISCH=m
|
||||||
|
CONFIG_I2C_NFORCE2=m
|
||||||
|
CONFIG_I2C_NFORCE2_S4985=m
|
||||||
|
CONFIG_I2C_PIIX4=m
|
||||||
|
CONFIG_I2C_SIS5595=m
|
||||||
|
CONFIG_I2C_SIS630=m
|
||||||
|
CONFIG_I2C_SIS96X=m
|
||||||
|
|
||||||
|
CONFIG_I2C_VIA=m
|
||||||
|
CONFIG_I2C_VIAPRO=m
|
||||||
|
|
||||||
|
CONFIG_SCx200_ACB=m
|
||||||
|
|
||||||
|
# CONFIG_X86_REBOOTFIXUPS is not set
|
||||||
|
|
||||||
|
CONFIG_DELL_RBU=m
|
||||||
|
CONFIG_DCDBAS=m
|
||||||
|
|
||||||
|
CONFIG_GPIO_SCH=m
|
||||||
|
CONFIG_PC8736x_GPIO=m
|
||||||
|
# CONFIG_NSC_GPIO is not set
|
||||||
|
CONFIG_CS5535_GPIO=m
|
||||||
|
|
||||||
|
CONFIG_EDAC=y
|
||||||
|
# CONFIG_EDAC_DEBUG is not set
|
||||||
|
CONFIG_EDAC_MM_EDAC=m
|
||||||
|
CONFIG_EDAC_AMD76X=m
|
||||||
|
CONFIG_EDAC_E7XXX=m
|
||||||
|
CONFIG_EDAC_E752X=m
|
||||||
|
CONFIG_EDAC_I82860=m
|
||||||
|
CONFIG_EDAC_I82875P=m
|
||||||
|
CONFIG_EDAC_I82975X=m
|
||||||
|
CONFIG_EDAC_I3000=m
|
||||||
|
CONFIG_EDAC_I5000=m
|
||||||
|
CONFIG_EDAC_I5100=m
|
||||||
|
CONFIG_EDAC_I5400=m
|
||||||
|
CONFIG_EDAC_R82600=m
|
||||||
|
CONFIG_EDAC_AMD8131=m
|
||||||
|
CONFIG_EDAC_AMD8111=m
|
||||||
|
|
||||||
|
CONFIG_SCHED_MC=y
|
||||||
|
|
||||||
|
CONFIG_SND_ISA=y
|
||||||
|
CONFIG_SND_ES18XX=m
|
||||||
|
|
||||||
|
CONFIG_TCG_INFINEON=m
|
||||||
|
|
||||||
|
CONFIG_HW_RANDOM_INTEL=m
|
||||||
|
CONFIG_HW_RANDOM_AMD=m
|
||||||
|
CONFIG_HW_RANDOM_GEODE=m
|
||||||
|
CONFIG_HW_RANDOM_VIA=m
|
||||||
|
|
||||||
|
|
||||||
|
# CONFIG_COMPAT_VDSO is not set
|
||||||
|
|
||||||
|
# CONFIG_SGI_IOC4 is not set
|
||||||
|
|
||||||
|
CONFIG_X86_PLATFORM_DEVICES=y
|
||||||
|
CONFIG_ASUS_LAPTOP=m
|
||||||
|
CONFIG_COMPAL_LAPTOP=m
|
||||||
|
CONFIG_EEEPC_LAPTOP=m
|
||||||
|
CONFIG_EEEPC_WMI=m
|
||||||
|
CONFIG_FUJITSU_LAPTOP=m
|
||||||
|
# CONFIG_FUJITSU_LAPTOP_DEBUG is not set
|
||||||
|
CONFIG_MSI_LAPTOP=m
|
||||||
|
CONFIG_SONY_LAPTOP=m
|
||||||
|
CONFIG_DELL_LAPTOP=m
|
||||||
|
CONFIG_ACPI_WMI=m
|
||||||
|
CONFIG_ACER_WMI=m
|
||||||
|
CONFIG_ACERHDF=m
|
||||||
|
CONFIG_TC1100_WMI=m
|
||||||
|
CONFIG_HP_WMI=m
|
||||||
|
CONFIG_DELL_WMI=m
|
||||||
|
|
||||||
|
# CONFIG_SMSC37B787_WDT is not set
|
||||||
|
CONFIG_W83697HF_WDT=m
|
||||||
|
CONFIG_IB700_WDT=m
|
||||||
|
|
||||||
|
CONFIG_RELOCATABLE=y
|
||||||
|
CONFIG_PHYSICAL_ALIGN=0x400000
|
||||||
|
CONFIG_PHYSICAL_START=0x400000
|
||||||
|
CONFIG_CRASH_DUMP=y
|
||||||
|
# CONFIG_KEXEC_JUMP is not set
|
||||||
|
CONFIG_PROC_VMCORE=y
|
||||||
|
CONFIG_CRASH=m
|
||||||
|
|
||||||
|
CONFIG_CRYPTO_DEV_GEODE=m
|
||||||
|
|
||||||
|
CONFIG_VIDEO_CAFE_CCIC=m
|
||||||
|
|
||||||
|
CONFIG_VIRTUALIZATION=y
|
||||||
|
CONFIG_KVM=m
|
||||||
|
CONFIG_KVM_INTEL=m
|
||||||
|
CONFIG_KVM_AMD=m
|
||||||
|
CONFIG_LGUEST=m
|
||||||
|
|
||||||
|
CONFIG_PARAVIRT_GUEST=y
|
||||||
|
CONFIG_PARAVIRT=y
|
||||||
|
# CONFIG_PARAVIRT_DEBUG is not set
|
||||||
|
|
||||||
|
# PARAVIRT_SPINLOCKS has a 5% perf hit
|
||||||
|
# CONFIG_PARAVIRT_SPINLOCKS is not set
|
||||||
|
CONFIG_KVM_CLOCK=y
|
||||||
|
CONFIG_KVM_GUEST=y
|
||||||
|
CONFIG_LGUEST_GUEST=y
|
||||||
|
CONFIG_VMI=y
|
||||||
|
|
||||||
|
CONFIG_XEN=y
|
||||||
|
CONFIG_XEN_MAX_DOMAIN_MEMORY=8
|
||||||
|
CONFIG_XEN_BALLOON=y
|
||||||
|
CONFIG_XEN_SCRUB_PAGES=y
|
||||||
|
CONFIG_XEN_SAVE_RESTORE=y
|
||||||
|
CONFIG_HVC_XEN=y
|
||||||
|
CONFIG_XEN_FBDEV_FRONTEND=y
|
||||||
|
CONFIG_XEN_KBDDEV_FRONTEND=y
|
||||||
|
CONFIG_XEN_BLKDEV_FRONTEND=m
|
||||||
|
CONFIG_XEN_NETDEV_FRONTEND=m
|
||||||
|
CONFIG_XENFS=m
|
||||||
|
CONFIG_XEN_COMPAT_XENFS=y
|
||||||
|
|
||||||
|
CONFIG_MTD_ESB2ROM=m
|
||||||
|
CONFIG_MTD_CK804XROM=m
|
||||||
|
CONFIG_MTD_NAND_CAFE=m
|
||||||
|
|
||||||
|
CONFIG_NO_HZ=y
|
||||||
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
CONFIG_CPU_IDLE=y
|
||||||
|
# CONFIG_CPU_IDLE_GOV_LADDER is not set
|
||||||
|
CONFIG_CPU_IDLE_GOV_MENU=y
|
||||||
|
|
||||||
|
CONFIG_THINKPAD_ACPI=m
|
||||||
|
# CONFIG_THINKPAD_ACPI_DEBUG is not set
|
||||||
|
# CONFIG_THINKPAD_ACPI_DEBUGFACILITIES is not set
|
||||||
|
CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y
|
||||||
|
CONFIG_THINKPAD_ACPI_VIDEO=y
|
||||||
|
CONFIG_THINKPAD_ACPI_ALSA_SUPPORT=y
|
||||||
|
# CONFIG_THINKPAD_ACPI_UNSAFE_LEDS is not set
|
||||||
|
|
||||||
|
CONFIG_MACINTOSH_DRIVERS=y
|
||||||
|
|
||||||
|
CONFIG_DMIID=y
|
||||||
|
CONFIG_ISCSI_IBFT_FIND=y
|
||||||
|
CONFIG_ISCSI_IBFT=m
|
||||||
|
|
||||||
|
CONFIG_DMADEVICES=y
|
||||||
|
CONFIG_INTEL_IOATDMA=m
|
||||||
|
|
||||||
|
CONFIG_SENSORS_I5K_AMB=m
|
||||||
|
|
||||||
|
# CONFIG_CPA_DEBUG is not set
|
||||||
|
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
|
||||||
|
|
||||||
|
CONFIG_HP_WATCHDOG=m
|
||||||
|
|
||||||
|
CONFIG_OLPC=y
|
||||||
|
CONFIG_BATTERY_OLPC=y
|
||||||
|
CONFIG_MOUSE_PS2_OLPC=y
|
||||||
|
|
||||||
|
CONFIG_STRICT_DEVMEM=y
|
||||||
|
|
||||||
|
# CONFIG_NO_BOOTMEM is not set
|
||||||
|
|
||||||
|
# CONFIG_MEMTEST is not set
|
||||||
|
# CONFIG_MAXSMP is not set
|
||||||
|
CONFIG_MTRR_SANITIZER=y
|
||||||
|
CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=1
|
||||||
|
CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
|
||||||
|
CONFIG_SYSPROF_TRACER=y
|
||||||
|
|
||||||
|
# CONFIG_X86_VERBOSE_BOOTUP is not set
|
||||||
|
# CONFIG_MMIOTRACE_TEST is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_PER_CPU_MAPS is not set
|
||||||
|
|
||||||
|
CONFIG_HP_ILO=m
|
||||||
|
|
||||||
|
CONFIG_BACKLIGHT_MBP_NVIDIA=m
|
||||||
|
|
||||||
|
CONFIG_OPROFILE_IBS=y
|
||||||
|
CONFIG_MICROCODE_INTEL=y
|
||||||
|
CONFIG_MICROCODE_AMD=y
|
||||||
|
|
||||||
|
# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set
|
||||||
|
CONFIG_X86_RESERVE_LOW_64K=y
|
||||||
|
|
||||||
|
# CONFIG_CMDLINE_BOOL is not set
|
||||||
|
|
||||||
|
CONFIG_PANASONIC_LAPTOP=m
|
||||||
|
|
||||||
|
CONFIG_XEN_DEBUG_FS=y
|
||||||
|
CONFIG_X86_PTRACE_BTS=y
|
||||||
|
|
||||||
|
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
|
||||||
|
|
||||||
|
CONFIG_POWER_TRACER=y
|
||||||
|
CONFIG_HW_BRANCH_TRACER=y
|
||||||
|
|
||||||
|
# CONFIG_SPARSE_IRQ is not set
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=32
|
||||||
|
|
||||||
|
# CONFIG_IOMMU_STRESS is not set
|
||||||
|
|
||||||
|
CONFIG_PERF_COUNTERS=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
|
CONFIG_EVENT_PROFILE=y
|
||||||
|
|
||||||
|
CONFIG_X86_MCE_INTEL=y
|
||||||
|
CONFIG_X86_MCE_AMD=y
|
||||||
|
# CONFIG_X86_ANCIENT_MCE is not set
|
||||||
|
# CONFIG_X86_MCE_INJECT is not set
|
||||||
|
|
||||||
|
# CONFIG_X86_MRST is not set
|
||||||
|
CONFIG_SFI=y
|
||||||
|
|
||||||
|
CONFIG_INPUT_WINBOND_CIR=m
|
||||||
|
CONFIG_I2C_SCMI=m
|
||||||
|
CONFIG_SBC_FITPC2_WATCHDOG=m
|
||||||
|
CONFIG_EDAC_I3200=m
|
||||||
|
CONFIG_EDAC_DECODE_MCE=m
|
||||||
|
|
||||||
|
CONFIG_GPIO_LANGWELL=y
|
||||||
|
|
||||||
|
# CONFIG_INTEL_TXT is not set
|
||||||
|
|
||||||
|
CONFIG_CS5535_MFGPT=m
|
||||||
|
CONFIG_GEODE_WDT=m
|
||||||
|
CONFIG_CS5535_CLOCK_EVENT_SRC=m
|
||||||
|
|
||||||
|
CONFIG_LEDS_INTEL_SS4200=m
|
||||||
|
|
||||||
|
CONFIG_X86_DECODER_SELFTEST=y
|
||||||
|
|
||||||
|
CONFIG_ACPI_CMPC=m
|
||||||
|
CONFIG_MSI_WMI=m
|
||||||
|
CONFIG_TOSHIBA_BT_RFKILL=m
|
||||||
|
# CONFIG_SAMSUNG_LAPTOP is not set
|
||||||
|
|
||||||
|
CONFIG_VGA_SWITCHEROO=y
|
||||||
|
CONFIG_LPC_SCH=m
|
|
@ -0,0 +1,400 @@
|
||||||
|
CONFIG_64BIT=y
|
||||||
|
CONFIG_UID16=y
|
||||||
|
# CONFIG_KERNEL_LZMA is not set
|
||||||
|
|
||||||
|
# CONFIG_MK8 is not set
|
||||||
|
# CONFIG_MPSC is not set
|
||||||
|
CONFIG_GENERIC_CPU=y
|
||||||
|
CONFIG_X86_EXTENDED_PLATFORM=y
|
||||||
|
# CONFIG_X86_VSMP is not set
|
||||||
|
# CONFIG_X86_UV is not set
|
||||||
|
CONFIG_X86_MSR=y
|
||||||
|
CONFIG_X86_CPUID=y
|
||||||
|
CONFIG_MTRR=y
|
||||||
|
CONFIG_NUMA=y
|
||||||
|
CONFIG_K8_NUMA=y
|
||||||
|
CONFIG_X86_64_ACPI_NUMA=y
|
||||||
|
# CONFIG_NUMA_EMU is not set
|
||||||
|
CONFIG_NR_CPUS=256
|
||||||
|
CONFIG_X86_POWERNOW_K8=m
|
||||||
|
CONFIG_X86_P4_CLOCKMOD=m
|
||||||
|
CONFIG_IA32_EMULATION=y
|
||||||
|
# CONFIG_IA32_AOUT is not set
|
||||||
|
# CONFIG_IOMMU_DEBUG is not set
|
||||||
|
CONFIG_DEBUG_RODATA=y
|
||||||
|
CONFIG_MICROCODE=m
|
||||||
|
CONFIG_SWIOTLB=y
|
||||||
|
CONFIG_CALGARY_IOMMU=y
|
||||||
|
CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT=y
|
||||||
|
CONFIG_X86_PM_TIMER=y
|
||||||
|
CONFIG_EDD=m
|
||||||
|
# CONFIG_EDD_OFF is not set
|
||||||
|
CONFIG_PCI_BIOS=y
|
||||||
|
CONFIG_PCI_MMCONFIG=y
|
||||||
|
CONFIG_DMAR=y
|
||||||
|
CONFIG_DMAR_BROKEN_GFX_WA=y
|
||||||
|
CONFIG_DMAR_FLOPPY_WA=y
|
||||||
|
CONFIG_DMAR_DEFAULT_ON=y
|
||||||
|
|
||||||
|
CONFIG_KEXEC_JUMP=y
|
||||||
|
|
||||||
|
CONFIG_EFI=y
|
||||||
|
CONFIG_EFI_VARS=y
|
||||||
|
CONFIG_EFI_PCDP=y
|
||||||
|
CONFIG_FB_EFI=y
|
||||||
|
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
|
|
||||||
|
CONFIG_CAPI_EICON=y
|
||||||
|
|
||||||
|
CONFIG_GENERIC_ISA_DMA=y
|
||||||
|
CONFIG_SCHED_SMT=y
|
||||||
|
CONFIG_SUSPEND=y
|
||||||
|
CONFIG_HIBERNATION=y
|
||||||
|
CONFIG_PM_STD_PARTITION=""
|
||||||
|
|
||||||
|
CONFIG_CPU_FREQ=y
|
||||||
|
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
|
||||||
|
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_USERSPACE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_ONDEMAND=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
|
||||||
|
CONFIG_CPU_FREQ_TABLE=y
|
||||||
|
CONFIG_CPU_FREQ_DEBUG=y
|
||||||
|
# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
|
||||||
|
CONFIG_X86_PCC_CPUFREQ=m
|
||||||
|
CONFIG_X86_ACPI_CPUFREQ=m
|
||||||
|
CONFIG_CPU_FREQ_STAT=m
|
||||||
|
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||||
|
|
||||||
|
CONFIG_ACPI=y
|
||||||
|
CONFIG_ACPI_AC=y
|
||||||
|
# CONFIG_ACPI_ASUS is not set
|
||||||
|
CONFIG_ACPI_PROCFS_POWER=y
|
||||||
|
CONFIG_ACPI_SYSFS_POWER=y
|
||||||
|
CONFIG_ACPI_BATTERY=y
|
||||||
|
CONFIG_ACPI_BLACKLIST_YEAR=0
|
||||||
|
CONFIG_ACPI_BUTTON=y
|
||||||
|
CONFIG_ACPI_CONTAINER=m
|
||||||
|
CONFIG_ACPI_DOCK=y
|
||||||
|
CONFIG_ACPI_FAN=y
|
||||||
|
CONFIG_ACPI_HOTPLUG_MEMORY=m
|
||||||
|
CONFIG_ACPI_NUMA=y
|
||||||
|
CONFIG_ACPI_PROCESSOR=y
|
||||||
|
CONFIG_ACPI_PROCFS=y
|
||||||
|
CONFIG_ACPI_SBS=m
|
||||||
|
CONFIG_ACPI_SLEEP=y
|
||||||
|
CONFIG_ACPI_THERMAL=y
|
||||||
|
CONFIG_ACPI_TOSHIBA=m
|
||||||
|
CONFIG_ACPI_POWER=y
|
||||||
|
CONFIG_ACPI_VIDEO=m
|
||||||
|
# Disable in F9.
|
||||||
|
CONFIG_ACPI_PROC_EVENT=y
|
||||||
|
CONFIG_ACPI_POWER_METER=m
|
||||||
|
CONFIG_ACPI_PROCESSOR_AGGREGATOR=m
|
||||||
|
|
||||||
|
CONFIG_X86_PLATFORM_DEVICES=y
|
||||||
|
CONFIG_ASUS_LAPTOP=m
|
||||||
|
CONFIG_COMPAL_LAPTOP=m
|
||||||
|
CONFIG_FUJITSU_LAPTOP=m
|
||||||
|
# CONFIG_FUJITSU_LAPTOP_DEBUG is not set
|
||||||
|
CONFIG_MSI_LAPTOP=m
|
||||||
|
CONFIG_SONY_LAPTOP=m
|
||||||
|
CONFIG_SONYPI_COMPAT=y
|
||||||
|
CONFIG_EEEPC_LAPTOP=m
|
||||||
|
CONFIG_EEEPC_WMI=m
|
||||||
|
CONFIG_DELL_LAPTOP=m
|
||||||
|
CONFIG_ACPI_WMI=m
|
||||||
|
CONFIG_ACER_WMI=m
|
||||||
|
CONFIG_ACERHDF=m
|
||||||
|
CONFIG_HP_WMI=m
|
||||||
|
CONFIG_DELL_WMI=m
|
||||||
|
|
||||||
|
CONFIG_THINKPAD_ACPI=m
|
||||||
|
# CONFIG_THINKPAD_ACPI_DEBUG is not set
|
||||||
|
# CONFIG_THINKPAD_ACPI_DEBUGFACILITIES is not set
|
||||||
|
CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y
|
||||||
|
CONFIG_THINKPAD_ACPI_VIDEO=y
|
||||||
|
CONFIG_THINKPAD_ACPI_ALSA_SUPPORT=y
|
||||||
|
# CONFIG_THINKPAD_ACPI_UNSAFE_LEDS is not set
|
||||||
|
|
||||||
|
CONFIG_HOTPLUG_PCI=y
|
||||||
|
CONFIG_HOTPLUG_PCI_COMPAQ=m
|
||||||
|
# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set
|
||||||
|
CONFIG_HOTPLUG_PCI_IBM=m
|
||||||
|
# CONFIG_HOTPLUG_PCI_CPCI is not set
|
||||||
|
# SHPC has half-arsed PCI probing, which makes it load on too many systems
|
||||||
|
CONFIG_HOTPLUG_PCI_SHPC=m
|
||||||
|
|
||||||
|
CONFIG_HPET=y
|
||||||
|
# CONFIG_HPET_MMAP is not set
|
||||||
|
CONFIG_PM=y
|
||||||
|
|
||||||
|
CONFIG_IPW2100=m
|
||||||
|
CONFIG_IPW2100_MONITOR=y
|
||||||
|
CONFIG_IPW2200=m
|
||||||
|
CONFIG_IPW2200_MONITOR=y
|
||||||
|
CONFIG_IPW2200_RADIOTAP=y
|
||||||
|
CONFIG_IPW2200_PROMISCUOUS=y
|
||||||
|
CONFIG_IPW2200_QOS=y
|
||||||
|
|
||||||
|
CONFIG_PNP=y
|
||||||
|
CONFIG_PNPACPI=y
|
||||||
|
|
||||||
|
CONFIG_BLK_DEV_AMD74XX=y
|
||||||
|
CONFIG_CRYPTO_DEV_PADLOCK=m
|
||||||
|
CONFIG_CRYPTO_DEV_PADLOCK_AES=m
|
||||||
|
CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
|
||||||
|
# CONFIG_CRYPTO_AES is not set
|
||||||
|
CONFIG_CRYPTO_AES_X86_64=m
|
||||||
|
# CONFIG_CRYPTO_TWOFISH is not set
|
||||||
|
CONFIG_CRYPTO_TWOFISH_X86_64=m
|
||||||
|
# CONFIG_CRYPTO_SALSA20 is not set
|
||||||
|
CONFIG_CRYPTO_SALSA20_X86_64=m
|
||||||
|
# -- Temporarily disabled until bugs can be sorted
|
||||||
|
# CONFIG_CRYPTO_AES_NI_INTEL is not set
|
||||||
|
|
||||||
|
CONFIG_X86_MCE=y
|
||||||
|
CONFIG_X86_MCE_INTEL=y
|
||||||
|
CONFIG_X86_MCE_AMD=y
|
||||||
|
|
||||||
|
# CONFIG_I2C_ALI1535 is not set
|
||||||
|
# CONFIG_I2C_ALI1563 is not set
|
||||||
|
# CONFIG_I2C_ALI15X3 is not set
|
||||||
|
CONFIG_I2C_AMD756=m
|
||||||
|
CONFIG_I2C_AMD756_S4882=m
|
||||||
|
CONFIG_I2C_AMD8111=m
|
||||||
|
CONFIG_I2C_I801=m
|
||||||
|
CONFIG_I2C_ISCH=m
|
||||||
|
CONFIG_I2C_NFORCE2_S4985=m
|
||||||
|
CONFIG_I2C_PIIX4=m
|
||||||
|
# CONFIG_I2C_SIS5595 is not set
|
||||||
|
# CONFIG_I2C_SIS630 is not set
|
||||||
|
|
||||||
|
CONFIG_I2C_SIS96X=m
|
||||||
|
CONFIG_I2C_VIA=m
|
||||||
|
CONFIG_I2C_VIAPRO=m
|
||||||
|
|
||||||
|
CONFIG_DELL_RBU=m
|
||||||
|
CONFIG_DCDBAS=m
|
||||||
|
|
||||||
|
CONFIG_NVRAM=y
|
||||||
|
|
||||||
|
CONFIG_EDAC=y
|
||||||
|
# CONFIG_EDAC_DEBUG is not set
|
||||||
|
CONFIG_EDAC_MM_EDAC=m
|
||||||
|
CONFIG_EDAC_AMD76X=m
|
||||||
|
CONFIG_EDAC_E7XXX=m
|
||||||
|
CONFIG_EDAC_E752X=m
|
||||||
|
CONFIG_EDAC_I5000=m
|
||||||
|
CONFIG_EDAC_I5100=m
|
||||||
|
CONFIG_EDAC_I5400=m
|
||||||
|
CONFIG_EDAC_I82875P=m
|
||||||
|
CONFIG_EDAC_I82860=m
|
||||||
|
CONFIG_EDAC_I82975X=m
|
||||||
|
CONFIG_EDAC_R82600=m
|
||||||
|
CONFIG_EDAC_AMD8131=m
|
||||||
|
CONFIG_EDAC_AMD8111=m
|
||||||
|
CONFIG_EDAC_AMD64=m
|
||||||
|
# CONFIG_EDAC_AMD64_ERROR_INJECTION is not set
|
||||||
|
CONFIG_EDAC_DECODE_MCE=m
|
||||||
|
|
||||||
|
CONFIG_SCHED_MC=y
|
||||||
|
|
||||||
|
CONFIG_TCG_INFINEON=m
|
||||||
|
|
||||||
|
CONFIG_HW_RANDOM_INTEL=m
|
||||||
|
CONFIG_HW_RANDOM_AMD=m
|
||||||
|
CONFIG_HW_RANDOM_VIA=m
|
||||||
|
|
||||||
|
# CONFIG_HW_RANDOM_GEODE is not set
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||||
|
CONFIG_DEBUG_NMI_TIMEOUT=5
|
||||||
|
|
||||||
|
CONFIG_GPIO_SCH=m
|
||||||
|
# CONFIG_PC8736x_GPIO is not set
|
||||||
|
|
||||||
|
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||||
|
CONFIG_SPARSEMEM_MANUAL=y
|
||||||
|
CONFIG_SPARSEMEM=y
|
||||||
|
CONFIG_HAVE_MEMORY_PRESENT=y
|
||||||
|
CONFIG_SPARSEMEM_EXTREME=y
|
||||||
|
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||||
|
CONFIG_MEMORY_HOTPLUG=y
|
||||||
|
CONFIG_MEMORY_HOTREMOVE=y
|
||||||
|
|
||||||
|
# CONFIG_BLK_DEV_CMD640 is not set
|
||||||
|
# CONFIG_BLK_DEV_RZ1000 is not set
|
||||||
|
# CONFIG_BLK_DEV_TRIFLEX is not set
|
||||||
|
# CONFIG_BLK_DEV_CS5520 is not set
|
||||||
|
# CONFIG_BLK_DEV_CS5530 is not set
|
||||||
|
# CONFIG_BLK_DEV_CS5535 is not set
|
||||||
|
|
||||||
|
CONFIG_CC_STACKPROTECTOR=y
|
||||||
|
|
||||||
|
CONFIG_SGI_IOC4=m
|
||||||
|
CONFIG_SGI_XP=m
|
||||||
|
CONFIG_SGI_GRU=m
|
||||||
|
# CONFIG_SGI_GRU_DEBUG is not set
|
||||||
|
|
||||||
|
# CONFIG_SMSC37B787_WDT is not set
|
||||||
|
CONFIG_W83697HF_WDT=m
|
||||||
|
|
||||||
|
# CONFIG_VIDEO_CAFE_CCIC is not set
|
||||||
|
|
||||||
|
CONFIG_MTD_ESB2ROM=m
|
||||||
|
CONFIG_MTD_CK804XROM=m
|
||||||
|
|
||||||
|
CONFIG_RELOCATABLE=y
|
||||||
|
CONFIG_MACINTOSH_DRIVERS=y
|
||||||
|
|
||||||
|
CONFIG_CRASH_DUMP=y
|
||||||
|
CONFIG_PHYSICAL_START=0x1000000
|
||||||
|
CONFIG_PROC_VMCORE=y
|
||||||
|
CONFIG_CRASH=m
|
||||||
|
|
||||||
|
CONFIG_DMIID=y
|
||||||
|
CONFIG_ISCSI_IBFT_FIND=y
|
||||||
|
CONFIG_ISCSI_IBFT=m
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_NO_HZ=y
|
||||||
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
CONFIG_CPU_IDLE=y
|
||||||
|
# CONFIG_CPU_IDLE_GOV_LADDER is not set
|
||||||
|
CONFIG_CPU_IDLE_GOV_MENU=y
|
||||||
|
|
||||||
|
CONFIG_VIRTUALIZATION=y
|
||||||
|
CONFIG_KVM=m
|
||||||
|
CONFIG_KVM_INTEL=m
|
||||||
|
CONFIG_KVM_AMD=m
|
||||||
|
|
||||||
|
CONFIG_PARAVIRT_GUEST=y
|
||||||
|
CONFIG_PARAVIRT=y
|
||||||
|
# CONFIG_PARAVIRT_DEBUG is not set
|
||||||
|
# PARAVIRT_SPINLOCKS has a 5% perf hit
|
||||||
|
# CONFIG_PARAVIRT_SPINLOCKS is not set
|
||||||
|
CONFIG_KVM_CLOCK=y
|
||||||
|
CONFIG_KVM_GUEST=y
|
||||||
|
|
||||||
|
CONFIG_XEN=y
|
||||||
|
CONFIG_XEN_MAX_DOMAIN_MEMORY=32
|
||||||
|
CONFIG_XEN_BALLOON=y
|
||||||
|
CONFIG_XEN_SCRUB_PAGES=y
|
||||||
|
CONFIG_XEN_SAVE_RESTORE=y
|
||||||
|
CONFIG_HVC_XEN=y
|
||||||
|
CONFIG_XEN_FBDEV_FRONTEND=y
|
||||||
|
CONFIG_XEN_KBDDEV_FRONTEND=y
|
||||||
|
CONFIG_XEN_BLKDEV_FRONTEND=m
|
||||||
|
CONFIG_XEN_NETDEV_FRONTEND=m
|
||||||
|
CONFIG_XENFS=m
|
||||||
|
CONFIG_XEN_COMPAT_XENFS=y
|
||||||
|
CONFIG_XEN_DEV_EVTCHN=m
|
||||||
|
CONFIG_XEN_SYS_HYPERVISOR=y
|
||||||
|
|
||||||
|
CONFIG_DMADEVICES=y
|
||||||
|
CONFIG_INTEL_IOATDMA=m
|
||||||
|
|
||||||
|
CONFIG_SENSORS_I5K_AMB=m
|
||||||
|
|
||||||
|
# CONFIG_COMPAT_VDSO is not set
|
||||||
|
CONFIG_PROVIDE_OHCI1394_DMA_INIT=y
|
||||||
|
# CONFIG_DEBUG_PER_CPU_MAPS is not set
|
||||||
|
# CONFIG_CPA_DEBUG is not set
|
||||||
|
|
||||||
|
CONFIG_HP_WATCHDOG=m
|
||||||
|
|
||||||
|
CONFIG_FRAME_WARN=2048
|
||||||
|
|
||||||
|
CONFIG_NODES_SHIFT=9
|
||||||
|
CONFIG_X86_PAT=y
|
||||||
|
# FIXME: These should be 32bit only
|
||||||
|
# CONFIG_FB_N411 is not set
|
||||||
|
CONFIG_STRICT_DEVMEM=y
|
||||||
|
|
||||||
|
CONFIG_DIRECT_GBPAGES=y
|
||||||
|
|
||||||
|
# CONFIG_NO_BOOTMEM is not set
|
||||||
|
|
||||||
|
# CONFIG_MEMTEST is not set
|
||||||
|
CONFIG_AMD_IOMMU=y
|
||||||
|
CONFIG_AMD_IOMMU_STATS=y
|
||||||
|
# CONFIG_MAXSMP is not set
|
||||||
|
CONFIG_MTRR_SANITIZER=y
|
||||||
|
CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=1
|
||||||
|
CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
|
||||||
|
CONFIG_SYSPROF_TRACER=y
|
||||||
|
# CONFIG_X86_VERBOSE_BOOTUP is not set
|
||||||
|
# CONFIG_MMIOTRACE_TEST is not set
|
||||||
|
|
||||||
|
CONFIG_X86_MPPARSE=y
|
||||||
|
|
||||||
|
CONFIG_BACKLIGHT_MBP_NVIDIA=m
|
||||||
|
|
||||||
|
CONFIG_OPROFILE_IBS=y
|
||||||
|
CONFIG_MICROCODE_INTEL=y
|
||||||
|
CONFIG_MICROCODE_AMD=y
|
||||||
|
|
||||||
|
# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set
|
||||||
|
CONFIG_X86_RESERVE_LOW_64K=y
|
||||||
|
|
||||||
|
# CONFIG_CMDLINE_BOOL is not set
|
||||||
|
|
||||||
|
CONFIG_PANASONIC_LAPTOP=m
|
||||||
|
|
||||||
|
CONFIG_XEN_DEBUG_FS=y
|
||||||
|
CONFIG_X86_PTRACE_BTS=y
|
||||||
|
|
||||||
|
CONFIG_I7300_IDLE=m
|
||||||
|
CONFIG_INTR_REMAP=y
|
||||||
|
|
||||||
|
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
|
||||||
|
|
||||||
|
CONFIG_POWER_TRACER=y
|
||||||
|
CONFIG_HW_BRANCH_TRACER=y
|
||||||
|
|
||||||
|
CONFIG_X86_X2APIC=y
|
||||||
|
CONFIG_SPARSE_IRQ=y
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=64
|
||||||
|
|
||||||
|
# CONFIG_IOMMU_STRESS is not set
|
||||||
|
|
||||||
|
CONFIG_PERF_COUNTERS=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
|
CONFIG_EVENT_PROFILE=y
|
||||||
|
|
||||||
|
# CONFIG_X86_MCE_INJECT is not set
|
||||||
|
|
||||||
|
CONFIG_SFI=y
|
||||||
|
CONFIG_INPUT_WINBOND_CIR=m
|
||||||
|
CONFIG_I2C_SCMI=m
|
||||||
|
CONFIG_SBC_FITPC2_WATCHDOG=m
|
||||||
|
CONFIG_EDAC_I3200=m
|
||||||
|
CONFIG_TOPSTAR_LAPTOP=m
|
||||||
|
CONFIG_INTEL_TXT=y
|
||||||
|
CONFIG_GPIO_LANGWELL=y
|
||||||
|
|
||||||
|
CONFIG_FUNCTION_GRAPH_TRACER=y
|
||||||
|
|
||||||
|
CONFIG_ACPI_CMPC=m
|
||||||
|
CONFIG_MSI_WMI=m
|
||||||
|
CONFIG_TOSHIBA_BT_RFKILL=m
|
||||||
|
# CONFIG_SAMSUNG_LAPTOP is not set
|
||||||
|
|
||||||
|
CONFIG_CS5535_MFGPT=m
|
||||||
|
CONFIG_GEODE_WDT=m
|
||||||
|
CONFIG_CS5535_CLOCK_EVENT_SRC=m
|
||||||
|
|
||||||
|
CONFIG_X86_DECODER_SELFTEST=y
|
||||||
|
|
||||||
|
CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m
|
||||||
|
|
||||||
|
CONFIG_VGA_SWITCHEROO=y
|
||||||
|
CONFIG_LPC_SCH=m
|
||||||
|
|
||||||
|
CONFIG_HP_ILO=m
|
|
@ -0,0 +1,176 @@
|
||||||
|
From: David Howells <dhowells@redhat.com>
|
||||||
|
Date: Thu, 29 Jul 2010 11:45:49 +0000 (+0100)
|
||||||
|
Subject: CRED: Fix get_task_cred() and task_state() to not resurrect dead credentials
|
||||||
|
X-Git-Tag: v2.6.35~11
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=de09a9771a5346029f4d11e4ac886be7f9b
|
||||||
|
|
||||||
|
CRED: Fix get_task_cred() and task_state() to not resurrect dead credentials
|
||||||
|
|
||||||
|
It's possible for get_task_cred() as it currently stands to 'corrupt' a set of
|
||||||
|
credentials by incrementing their usage count after their replacement by the
|
||||||
|
task being accessed.
|
||||||
|
|
||||||
|
What happens is that get_task_cred() can race with commit_creds():
|
||||||
|
|
||||||
|
TASK_1 TASK_2 RCU_CLEANER
|
||||||
|
-->get_task_cred(TASK_2)
|
||||||
|
rcu_read_lock()
|
||||||
|
__cred = __task_cred(TASK_2)
|
||||||
|
-->commit_creds()
|
||||||
|
old_cred = TASK_2->real_cred
|
||||||
|
TASK_2->real_cred = ...
|
||||||
|
put_cred(old_cred)
|
||||||
|
call_rcu(old_cred)
|
||||||
|
[__cred->usage == 0]
|
||||||
|
get_cred(__cred)
|
||||||
|
[__cred->usage == 1]
|
||||||
|
rcu_read_unlock()
|
||||||
|
-->put_cred_rcu()
|
||||||
|
[__cred->usage == 1]
|
||||||
|
panic()
|
||||||
|
|
||||||
|
However, since a tasks credentials are generally not changed very often, we can
|
||||||
|
reasonably make use of a loop involving reading the creds pointer and using
|
||||||
|
atomic_inc_not_zero() to attempt to increment it if it hasn't already hit zero.
|
||||||
|
|
||||||
|
If successful, we can safely return the credentials in the knowledge that, even
|
||||||
|
if the task we're accessing has released them, they haven't gone to the RCU
|
||||||
|
cleanup code.
|
||||||
|
|
||||||
|
We then change task_state() in procfs to use get_task_cred() rather than
|
||||||
|
calling get_cred() on the result of __task_cred(), as that suffers from the
|
||||||
|
same problem.
|
||||||
|
|
||||||
|
Without this change, a BUG_ON in __put_cred() or in put_cred_rcu() can be
|
||||||
|
tripped when it is noticed that the usage count is not zero as it ought to be,
|
||||||
|
for example:
|
||||||
|
|
||||||
|
kernel BUG at kernel/cred.c:168!
|
||||||
|
invalid opcode: 0000 [#1] SMP
|
||||||
|
last sysfs file: /sys/kernel/mm/ksm/run
|
||||||
|
CPU 0
|
||||||
|
Pid: 2436, comm: master Not tainted 2.6.33.3-85.fc13.x86_64 #1 0HR330/OptiPlex
|
||||||
|
745
|
||||||
|
RIP: 0010:[<ffffffff81069881>] [<ffffffff81069881>] __put_cred+0xc/0x45
|
||||||
|
RSP: 0018:ffff88019e7e9eb8 EFLAGS: 00010202
|
||||||
|
RAX: 0000000000000001 RBX: ffff880161514480 RCX: 00000000ffffffff
|
||||||
|
RDX: 00000000ffffffff RSI: ffff880140c690c0 RDI: ffff880140c690c0
|
||||||
|
RBP: ffff88019e7e9eb8 R08: 00000000000000d0 R09: 0000000000000000
|
||||||
|
R10: 0000000000000001 R11: 0000000000000040 R12: ffff880140c690c0
|
||||||
|
R13: ffff88019e77aea0 R14: 00007fff336b0a5c R15: 0000000000000001
|
||||||
|
FS: 00007f12f50d97c0(0000) GS:ffff880007400000(0000) knlGS:0000000000000000
|
||||||
|
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
|
||||||
|
CR2: 00007f8f461bc000 CR3: 00000001b26ce000 CR4: 00000000000006f0
|
||||||
|
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
|
||||||
|
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
|
||||||
|
Process master (pid: 2436, threadinfo ffff88019e7e8000, task ffff88019e77aea0)
|
||||||
|
Stack:
|
||||||
|
ffff88019e7e9ec8 ffffffff810698cd ffff88019e7e9ef8 ffffffff81069b45
|
||||||
|
<0> ffff880161514180 ffff880161514480 ffff880161514180 0000000000000000
|
||||||
|
<0> ffff88019e7e9f28 ffffffff8106aace 0000000000000001 0000000000000246
|
||||||
|
Call Trace:
|
||||||
|
[<ffffffff810698cd>] put_cred+0x13/0x15
|
||||||
|
[<ffffffff81069b45>] commit_creds+0x16b/0x175
|
||||||
|
[<ffffffff8106aace>] set_current_groups+0x47/0x4e
|
||||||
|
[<ffffffff8106ac89>] sys_setgroups+0xf6/0x105
|
||||||
|
[<ffffffff81009b02>] system_call_fastpath+0x16/0x1b
|
||||||
|
Code: 48 8d 71 ff e8 7e 4e 15 00 85 c0 78 0b 8b 75 ec 48 89 df e8 ef 4a 15 00
|
||||||
|
48 83 c4 18 5b c9 c3 55 8b 07 8b 07 48 89 e5 85 c0 74 04 <0f> 0b eb fe 65 48 8b
|
||||||
|
04 25 00 cc 00 00 48 3b b8 58 04 00 00 75
|
||||||
|
RIP [<ffffffff81069881>] __put_cred+0xc/0x45
|
||||||
|
RSP <ffff88019e7e9eb8>
|
||||||
|
---[ end trace df391256a100ebdd ]---
|
||||||
|
|
||||||
|
Signed-off-by: David Howells <dhowells@redhat.com>
|
||||||
|
Acked-by: Jiri Olsa <jolsa@redhat.com>
|
||||||
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/fs/proc/array.c b/fs/proc/array.c
|
||||||
|
index 9b58d38..fff6572 100644
|
||||||
|
--- a/fs/proc/array.c
|
||||||
|
+++ b/fs/proc/array.c
|
||||||
|
@@ -176,7 +176,7 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns,
|
||||||
|
if (tracer)
|
||||||
|
tpid = task_pid_nr_ns(tracer, ns);
|
||||||
|
}
|
||||||
|
- cred = get_cred((struct cred *) __task_cred(p));
|
||||||
|
+ cred = get_task_cred(p);
|
||||||
|
seq_printf(m,
|
||||||
|
"State:\t%s\n"
|
||||||
|
"Tgid:\t%d\n"
|
||||||
|
diff --git a/include/linux/cred.h b/include/linux/cred.h
|
||||||
|
index 75c0fa8..ce40cbc 100644
|
||||||
|
--- a/include/linux/cred.h
|
||||||
|
+++ b/include/linux/cred.h
|
||||||
|
@@ -153,6 +153,7 @@ struct cred {
|
||||||
|
extern void __put_cred(struct cred *);
|
||||||
|
extern void exit_creds(struct task_struct *);
|
||||||
|
extern int copy_creds(struct task_struct *, unsigned long);
|
||||||
|
+extern const struct cred *get_task_cred(struct task_struct *);
|
||||||
|
extern struct cred *cred_alloc_blank(void);
|
||||||
|
extern struct cred *prepare_creds(void);
|
||||||
|
extern struct cred *prepare_exec_creds(void);
|
||||||
|
@@ -282,26 +283,6 @@ static inline void put_cred(const struct cred *_cred)
|
||||||
|
((const struct cred *)(rcu_dereference_check((task)->real_cred, rcu_read_lock_held() || lockdep_tasklist_lock_is_held())))
|
||||||
|
|
||||||
|
/**
|
||||||
|
- * get_task_cred - Get another task's objective credentials
|
||||||
|
- * @task: The task to query
|
||||||
|
- *
|
||||||
|
- * Get the objective credentials of a task, pinning them so that they can't go
|
||||||
|
- * away. Accessing a task's credentials directly is not permitted.
|
||||||
|
- *
|
||||||
|
- * The caller must make sure task doesn't go away, either by holding a ref on
|
||||||
|
- * task or by holding tasklist_lock to prevent it from being unlinked.
|
||||||
|
- */
|
||||||
|
-#define get_task_cred(task) \
|
||||||
|
-({ \
|
||||||
|
- struct cred *__cred; \
|
||||||
|
- rcu_read_lock(); \
|
||||||
|
- __cred = (struct cred *) __task_cred((task)); \
|
||||||
|
- get_cred(__cred); \
|
||||||
|
- rcu_read_unlock(); \
|
||||||
|
- __cred; \
|
||||||
|
-})
|
||||||
|
-
|
||||||
|
-/**
|
||||||
|
* get_current_cred - Get the current task's subjective credentials
|
||||||
|
*
|
||||||
|
* Get the subjective credentials of the current task, pinning them so that
|
||||||
|
diff --git a/kernel/cred.c b/kernel/cred.c
|
||||||
|
index a2d5504..60bc8b1 100644
|
||||||
|
--- a/kernel/cred.c
|
||||||
|
+++ b/kernel/cred.c
|
||||||
|
@@ -209,6 +209,31 @@ void exit_creds(struct task_struct *tsk)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ * get_task_cred - Get another task's objective credentials
|
||||||
|
+ * @task: The task to query
|
||||||
|
+ *
|
||||||
|
+ * Get the objective credentials of a task, pinning them so that they can't go
|
||||||
|
+ * away. Accessing a task's credentials directly is not permitted.
|
||||||
|
+ *
|
||||||
|
+ * The caller must also make sure task doesn't get deleted, either by holding a
|
||||||
|
+ * ref on task or by holding tasklist_lock to prevent it from being unlinked.
|
||||||
|
+ */
|
||||||
|
+const struct cred *get_task_cred(struct task_struct *task)
|
||||||
|
+{
|
||||||
|
+ const struct cred *cred;
|
||||||
|
+
|
||||||
|
+ rcu_read_lock();
|
||||||
|
+
|
||||||
|
+ do {
|
||||||
|
+ cred = __task_cred((task));
|
||||||
|
+ BUG_ON(!cred);
|
||||||
|
+ } while (!atomic_inc_not_zero(&((struct cred *)cred)->usage));
|
||||||
|
+
|
||||||
|
+ rcu_read_unlock();
|
||||||
|
+ return cred;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Allocate blank credentials, such that the credentials can be filled in at a
|
||||||
|
* later date without risk of ENOMEM.
|
|
@ -0,0 +1,111 @@
|
||||||
|
From e45009229be6a7fae49bdfa3459905668c0b0fb1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: David S. Miller <davem@davemloft.net>
|
||||||
|
Date: Wed, 19 May 2010 14:12:03 +1000
|
||||||
|
Subject: crypto: testmgr - Add testing for async hashing and update/final
|
||||||
|
|
||||||
|
Extend testmgr such that it tests async hash algorithms,
|
||||||
|
and that for both sync and async hashes it tests both
|
||||||
|
->digest() and ->update()/->final() sequences.
|
||||||
|
|
||||||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||||
|
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||||
|
---
|
||||||
|
crypto/testmgr.c | 66 +++++++++++++++++++++++++++++++++++++++--------------
|
||||||
|
1 files changed, 48 insertions(+), 18 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/crypto/testmgr.c b/crypto/testmgr.c
|
||||||
|
index c494d76..5c8aaa0 100644
|
||||||
|
--- a/crypto/testmgr.c
|
||||||
|
+++ b/crypto/testmgr.c
|
||||||
|
@@ -153,8 +153,21 @@ static void testmgr_free_buf(char *buf[XBUFSIZE])
|
||||||
|
free_page((unsigned long)buf[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int do_one_async_hash_op(struct ahash_request *req,
|
||||||
|
+ struct tcrypt_result *tr,
|
||||||
|
+ int ret)
|
||||||
|
+{
|
||||||
|
+ if (ret == -EINPROGRESS || ret == -EBUSY) {
|
||||||
|
+ ret = wait_for_completion_interruptible(&tr->completion);
|
||||||
|
+ if (!ret)
|
||||||
|
+ ret = tr->err;
|
||||||
|
+ INIT_COMPLETION(tr->completion);
|
||||||
|
+ }
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
|
||||||
|
- unsigned int tcount)
|
||||||
|
+ unsigned int tcount, bool use_digest)
|
||||||
|
{
|
||||||
|
const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
|
||||||
|
unsigned int i, j, k, temp;
|
||||||
|
@@ -206,23 +219,36 @@ static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
|
||||||
|
}
|
||||||
|
|
||||||
|
ahash_request_set_crypt(req, sg, result, template[i].psize);
|
||||||
|
- ret = crypto_ahash_digest(req);
|
||||||
|
- switch (ret) {
|
||||||
|
- case 0:
|
||||||
|
- break;
|
||||||
|
- case -EINPROGRESS:
|
||||||
|
- case -EBUSY:
|
||||||
|
- ret = wait_for_completion_interruptible(
|
||||||
|
- &tresult.completion);
|
||||||
|
- if (!ret && !(ret = tresult.err)) {
|
||||||
|
- INIT_COMPLETION(tresult.completion);
|
||||||
|
- break;
|
||||||
|
+ if (use_digest) {
|
||||||
|
+ ret = do_one_async_hash_op(req, &tresult,
|
||||||
|
+ crypto_ahash_digest(req));
|
||||||
|
+ if (ret) {
|
||||||
|
+ pr_err("alg: hash: digest failed on test %d "
|
||||||
|
+ "for %s: ret=%d\n", j, algo, -ret);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ ret = do_one_async_hash_op(req, &tresult,
|
||||||
|
+ crypto_ahash_init(req));
|
||||||
|
+ if (ret) {
|
||||||
|
+ pr_err("alt: hash: init failed on test %d "
|
||||||
|
+ "for %s: ret=%d\n", j, algo, -ret);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ ret = do_one_async_hash_op(req, &tresult,
|
||||||
|
+ crypto_ahash_update(req));
|
||||||
|
+ if (ret) {
|
||||||
|
+ pr_err("alt: hash: update failed on test %d "
|
||||||
|
+ "for %s: ret=%d\n", j, algo, -ret);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ ret = do_one_async_hash_op(req, &tresult,
|
||||||
|
+ crypto_ahash_final(req));
|
||||||
|
+ if (ret) {
|
||||||
|
+ pr_err("alt: hash: final failed on test %d "
|
||||||
|
+ "for %s: ret=%d\n", j, algo, -ret);
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
- /* fall through */
|
||||||
|
- default:
|
||||||
|
- printk(KERN_ERR "alg: hash: digest failed on test %d "
|
||||||
|
- "for %s: ret=%d\n", j, algo, -ret);
|
||||||
|
- goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (memcmp(result, template[i].digest,
|
||||||
|
@@ -1402,7 +1428,11 @@ static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
|
||||||
|
return PTR_ERR(tfm);
|
||||||
|
}
|
||||||
|
|
||||||
|
- err = test_hash(tfm, desc->suite.hash.vecs, desc->suite.hash.count);
|
||||||
|
+ err = test_hash(tfm, desc->suite.hash.vecs,
|
||||||
|
+ desc->suite.hash.count, true);
|
||||||
|
+ if (!err)
|
||||||
|
+ err = test_hash(tfm, desc->suite.hash.vecs,
|
||||||
|
+ desc->suite.hash.count, false);
|
||||||
|
|
||||||
|
crypto_free_ahash(tfm);
|
||||||
|
return err;
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
From: Gerrit Renker <gerrit@erg.abdn.ac.uk>
|
||||||
|
Date: Wed, 2 Mar 2011 07:02:07 +0000 (-0800)
|
||||||
|
Subject: dccp: fix oops on Reset after close
|
||||||
|
X-Git-Tag: v2.6.38-rc8~29^2~9
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=720dc34bbbe9493c7bd48b2243058b4e447a929d
|
||||||
|
|
||||||
|
dccp: fix oops on Reset after close
|
||||||
|
|
||||||
|
This fixes a bug in the order of dccp_rcv_state_process() that still permitted
|
||||||
|
reception even after closing the socket. A Reset after close thus causes a NULL
|
||||||
|
pointer dereference by not preventing operations on an already torn-down socket.
|
||||||
|
|
||||||
|
dccp_v4_do_rcv()
|
||||||
|
|
|
||||||
|
| state other than OPEN
|
||||||
|
v
|
||||||
|
dccp_rcv_state_process()
|
||||||
|
|
|
||||||
|
| DCCP_PKT_RESET
|
||||||
|
v
|
||||||
|
dccp_rcv_reset()
|
||||||
|
|
|
||||||
|
v
|
||||||
|
dccp_time_wait()
|
||||||
|
|
||||||
|
WARNING: at net/ipv4/inet_timewait_sock.c:141 __inet_twsk_hashdance+0x48/0x128()
|
||||||
|
Modules linked in: arc4 ecb carl9170 rt2870sta(C) mac80211 r8712u(C) crc_ccitt ah
|
||||||
|
[<c0038850>] (unwind_backtrace+0x0/0xec) from [<c0055364>] (warn_slowpath_common)
|
||||||
|
[<c0055364>] (warn_slowpath_common+0x4c/0x64) from [<c0055398>] (warn_slowpath_n)
|
||||||
|
[<c0055398>] (warn_slowpath_null+0x1c/0x24) from [<c02b72d0>] (__inet_twsk_hashd)
|
||||||
|
[<c02b72d0>] (__inet_twsk_hashdance+0x48/0x128) from [<c031caa0>] (dccp_time_wai)
|
||||||
|
[<c031caa0>] (dccp_time_wait+0x40/0xc8) from [<c031c15c>] (dccp_rcv_state_proces)
|
||||||
|
[<c031c15c>] (dccp_rcv_state_process+0x120/0x538) from [<c032609c>] (dccp_v4_do_)
|
||||||
|
[<c032609c>] (dccp_v4_do_rcv+0x11c/0x14c) from [<c0286594>] (release_sock+0xac/0)
|
||||||
|
[<c0286594>] (release_sock+0xac/0x110) from [<c031fd34>] (dccp_close+0x28c/0x380)
|
||||||
|
[<c031fd34>] (dccp_close+0x28c/0x380) from [<c02d9a78>] (inet_release+0x64/0x70)
|
||||||
|
|
||||||
|
The fix is by testing the socket state first. Receiving a packet in Closed state
|
||||||
|
now also produces the required "No connection" Reset reply of RFC 4340, 8.3.1.
|
||||||
|
|
||||||
|
Reported-and-tested-by: Johan Hovold <jhovold@gmail.com>
|
||||||
|
Cc: stable@kernel.org
|
||||||
|
Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
|
||||||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/net/dccp/input.c b/net/dccp/input.c
|
||||||
|
index 8cde009..4222e7a 100644
|
||||||
|
--- a/net/dccp/input.c
|
||||||
|
+++ b/net/dccp/input.c
|
||||||
|
@@ -614,6 +614,9 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
|
||||||
|
/* Caller (dccp_v4_do_rcv) will send Reset */
|
||||||
|
dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;
|
||||||
|
return 1;
|
||||||
|
+ } else if (sk->sk_state == DCCP_CLOSED) {
|
||||||
|
+ dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;
|
||||||
|
+ return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sk->sk_state != DCCP_REQUESTING && sk->sk_state != DCCP_RESPOND) {
|
||||||
|
@@ -668,10 +671,6 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (sk->sk_state) {
|
||||||
|
- case DCCP_CLOSED:
|
||||||
|
- dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;
|
||||||
|
- return 1;
|
||||||
|
-
|
||||||
|
case DCCP_REQUESTING:
|
||||||
|
queued = dccp_rcv_request_sent_state_process(sk, skb, dh, len);
|
||||||
|
if (queued >= 0)
|
|
@ -0,0 +1,29 @@
|
||||||
|
From: Islam Amer <pharon@gmail.com>
|
||||||
|
Date: Thu, 24 Jun 2010 17:39:47 +0000 (-0400)
|
||||||
|
Subject: dell-wmi: Add support for eject key on Dell Studio 1555
|
||||||
|
X-Git-Tag: v2.6.36-rc1~579^2~64
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=d5164dbf1f651d1e955b158fb70a9c844cc91cd1
|
||||||
|
|
||||||
|
dell-wmi: Add support for eject key on Dell Studio 1555
|
||||||
|
|
||||||
|
Fixes pressing the eject key on Dell Studio 1555 does not work and produces
|
||||||
|
message :
|
||||||
|
|
||||||
|
dell-wmi: Unknown key 0 pressed
|
||||||
|
|
||||||
|
Signed-off-by: Islam Amer <pharon@gmail.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/platform/x86/dell-wmi.c b/drivers/platform/x86/dell-wmi.c
|
||||||
|
index 66f53c3..12a8e6f 100644
|
||||||
|
--- a/drivers/platform/x86/dell-wmi.c
|
||||||
|
+++ b/drivers/platform/x86/dell-wmi.c
|
||||||
|
@@ -221,7 +221,7 @@ static void dell_wmi_notify(u32 value, void *context)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (dell_new_hk_type)
|
||||||
|
+ if (dell_new_hk_type || buffer_entry[1] == 0x0)
|
||||||
|
reported_key = (int)buffer_entry[2];
|
||||||
|
else
|
||||||
|
reported_key = (int)buffer_entry[1] & 0xffff;
|
|
@ -0,0 +1,30 @@
|
||||||
|
From 4ff58b642f80dedb20533978123d89b5ac9b1ed5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Tue, 30 Mar 2010 00:04:29 -0400
|
||||||
|
Subject: die-floppy-die
|
||||||
|
|
||||||
|
Kill the floppy.ko pnp modalias. We were surviving just fine without
|
||||||
|
autoloading floppy drivers, tyvm.
|
||||||
|
|
||||||
|
Please feel free to register all complaints in the wastepaper bin.
|
||||||
|
---
|
||||||
|
drivers/block/floppy.c | 3 +--
|
||||||
|
1 files changed, 1 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
|
||||||
|
index 90c4038..f4a0b90 100644
|
||||||
|
--- a/drivers/block/floppy.c
|
||||||
|
+++ b/drivers/block/floppy.c
|
||||||
|
@@ -4619,8 +4619,7 @@ static const struct pnp_device_id floppy_pnpids[] = {
|
||||||
|
{"PNP0700", 0},
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
-
|
||||||
|
-MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
|
||||||
|
+/* MODULE_DEVICE_TABLE(pnp, floppy_pnpids); */
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,204 @@
|
||||||
|
From: Christoph Hellwig <hch@infradead.org>
|
||||||
|
Date: Sun, 18 Jul 2010 21:17:09 +0000 (+0000)
|
||||||
|
Subject: direct-io: move aio_complete into ->end_io
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=40e2e97316af6e62affab7a392e792494b8d9dde
|
||||||
|
|
||||||
|
direct-io: move aio_complete into ->end_io
|
||||||
|
|
||||||
|
Filesystems with unwritten extent support must not complete an AIO request
|
||||||
|
until the transaction to convert the extent has been commited. That means
|
||||||
|
the aio_complete calls needs to be moved into the ->end_io callback so
|
||||||
|
that the filesystem can control when to call it exactly.
|
||||||
|
|
||||||
|
This makes a bit of a mess out of dio_complete and the ->end_io callback
|
||||||
|
prototype even more complicated.
|
||||||
|
|
||||||
|
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||||
|
Reviewed-by: Jan Kara <jack@suse.cz>
|
||||||
|
Signed-off-by: Alex Elder <aelder@sgi.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/fs/direct-io.c b/fs/direct-io.c
|
||||||
|
index 7600aac..a10cb91 100644
|
||||||
|
--- a/fs/direct-io.c
|
||||||
|
+++ b/fs/direct-io.c
|
||||||
|
@@ -218,7 +218,7 @@ static struct page *dio_get_page(struct dio *dio)
|
||||||
|
* filesystems can use it to hold additional state between get_block calls and
|
||||||
|
* dio_complete.
|
||||||
|
*/
|
||||||
|
-static int dio_complete(struct dio *dio, loff_t offset, int ret)
|
||||||
|
+static int dio_complete(struct dio *dio, loff_t offset, int ret, bool is_async)
|
||||||
|
{
|
||||||
|
ssize_t transferred = 0;
|
||||||
|
|
||||||
|
@@ -239,14 +239,6 @@ static int dio_complete(struct dio *dio, loff_t offset, int ret)
|
||||||
|
transferred = dio->i_size - offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (dio->end_io && dio->result)
|
||||||
|
- dio->end_io(dio->iocb, offset, transferred,
|
||||||
|
- dio->map_bh.b_private);
|
||||||
|
-
|
||||||
|
- if (dio->flags & DIO_LOCKING)
|
||||||
|
- /* lockdep: non-owner release */
|
||||||
|
- up_read_non_owner(&dio->inode->i_alloc_sem);
|
||||||
|
-
|
||||||
|
if (ret == 0)
|
||||||
|
ret = dio->page_errors;
|
||||||
|
if (ret == 0)
|
||||||
|
@@ -254,6 +246,17 @@ static int dio_complete(struct dio *dio, loff_t offset, int ret)
|
||||||
|
if (ret == 0)
|
||||||
|
ret = transferred;
|
||||||
|
|
||||||
|
+ if (dio->end_io && dio->result) {
|
||||||
|
+ dio->end_io(dio->iocb, offset, transferred,
|
||||||
|
+ dio->map_bh.b_private, ret, is_async);
|
||||||
|
+ } else if (is_async) {
|
||||||
|
+ aio_complete(dio->iocb, ret, 0);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (dio->flags & DIO_LOCKING)
|
||||||
|
+ /* lockdep: non-owner release */
|
||||||
|
+ up_read_non_owner(&dio->inode->i_alloc_sem);
|
||||||
|
+
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -277,8 +280,7 @@ static void dio_bio_end_aio(struct bio *bio, int error)
|
||||||
|
spin_unlock_irqrestore(&dio->bio_lock, flags);
|
||||||
|
|
||||||
|
if (remaining == 0) {
|
||||||
|
- int ret = dio_complete(dio, dio->iocb->ki_pos, 0);
|
||||||
|
- aio_complete(dio->iocb, ret, 0);
|
||||||
|
+ dio_complete(dio, dio->iocb->ki_pos, 0, true);
|
||||||
|
kfree(dio);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1126,7 +1128,7 @@ direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode,
|
||||||
|
spin_unlock_irqrestore(&dio->bio_lock, flags);
|
||||||
|
|
||||||
|
if (ret2 == 0) {
|
||||||
|
- ret = dio_complete(dio, offset, ret);
|
||||||
|
+ ret = dio_complete(dio, offset, ret, false);
|
||||||
|
kfree(dio);
|
||||||
|
} else
|
||||||
|
BUG_ON(ret != -EIOCBQUEUED);
|
||||||
|
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
|
||||||
|
index 42272d6..0afc8c1 100644
|
||||||
|
--- a/fs/ext4/inode.c
|
||||||
|
+++ b/fs/ext4/inode.c
|
||||||
|
@@ -3775,7 +3775,8 @@ static ext4_io_end_t *ext4_init_io_end (struct inode *inode, gfp_t flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,
|
||||||
|
- ssize_t size, void *private)
|
||||||
|
+ ssize_t size, void *private, int ret,
|
||||||
|
+ bool is_async)
|
||||||
|
{
|
||||||
|
ext4_io_end_t *io_end = iocb->private;
|
||||||
|
struct workqueue_struct *wq;
|
||||||
|
@@ -3784,7 +3785,7 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,
|
||||||
|
|
||||||
|
/* if not async direct IO or dio with 0 bytes write, just return */
|
||||||
|
if (!io_end || !size)
|
||||||
|
- return;
|
||||||
|
+ goto out;
|
||||||
|
|
||||||
|
ext_debug("ext4_end_io_dio(): io_end 0x%p"
|
||||||
|
"for inode %lu, iocb 0x%p, offset %llu, size %llu\n",
|
||||||
|
@@ -3795,7 +3796,7 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,
|
||||||
|
if (io_end->flag != EXT4_IO_UNWRITTEN){
|
||||||
|
ext4_free_io_end(io_end);
|
||||||
|
iocb->private = NULL;
|
||||||
|
- return;
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
io_end->offset = offset;
|
||||||
|
@@ -3812,6 +3813,9 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,
|
||||||
|
list_add_tail(&io_end->list, &ei->i_completed_io_list);
|
||||||
|
spin_unlock_irqrestore(&ei->i_completed_io_lock, flags);
|
||||||
|
iocb->private = NULL;
|
||||||
|
+out:
|
||||||
|
+ if (is_async)
|
||||||
|
+ aio_complete(iocb, ret, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ext4_end_io_buffer_write(struct buffer_head *bh, int uptodate)
|
||||||
|
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c
|
||||||
|
index 356e976..96337a4 100644
|
||||||
|
--- a/fs/ocfs2/aops.c
|
||||||
|
+++ b/fs/ocfs2/aops.c
|
||||||
|
@@ -578,7 +578,9 @@ bail:
|
||||||
|
static void ocfs2_dio_end_io(struct kiocb *iocb,
|
||||||
|
loff_t offset,
|
||||||
|
ssize_t bytes,
|
||||||
|
- void *private)
|
||||||
|
+ void *private,
|
||||||
|
+ int ret,
|
||||||
|
+ bool is_async)
|
||||||
|
{
|
||||||
|
struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
|
||||||
|
int level;
|
||||||
|
@@ -592,6 +594,9 @@ static void ocfs2_dio_end_io(struct kiocb *iocb,
|
||||||
|
if (!level)
|
||||||
|
up_read(&inode->i_alloc_sem);
|
||||||
|
ocfs2_rw_unlock(inode, level);
|
||||||
|
+
|
||||||
|
+ if (is_async)
|
||||||
|
+ aio_complete(iocb, ret, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c
|
||||||
|
index 8abbf05..95d1e26 100644
|
||||||
|
--- a/fs/xfs/linux-2.6/xfs_aops.c
|
||||||
|
+++ b/fs/xfs/linux-2.6/xfs_aops.c
|
||||||
|
@@ -1406,7 +1406,9 @@ xfs_end_io_direct(
|
||||||
|
struct kiocb *iocb,
|
||||||
|
loff_t offset,
|
||||||
|
ssize_t size,
|
||||||
|
- void *private)
|
||||||
|
+ void *private,
|
||||||
|
+ int ret,
|
||||||
|
+ bool is_async)
|
||||||
|
{
|
||||||
|
xfs_ioend_t *ioend = iocb->private;
|
||||||
|
|
||||||
|
@@ -1452,6 +1454,9 @@ xfs_end_io_direct(
|
||||||
|
* against double-freeing.
|
||||||
|
*/
|
||||||
|
iocb->private = NULL;
|
||||||
|
+
|
||||||
|
+ if (is_async)
|
||||||
|
+ aio_complete(iocb, ret, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC ssize_t
|
||||||
|
diff --git a/fs/xfs/linux-2.6/xfs_aops.h b/fs/xfs/linux-2.6/xfs_aops.h
|
||||||
|
index 319da17..c5057fb 100644
|
||||||
|
--- a/fs/xfs/linux-2.6/xfs_aops.h
|
||||||
|
+++ b/fs/xfs/linux-2.6/xfs_aops.h
|
||||||
|
@@ -37,6 +37,8 @@ typedef struct xfs_ioend {
|
||||||
|
size_t io_size; /* size of the extent */
|
||||||
|
xfs_off_t io_offset; /* offset in the file */
|
||||||
|
struct work_struct io_work; /* xfsdatad work queue */
|
||||||
|
+ struct kiocb *io_iocb;
|
||||||
|
+ int io_result;
|
||||||
|
} xfs_ioend_t;
|
||||||
|
|
||||||
|
extern const struct address_space_operations xfs_address_space_operations;
|
||||||
|
diff --git a/include/linux/fs.h b/include/linux/fs.h
|
||||||
|
index 68ca1b0..f91affb 100644
|
||||||
|
--- a/include/linux/fs.h
|
||||||
|
+++ b/include/linux/fs.h
|
||||||
|
@@ -415,7 +415,8 @@ struct buffer_head;
|
||||||
|
typedef int (get_block_t)(struct inode *inode, sector_t iblock,
|
||||||
|
struct buffer_head *bh_result, int create);
|
||||||
|
typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset,
|
||||||
|
- ssize_t bytes, void *private);
|
||||||
|
+ ssize_t bytes, void *private, int ret,
|
||||||
|
+ bool is_async);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Attribute flags. These should be or-ed together to figure out what
|
|
@ -0,0 +1,59 @@
|
||||||
|
From 2a79554c864ac58fa2ad982f0fcee2cc2aa33eb5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Bastien Nocera <hadess@hadess.net>
|
||||||
|
Date: Thu, 20 May 2010 10:30:31 -0400
|
||||||
|
Subject: Disable i8042 checks on Intel Apple Macs
|
||||||
|
|
||||||
|
As those computers never had any i8042 controllers, and the
|
||||||
|
current lookup code could potentially lock up/hang/wait for
|
||||||
|
timeout for long periods of time.
|
||||||
|
|
||||||
|
Fixes intermittent hangs on boot on a MacbookAir1,1
|
||||||
|
|
||||||
|
Signed-off-by: Bastien Nocera <hadess@hadess.net>
|
||||||
|
---
|
||||||
|
drivers/input/serio/i8042.c | 22 ++++++++++++++++++++++
|
||||||
|
1 files changed, 22 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
|
||||||
|
index 6440a8f..4d7cf98 100644
|
||||||
|
--- a/drivers/input/serio/i8042.c
|
||||||
|
+++ b/drivers/input/serio/i8042.c
|
||||||
|
@@ -1451,6 +1451,22 @@ static struct platform_driver i8042_driver = {
|
||||||
|
.shutdown = i8042_shutdown,
|
||||||
|
};
|
||||||
|
|
||||||
|
+#ifdef CONFIG_DMI
|
||||||
|
+static struct dmi_system_id __initdata dmi_system_table[] = {
|
||||||
|
+ {
|
||||||
|
+ .matches = {
|
||||||
|
+ DMI_MATCH(DMI_BIOS_VENDOR, "Apple Computer, Inc.")
|
||||||
|
+ },
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .matches = {
|
||||||
|
+ DMI_MATCH(DMI_BIOS_VENDOR, "Apple Inc.")
|
||||||
|
+ },
|
||||||
|
+ },
|
||||||
|
+ {}
|
||||||
|
+};
|
||||||
|
+#endif /*CONFIG_DMI*/
|
||||||
|
+
|
||||||
|
static int __init i8042_init(void)
|
||||||
|
{
|
||||||
|
struct platform_device *pdev;
|
||||||
|
@@ -1458,6 +1474,12 @@ static int __init i8042_init(void)
|
||||||
|
|
||||||
|
dbg_init();
|
||||||
|
|
||||||
|
+#ifdef CONFIG_DMI
|
||||||
|
+ /* Intel Apple Macs never have an i8042 controller */
|
||||||
|
+ if (dmi_check_system(dmi_system_table) > 0)
|
||||||
|
+ return -ENODEV;
|
||||||
|
+#endif /*CONFIG_DMI*/
|
||||||
|
+
|
||||||
|
err = i8042_platform_init();
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
From 8d2f6746f7f82e1aee2dc40a937b5954cfc73414 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@mcmartin.ca>
|
||||||
|
Date: Sun, 17 Oct 2010 15:55:32 -0400
|
||||||
|
Subject: [PATCH] dmar: disable if ricoh multifunction detected
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/pci/intel-iommu.c | 10 ++++++++++
|
||||||
|
1 files changed, 10 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
|
||||||
|
index 8e499e8..076c5de 100644
|
||||||
|
--- a/drivers/pci/intel-iommu.c
|
||||||
|
+++ b/drivers/pci/intel-iommu.c
|
||||||
|
@@ -3755,6 +3755,18 @@ static void __devinit quirk_iommu_rwbf(struct pci_dev *dev)
|
||||||
|
|
||||||
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf);
|
||||||
|
|
||||||
|
+/* https://bugzilla.redhat.com/show_bug.cgi?id=605888 */
|
||||||
|
+static void __devinit quirk_ricoh_multifunction(struct pci_dev *dev)
|
||||||
|
+{
|
||||||
|
+ printk(KERN_INFO "intel_iommu: broken Ricoh device %04X detected, disabling...\n",
|
||||||
|
+ dev->device);
|
||||||
|
+ dmar_disabled = 1;
|
||||||
|
+}
|
||||||
|
+DECLARE_PCI_FIXUP_HEADER(0x1180, 0xe822, quirk_ricoh_multifunction);
|
||||||
|
+DECLARE_PCI_FIXUP_HEADER(0x1180, 0xe230, quirk_ricoh_multifunction);
|
||||||
|
+DECLARE_PCI_FIXUP_HEADER(0x1180, 0xe832, quirk_ricoh_multifunction);
|
||||||
|
+DECLARE_PCI_FIXUP_HEADER(0x1180, 0xe476, quirk_ricoh_multifunction);
|
||||||
|
+
|
||||||
|
/* On Tylersburg chipsets, some BIOSes have been known to enable the
|
||||||
|
ISOCH DMAR unit for the Azalia sound device, but not give it any
|
||||||
|
TLB entries, which causes it to deadlock. Check for that. We do
|
||||||
|
--
|
||||||
|
1.7.3.1
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
From: Carsten Emde <C.Emde@osadl.org>
|
||||||
|
Date: Mon, 24 May 2010 21:33:39 +0000 (-0700)
|
||||||
|
Subject: drivers/hwmon/coretemp.c: detect the thermal sensors by CPUID
|
||||||
|
X-Git-Tag: v2.6.35-rc1~297
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=5db47b009d17d69a2f8d84357e7b24c3e3c2edec
|
||||||
|
|
||||||
|
drivers/hwmon/coretemp.c: detect the thermal sensors by CPUID
|
||||||
|
|
||||||
|
The thermal sensors of Intel(R) CPUs can be detected by CPUID instruction,
|
||||||
|
indicated by CPUID.06H.EAX[0].
|
||||||
|
|
||||||
|
Signed-off-by: Huaxu Wan <huaxu.wan@linux.intel.com>
|
||||||
|
Signed-off-by: Carsten Emde <C.Emde@osadl.org>
|
||||||
|
Reviewed-by: Valdis Kletnieks <valdis.kletnieks@vt.edu>
|
||||||
|
Cc: Jean Delvare <khali@linux-fr.org>
|
||||||
|
Cc: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
|
||||||
|
Cc: Yong Wang <yong.y.wang@linux.intel.com>
|
||||||
|
Cc: Rudolf Marek <r.marek@assembler.cz>
|
||||||
|
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||||
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
|
||||||
|
index e9b7fbc..9fae7cb 100644
|
||||||
|
--- a/drivers/hwmon/coretemp.c
|
||||||
|
+++ b/drivers/hwmon/coretemp.c
|
||||||
|
@@ -451,28 +451,20 @@ static int __init coretemp_init(void)
|
||||||
|
|
||||||
|
for_each_online_cpu(i) {
|
||||||
|
struct cpuinfo_x86 *c = &cpu_data(i);
|
||||||
|
+ /*
|
||||||
|
+ * CPUID.06H.EAX[0] indicates whether the CPU has thermal
|
||||||
|
+ * sensors. We check this bit only, all the early CPUs
|
||||||
|
+ * without thermal sensors will be filtered out.
|
||||||
|
+ */
|
||||||
|
+ if (c->cpuid_level >= 6 && (cpuid_eax(0x06) & 0x01)) {
|
||||||
|
+ err = coretemp_device_add(i);
|
||||||
|
+ if (err)
|
||||||
|
+ goto exit_devices_unreg;
|
||||||
|
|
||||||
|
- /* check if family 6, models 0xe (Pentium M DC),
|
||||||
|
- 0xf (Core 2 DC 65nm), 0x16 (Core 2 SC 65nm),
|
||||||
|
- 0x17 (Penryn 45nm), 0x1a (Nehalem), 0x1c (Atom),
|
||||||
|
- 0x1e (Lynnfield) */
|
||||||
|
- if ((c->cpuid_level < 0) || (c->x86 != 0x6) ||
|
||||||
|
- !((c->x86_model == 0xe) || (c->x86_model == 0xf) ||
|
||||||
|
- (c->x86_model == 0x16) || (c->x86_model == 0x17) ||
|
||||||
|
- (c->x86_model == 0x1a) || (c->x86_model == 0x1c) ||
|
||||||
|
- (c->x86_model == 0x1e))) {
|
||||||
|
-
|
||||||
|
- /* supported CPU not found, but report the unknown
|
||||||
|
- family 6 CPU */
|
||||||
|
- if ((c->x86 == 0x6) && (c->x86_model > 0xf))
|
||||||
|
- printk(KERN_WARNING DRVNAME ": Unknown CPU "
|
||||||
|
- "model 0x%x\n", c->x86_model);
|
||||||
|
- continue;
|
||||||
|
+ } else {
|
||||||
|
+ printk(KERN_INFO DRVNAME ": CPU (model=0x%x)"
|
||||||
|
+ " has no thermal sensor.\n", c->x86_model);
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- err = coretemp_device_add(i);
|
||||||
|
- if (err)
|
||||||
|
- goto exit_devices_unreg;
|
||||||
|
}
|
||||||
|
if (list_empty(&pdev_list)) {
|
||||||
|
err = -ENODEV;
|
|
@ -0,0 +1,74 @@
|
||||||
|
From 0b91f360956aa7a5aa8900d358d1bff3020182e0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
Date: Thu, 1 Jul 2010 12:34:56 +1000
|
||||||
|
Subject: [PATCH 1/2] drm: disable encoder rather than dpms off in drm_crtc_prepare_encoders()
|
||||||
|
|
||||||
|
Original behaviour will be preserved for drivers that don't implement
|
||||||
|
disable() hooks for an encoder.
|
||||||
|
|
||||||
|
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/drm_crtc_helper.c | 22 ++++++++++++++--------
|
||||||
|
1 files changed, 14 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
|
||||||
|
index b142ac2..32dae0e 100644
|
||||||
|
--- a/drivers/gpu/drm/drm_crtc_helper.c
|
||||||
|
+++ b/drivers/gpu/drm/drm_crtc_helper.c
|
||||||
|
@@ -201,6 +201,17 @@ bool drm_helper_crtc_in_use(struct drm_crtc *crtc)
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_helper_crtc_in_use);
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+drm_encoder_disable(struct drm_encoder *encoder)
|
||||||
|
+{
|
||||||
|
+ struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
|
||||||
|
+
|
||||||
|
+ if (encoder_funcs->disable)
|
||||||
|
+ (*encoder_funcs->disable)(encoder);
|
||||||
|
+ else
|
||||||
|
+ (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* drm_helper_disable_unused_functions - disable unused objects
|
||||||
|
* @dev: DRM device
|
||||||
|
@@ -215,7 +226,6 @@ void drm_helper_disable_unused_functions(struct drm_device *dev)
|
||||||
|
{
|
||||||
|
struct drm_encoder *encoder;
|
||||||
|
struct drm_connector *connector;
|
||||||
|
- struct drm_encoder_helper_funcs *encoder_funcs;
|
||||||
|
struct drm_crtc *crtc;
|
||||||
|
|
||||||
|
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||||
|
@@ -226,12 +236,8 @@ void drm_helper_disable_unused_functions(struct drm_device *dev)
|
||||||
|
}
|
||||||
|
|
||||||
|
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
||||||
|
- encoder_funcs = encoder->helper_private;
|
||||||
|
if (!drm_helper_encoder_in_use(encoder)) {
|
||||||
|
- if (encoder_funcs->disable)
|
||||||
|
- (*encoder_funcs->disable)(encoder);
|
||||||
|
- else
|
||||||
|
- (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
|
||||||
|
+ drm_encoder_disable(encoder);
|
||||||
|
/* disconnector encoder from any connector */
|
||||||
|
encoder->crtc = NULL;
|
||||||
|
}
|
||||||
|
@@ -292,11 +298,11 @@ drm_crtc_prepare_encoders(struct drm_device *dev)
|
||||||
|
encoder_funcs = encoder->helper_private;
|
||||||
|
/* Disable unused encoders */
|
||||||
|
if (encoder->crtc == NULL)
|
||||||
|
- (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
|
||||||
|
+ drm_encoder_disable(encoder);
|
||||||
|
/* Disable encoders whose CRTC is about to change */
|
||||||
|
if (encoder_funcs->get_crtc &&
|
||||||
|
encoder->crtc != (*encoder_funcs->get_crtc)(encoder))
|
||||||
|
- (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
|
||||||
|
+ drm_encoder_disable(encoder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.1.1
|
||||||
|
|
|
@ -0,0 +1,107 @@
|
||||||
|
From 39b4d07aa3583ceefe73622841303a0a3e942ca1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||||
|
Date: Thu, 30 Sep 2010 09:10:26 +0100
|
||||||
|
Subject: drm: Hold the mutex when dropping the last GEM reference (v2)
|
||||||
|
|
||||||
|
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||||
|
|
||||||
|
commit 39b4d07aa3583ceefe73622841303a0a3e942ca1 upstream.
|
||||||
|
|
||||||
|
In order to be fully threadsafe we need to check that the drm_gem_object
|
||||||
|
refcount is still 0 after acquiring the mutex in order to call the free
|
||||||
|
function. Otherwise, we may encounter scenarios like:
|
||||||
|
|
||||||
|
Thread A: Thread B:
|
||||||
|
drm_gem_close
|
||||||
|
unreference_unlocked
|
||||||
|
kref_put mutex_lock
|
||||||
|
... i915_gem_evict
|
||||||
|
... kref_get -> BUG
|
||||||
|
... i915_gem_unbind
|
||||||
|
... kref_put
|
||||||
|
... i915_gem_object_free
|
||||||
|
... mutex_unlock
|
||||||
|
mutex_lock
|
||||||
|
i915_gem_object_free -> BUG
|
||||||
|
i915_gem_object_unbind
|
||||||
|
kfree
|
||||||
|
mutex_unlock
|
||||||
|
|
||||||
|
Note that no driver is currently using the free_unlocked vfunc and it is
|
||||||
|
scheduled for removal, hasten that process.
|
||||||
|
|
||||||
|
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=30454
|
||||||
|
Reported-and-Tested-by: Magnus Kessler <Magnus.Kessler@gmx.net>
|
||||||
|
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
|
||||||
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/drm_gem.c | 22 ----------------------
|
||||||
|
include/drm/drmP.h | 10 ++++++----
|
||||||
|
2 files changed, 6 insertions(+), 26 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/gpu/drm/drm_gem.c
|
||||||
|
+++ b/drivers/gpu/drm/drm_gem.c
|
||||||
|
@@ -451,28 +451,6 @@ drm_gem_object_free(struct kref *kref)
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_gem_object_free);
|
||||||
|
|
||||||
|
-/**
|
||||||
|
- * Called after the last reference to the object has been lost.
|
||||||
|
- * Must be called without holding struct_mutex
|
||||||
|
- *
|
||||||
|
- * Frees the object
|
||||||
|
- */
|
||||||
|
-void
|
||||||
|
-drm_gem_object_free_unlocked(struct kref *kref)
|
||||||
|
-{
|
||||||
|
- struct drm_gem_object *obj = (struct drm_gem_object *) kref;
|
||||||
|
- struct drm_device *dev = obj->dev;
|
||||||
|
-
|
||||||
|
- if (dev->driver->gem_free_object_unlocked != NULL)
|
||||||
|
- dev->driver->gem_free_object_unlocked(obj);
|
||||||
|
- else if (dev->driver->gem_free_object != NULL) {
|
||||||
|
- mutex_lock(&dev->struct_mutex);
|
||||||
|
- dev->driver->gem_free_object(obj);
|
||||||
|
- mutex_unlock(&dev->struct_mutex);
|
||||||
|
- }
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(drm_gem_object_free_unlocked);
|
||||||
|
-
|
||||||
|
static void drm_gem_object_ref_bug(struct kref *list_kref)
|
||||||
|
{
|
||||||
|
BUG();
|
||||||
|
--- a/include/drm/drmP.h
|
||||||
|
+++ b/include/drm/drmP.h
|
||||||
|
@@ -802,7 +802,6 @@ struct drm_driver {
|
||||||
|
*/
|
||||||
|
int (*gem_init_object) (struct drm_gem_object *obj);
|
||||||
|
void (*gem_free_object) (struct drm_gem_object *obj);
|
||||||
|
- void (*gem_free_object_unlocked) (struct drm_gem_object *obj);
|
||||||
|
|
||||||
|
/* vga arb irq handler */
|
||||||
|
void (*vgaarb_irq)(struct drm_device *dev, bool state);
|
||||||
|
@@ -1430,7 +1429,6 @@ int drm_gem_init(struct drm_device *dev)
|
||||||
|
void drm_gem_destroy(struct drm_device *dev);
|
||||||
|
void drm_gem_object_release(struct drm_gem_object *obj);
|
||||||
|
void drm_gem_object_free(struct kref *kref);
|
||||||
|
-void drm_gem_object_free_unlocked(struct kref *kref);
|
||||||
|
struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev,
|
||||||
|
size_t size);
|
||||||
|
int drm_gem_object_init(struct drm_device *dev,
|
||||||
|
@@ -1456,8 +1454,12 @@ drm_gem_object_unreference(struct drm_ge
|
||||||
|
static inline void
|
||||||
|
drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
|
||||||
|
{
|
||||||
|
- if (obj != NULL)
|
||||||
|
- kref_put(&obj->refcount, drm_gem_object_free_unlocked);
|
||||||
|
+ if (obj != NULL) {
|
||||||
|
+ struct drm_device *dev = obj->dev;
|
||||||
|
+ mutex_lock(&dev->struct_mutex);
|
||||||
|
+ kref_put(&obj->refcount, drm_gem_object_free);
|
||||||
|
+ mutex_unlock(&dev->struct_mutex);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
int drm_gem_handle_create(struct drm_file *file_priv,
|
|
@ -0,0 +1,62 @@
|
||||||
|
commit 6f772d7e2f4105470b9f3d0f0b26f06f61b1278d
|
||||||
|
Author: Chris Wilson <chris@chris-wilson.co.uk>
|
||||||
|
Date: Fri Jul 2 08:57:15 2010 +0100
|
||||||
|
|
||||||
|
drm/i915: Explosion following OOM in do_execbuffer.
|
||||||
|
|
||||||
|
Oops, when merging the extra details following an OOM, I missed that
|
||||||
|
driver_private is now NULL and the correct way to convert from the
|
||||||
|
drm_gem_object into the drm_i915_gem_object is to use to_intel_bo().
|
||||||
|
|
||||||
|
BUG: unable to handle kernel NULL pointer dereference at 00000069
|
||||||
|
IP: [<c11a4a02>] i915_gem_do_execbuffer+0x71f/0xbb6
|
||||||
|
*pde = 00000000
|
||||||
|
Oops: 0000 [#1] SMP
|
||||||
|
last sysfs file: /sys/devices/virtual/vc/vcsa3/uevent
|
||||||
|
|
||||||
|
Pid: 10993, comm: X Not tainted 2.6.35-rc2+ #67 /
|
||||||
|
EIP: 0060:[<c11a4a02>] EFLAGS: 00213202 CPU: 0
|
||||||
|
EIP is at i915_gem_do_execbuffer+0x71f/0xbb6
|
||||||
|
EAX: f647e8a8 EBX: 00000000 ECX: 00000003 EDX: 00000000
|
||||||
|
ESI: 00424000 EDI: 00000000 EBP: f6508e48 ESP: f6508dd4
|
||||||
|
DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
|
||||||
|
Process X (pid: 10993, ti=f6508000 task=f6432880 task.ti=f6508000)
|
||||||
|
Stack:
|
||||||
|
f6508de0 f7130000 00000001 00000000 00000000 f647e8a8 00000000 f64f8480
|
||||||
|
<0> f7974414 00000000 00000006 00000000 00000000 f6578000 00000008 00000006
|
||||||
|
<0> f6797880 00400000 00000000 ffffffe4 f7974400 000000d0 000000d0 000001c0
|
||||||
|
Call Trace:
|
||||||
|
[<c11a4f3a>] ? i915_gem_execbuffer2+0xa1/0xe7
|
||||||
|
[<c118ab96>] ? drm_ioctl+0x22c/0x2fa
|
||||||
|
[<c11a4e99>] ? i915_gem_execbuffer2+0x0/0xe7
|
||||||
|
[<c107e88c>] ? do_sync_read+0x8f/0xca
|
||||||
|
[<c1088cbd>] ? vfs_ioctl+0x2c/0x96
|
||||||
|
[<c118a96a>] ? drm_ioctl+0x0/0x2fa
|
||||||
|
[<c10891f4>] ? do_vfs_ioctl+0x429/0x45a
|
||||||
|
[<c107e5c9>] ? fsnotify_access+0x54/0x5f
|
||||||
|
[<c107ee1c>] ? vfs_read+0x9a/0xae
|
||||||
|
[<c1089258>] ? sys_ioctl+0x33/0x4d
|
||||||
|
[<c1002610>] ? sysenter_do_call+0x12/0x26
|
||||||
|
Code: d0 89 4d c4 31 c9 89 45 d8 eb 44 8b 45 cc 8b 14 88 8b 42 50 89 45
|
||||||
|
bc 8b 45 a0 8b 52 38 89 55 d0 31 d2 f6 40 20 01 74 0d 8b 55 bc <f6> 42
|
||||||
|
69 30 0f 95 c2 0f b6 d2 8b 45 d0 c7 45 d4 00 00 00 00 89
|
||||||
|
EIP: [<c11a4a02>] i915_gem_do_execbuffer+0x71f/0xbb6 SS:ESP 0068:f6508dd4
|
||||||
|
CR2: 0000000000000069
|
||||||
|
---[ end trace 3f1d514b34d39381 ]---
|
||||||
|
|
||||||
|
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
|
||||||
|
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
index 0743858..eb17cc3 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
@@ -3793,7 +3794,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
|
||||||
|
unsigned long long total_size = 0;
|
||||||
|
int num_fences = 0;
|
||||||
|
for (i = 0; i < args->buffer_count; i++) {
|
||||||
|
- obj_priv = object_list[i]->driver_private;
|
||||||
|
+ obj_priv = to_intel_bo(object_list[i]);
|
||||||
|
|
||||||
|
total_size += object_list[i]->size;
|
||||||
|
num_fences +=
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff -up linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_dp.c.dave linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_dp.c
|
||||||
|
--- linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_dp.c.dave 2010-06-25 16:30:13.000000000 +1000
|
||||||
|
+++ linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_dp.c 2010-06-25 16:30:23.000000000 +1000
|
||||||
|
@@ -129,7 +129,7 @@ intel_dp_link_required(struct drm_device
|
||||||
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
|
|
||||||
|
if (IS_eDP(intel_encoder))
|
||||||
|
- return (pixel_clock * dev_priv->edp_bpp) / 8;
|
||||||
|
+ return (pixel_clock * ALIGN(dev_priv->edp_bpp, 8)) / 8;
|
||||||
|
else
|
||||||
|
return pixel_clock * 3;
|
||||||
|
}
|
|
@ -0,0 +1,87 @@
|
||||||
|
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||||
|
Date: Sun, 26 Sep 2010 19:50:05 +0000 (+0100)
|
||||||
|
Subject: drm/i915: Sanity check pread/pwrite
|
||||||
|
X-Git-Tag: v2.6.36-rc7~17^2~1
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=ce9d419dbecc292cc3e06e8b1d6d123d3fa813a4
|
||||||
|
|
||||||
|
drm/i915: Sanity check pread/pwrite
|
||||||
|
|
||||||
|
Move the access control up from the fast paths, which are no longer
|
||||||
|
universally taken first, up into the caller. This then duplicates some
|
||||||
|
sanity checking along the slow paths, but is much simpler.
|
||||||
|
Tracked as CVE-2010-2962.
|
||||||
|
|
||||||
|
Reported-by: Kees Cook <kees@ubuntu.com>
|
||||||
|
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
|
||||||
|
Cc: stable@kernel.org
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
index cfe5978..7749e78 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
@@ -477,8 +477,15 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
|
||||||
|
*/
|
||||||
|
if (args->offset > obj->size || args->size > obj->size ||
|
||||||
|
args->offset + args->size > obj->size) {
|
||||||
|
- drm_gem_object_unreference_unlocked(obj);
|
||||||
|
- return -EINVAL;
|
||||||
|
+ ret = -EINVAL;
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!access_ok(VERIFY_WRITE,
|
||||||
|
+ (char __user *)(uintptr_t)args->data_ptr,
|
||||||
|
+ args->size)) {
|
||||||
|
+ ret = -EFAULT;
|
||||||
|
+ goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i915_gem_object_needs_bit17_swizzle(obj)) {
|
||||||
|
@@ -490,8 +497,8 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
|
||||||
|
file_priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
+err:
|
||||||
|
drm_gem_object_unreference_unlocked(obj);
|
||||||
|
-
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -580,8 +587,6 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev, struct drm_gem_object *obj,
|
||||||
|
|
||||||
|
user_data = (char __user *) (uintptr_t) args->data_ptr;
|
||||||
|
remain = args->size;
|
||||||
|
- if (!access_ok(VERIFY_READ, user_data, remain))
|
||||||
|
- return -EFAULT;
|
||||||
|
|
||||||
|
|
||||||
|
mutex_lock(&dev->struct_mutex);
|
||||||
|
@@ -940,8 +945,15 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
|
||||||
|
*/
|
||||||
|
if (args->offset > obj->size || args->size > obj->size ||
|
||||||
|
args->offset + args->size > obj->size) {
|
||||||
|
- drm_gem_object_unreference_unlocked(obj);
|
||||||
|
- return -EINVAL;
|
||||||
|
+ ret = -EINVAL;
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!access_ok(VERIFY_READ,
|
||||||
|
+ (char __user *)(uintptr_t)args->data_ptr,
|
||||||
|
+ args->size)) {
|
||||||
|
+ ret = -EFAULT;
|
||||||
|
+ goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We can only do the GTT pwrite on untiled buffers, as otherwise
|
||||||
|
@@ -975,8 +987,8 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
|
||||||
|
DRM_INFO("pwrite failed %d\n", ret);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+err:
|
||||||
|
drm_gem_object_unreference_unlocked(obj);
|
||||||
|
-
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
index 37427e4..08af9db 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
@@ -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 hamer for now to avoid random crashiness. */
|
||||||
|
+ if (IS_I85X(dev) || IS_I865G(dev))
|
||||||
|
+ wbinvd();
|
||||||
|
+
|
||||||
|
i915_verify_inactive(dev, __FILE__, __LINE__);
|
||||||
|
|
||||||
|
if (dev_priv->mm.wedged) {
|
|
@ -0,0 +1,245 @@
|
||||||
|
commit 96b6a8c56dbee75f61271f6484f56730beb17a20
|
||||||
|
Author: Zhenyu Wang <zhenyuw@linux.intel.com>
|
||||||
|
Date: Sun Sep 19 10:28:54 2010 +0800
|
||||||
|
|
||||||
|
agp/intel: fix dma mask bits on sandybridge
|
||||||
|
|
||||||
|
[This is backport patch from upstream 877fdacf.]
|
||||||
|
|
||||||
|
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||||
|
|
||||||
|
commit 1252894fa9ea0a4e73cb68f49f5913dda9834d6c
|
||||||
|
Author: Zhenyu Wang <zhenyuw@linux.intel.com>
|
||||||
|
Date: Sun Sep 19 10:28:53 2010 +0800
|
||||||
|
|
||||||
|
agp/intel: fix physical address mask bits for sandybridge
|
||||||
|
|
||||||
|
[This is backport patch from upstream 8dfc2b14.]
|
||||||
|
|
||||||
|
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||||
|
|
||||||
|
commit 6d51cdffcae15394f615489d57d8ca0e9a91e494
|
||||||
|
Author: Zhenyu Wang <zhenyuw@linux.intel.com>
|
||||||
|
Date: Sun Sep 19 10:28:52 2010 +0800
|
||||||
|
|
||||||
|
intel_agp, drm/i915: Add all sandybridge graphics devices support
|
||||||
|
|
||||||
|
New pci ids for all sandybridge graphics versions on desktop/mobile/server.
|
||||||
|
|
||||||
|
[This is backport patch from upstream commit 4fefe435 and 85540480.]
|
||||||
|
|
||||||
|
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||||
|
|
||||||
|
drivers/char/agp/intel-agp.c | 42 ++++++++++++++++++++++++----------
|
||||||
|
drivers/char/agp/intel-agp.h | 17 ++++++++++----
|
||||||
|
drivers/char/agp/intel-gtt.c | 47 +++++++++++++++++++++++++++++++++++++-
|
||||||
|
drivers/gpu/drm/i915/i915_drv.c | 5 ++++
|
||||||
|
4 files changed, 91 insertions(+), 20 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
|
||||||
|
index d836a71..fe9c6e0 100644
|
||||||
|
--- a/drivers/char/agp/intel-agp.c
|
||||||
|
+++ b/drivers/char/agp/intel-agp.c
|
||||||
|
@@ -815,17 +815,27 @@ static const struct intel_driver_description {
|
||||||
|
"HD Graphics", NULL, &intel_i965_driver },
|
||||||
|
{ PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG,
|
||||||
|
"HD Graphics", NULL, &intel_i965_driver },
|
||||||
|
- { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_IG,
|
||||||
|
- "Sandybridge", NULL, &intel_i965_driver },
|
||||||
|
- { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_IG,
|
||||||
|
- "Sandybridge", NULL, &intel_i965_driver },
|
||||||
|
+ { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT1_IG,
|
||||||
|
+ "Sandybridge", NULL, &intel_gen6_driver },
|
||||||
|
+ { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT2_IG,
|
||||||
|
+ "Sandybridge", NULL, &intel_gen6_driver },
|
||||||
|
+ { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT2_PLUS_IG,
|
||||||
|
+ "Sandybridge", NULL, &intel_gen6_driver },
|
||||||
|
+ { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT1_IG,
|
||||||
|
+ "Sandybridge", NULL, &intel_gen6_driver },
|
||||||
|
+ { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT2_IG,
|
||||||
|
+ "Sandybridge", NULL, &intel_gen6_driver },
|
||||||
|
+ { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT2_PLUS_IG,
|
||||||
|
+ "Sandybridge", NULL, &intel_gen6_driver },
|
||||||
|
+ { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_IG,
|
||||||
|
+ "Sandybridge", NULL, &intel_gen6_driver },
|
||||||
|
{ 0, 0, NULL, NULL, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __devinit intel_gmch_probe(struct pci_dev *pdev,
|
||||||
|
struct agp_bridge_data *bridge)
|
||||||
|
{
|
||||||
|
- int i;
|
||||||
|
+ int i, mask;
|
||||||
|
bridge->driver = NULL;
|
||||||
|
|
||||||
|
for (i = 0; intel_agp_chipsets[i].name != NULL; i++) {
|
||||||
|
@@ -845,14 +855,19 @@ static int __devinit intel_gmch_probe(struct pci_dev *pdev,
|
||||||
|
|
||||||
|
dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name);
|
||||||
|
|
||||||
|
- if (bridge->driver->mask_memory == intel_i965_mask_memory) {
|
||||||
|
- if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(36)))
|
||||||
|
- dev_err(&intel_private.pcidev->dev,
|
||||||
|
- "set gfx device dma mask 36bit failed!\n");
|
||||||
|
- else
|
||||||
|
- pci_set_consistent_dma_mask(intel_private.pcidev,
|
||||||
|
- DMA_BIT_MASK(36));
|
||||||
|
- }
|
||||||
|
+ if (bridge->driver->mask_memory == intel_gen6_mask_memory)
|
||||||
|
+ mask = 40;
|
||||||
|
+ else if (bridge->driver->mask_memory == intel_i965_mask_memory)
|
||||||
|
+ mask = 36;
|
||||||
|
+ else
|
||||||
|
+ mask = 32;
|
||||||
|
+
|
||||||
|
+ if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(mask)))
|
||||||
|
+ dev_err(&intel_private.pcidev->dev,
|
||||||
|
+ "set gfx device dma mask %d-bit failed!\n", mask);
|
||||||
|
+ else
|
||||||
|
+ pci_set_consistent_dma_mask(intel_private.pcidev,
|
||||||
|
+ DMA_BIT_MASK(mask));
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
@@ -1036,6 +1051,7 @@ static struct pci_device_id agp_intel_pci_table[] = {
|
||||||
|
ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB),
|
||||||
|
ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB),
|
||||||
|
ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB),
|
||||||
|
+ ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_HB),
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/drivers/char/agp/intel-agp.h b/drivers/char/agp/intel-agp.h
|
||||||
|
index 2547465..ffa87b7 100644
|
||||||
|
--- a/drivers/char/agp/intel-agp.h
|
||||||
|
+++ b/drivers/char/agp/intel-agp.h
|
||||||
|
@@ -194,10 +194,16 @@
|
||||||
|
#define PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB 0x0062
|
||||||
|
#define PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB 0x006a
|
||||||
|
#define PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG 0x0046
|
||||||
|
-#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB 0x0100
|
||||||
|
-#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_IG 0x0102
|
||||||
|
-#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB 0x0104
|
||||||
|
-#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_IG 0x0106
|
||||||
|
+#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB 0x0100 /* Desktop */
|
||||||
|
+#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT1_IG 0x0102
|
||||||
|
+#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT2_IG 0x0112
|
||||||
|
+#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT2_PLUS_IG 0x0122
|
||||||
|
+#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB 0x0104 /* Mobile */
|
||||||
|
+#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT1_IG 0x0106
|
||||||
|
+#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT2_IG 0x0116
|
||||||
|
+#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT2_PLUS_IG 0x0126
|
||||||
|
+#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_HB 0x0108 /* Server */
|
||||||
|
+#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_IG 0x010A
|
||||||
|
|
||||||
|
/* cover 915 and 945 variants */
|
||||||
|
#define IS_I915 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_E7221_HB || \
|
||||||
|
@@ -224,7 +230,8 @@
|
||||||
|
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_PINEVIEW_HB)
|
||||||
|
|
||||||
|
#define IS_SNB (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB || \
|
||||||
|
- agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB)
|
||||||
|
+ agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB || \
|
||||||
|
+ agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_HB)
|
||||||
|
|
||||||
|
#define IS_G4X (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_EAGLELAKE_HB || \
|
||||||
|
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q45_HB || \
|
||||||
|
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c
|
||||||
|
index ea6997e..ed11c77 100644
|
||||||
|
--- a/drivers/char/agp/intel-gtt.c
|
||||||
|
+++ b/drivers/char/agp/intel-gtt.c
|
||||||
|
@@ -585,8 +585,7 @@ static void intel_i830_init_gtt_entries(void)
|
||||||
|
gtt_entries = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
- } else if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB ||
|
||||||
|
- agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB) {
|
||||||
|
+ } else if (IS_SNB) {
|
||||||
|
/*
|
||||||
|
* SandyBridge has new memory control reg at 0x50.w
|
||||||
|
*/
|
||||||
|
@@ -1318,6 +1317,16 @@ static unsigned long intel_i965_mask_memory(struct agp_bridge_data *bridge,
|
||||||
|
return addr | bridge->driver->masks[type].mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static unsigned long intel_gen6_mask_memory(struct agp_bridge_data *bridge,
|
||||||
|
+ dma_addr_t addr, int type)
|
||||||
|
+{
|
||||||
|
+ /* gen6 has bit11-4 for physical addr bit39-32 */
|
||||||
|
+ addr |= (addr >> 28) & 0xff0;
|
||||||
|
+
|
||||||
|
+ /* Type checking must be done elsewhere */
|
||||||
|
+ return addr | bridge->driver->masks[type].mask;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void intel_i965_get_gtt_range(int *gtt_offset, int *gtt_size)
|
||||||
|
{
|
||||||
|
u16 snb_gmch_ctl;
|
||||||
|
@@ -1337,6 +1346,7 @@ static void intel_i965_get_gtt_range(int *gtt_offset, int *gtt_size)
|
||||||
|
break;
|
||||||
|
case PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB:
|
||||||
|
case PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB:
|
||||||
|
+ case PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_HB:
|
||||||
|
*gtt_offset = MB(2);
|
||||||
|
|
||||||
|
pci_read_config_word(intel_private.pcidev, SNB_GMCH_CTRL, &snb_gmch_ctl);
|
||||||
|
@@ -1526,6 +1536,39 @@ static const struct agp_bridge_driver intel_i965_driver = {
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct agp_bridge_driver intel_gen6_driver = {
|
||||||
|
+ .owner = THIS_MODULE,
|
||||||
|
+ .aperture_sizes = intel_i830_sizes,
|
||||||
|
+ .size_type = FIXED_APER_SIZE,
|
||||||
|
+ .num_aperture_sizes = 4,
|
||||||
|
+ .needs_scratch_page = true,
|
||||||
|
+ .configure = intel_i9xx_configure,
|
||||||
|
+ .fetch_size = intel_i9xx_fetch_size,
|
||||||
|
+ .cleanup = intel_i915_cleanup,
|
||||||
|
+ .mask_memory = intel_gen6_mask_memory,
|
||||||
|
+ .masks = intel_i810_masks,
|
||||||
|
+ .agp_enable = intel_i810_agp_enable,
|
||||||
|
+ .cache_flush = global_cache_flush,
|
||||||
|
+ .create_gatt_table = intel_i965_create_gatt_table,
|
||||||
|
+ .free_gatt_table = intel_i830_free_gatt_table,
|
||||||
|
+ .insert_memory = intel_i915_insert_entries,
|
||||||
|
+ .remove_memory = intel_i915_remove_entries,
|
||||||
|
+ .alloc_by_type = intel_i830_alloc_by_type,
|
||||||
|
+ .free_by_type = intel_i810_free_by_type,
|
||||||
|
+ .agp_alloc_page = agp_generic_alloc_page,
|
||||||
|
+ .agp_alloc_pages = agp_generic_alloc_pages,
|
||||||
|
+ .agp_destroy_page = agp_generic_destroy_page,
|
||||||
|
+ .agp_destroy_pages = agp_generic_destroy_pages,
|
||||||
|
+ .agp_type_to_mask_type = intel_i830_type_to_mask_type,
|
||||||
|
+ .chipset_flush = intel_i915_chipset_flush,
|
||||||
|
+#ifdef USE_PCI_DMA_API
|
||||||
|
+ .agp_map_page = intel_agp_map_page,
|
||||||
|
+ .agp_unmap_page = intel_agp_unmap_page,
|
||||||
|
+ .agp_map_memory = intel_agp_map_memory,
|
||||||
|
+ .agp_unmap_memory = intel_agp_unmap_memory,
|
||||||
|
+#endif
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct agp_bridge_driver intel_g33_driver = {
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
.aperture_sizes = intel_i830_sizes,
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
|
||||||
|
index 423dc90..07a0cf1 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_drv.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_drv.c
|
||||||
|
@@ -180,7 +180,12 @@ static const struct pci_device_id pciidlist[] = {
|
||||||
|
INTEL_VGA_DEVICE(0x0042, &intel_ironlake_d_info),
|
||||||
|
INTEL_VGA_DEVICE(0x0046, &intel_ironlake_m_info),
|
||||||
|
INTEL_VGA_DEVICE(0x0102, &intel_sandybridge_d_info),
|
||||||
|
+ INTEL_VGA_DEVICE(0x0112, &intel_sandybridge_d_info),
|
||||||
|
+ INTEL_VGA_DEVICE(0x0122, &intel_sandybridge_d_info),
|
||||||
|
INTEL_VGA_DEVICE(0x0106, &intel_sandybridge_m_info),
|
||||||
|
+ INTEL_VGA_DEVICE(0x0116, &intel_sandybridge_m_info),
|
||||||
|
+ INTEL_VGA_DEVICE(0x0126, &intel_sandybridge_m_info),
|
||||||
|
+ INTEL_VGA_DEVICE(0x010A, &intel_sandybridge_d_info),
|
||||||
|
{0, 0, 0}
|
||||||
|
};
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
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->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;
|
||||||
|
@@ -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 output back off if necessary */
|
|
@ -0,0 +1 @@
|
||||||
|
empty
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,29 @@
|
||||||
|
From 3a25c2ea8bd898dff218ef8baa09ea1f05a60b48 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
Date: Fri, 10 Sep 2010 15:33:11 +1000
|
||||||
|
Subject: [PATCH] drm/nouveau: we can't free ACPI EDID, so make a copy that we can
|
||||||
|
|
||||||
|
The rest of the connector code assumes we can kfree() the EDID pointer.
|
||||||
|
This causes things to blow up with the ACPI EDID pointer we get
|
||||||
|
passed.
|
||||||
|
|
||||||
|
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_acpi.c | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c
|
||||||
|
index c17a055..1191526 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_acpi.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c
|
||||||
|
@@ -292,6 +292,6 @@ nouveau_acpi_edid(struct drm_device *dev, struct drm_connector *connector)
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
- nv_connector->edid = edid;
|
||||||
|
+ nv_connector->edid = kmemdup(edid, EDID_LENGTH, GFP_KERNEL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.7.2.2
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
From 55647c139cf7d6caeaa08a99b2165763a02ab71a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
Date: Thu, 30 Sep 2010 09:09:42 +1000
|
||||||
|
Subject: [PATCH] drm/nv50: prevent (IB_PUT == IB_GET) for occurring unless idle
|
||||||
|
|
||||||
|
Should fix a DMA race condition I've never seen myself, but could be
|
||||||
|
the culprit in some random hangs that have been reported.
|
||||||
|
|
||||||
|
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_dma.c | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_dma.c b/drivers/gpu/drm/nouveau/nouveau_dma.c
|
||||||
|
index 9d27acd..eb24e2b 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_dma.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_dma.c
|
||||||
|
@@ -214,7 +214,7 @@ nv50_dma_push_wait(struct nouveau_channel *chan, int count)
|
||||||
|
|
||||||
|
chan->dma.ib_free = get - chan->dma.ib_put;
|
||||||
|
if (chan->dma.ib_free <= 0)
|
||||||
|
- chan->dma.ib_free += chan->dma.ib_max + 1;
|
||||||
|
+ chan->dma.ib_free += chan->dma.ib_max;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
--
|
||||||
|
1.7.2.2
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
From b4403874d7df4aa6650da412b707c17754a6e105 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
Date: Tue, 17 Aug 2010 14:20:29 +1000
|
||||||
|
Subject: [PATCH] drm-nouveau-nv50-crtc-update-delay
|
||||||
|
|
||||||
|
rhbz#614552
|
||||||
|
|
||||||
|
Adds a short delay before doing framebuffer-only CRTC updates. Fixes
|
||||||
|
an issue that effects some cards (Quadro NVS295/FX580) where two of
|
||||||
|
these updates in quick succession hangs the display engine.
|
||||||
|
|
||||||
|
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/nouveau/nv50_crtc.c | 3 +++
|
||||||
|
1 files changed, 3 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nv50_crtc.c b/drivers/gpu/drm/nouveau/nv50_crtc.c
|
||||||
|
index 5d11ea1..937adfd 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nv50_crtc.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nv50_crtc.c
|
||||||
|
@@ -521,6 +521,9 @@ nv50_crtc_do_mode_set_base(struct drm_crtc *crtc, int x, int y,
|
||||||
|
nouveau_bo_unpin(ofb->nvbo);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (update)
|
||||||
|
+ mdelay(1);
|
||||||
|
+
|
||||||
|
nv_crtc->fb.offset = fb->nvbo->bo.offset - dev_priv->vm_vram_base;
|
||||||
|
nv_crtc->fb.tile_flags = fb->nvbo->tile_flags;
|
||||||
|
nv_crtc->fb.cpp = drm_fb->bits_per_pixel / 8;
|
||||||
|
--
|
||||||
|
1.7.2
|
||||||
|
|
|
@ -0,0 +1,107 @@
|
||||||
|
From 030e105efc9a29c7d34fb59fb0e0a40e54178299 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
Date: Wed, 30 Jun 2010 13:34:05 +1000
|
||||||
|
Subject: [PATCH] drm/nouveau: disable acceleration on NVA3/NVA5/NVA8 by default
|
||||||
|
|
||||||
|
There's an GPU lockup problem for which the cause is currently unknown
|
||||||
|
on these chipsets.
|
||||||
|
|
||||||
|
Until it's resolved, it's better to leave the user with a working system
|
||||||
|
without acceleration than to have random lockups.
|
||||||
|
|
||||||
|
With this patch, acceleration will be off by default if a known problem
|
||||||
|
chipset is detected, but can be re-enabled with nouveau.noaccel=0 on
|
||||||
|
the kernel commandline.
|
||||||
|
|
||||||
|
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_drv.c | 2 +-
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_drv.h | 1 +
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_state.c | 23 +++++++++++++++++++----
|
||||||
|
3 files changed, 21 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.c b/drivers/gpu/drm/nouveau/nouveau_drv.c
|
||||||
|
index b4d958c..02b564c 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_drv.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.c
|
||||||
|
@@ -72,7 +72,7 @@ int nouveau_ignorelid = 0;
|
||||||
|
module_param_named(ignorelid, nouveau_ignorelid, int, 0400);
|
||||||
|
|
||||||
|
MODULE_PARM_DESC(noaccel, "Disable all acceleration");
|
||||||
|
-int nouveau_noaccel = 0;
|
||||||
|
+int nouveau_noaccel = -1;
|
||||||
|
module_param_named(noaccel, nouveau_noaccel, int, 0400);
|
||||||
|
|
||||||
|
MODULE_PARM_DESC(nofbaccel, "Disable fbcon acceleration");
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
|
||||||
|
index 022648e..76ec783 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
|
||||||
|
@@ -493,6 +493,7 @@ enum nouveau_card_type {
|
||||||
|
|
||||||
|
struct drm_nouveau_private {
|
||||||
|
struct drm_device *dev;
|
||||||
|
+ bool noaccel;
|
||||||
|
|
||||||
|
/* the card type, takes NV_* as values */
|
||||||
|
enum nouveau_card_type card_type;
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
|
||||||
|
index 63c2d24..866f437 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_state.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
|
||||||
|
@@ -454,7 +454,7 @@ nouveau_card_init(struct drm_device *dev)
|
||||||
|
if (ret)
|
||||||
|
goto out_timer;
|
||||||
|
|
||||||
|
- if (nouveau_noaccel)
|
||||||
|
+ if (dev_priv->noaccel)
|
||||||
|
engine->graph.accel_blocked = true;
|
||||||
|
else {
|
||||||
|
/* PGRAPH */
|
||||||
|
@@ -509,10 +509,10 @@ out_display:
|
||||||
|
else
|
||||||
|
nv04_display_destroy(dev);
|
||||||
|
out_fifo:
|
||||||
|
- if (!nouveau_noaccel)
|
||||||
|
+ if (!dev_priv->noaccel)
|
||||||
|
engine->fifo.takedown(dev);
|
||||||
|
out_graph:
|
||||||
|
- if (!nouveau_noaccel)
|
||||||
|
+ if (!dev_priv->noaccel)
|
||||||
|
engine->graph.takedown(dev);
|
||||||
|
out_fb:
|
||||||
|
engine->fb.takedown(dev);
|
||||||
|
@@ -548,7 +548,7 @@ static void nouveau_card_takedown(struct drm_device *dev)
|
||||||
|
dev_priv->channel = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!nouveau_noaccel) {
|
||||||
|
+ if (!dev_priv->noaccel) {
|
||||||
|
engine->fifo.takedown(dev);
|
||||||
|
engine->graph.takedown(dev);
|
||||||
|
}
|
||||||
|
@@ -744,6 +744,21 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
+ if (nouveau_noaccel == -1) {
|
||||||
|
+ switch (dev_priv->chipset) {
|
||||||
|
+ case 0xa3:
|
||||||
|
+ case 0xa5:
|
||||||
|
+ case 0xa8:
|
||||||
|
+ dev_priv->noaccel = true;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ dev_priv->noaccel = false;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ dev_priv->noaccel = (nouveau_noaccel != 0);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Map PRAMIN BAR, or on older cards, the aperture withing BAR0 */
|
||||||
|
if (dev_priv->card_type >= NV_40) {
|
||||||
|
int ramin_bar = 2;
|
||||||
|
--
|
||||||
|
1.7.2
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
From ef0744eff71f519db7641313d1588289f5cb49d2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
Date: Wed, 8 Sep 2010 15:40:30 +1000
|
||||||
|
Subject: [PATCH] drm/nouveau: handle fifo pusher errors better
|
||||||
|
|
||||||
|
The most important part of this change is that we now instruct PFIFO to
|
||||||
|
drop all pending fetches, rather than attempting to skip a single dword
|
||||||
|
and hope that things would magically sort themselves out - they usually
|
||||||
|
don't, and we end up with PFIFO being completely hung.
|
||||||
|
|
||||||
|
This commit also adds somewhat more useful logging when these exceptions
|
||||||
|
occur.
|
||||||
|
|
||||||
|
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_irq.c | 45 +++++++++++++++++++++++++++------
|
||||||
|
1 files changed, 37 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_irq.c b/drivers/gpu/drm/nouveau/nouveau_irq.c
|
||||||
|
index 53360f1..a0f31e4 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_irq.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_irq.c
|
||||||
|
@@ -200,16 +200,45 @@ nouveau_fifo_irq_handler(struct drm_device *dev)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status & NV_PFIFO_INTR_DMA_PUSHER) {
|
||||||
|
- NV_INFO(dev, "PFIFO_DMA_PUSHER - Ch %d\n", chid);
|
||||||
|
+ u32 get = nv_rd32(dev, 0x003244);
|
||||||
|
+ u32 put = nv_rd32(dev, 0x003240);
|
||||||
|
+ u32 push = nv_rd32(dev, 0x003220);
|
||||||
|
+ u32 state = nv_rd32(dev, 0x003228);
|
||||||
|
+
|
||||||
|
+ if (dev_priv->card_type == NV_50) {
|
||||||
|
+ u32 ho_get = nv_rd32(dev, 0x003328);
|
||||||
|
+ u32 ho_put = nv_rd32(dev, 0x003320);
|
||||||
|
+ u32 ib_get = nv_rd32(dev, 0x003334);
|
||||||
|
+ u32 ib_put = nv_rd32(dev, 0x003330);
|
||||||
|
+
|
||||||
|
+ NV_INFO(dev, "PFIFO_DMA_PUSHER - Ch %d Get 0x%02x%08x "
|
||||||
|
+ "Put 0x%02x%08x IbGet 0x%08x IbPut 0x%08x "
|
||||||
|
+ "State 0x%08x Push 0x%08x\n",
|
||||||
|
+ chid, ho_get, get, ho_put, put, ib_get, ib_put,
|
||||||
|
+ state, push);
|
||||||
|
+
|
||||||
|
+ /* METHOD_COUNT, in DMA_STATE on earlier chipsets */
|
||||||
|
+ nv_wr32(dev, 0x003364, 0x00000000);
|
||||||
|
+ if (get != put || ho_get != ho_put) {
|
||||||
|
+ nv_wr32(dev, 0x003244, put);
|
||||||
|
+ nv_wr32(dev, 0x003328, ho_put);
|
||||||
|
+ } else
|
||||||
|
+ if (ib_get != ib_put) {
|
||||||
|
+ nv_wr32(dev, 0x003334, ib_put);
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ NV_INFO(dev, "PFIFO_DMA_PUSHER - Ch %d Get 0x%08x "
|
||||||
|
+ "Put 0x%08x State 0x%08x Push 0x%08x\n",
|
||||||
|
+ chid, get, put, state, push);
|
||||||
|
|
||||||
|
- status &= ~NV_PFIFO_INTR_DMA_PUSHER;
|
||||||
|
- nv_wr32(dev, NV03_PFIFO_INTR_0,
|
||||||
|
- NV_PFIFO_INTR_DMA_PUSHER);
|
||||||
|
+ if (get != put)
|
||||||
|
+ nv_wr32(dev, 0x003244, put);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- nv_wr32(dev, NV04_PFIFO_CACHE1_DMA_STATE, 0x00000000);
|
||||||
|
- if (nv_rd32(dev, NV04_PFIFO_CACHE1_DMA_PUT) != get)
|
||||||
|
- nv_wr32(dev, NV04_PFIFO_CACHE1_DMA_GET,
|
||||||
|
- get + 4);
|
||||||
|
+ nv_wr32(dev, 0x003228, 0x00000000);
|
||||||
|
+ nv_wr32(dev, 0x003220, 0x00000001);
|
||||||
|
+ nv_wr32(dev, 0x002100, NV_PFIFO_INTR_DMA_PUSHER);
|
||||||
|
+ status &= ~NV_PFIFO_INTR_DMA_PUSHER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status & NV_PFIFO_INTR_SEMAPHORE) {
|
||||||
|
--
|
||||||
|
1.7.2.2
|
|
@ -0,0 +1,139 @@
|
||||||
|
From cfff162fe5d7a69a6a77cef306866145bf5b0567 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
Date: Fri, 23 Jul 2010 09:06:52 +1000
|
||||||
|
Subject: [PATCH] drm/nouveau: fix race condition when under memory pressure
|
||||||
|
|
||||||
|
rhbz#602663
|
||||||
|
|
||||||
|
When VRAM is running out it's possible that the client's push buffers get
|
||||||
|
evicted to main memory. When they're validated back in, the GPU may
|
||||||
|
be used for the copy back to VRAM, but the existing synchronisation code
|
||||||
|
only deals with inter-channel sync, not sync between PFIFO and PGRAPH on
|
||||||
|
the same channel. This leads to PFIFO fetching from command buffers that
|
||||||
|
haven't quite been copied by PGRAPH yet.
|
||||||
|
|
||||||
|
This patch marks push buffers as so, and forces any GPU-assisted buffer
|
||||||
|
moves to be done on a different channel, which triggers the correct
|
||||||
|
synchronisation to happen before we submit them.
|
||||||
|
|
||||||
|
After discussion with another nouveau developer, it was agreed that while
|
||||||
|
this patch is fine in itself, that we'd prefer to work out a nicer, but
|
||||||
|
likely much more invasive, fix upstream.
|
||||||
|
|
||||||
|
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_bo.c | 15 +++++++++++++
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_drv.h | 1 +
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_gem.c | 36 +++++++++++++++++++++++---------
|
||||||
|
3 files changed, 42 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
|
||||||
|
index d8c341d..494a219 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
|
||||||
|
@@ -36,6 +36,21 @@
|
||||||
|
#include <linux/log2.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
|
||||||
|
+int
|
||||||
|
+nouveau_bo_sync_gpu(struct nouveau_bo *nvbo, struct nouveau_channel *chan)
|
||||||
|
+{
|
||||||
|
+ struct nouveau_fence *prev_fence = nvbo->bo.sync_obj;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ if (!prev_fence || nouveau_fence_channel(prev_fence) == chan)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ spin_lock(&nvbo->bo.lock);
|
||||||
|
+ ret = ttm_bo_wait(&nvbo->bo, false, false, false);
|
||||||
|
+ spin_unlock(&nvbo->bo.lock);
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
nouveau_bo_del_ttm(struct ttm_buffer_object *bo)
|
||||||
|
{
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
|
||||||
|
index 51ccd90..022648e 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
|
||||||
|
@@ -1098,6 +1098,7 @@ extern u16 nouveau_bo_rd16(struct nouveau_bo *nvbo, unsigned index);
|
||||||
|
extern void nouveau_bo_wr16(struct nouveau_bo *nvbo, unsigned index, u16 val);
|
||||||
|
extern u32 nouveau_bo_rd32(struct nouveau_bo *nvbo, unsigned index);
|
||||||
|
extern void nouveau_bo_wr32(struct nouveau_bo *nvbo, unsigned index, u32 val);
|
||||||
|
+extern int nouveau_bo_sync_gpu(struct nouveau_bo *, struct nouveau_channel *);
|
||||||
|
|
||||||
|
/* nouveau_fence.c */
|
||||||
|
struct nouveau_fence;
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
|
||||||
|
index 547f2c2..a915dcd 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
|
||||||
|
@@ -361,16 +361,11 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
|
||||||
|
|
||||||
|
list_for_each_entry(nvbo, list, entry) {
|
||||||
|
struct drm_nouveau_gem_pushbuf_bo *b = &pbbo[nvbo->pbbo_index];
|
||||||
|
- struct nouveau_fence *prev_fence = nvbo->bo.sync_obj;
|
||||||
|
|
||||||
|
- if (prev_fence && nouveau_fence_channel(prev_fence) != chan) {
|
||||||
|
- spin_lock(&nvbo->bo.lock);
|
||||||
|
- ret = ttm_bo_wait(&nvbo->bo, false, false, false);
|
||||||
|
- spin_unlock(&nvbo->bo.lock);
|
||||||
|
- if (unlikely(ret)) {
|
||||||
|
- NV_ERROR(dev, "fail wait other chan\n");
|
||||||
|
- return ret;
|
||||||
|
- }
|
||||||
|
+ ret = nouveau_bo_sync_gpu(nvbo, chan);
|
||||||
|
+ if (unlikely(ret)) {
|
||||||
|
+ NV_ERROR(dev, "fail pre-validate sync\n");
|
||||||
|
+ return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = nouveau_gem_set_domain(nvbo->gem, b->read_domains,
|
||||||
|
@@ -381,7 +376,7 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
- nvbo->channel = chan;
|
||||||
|
+ nvbo->channel = (b->read_domains & (1 << 31)) ? NULL : chan;
|
||||||
|
ret = ttm_bo_validate(&nvbo->bo, &nvbo->placement,
|
||||||
|
false, false, false);
|
||||||
|
nvbo->channel = NULL;
|
||||||
|
@@ -390,6 +385,12 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ ret = nouveau_bo_sync_gpu(nvbo, chan);
|
||||||
|
+ if (unlikely(ret)) {
|
||||||
|
+ NV_ERROR(dev, "fail post-validate sync\n");
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (nvbo->bo.offset == b->presumed.offset &&
|
||||||
|
((nvbo->bo.mem.mem_type == TTM_PL_VRAM &&
|
||||||
|
b->presumed.domain & NOUVEAU_GEM_DOMAIN_VRAM) ||
|
||||||
|
@@ -615,6 +616,21 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
|
||||||
|
|
||||||
|
mutex_lock(&dev->struct_mutex);
|
||||||
|
|
||||||
|
+ /* Mark push buffers as being used on PFIFO, the validation code
|
||||||
|
+ * will then make sure that if the pushbuf bo moves, that they
|
||||||
|
+ * happen on the kernel channel, which will in turn cause a sync
|
||||||
|
+ * to happen before we try and submit the push buffer.
|
||||||
|
+ */
|
||||||
|
+ for (i = 0; i < req->nr_push; i++) {
|
||||||
|
+ if (push[i].bo_index >= req->nr_buffers) {
|
||||||
|
+ NV_ERROR(dev, "push %d buffer not in list\n", i);
|
||||||
|
+ ret = -EINVAL;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ bo[push[i].bo_index].read_domains |= (1 << 31);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Validate buffer list */
|
||||||
|
ret = nouveau_gem_pushbuf_validate(chan, file_priv, bo, req->buffers,
|
||||||
|
req->nr_buffers, &op, &do_reloc);
|
||||||
|
--
|
||||||
|
1.7.2
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,32 @@
|
||||||
|
commit 93d2725f536c17a85c35051beb4c41b7c1707db0
|
||||||
|
Author: Alex Deucher <alexdeucher@gmail.com>
|
||||||
|
Date: Mon Oct 25 19:44:00 2010 -0400
|
||||||
|
|
||||||
|
drm/radeon/kms: MC vram map needs to be >= pci aperture size
|
||||||
|
|
||||||
|
The vram map in the radeon memory controller needs to be
|
||||||
|
>= the pci aperture size. Fixes:
|
||||||
|
https://bugs.freedesktop.org/show_bug.cgi?id=28402
|
||||||
|
|
||||||
|
The problematic cards in the above bug have 64 MB of vram,
|
||||||
|
but the pci aperture is 128 MB and the MC vram map was only
|
||||||
|
64 MB. This can lead to hangs.
|
||||||
|
|
||||||
|
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
|
||||||
|
Cc: stable@kernel.org
|
||||||
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
|
||||||
|
index a89a15a..a3378ba 100644
|
||||||
|
--- a/drivers/gpu/drm/radeon/r100.c
|
||||||
|
+++ b/drivers/gpu/drm/radeon/r100.c
|
||||||
|
@@ -2321,6 +2321,9 @@ void r100_vram_init_sizes(struct radeon_device *rdev)
|
||||||
|
/* Fix for RN50, M6, M7 with 8/16/32(??) MBs of VRAM -
|
||||||
|
* Novell bug 204882 + along with lots of ubuntu ones
|
||||||
|
*/
|
||||||
|
+ if (rdev->mc.aper_size > config_aper_size)
|
||||||
|
+ config_aper_size = rdev->mc.aper_size;
|
||||||
|
+
|
||||||
|
if (config_aper_size > rdev->mc.real_vram_size)
|
||||||
|
rdev->mc.mc_vram_size = config_aper_size;
|
||||||
|
else
|
|
@ -0,0 +1,151 @@
|
||||||
|
diff -ur linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon_device.c radeon-fixes.i686/drivers/gpu/drm/radeon/radeon_device.c
|
||||||
|
--- linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon_device.c 2010-09-02 21:50:43.000000000 +1000
|
||||||
|
+++ radeon-fixes.i686/drivers/gpu/drm/radeon/radeon_device.c 2010-09-02 21:13:09.000000000 +1000
|
||||||
|
@@ -777,6 +777,7 @@
|
||||||
|
|
||||||
|
int radeon_resume_kms(struct drm_device *dev)
|
||||||
|
{
|
||||||
|
+ struct drm_connector *connector;
|
||||||
|
struct radeon_device *rdev = dev->dev_private;
|
||||||
|
|
||||||
|
if (rdev->powered_down)
|
||||||
|
@@ -795,6 +796,12 @@
|
||||||
|
radeon_resume(rdev);
|
||||||
|
radeon_pm_resume(rdev);
|
||||||
|
radeon_restore_bios_scratch_regs(rdev);
|
||||||
|
+
|
||||||
|
+ /* turn on display hw */
|
||||||
|
+ list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||||
|
+ drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
radeon_fbdev_set_suspend(rdev, 0);
|
||||||
|
release_console_sem();
|
||||||
|
|
||||||
|
diff -ur linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon.h radeon-fixes.i686/drivers/gpu/drm/radeon/radeon.h
|
||||||
|
--- linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon.h 2010-09-02 21:50:42.000000000 +1000
|
||||||
|
+++ radeon-fixes.i686/drivers/gpu/drm/radeon/radeon.h 2010-09-02 21:36:50.000000000 +1000
|
||||||
|
@@ -620,7 +620,8 @@
|
||||||
|
DYNPM_STATE_DISABLED,
|
||||||
|
DYNPM_STATE_MINIMUM,
|
||||||
|
DYNPM_STATE_PAUSED,
|
||||||
|
- DYNPM_STATE_ACTIVE
|
||||||
|
+ DYNPM_STATE_ACTIVE,
|
||||||
|
+ DYNPM_STATE_SUSPENDED,
|
||||||
|
};
|
||||||
|
enum radeon_dynpm_action {
|
||||||
|
DYNPM_ACTION_NONE,
|
||||||
|
diff -ur linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon_pm.c radeon-fixes.i686/drivers/gpu/drm/radeon/radeon_pm.c
|
||||||
|
--- linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon_pm.c 2010-09-02 21:50:42.000000000 +1000
|
||||||
|
+++ radeon-fixes.i686/drivers/gpu/drm/radeon/radeon_pm.c 2010-09-02 21:36:50.000000000 +1000
|
||||||
|
@@ -397,13 +397,20 @@
|
||||||
|
rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT;
|
||||||
|
mutex_unlock(&rdev->pm.mutex);
|
||||||
|
} else if (strncmp("profile", buf, strlen("profile")) == 0) {
|
||||||
|
+ bool flush_wq = false;
|
||||||
|
+
|
||||||
|
mutex_lock(&rdev->pm.mutex);
|
||||||
|
- rdev->pm.pm_method = PM_METHOD_PROFILE;
|
||||||
|
+ if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
|
||||||
|
+ cancel_delayed_work(&rdev->pm.dynpm_idle_work);
|
||||||
|
+ flush_wq = true;
|
||||||
|
+ }
|
||||||
|
/* disable dynpm */
|
||||||
|
rdev->pm.dynpm_state = DYNPM_STATE_DISABLED;
|
||||||
|
rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE;
|
||||||
|
- cancel_delayed_work(&rdev->pm.dynpm_idle_work);
|
||||||
|
+ rdev->pm.pm_method = PM_METHOD_PROFILE;
|
||||||
|
mutex_unlock(&rdev->pm.mutex);
|
||||||
|
+ if (flush_wq)
|
||||||
|
+ flush_workqueue(rdev->wq);
|
||||||
|
} else {
|
||||||
|
DRM_ERROR("invalid power method!\n");
|
||||||
|
goto fail;
|
||||||
|
@@ -418,9 +425,18 @@
|
||||||
|
|
||||||
|
void radeon_pm_suspend(struct radeon_device *rdev)
|
||||||
|
{
|
||||||
|
+ bool flush_wq = false;
|
||||||
|
+
|
||||||
|
mutex_lock(&rdev->pm.mutex);
|
||||||
|
- cancel_delayed_work(&rdev->pm.dynpm_idle_work);
|
||||||
|
+ if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
|
||||||
|
+ cancel_delayed_work(&rdev->pm.dynpm_idle_work);
|
||||||
|
+ if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE)
|
||||||
|
+ rdev->pm.dynpm_state = DYNPM_STATE_SUSPENDED;
|
||||||
|
+ flush_wq = true;
|
||||||
|
+ }
|
||||||
|
mutex_unlock(&rdev->pm.mutex);
|
||||||
|
+ if (flush_wq)
|
||||||
|
+ flush_workqueue(rdev->wq);
|
||||||
|
}
|
||||||
|
|
||||||
|
void radeon_pm_resume(struct radeon_device *rdev)
|
||||||
|
@@ -432,6 +448,12 @@
|
||||||
|
rdev->pm.current_sclk = rdev->clock.default_sclk;
|
||||||
|
rdev->pm.current_mclk = rdev->clock.default_mclk;
|
||||||
|
rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage;
|
||||||
|
+ if (rdev->pm.pm_method == PM_METHOD_DYNPM
|
||||||
|
+ && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) {
|
||||||
|
+ rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE;
|
||||||
|
+ queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work,
|
||||||
|
+ msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
|
||||||
|
+ }
|
||||||
|
mutex_unlock(&rdev->pm.mutex);
|
||||||
|
radeon_pm_compute_clocks(rdev);
|
||||||
|
}
|
||||||
|
@@ -486,6 +508,8 @@
|
||||||
|
void radeon_pm_fini(struct radeon_device *rdev)
|
||||||
|
{
|
||||||
|
if (rdev->pm.num_power_states > 1) {
|
||||||
|
+ bool flush_wq = false;
|
||||||
|
+
|
||||||
|
mutex_lock(&rdev->pm.mutex);
|
||||||
|
if (rdev->pm.pm_method == PM_METHOD_PROFILE) {
|
||||||
|
rdev->pm.profile = PM_PROFILE_DEFAULT;
|
||||||
|
@@ -493,13 +517,16 @@
|
||||||
|
radeon_pm_set_clocks(rdev);
|
||||||
|
} else if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
|
||||||
|
/* cancel work */
|
||||||
|
- cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work);
|
||||||
|
+ cancel_delayed_work(&rdev->pm.dynpm_idle_work);
|
||||||
|
+ flush_wq = true;
|
||||||
|
/* reset default clocks */
|
||||||
|
rdev->pm.dynpm_state = DYNPM_STATE_DISABLED;
|
||||||
|
rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT;
|
||||||
|
radeon_pm_set_clocks(rdev);
|
||||||
|
}
|
||||||
|
mutex_unlock(&rdev->pm.mutex);
|
||||||
|
+ if (flush_wq)
|
||||||
|
+ flush_workqueue(rdev->wq);
|
||||||
|
|
||||||
|
device_remove_file(rdev->dev, &dev_attr_power_profile);
|
||||||
|
device_remove_file(rdev->dev, &dev_attr_power_method);
|
||||||
|
@@ -720,12 +747,12 @@
|
||||||
|
radeon_pm_get_dynpm_state(rdev);
|
||||||
|
radeon_pm_set_clocks(rdev);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work,
|
||||||
|
+ msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
|
||||||
|
}
|
||||||
|
mutex_unlock(&rdev->pm.mutex);
|
||||||
|
ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
|
||||||
|
-
|
||||||
|
- queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work,
|
||||||
|
- msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
diff -ur linux-2.6.34.i686/drivers/gpu/drm/ttm/ttm_page_alloc.c radeon-fixes.i686/drivers/gpu/drm/ttm/ttm_page_alloc.c
|
||||||
|
--- linux-2.6.34.i686/drivers/gpu/drm/ttm/ttm_page_alloc.c 2010-09-02 21:50:42.000000000 +1000
|
||||||
|
+++ radeon-fixes.i686/drivers/gpu/drm/ttm/ttm_page_alloc.c 2010-09-02 21:13:14.000000000 +1000
|
||||||
|
@@ -667,7 +667,7 @@
|
||||||
|
{
|
||||||
|
struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
|
||||||
|
struct page *p = NULL;
|
||||||
|
- int gfp_flags = 0;
|
||||||
|
+ int gfp_flags = GFP_USER;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
/* set zero flag for page allocation if required */
|
|
@ -0,0 +1,958 @@
|
||||||
|
From 5b904034b0ab5195d971b139d0c0b67ab21b063c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@dreadnought.i.jkkm.org>
|
||||||
|
Date: Mon, 21 Jun 2010 20:33:16 +0100
|
||||||
|
Subject: Revert "drm/fbdev: rework output polling to be back in the core. (v4)"
|
||||||
|
|
||||||
|
This reverts commit eb1f8e4f3be898df808e2dfc131099f5831d491d.
|
||||||
|
|
||||||
|
Conflicts:
|
||||||
|
|
||||||
|
drivers/gpu/drm/drm_crtc_helper.c
|
||||||
|
drivers/gpu/drm/i915/i915_dma.c
|
||||||
|
drivers/gpu/drm/i915/intel_fb.c
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_fbcon.c
|
||||||
|
drivers/gpu/drm/radeon/radeon_fb.c
|
||||||
|
include/drm/drm_crtc_helper.h
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/Kconfig | 2 +-
|
||||||
|
drivers/gpu/drm/drm_crtc_helper.c | 111 ------------------------
|
||||||
|
drivers/gpu/drm/drm_fb_helper.c | 123 +++++++++++++++++++++++----
|
||||||
|
drivers/gpu/drm/i915/i915_dma.c | 1 -
|
||||||
|
drivers/gpu/drm/i915/i915_irq.c | 3 +-
|
||||||
|
drivers/gpu/drm/i915/intel_crt.c | 5 -
|
||||||
|
drivers/gpu/drm/i915/intel_display.c | 2 -
|
||||||
|
drivers/gpu/drm/i915/intel_dp.c | 2 -
|
||||||
|
drivers/gpu/drm/i915/intel_drv.h | 2 +-
|
||||||
|
drivers/gpu/drm/i915/intel_fb.c | 14 ++--
|
||||||
|
drivers/gpu/drm/i915/intel_hdmi.c | 1 -
|
||||||
|
drivers/gpu/drm/i915/intel_sdvo.c | 2 -
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_connector.c | 12 ---
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_display.c | 1 -
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_fbcon.c | 13 ++-
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_fbcon.h | 2 +-
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_state.c | 5 +-
|
||||||
|
drivers/gpu/drm/nouveau/nv50_display.c | 2 +-
|
||||||
|
drivers/gpu/drm/radeon/radeon_connectors.c | 13 ---
|
||||||
|
drivers/gpu/drm/radeon/radeon_display.c | 10 --
|
||||||
|
drivers/gpu/drm/radeon/radeon_fb.c | 15 +++-
|
||||||
|
drivers/gpu/drm/radeon/radeon_irq_kms.c | 5 +-
|
||||||
|
drivers/gpu/drm/radeon/radeon_mode.h | 3 +-
|
||||||
|
include/drm/drm_crtc.h | 17 ----
|
||||||
|
include/drm/drm_crtc_helper.h | 6 --
|
||||||
|
include/drm/drm_fb_helper.h | 13 +++-
|
||||||
|
26 files changed, 155 insertions(+), 230 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
|
||||||
|
index c2711c6..a51a1e4 100644
|
||||||
|
--- a/drivers/gpu/drm/Kconfig
|
||||||
|
+++ b/drivers/gpu/drm/Kconfig
|
||||||
|
@@ -9,7 +9,6 @@ menuconfig DRM
|
||||||
|
depends on (AGP || AGP=n) && PCI && !EMULATED_CMPXCHG && MMU
|
||||||
|
select I2C
|
||||||
|
select I2C_ALGOBIT
|
||||||
|
- select SLOW_WORK
|
||||||
|
help
|
||||||
|
Kernel-level support for the Direct Rendering Infrastructure (DRI)
|
||||||
|
introduced in XFree86 4.0. If you say Y here, you need to select
|
||||||
|
@@ -24,6 +23,7 @@ config DRM_KMS_HELPER
|
||||||
|
depends on DRM
|
||||||
|
select FB
|
||||||
|
select FRAMEBUFFER_CONSOLE if !EMBEDDED
|
||||||
|
+ select SLOW_WORK
|
||||||
|
help
|
||||||
|
FB and CRTC helpers for KMS drivers.
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
|
||||||
|
index 9b2a541..b142ac2 100644
|
||||||
|
--- a/drivers/gpu/drm/drm_crtc_helper.c
|
||||||
|
+++ b/drivers/gpu/drm/drm_crtc_helper.c
|
||||||
|
@@ -807,114 +807,3 @@ int drm_helper_resume_force_mode(struct drm_device *dev)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_helper_resume_force_mode);
|
||||||
|
-
|
||||||
|
-static struct slow_work_ops output_poll_ops;
|
||||||
|
-
|
||||||
|
-#define DRM_OUTPUT_POLL_PERIOD (10*HZ)
|
||||||
|
-static void output_poll_execute(struct slow_work *work)
|
||||||
|
-{
|
||||||
|
- struct delayed_slow_work *delayed_work = container_of(work, struct delayed_slow_work, work);
|
||||||
|
- struct drm_device *dev = container_of(delayed_work, struct drm_device, mode_config.output_poll_slow_work);
|
||||||
|
- struct drm_connector *connector;
|
||||||
|
- enum drm_connector_status old_status, status;
|
||||||
|
- bool repoll = false, changed = false;
|
||||||
|
- int ret;
|
||||||
|
-
|
||||||
|
- mutex_lock(&dev->mode_config.mutex);
|
||||||
|
- list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||||
|
-
|
||||||
|
- /* if this is HPD or polled don't check it -
|
||||||
|
- TV out for instance */
|
||||||
|
- if (!connector->polled)
|
||||||
|
- continue;
|
||||||
|
-
|
||||||
|
- else if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT))
|
||||||
|
- repoll = true;
|
||||||
|
-
|
||||||
|
- old_status = connector->status;
|
||||||
|
- /* if we are connected and don't want to poll for disconnect
|
||||||
|
- skip it */
|
||||||
|
- if (old_status == connector_status_connected &&
|
||||||
|
- !(connector->polled & DRM_CONNECTOR_POLL_DISCONNECT) &&
|
||||||
|
- !(connector->polled & DRM_CONNECTOR_POLL_HPD))
|
||||||
|
- continue;
|
||||||
|
-
|
||||||
|
- status = connector->funcs->detect(connector);
|
||||||
|
- if (old_status != status)
|
||||||
|
- changed = true;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- mutex_unlock(&dev->mode_config.mutex);
|
||||||
|
-
|
||||||
|
- if (changed) {
|
||||||
|
- /* send a uevent + call fbdev */
|
||||||
|
- drm_sysfs_hotplug_event(dev);
|
||||||
|
- if (dev->mode_config.funcs->output_poll_changed)
|
||||||
|
- dev->mode_config.funcs->output_poll_changed(dev);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (repoll) {
|
||||||
|
- ret = delayed_slow_work_enqueue(delayed_work, DRM_OUTPUT_POLL_PERIOD);
|
||||||
|
- if (ret)
|
||||||
|
- DRM_ERROR("delayed enqueue failed %d\n", ret);
|
||||||
|
- }
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-void drm_kms_helper_poll_disable(struct drm_device *dev)
|
||||||
|
-{
|
||||||
|
- if (!dev->mode_config.poll_enabled)
|
||||||
|
- return;
|
||||||
|
- delayed_slow_work_cancel(&dev->mode_config.output_poll_slow_work);
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(drm_kms_helper_poll_disable);
|
||||||
|
-
|
||||||
|
-void drm_kms_helper_poll_enable(struct drm_device *dev)
|
||||||
|
-{
|
||||||
|
- bool poll = false;
|
||||||
|
- struct drm_connector *connector;
|
||||||
|
- int ret;
|
||||||
|
-
|
||||||
|
- list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||||
|
- if (connector->polled)
|
||||||
|
- poll = true;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (poll) {
|
||||||
|
- ret = delayed_slow_work_enqueue(&dev->mode_config.output_poll_slow_work, DRM_OUTPUT_POLL_PERIOD);
|
||||||
|
- if (ret)
|
||||||
|
- DRM_ERROR("delayed enqueue failed %d\n", ret);
|
||||||
|
- }
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(drm_kms_helper_poll_enable);
|
||||||
|
-
|
||||||
|
-void drm_kms_helper_poll_init(struct drm_device *dev)
|
||||||
|
-{
|
||||||
|
- slow_work_register_user(THIS_MODULE);
|
||||||
|
- delayed_slow_work_init(&dev->mode_config.output_poll_slow_work,
|
||||||
|
- &output_poll_ops);
|
||||||
|
- dev->mode_config.poll_enabled = true;
|
||||||
|
-
|
||||||
|
- drm_kms_helper_poll_enable(dev);
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(drm_kms_helper_poll_init);
|
||||||
|
-
|
||||||
|
-void drm_kms_helper_poll_fini(struct drm_device *dev)
|
||||||
|
-{
|
||||||
|
- drm_kms_helper_poll_disable(dev);
|
||||||
|
- slow_work_unregister_user(THIS_MODULE);
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(drm_kms_helper_poll_fini);
|
||||||
|
-
|
||||||
|
-void drm_helper_hpd_irq_event(struct drm_device *dev)
|
||||||
|
-{
|
||||||
|
- if (!dev->mode_config.poll_enabled)
|
||||||
|
- return;
|
||||||
|
- delayed_slow_work_cancel(&dev->mode_config.output_poll_slow_work);
|
||||||
|
- /* schedule a slow work asap */
|
||||||
|
- delayed_slow_work_enqueue(&dev->mode_config.output_poll_slow_work, 0);
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(drm_helper_hpd_irq_event);
|
||||||
|
-
|
||||||
|
-static struct slow_work_ops output_poll_ops = {
|
||||||
|
- .execute = output_poll_execute,
|
||||||
|
-};
|
||||||
|
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
|
||||||
|
index 08c4c92..dcc6601 100644
|
||||||
|
--- a/drivers/gpu/drm/drm_fb_helper.c
|
||||||
|
+++ b/drivers/gpu/drm/drm_fb_helper.c
|
||||||
|
@@ -42,6 +42,8 @@ MODULE_LICENSE("GPL and additional rights");
|
||||||
|
|
||||||
|
static LIST_HEAD(kernel_fb_helper_list);
|
||||||
|
|
||||||
|
+static struct slow_work_ops output_status_change_ops;
|
||||||
|
+
|
||||||
|
/* simple single crtc case helper function */
|
||||||
|
int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper)
|
||||||
|
{
|
||||||
|
@@ -423,13 +425,19 @@ static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper)
|
||||||
|
|
||||||
|
int drm_fb_helper_init(struct drm_device *dev,
|
||||||
|
struct drm_fb_helper *fb_helper,
|
||||||
|
- int crtc_count, int max_conn_count)
|
||||||
|
+ int crtc_count, int max_conn_count,
|
||||||
|
+ bool polled)
|
||||||
|
{
|
||||||
|
struct drm_crtc *crtc;
|
||||||
|
int ret = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
fb_helper->dev = dev;
|
||||||
|
+ fb_helper->poll_enabled = polled;
|
||||||
|
+
|
||||||
|
+ slow_work_register_user(THIS_MODULE);
|
||||||
|
+ delayed_slow_work_init(&fb_helper->output_status_change_slow_work,
|
||||||
|
+ &output_status_change_ops);
|
||||||
|
|
||||||
|
INIT_LIST_HEAD(&fb_helper->kernel_fb_list);
|
||||||
|
|
||||||
|
@@ -486,6 +494,8 @@ void drm_fb_helper_fini(struct drm_fb_helper *fb_helper)
|
||||||
|
|
||||||
|
drm_fb_helper_crtc_free(fb_helper);
|
||||||
|
|
||||||
|
+ delayed_slow_work_cancel(&fb_helper->output_status_change_slow_work);
|
||||||
|
+ slow_work_unregister_user(THIS_MODULE);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_fb_helper_fini);
|
||||||
|
|
||||||
|
@@ -703,7 +713,7 @@ int drm_fb_helper_set_par(struct fb_info *info)
|
||||||
|
|
||||||
|
if (fb_helper->delayed_hotplug) {
|
||||||
|
fb_helper->delayed_hotplug = false;
|
||||||
|
- drm_fb_helper_hotplug_event(fb_helper);
|
||||||
|
+ delayed_slow_work_enqueue(&fb_helper->output_status_change_slow_work, 0);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -816,7 +826,7 @@ int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper,
|
||||||
|
if (crtc_count == 0 || sizes.fb_width == -1 || sizes.fb_height == -1) {
|
||||||
|
/* hmm everyone went away - assume VGA cable just fell out
|
||||||
|
and will come back later. */
|
||||||
|
- DRM_INFO("Cannot find any crtc or sizes - going 1024x768\n");
|
||||||
|
+ DRM_ERROR("Cannot find any crtc or sizes - going 1024x768\n");
|
||||||
|
sizes.fb_width = sizes.surface_width = 1024;
|
||||||
|
sizes.fb_height = sizes.surface_height = 768;
|
||||||
|
}
|
||||||
|
@@ -1362,7 +1372,12 @@ bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
|
||||||
|
* we shouldn't end up with no modes here.
|
||||||
|
*/
|
||||||
|
if (count == 0) {
|
||||||
|
- printk(KERN_INFO "No connectors reported connected with modes\n");
|
||||||
|
+ if (fb_helper->poll_enabled) {
|
||||||
|
+ delayed_slow_work_enqueue(&fb_helper->output_status_change_slow_work,
|
||||||
|
+ 5*HZ);
|
||||||
|
+ printk(KERN_INFO "No connectors reported connected with modes - started polling\n");
|
||||||
|
+ } else
|
||||||
|
+ printk(KERN_INFO "No connectors reported connected with modes\n");
|
||||||
|
}
|
||||||
|
drm_setup_crtcs(fb_helper);
|
||||||
|
|
||||||
|
@@ -1370,16 +1385,71 @@ bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_fb_helper_initial_config);
|
||||||
|
|
||||||
|
-bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
|
||||||
|
+/* we got a hotplug irq - need to update fbcon */
|
||||||
|
+void drm_helper_fb_hpd_irq_event(struct drm_fb_helper *fb_helper)
|
||||||
|
+{
|
||||||
|
+ /* if we don't have the fbdev registered yet do nothing */
|
||||||
|
+ if (!fb_helper->fbdev)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ /* schedule a slow work asap */
|
||||||
|
+ delayed_slow_work_enqueue(&fb_helper->output_status_change_slow_work, 0);
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL(drm_helper_fb_hpd_irq_event);
|
||||||
|
+
|
||||||
|
+bool drm_helper_fb_hotplug_event(struct drm_fb_helper *fb_helper, bool polled)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
+ int ret;
|
||||||
|
u32 max_width, max_height, bpp_sel;
|
||||||
|
- bool bound = false, crtcs_bound = false;
|
||||||
|
- struct drm_crtc *crtc;
|
||||||
|
|
||||||
|
if (!fb_helper->fb)
|
||||||
|
return false;
|
||||||
|
+ DRM_DEBUG_KMS("\n");
|
||||||
|
+
|
||||||
|
+ max_width = fb_helper->fb->width;
|
||||||
|
+ max_height = fb_helper->fb->height;
|
||||||
|
+ bpp_sel = fb_helper->fb->bits_per_pixel;
|
||||||
|
+
|
||||||
|
+ count = drm_fb_helper_probe_connector_modes(fb_helper, max_width,
|
||||||
|
+ max_height);
|
||||||
|
+ if (fb_helper->poll_enabled && !polled) {
|
||||||
|
+ if (count) {
|
||||||
|
+ delayed_slow_work_cancel(&fb_helper->output_status_change_slow_work);
|
||||||
|
+ } else {
|
||||||
|
+ ret = delayed_slow_work_enqueue(&fb_helper->output_status_change_slow_work, 5*HZ);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ drm_setup_crtcs(fb_helper);
|
||||||
|
+
|
||||||
|
+ return drm_fb_helper_single_fb_probe(fb_helper, bpp_sel);
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL(drm_helper_fb_hotplug_event);
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * delayed work queue execution function
|
||||||
|
+ * - check if fbdev is actually in use on the gpu
|
||||||
|
+ * - if not set delayed flag and repoll if necessary
|
||||||
|
+ * - check for connector status change
|
||||||
|
+ * - repoll if 0 modes found
|
||||||
|
+ *- call driver output status changed notifier
|
||||||
|
+ */
|
||||||
|
+static void output_status_change_execute(struct slow_work *work)
|
||||||
|
+{
|
||||||
|
+ struct delayed_slow_work *delayed_work = container_of(work, struct delayed_slow_work, work);
|
||||||
|
+ struct drm_fb_helper *fb_helper = container_of(delayed_work, struct drm_fb_helper, output_status_change_slow_work);
|
||||||
|
+ struct drm_connector *connector;
|
||||||
|
+ enum drm_connector_status old_status, status;
|
||||||
|
+ bool repoll, changed = false;
|
||||||
|
+ int ret;
|
||||||
|
+ int i;
|
||||||
|
+ bool bound = false, crtcs_bound = false;
|
||||||
|
+ struct drm_crtc *crtc;
|
||||||
|
|
||||||
|
+ repoll = fb_helper->poll_enabled;
|
||||||
|
+
|
||||||
|
+ /* first of all check the fbcon framebuffer is actually bound to any crtc */
|
||||||
|
+ /* take into account that no crtc at all maybe bound */
|
||||||
|
list_for_each_entry(crtc, &fb_helper->dev->mode_config.crtc_list, head) {
|
||||||
|
if (crtc->fb)
|
||||||
|
crtcs_bound = true;
|
||||||
|
@@ -1387,21 +1457,38 @@ bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
|
||||||
|
bound = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!bound && crtcs_bound) {
|
||||||
|
+ if (bound == false && crtcs_bound) {
|
||||||
|
fb_helper->delayed_hotplug = true;
|
||||||
|
- return false;
|
||||||
|
+ goto requeue;
|
||||||
|
}
|
||||||
|
- DRM_DEBUG_KMS("\n");
|
||||||
|
|
||||||
|
- max_width = fb_helper->fb->width;
|
||||||
|
- max_height = fb_helper->fb->height;
|
||||||
|
- bpp_sel = fb_helper->fb->bits_per_pixel;
|
||||||
|
+ for (i = 0; i < fb_helper->connector_count; i++) {
|
||||||
|
+ connector = fb_helper->connector_info[i]->connector;
|
||||||
|
+ old_status = connector->status;
|
||||||
|
+ status = connector->funcs->detect(connector);
|
||||||
|
+ if (old_status != status) {
|
||||||
|
+ changed = true;
|
||||||
|
+ }
|
||||||
|
+ if (status == connector_status_connected && repoll) {
|
||||||
|
+ DRM_DEBUG("%s is connected - stop polling\n", drm_get_connector_name(connector));
|
||||||
|
+ repoll = false;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- count = drm_fb_helper_probe_connector_modes(fb_helper, max_width,
|
||||||
|
- max_height);
|
||||||
|
- drm_setup_crtcs(fb_helper);
|
||||||
|
+ if (changed) {
|
||||||
|
+ if (fb_helper->funcs->fb_output_status_changed)
|
||||||
|
+ fb_helper->funcs->fb_output_status_changed(fb_helper);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- return drm_fb_helper_single_fb_probe(fb_helper, bpp_sel);
|
||||||
|
+requeue:
|
||||||
|
+ if (repoll) {
|
||||||
|
+ ret = delayed_slow_work_enqueue(delayed_work, 5*HZ);
|
||||||
|
+ if (ret)
|
||||||
|
+ DRM_ERROR("delayed enqueue failed %d\n", ret);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
-EXPORT_SYMBOL(drm_fb_helper_hotplug_event);
|
||||||
|
+
|
||||||
|
+static struct slow_work_ops output_status_change_ops = {
|
||||||
|
+ .execute = output_status_change_execute,
|
||||||
|
+};
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
|
||||||
|
index 59a2bf8..76ace2d 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_dma.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_dma.c
|
||||||
|
@@ -1430,7 +1430,6 @@ static int i915_load_modeset_init(struct drm_device *dev,
|
||||||
|
if (ret)
|
||||||
|
goto cleanup_irq;
|
||||||
|
|
||||||
|
- drm_kms_helper_poll_init(dev);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
cleanup_irq:
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
|
||||||
|
index 2479be0..6350bd3 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_irq.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_irq.c
|
||||||
|
@@ -271,7 +271,8 @@ static void i915_hotplug_work_func(struct work_struct *work)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Just fire off a uevent and let userspace tell us what to do */
|
||||||
|
- drm_helper_hpd_irq_event(dev);
|
||||||
|
+ intelfb_hotplug(dev, false);
|
||||||
|
+ drm_sysfs_hotplug_event(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void i915_handle_rps_change(struct drm_device *dev)
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
|
||||||
|
index 22ff384..125eded 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_crt.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_crt.c
|
||||||
|
@@ -584,10 +584,5 @@ void intel_crt_init(struct drm_device *dev)
|
||||||
|
|
||||||
|
drm_sysfs_connector_add(connector);
|
||||||
|
|
||||||
|
- if (I915_HAS_HOTPLUG(dev))
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||||
|
- else
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
-
|
||||||
|
dev_priv->hotplug_supported_mask |= CRT_HOTPLUG_INT_STATUS;
|
||||||
|
}
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
|
||||||
|
index d753257..70537cf 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_display.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_display.c
|
||||||
|
@@ -5036,7 +5036,6 @@ intel_user_framebuffer_create(struct drm_device *dev,
|
||||||
|
|
||||||
|
static const struct drm_mode_config_funcs intel_mode_funcs = {
|
||||||
|
.fb_create = intel_user_framebuffer_create,
|
||||||
|
- .output_poll_changed = intel_fb_output_poll_changed,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct drm_gem_object *
|
||||||
|
@@ -5538,7 +5537,6 @@ void intel_modeset_cleanup(struct drm_device *dev)
|
||||||
|
|
||||||
|
mutex_lock(&dev->struct_mutex);
|
||||||
|
|
||||||
|
- drm_kms_helper_poll_fini(dev);
|
||||||
|
intel_fbdev_fini(dev);
|
||||||
|
|
||||||
|
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
|
||||||
|
index 49b54f0..1815df5 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_dp.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_dp.c
|
||||||
|
@@ -1393,8 +1393,6 @@ intel_dp_init(struct drm_device *dev, int output_reg)
|
||||||
|
DRM_MODE_CONNECTOR_DisplayPort);
|
||||||
|
drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs);
|
||||||
|
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||||
|
-
|
||||||
|
if (output_reg == DP_A)
|
||||||
|
intel_encoder->type = INTEL_OUTPUT_EDP;
|
||||||
|
else
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
|
||||||
|
index df931f7..3230e8d 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_drv.h
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_drv.h
|
||||||
|
@@ -235,5 +235,5 @@ extern int intel_overlay_put_image(struct drm_device *dev, void *data,
|
||||||
|
extern int intel_overlay_attrs(struct drm_device *dev, void *data,
|
||||||
|
struct drm_file *file_priv);
|
||||||
|
|
||||||
|
-extern void intel_fb_output_poll_changed(struct drm_device *dev);
|
||||||
|
+void intelfb_hotplug(struct drm_device *dev, bool polled);
|
||||||
|
#endif /* __INTEL_DRV_H__ */
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c
|
||||||
|
index c3c5052..79098b3 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_fb.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_fb.c
|
||||||
|
@@ -211,6 +211,12 @@ static int intel_fb_find_or_create_single(struct drm_fb_helper *helper,
|
||||||
|
return new_fb;
|
||||||
|
}
|
||||||
|
|
||||||
|
+void intelfb_hotplug(struct drm_device *dev, bool polled)
|
||||||
|
+{
|
||||||
|
+ drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
|
+ drm_helper_fb_hpd_irq_event(&dev_priv->fbdev->helper);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static struct drm_fb_helper_funcs intel_fb_helper_funcs = {
|
||||||
|
.gamma_set = intel_crtc_fb_gamma_set,
|
||||||
|
.gamma_get = intel_crtc_fb_gamma_get,
|
||||||
|
@@ -256,7 +262,7 @@ int intel_fbdev_init(struct drm_device *dev)
|
||||||
|
|
||||||
|
ret = drm_fb_helper_init(dev, &ifbdev->helper,
|
||||||
|
dev_priv->num_pipe,
|
||||||
|
- INTELFB_CONN_LIMIT);
|
||||||
|
+ INTELFB_CONN_LIMIT, false);
|
||||||
|
if (ret) {
|
||||||
|
kfree(ifbdev);
|
||||||
|
return ret;
|
||||||
|
@@ -278,9 +284,3 @@ void intel_fbdev_fini(struct drm_device *dev)
|
||||||
|
dev_priv->fbdev = NULL;
|
||||||
|
}
|
||||||
|
MODULE_LICENSE("GPL and additional rights");
|
||||||
|
-
|
||||||
|
-void intel_fb_output_poll_changed(struct drm_device *dev)
|
||||||
|
-{
|
||||||
|
- drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
|
- drm_fb_helper_hotplug_event(&dev_priv->fbdev->helper);
|
||||||
|
-}
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
|
||||||
|
index 83bd764..acaca07 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_hdmi.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
|
||||||
|
@@ -240,7 +240,6 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
|
||||||
|
|
||||||
|
intel_encoder->type = INTEL_OUTPUT_HDMI;
|
||||||
|
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||||
|
connector->interlace_allowed = 0;
|
||||||
|
connector->doublescan_allowed = 0;
|
||||||
|
intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
|
||||||
|
index 76993ac..1c716b5 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_sdvo.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
|
||||||
|
@@ -2218,7 +2218,6 @@ intel_sdvo_dvi_init(struct intel_encoder *intel_encoder, int device)
|
||||||
|
}
|
||||||
|
|
||||||
|
connector = &intel_connector->base;
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT;
|
||||||
|
encoder->encoder_type = DRM_MODE_ENCODER_TMDS;
|
||||||
|
connector->connector_type = DRM_MODE_CONNECTOR_DVID;
|
||||||
|
|
||||||
|
@@ -2285,7 +2284,6 @@ intel_sdvo_analog_init(struct intel_encoder *intel_encoder, int device)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
connector = &intel_connector->base;
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
encoder->encoder_type = DRM_MODE_ENCODER_DAC;
|
||||||
|
connector->connector_type = DRM_MODE_CONNECTOR_VGA;
|
||||||
|
sdvo_connector = intel_connector->dev_priv;
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
|
||||||
|
index 149ed22..9a61f3c 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
|
||||||
|
@@ -846,7 +846,6 @@ nouveau_connector_create(struct drm_device *dev,
|
||||||
|
|
||||||
|
switch (dcb->type) {
|
||||||
|
case DCB_CONNECTOR_VGA:
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
if (dev_priv->card_type >= NV_50) {
|
||||||
|
drm_connector_attach_property(connector,
|
||||||
|
dev->mode_config.scaling_mode_property,
|
||||||
|
@@ -858,17 +857,6 @@ nouveau_connector_create(struct drm_device *dev,
|
||||||
|
case DCB_CONNECTOR_TV_3:
|
||||||
|
nv_connector->scaling_mode = DRM_MODE_SCALE_NONE;
|
||||||
|
break;
|
||||||
|
- case DCB_CONNECTOR_DP:
|
||||||
|
- case DCB_CONNECTOR_eDP:
|
||||||
|
- case DCB_CONNECTOR_HDMI_0:
|
||||||
|
- case DCB_CONNECTOR_HDMI_1:
|
||||||
|
- case DCB_CONNECTOR_DVI_I:
|
||||||
|
- case DCB_CONNECTOR_DVI_D:
|
||||||
|
- if (dev_priv->card_type >= NV_50)
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||||
|
- else
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
- /* fall-through */
|
||||||
|
default:
|
||||||
|
nv_connector->scaling_mode = DRM_MODE_SCALE_FULLSCREEN;
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
|
||||||
|
index 74e6b4e..9d7928f 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_display.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
|
||||||
|
@@ -101,6 +101,5 @@ nouveau_user_framebuffer_create(struct drm_device *dev,
|
||||||
|
|
||||||
|
const struct drm_mode_config_funcs nouveau_mode_config_funcs = {
|
||||||
|
.fb_create = nouveau_user_framebuffer_create,
|
||||||
|
- .output_poll_changed = nouveau_fbcon_output_poll_changed,
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
|
||||||
|
index c9a4a0d..0a59f96 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
|
||||||
|
@@ -326,11 +326,15 @@ nouveau_fbcon_find_or_create_single(struct drm_fb_helper *helper,
|
||||||
|
return new_fb;
|
||||||
|
}
|
||||||
|
|
||||||
|
-void
|
||||||
|
-nouveau_fbcon_output_poll_changed(struct drm_device *dev)
|
||||||
|
+void nouveau_fbcon_hotplug(struct drm_device *dev)
|
||||||
|
{
|
||||||
|
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||||
|
- drm_fb_helper_hotplug_event(&dev_priv->nfbdev->helper);
|
||||||
|
+ drm_helper_fb_hpd_irq_event(&dev_priv->nfbdev->helper);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void nouveau_fbcon_output_status_changed(struct drm_fb_helper *fb_helper)
|
||||||
|
+{
|
||||||
|
+ drm_helper_fb_hotplug_event(fb_helper, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
@@ -370,6 +374,7 @@ static struct drm_fb_helper_funcs nouveau_fbcon_helper_funcs = {
|
||||||
|
.gamma_set = nouveau_fbcon_gamma_set,
|
||||||
|
.gamma_get = nouveau_fbcon_gamma_get,
|
||||||
|
.fb_probe = nouveau_fbcon_find_or_create_single,
|
||||||
|
+ .fb_output_status_changed = nouveau_fbcon_output_status_changed,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -387,7 +392,7 @@ int nouveau_fbcon_init(struct drm_device *dev)
|
||||||
|
dev_priv->nfbdev = nfbdev;
|
||||||
|
nfbdev->helper.funcs = &nouveau_fbcon_helper_funcs;
|
||||||
|
|
||||||
|
- ret = drm_fb_helper_init(dev, &nfbdev->helper, 2, 4);
|
||||||
|
+ ret = drm_fb_helper_init(dev, &nfbdev->helper, 2, 4, true);
|
||||||
|
if (ret) {
|
||||||
|
kfree(nfbdev);
|
||||||
|
return ret;
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.h b/drivers/gpu/drm/nouveau/nouveau_fbcon.h
|
||||||
|
index e7e1268..bf8e00d 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_fbcon.h
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.h
|
||||||
|
@@ -58,6 +58,6 @@ void nouveau_fbcon_zfill_all(struct drm_device *dev);
|
||||||
|
void nouveau_fbcon_save_disable_accel(struct drm_device *dev);
|
||||||
|
void nouveau_fbcon_restore_accel(struct drm_device *dev);
|
||||||
|
|
||||||
|
-void nouveau_fbcon_output_poll_changed(struct drm_device *dev);
|
||||||
|
+void nouveau_fbcon_hotplug(struct drm_device *dev);
|
||||||
|
#endif /* __NV50_FBCON_H__ */
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
|
||||||
|
index b02a231..4dcb976 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_state.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
|
||||||
|
@@ -519,10 +519,8 @@ nouveau_card_init(struct drm_device *dev)
|
||||||
|
|
||||||
|
dev_priv->init_state = NOUVEAU_CARD_INIT_DONE;
|
||||||
|
|
||||||
|
- if (drm_core_check_feature(dev, DRIVER_MODESET)) {
|
||||||
|
+ if (drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
nouveau_fbcon_init(dev);
|
||||||
|
- drm_kms_helper_poll_init(dev);
|
||||||
|
- }
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
@@ -844,7 +842,6 @@ int nouveau_unload(struct drm_device *dev)
|
||||||
|
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||||
|
|
||||||
|
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
|
||||||
|
- drm_kms_helper_poll_fini(dev);
|
||||||
|
nouveau_fbcon_fini(dev);
|
||||||
|
if (dev_priv->card_type >= NV_50)
|
||||||
|
nv50_display_destroy(dev);
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c
|
||||||
|
index 580a5d1..e6a44af 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nv50_display.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nv50_display.c
|
||||||
|
@@ -980,7 +980,7 @@ nv50_display_irq_hotplug_bh(struct work_struct *work)
|
||||||
|
if (dev_priv->chipset >= 0x90)
|
||||||
|
nv_wr32(dev, 0xe074, nv_rd32(dev, 0xe074));
|
||||||
|
|
||||||
|
- drm_helper_hpd_irq_event(dev);
|
||||||
|
+ nouveau_fbcon_hotplug(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||||
|
index 0c7ccc6..40a24c9 100644
|
||||||
|
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||||
|
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||||
|
@@ -1085,7 +1085,6 @@ radeon_add_atom_connector(struct drm_device *dev,
|
||||||
|
drm_connector_attach_property(&radeon_connector->base,
|
||||||
|
rdev->mode_info.load_detect_property,
|
||||||
|
1);
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
break;
|
||||||
|
case DRM_MODE_CONNECTOR_DVIA:
|
||||||
|
drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
|
||||||
|
@@ -1212,12 +1211,6 @@ radeon_add_atom_connector(struct drm_device *dev,
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (hpd->hpd == RADEON_HPD_NONE) {
|
||||||
|
- if (i2c_bus->valid)
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
- } else
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||||
|
-
|
||||||
|
connector->display_info.subpixel_order = subpixel_order;
|
||||||
|
drm_sysfs_connector_add(connector);
|
||||||
|
return;
|
||||||
|
@@ -1279,7 +1272,6 @@ radeon_add_legacy_connector(struct drm_device *dev,
|
||||||
|
drm_connector_attach_property(&radeon_connector->base,
|
||||||
|
rdev->mode_info.load_detect_property,
|
||||||
|
1);
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
break;
|
||||||
|
case DRM_MODE_CONNECTOR_DVIA:
|
||||||
|
drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
|
||||||
|
@@ -1348,11 +1340,6 @@ radeon_add_legacy_connector(struct drm_device *dev,
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (hpd->hpd == RADEON_HPD_NONE) {
|
||||||
|
- if (i2c_bus->valid)
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
- } else
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||||
|
connector->display_info.subpixel_order = subpixel_order;
|
||||||
|
drm_sysfs_connector_add(connector);
|
||||||
|
return;
|
||||||
|
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
|
||||||
|
index c73444a..ed756be 100644
|
||||||
|
--- a/drivers/gpu/drm/radeon/radeon_display.c
|
||||||
|
+++ b/drivers/gpu/drm/radeon/radeon_display.c
|
||||||
|
@@ -887,15 +887,8 @@ radeon_user_framebuffer_create(struct drm_device *dev,
|
||||||
|
return &radeon_fb->base;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void radeon_output_poll_changed(struct drm_device *dev)
|
||||||
|
-{
|
||||||
|
- struct radeon_device *rdev = dev->dev_private;
|
||||||
|
- radeon_fb_output_poll_changed(rdev);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static const struct drm_mode_config_funcs radeon_mode_funcs = {
|
||||||
|
.fb_create = radeon_user_framebuffer_create,
|
||||||
|
- .output_poll_changed = radeon_output_poll_changed
|
||||||
|
};
|
||||||
|
|
||||||
|
struct drm_prop_enum_list {
|
||||||
|
@@ -1044,8 +1037,6 @@ int radeon_modeset_init(struct radeon_device *rdev)
|
||||||
|
radeon_pm_init(rdev);
|
||||||
|
|
||||||
|
radeon_fbdev_init(rdev);
|
||||||
|
- drm_kms_helper_poll_init(rdev->ddev);
|
||||||
|
-
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1058,7 +1049,6 @@ void radeon_modeset_fini(struct radeon_device *rdev)
|
||||||
|
radeon_pm_fini(rdev);
|
||||||
|
|
||||||
|
if (rdev->mode_info.mode_config_initialized) {
|
||||||
|
- drm_kms_helper_poll_fini(rdev->ddev);
|
||||||
|
radeon_hpd_fini(rdev);
|
||||||
|
drm_mode_config_cleanup(rdev->ddev);
|
||||||
|
rdev->mode_info.mode_config_initialized = false;
|
||||||
|
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c
|
||||||
|
index dc1634b..7dc38f6 100644
|
||||||
|
--- a/drivers/gpu/drm/radeon/radeon_fb.c
|
||||||
|
+++ b/drivers/gpu/drm/radeon/radeon_fb.c
|
||||||
|
@@ -316,9 +316,16 @@ int radeon_parse_options(char *options)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-void radeon_fb_output_poll_changed(struct radeon_device *rdev)
|
||||||
|
+void radeonfb_hotplug(struct drm_device *dev, bool polled)
|
||||||
|
{
|
||||||
|
- drm_fb_helper_hotplug_event(&rdev->mode_info.rfbdev->helper);
|
||||||
|
+ struct radeon_device *rdev = dev->dev_private;
|
||||||
|
+
|
||||||
|
+ drm_helper_fb_hpd_irq_event(&rdev->mode_info.rfbdev->helper);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void radeon_fb_output_status_changed(struct drm_fb_helper *fb_helper)
|
||||||
|
+{
|
||||||
|
+ drm_helper_fb_hotplug_event(fb_helper, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int radeon_fbdev_destroy(struct drm_device *dev, struct radeon_fbdev *rfbdev)
|
||||||
|
@@ -357,6 +364,7 @@ static struct drm_fb_helper_funcs radeon_fb_helper_funcs = {
|
||||||
|
.gamma_set = radeon_crtc_fb_gamma_set,
|
||||||
|
.gamma_get = radeon_crtc_fb_gamma_get,
|
||||||
|
.fb_probe = radeon_fb_find_or_create_single,
|
||||||
|
+ .fb_output_status_changed = radeon_fb_output_status_changed,
|
||||||
|
};
|
||||||
|
|
||||||
|
int radeon_fbdev_init(struct radeon_device *rdev)
|
||||||
|
@@ -379,7 +387,7 @@ int radeon_fbdev_init(struct radeon_device *rdev)
|
||||||
|
|
||||||
|
ret = drm_fb_helper_init(rdev->ddev, &rfbdev->helper,
|
||||||
|
rdev->num_crtc,
|
||||||
|
- RADEONFB_CONN_LIMIT);
|
||||||
|
+ RADEONFB_CONN_LIMIT, true);
|
||||||
|
if (ret) {
|
||||||
|
kfree(rfbdev);
|
||||||
|
return ret;
|
||||||
|
@@ -388,6 +396,7 @@ int radeon_fbdev_init(struct radeon_device *rdev)
|
||||||
|
drm_fb_helper_single_add_all_connectors(&rfbdev->helper);
|
||||||
|
drm_fb_helper_initial_config(&rfbdev->helper, bpp_sel);
|
||||||
|
return 0;
|
||||||
|
+
|
||||||
|
}
|
||||||
|
|
||||||
|
void radeon_fbdev_fini(struct radeon_device *rdev)
|
||||||
|
diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c
|
||||||
|
index 059bfa4..b0178de 100644
|
||||||
|
--- a/drivers/gpu/drm/radeon/radeon_irq_kms.c
|
||||||
|
+++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c
|
||||||
|
@@ -26,7 +26,6 @@
|
||||||
|
* Jerome Glisse
|
||||||
|
*/
|
||||||
|
#include "drmP.h"
|
||||||
|
-#include "drm_crtc_helper.h"
|
||||||
|
#include "radeon_drm.h"
|
||||||
|
#include "radeon_reg.h"
|
||||||
|
#include "radeon.h"
|
||||||
|
@@ -56,7 +55,9 @@ static void radeon_hotplug_work_func(struct work_struct *work)
|
||||||
|
radeon_connector_hotplug(connector);
|
||||||
|
}
|
||||||
|
/* Just fire off a uevent and let userspace tell us what to do */
|
||||||
|
- drm_helper_hpd_irq_event(dev);
|
||||||
|
+ radeonfb_hotplug(dev, false);
|
||||||
|
+
|
||||||
|
+ drm_sysfs_hotplug_event(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void radeon_driver_irq_preinstall_kms(struct drm_device *dev)
|
||||||
|
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
|
||||||
|
index 67358ba..fdd1611 100644
|
||||||
|
--- a/drivers/gpu/drm/radeon/radeon_mode.h
|
||||||
|
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
|
||||||
|
@@ -588,6 +588,5 @@ void radeon_fbdev_fini(struct radeon_device *rdev);
|
||||||
|
void radeon_fbdev_set_suspend(struct radeon_device *rdev, int state);
|
||||||
|
int radeon_fbdev_total_size(struct radeon_device *rdev);
|
||||||
|
bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj);
|
||||||
|
-
|
||||||
|
-void radeon_fb_output_poll_changed(struct radeon_device *rdev);
|
||||||
|
+void radeonfb_hotplug(struct drm_device *dev, bool polled);
|
||||||
|
#endif
|
||||||
|
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
|
||||||
|
index 93a1a31..a7148d2 100644
|
||||||
|
--- a/include/drm/drm_crtc.h
|
||||||
|
+++ b/include/drm/drm_crtc.h
|
||||||
|
@@ -31,7 +31,6 @@
|
||||||
|
#include <linux/idr.h>
|
||||||
|
|
||||||
|
#include <linux/fb.h>
|
||||||
|
-#include <linux/slow-work.h>
|
||||||
|
|
||||||
|
struct drm_device;
|
||||||
|
struct drm_mode_set;
|
||||||
|
@@ -461,15 +460,6 @@ enum drm_connector_force {
|
||||||
|
DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */
|
||||||
|
};
|
||||||
|
|
||||||
|
-/* should we poll this connector for connects and disconnects */
|
||||||
|
-/* hot plug detectable */
|
||||||
|
-#define DRM_CONNECTOR_POLL_HPD (1 << 0)
|
||||||
|
-/* poll for connections */
|
||||||
|
-#define DRM_CONNECTOR_POLL_CONNECT (1 << 1)
|
||||||
|
-/* can cleanly poll for disconnections without flickering the screen */
|
||||||
|
-/* DACs should rarely do this without a lot of testing */
|
||||||
|
-#define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2)
|
||||||
|
-
|
||||||
|
/**
|
||||||
|
* drm_connector - central DRM connector control structure
|
||||||
|
* @crtc: CRTC this connector is currently connected to, NULL if none
|
||||||
|
@@ -514,8 +504,6 @@ struct drm_connector {
|
||||||
|
u32 property_ids[DRM_CONNECTOR_MAX_PROPERTY];
|
||||||
|
uint64_t property_values[DRM_CONNECTOR_MAX_PROPERTY];
|
||||||
|
|
||||||
|
- uint8_t polled; /* DRM_CONNECTOR_POLL_* */
|
||||||
|
-
|
||||||
|
/* requested DPMS state */
|
||||||
|
int dpms;
|
||||||
|
|
||||||
|
@@ -555,7 +543,6 @@ struct drm_mode_set {
|
||||||
|
*/
|
||||||
|
struct drm_mode_config_funcs {
|
||||||
|
struct drm_framebuffer *(*fb_create)(struct drm_device *dev, struct drm_file *file_priv, struct drm_mode_fb_cmd *mode_cmd);
|
||||||
|
- void (*output_poll_changed)(struct drm_device *dev);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct drm_mode_group {
|
||||||
|
@@ -593,10 +580,6 @@ struct drm_mode_config {
|
||||||
|
struct drm_mode_config_funcs *funcs;
|
||||||
|
resource_size_t fb_base;
|
||||||
|
|
||||||
|
- /* output poll support */
|
||||||
|
- bool poll_enabled;
|
||||||
|
- struct delayed_slow_work output_poll_slow_work;
|
||||||
|
-
|
||||||
|
/* pointers to standard properties */
|
||||||
|
struct list_head property_blob_list;
|
||||||
|
struct drm_property *edid_property;
|
||||||
|
diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h
|
||||||
|
index 1121f77..b1fa0f8 100644
|
||||||
|
--- a/include/drm/drm_crtc_helper.h
|
||||||
|
+++ b/include/drm/drm_crtc_helper.h
|
||||||
|
@@ -127,10 +127,4 @@ static inline void drm_connector_helper_add(struct drm_connector *connector,
|
||||||
|
}
|
||||||
|
|
||||||
|
extern int drm_helper_resume_force_mode(struct drm_device *dev);
|
||||||
|
-extern void drm_kms_helper_poll_init(struct drm_device *dev);
|
||||||
|
-extern void drm_kms_helper_poll_fini(struct drm_device *dev);
|
||||||
|
-extern void drm_helper_hpd_irq_event(struct drm_device *dev);
|
||||||
|
-
|
||||||
|
-extern void drm_kms_helper_poll_disable(struct drm_device *dev);
|
||||||
|
-extern void drm_kms_helper_poll_enable(struct drm_device *dev);
|
||||||
|
#endif
|
||||||
|
diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
|
||||||
|
index f0a6afc..9b55a94 100644
|
||||||
|
--- a/include/drm/drm_fb_helper.h
|
||||||
|
+++ b/include/drm/drm_fb_helper.h
|
||||||
|
@@ -30,6 +30,8 @@
|
||||||
|
#ifndef DRM_FB_HELPER_H
|
||||||
|
#define DRM_FB_HELPER_H
|
||||||
|
|
||||||
|
+#include <linux/slow-work.h>
|
||||||
|
+
|
||||||
|
struct drm_fb_helper;
|
||||||
|
|
||||||
|
struct drm_fb_helper_crtc {
|
||||||
|
@@ -69,6 +71,9 @@ struct drm_fb_helper_funcs {
|
||||||
|
|
||||||
|
int (*fb_probe)(struct drm_fb_helper *helper,
|
||||||
|
struct drm_fb_helper_surface_size *sizes);
|
||||||
|
+
|
||||||
|
+ void (*fb_output_status_changed)(struct drm_fb_helper *helper);
|
||||||
|
+
|
||||||
|
};
|
||||||
|
|
||||||
|
struct drm_fb_helper_connector {
|
||||||
|
@@ -90,6 +95,8 @@ struct drm_fb_helper {
|
||||||
|
u32 pseudo_palette[17];
|
||||||
|
struct list_head kernel_fb_list;
|
||||||
|
|
||||||
|
+ struct delayed_slow_work output_status_change_slow_work;
|
||||||
|
+ bool poll_enabled;
|
||||||
|
/* we got a hotplug but fbdev wasn't running the console
|
||||||
|
delay until next set_par */
|
||||||
|
bool delayed_hotplug;
|
||||||
|
@@ -100,7 +107,7 @@ int drm_fb_helper_single_fb_probe(struct drm_fb_helper *helper,
|
||||||
|
|
||||||
|
int drm_fb_helper_init(struct drm_device *dev,
|
||||||
|
struct drm_fb_helper *helper, int crtc_count,
|
||||||
|
- int max_conn);
|
||||||
|
+ int max_conn, bool polled);
|
||||||
|
void drm_fb_helper_fini(struct drm_fb_helper *helper);
|
||||||
|
int drm_fb_helper_blank(int blank, struct fb_info *info);
|
||||||
|
int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
|
||||||
|
@@ -123,8 +130,10 @@ void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
|
||||||
|
|
||||||
|
int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info);
|
||||||
|
|
||||||
|
-bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper);
|
||||||
|
+bool drm_helper_fb_hotplug_event(struct drm_fb_helper *fb_helper,
|
||||||
|
+ bool polled);
|
||||||
|
bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel);
|
||||||
|
int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper);
|
||||||
|
|
||||||
|
+void drm_helper_fb_hpd_irq_event(struct drm_fb_helper *fb_helper);
|
||||||
|
#endif
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
From: jiayingz@google.com (Jiaying Zhang) <>
|
||||||
|
Date: Tue, 27 Jul 2010 15:56:06 +0000 (-0400)
|
||||||
|
Subject: ext4: move aio completion after unwritten extent conversion
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftytso%2Fext4.git;a=commitdiff_plain;h=5b3ff237bef43b9e7fb7d1eb858e29b73fd664f9
|
||||||
|
|
||||||
|
ext4: move aio completion after unwritten extent conversion
|
||||||
|
|
||||||
|
This patch is to be applied upon Christoph's "direct-io: move aio_complete
|
||||||
|
into ->end_io" patch. It adds iocb and result fields to struct ext4_io_end_t,
|
||||||
|
so that we can call aio_complete from ext4_end_io_nolock() after the extent
|
||||||
|
conversion has finished.
|
||||||
|
|
||||||
|
I have verified with Christoph's aio-dio test that used to fail after a few
|
||||||
|
runs on an original kernel but now succeeds on the patched kernel.
|
||||||
|
|
||||||
|
See http://thread.gmane.org/gmane.comp.file-systems.ext4/19659 for details.
|
||||||
|
|
||||||
|
Signed-off-by: Jiaying Zhang <jiayingz@google.com>
|
||||||
|
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
|
||||||
|
index 4c7d472..fbb3947 100644
|
||||||
|
--- a/fs/ext4/ext4.h
|
||||||
|
+++ b/fs/ext4/ext4.h
|
||||||
|
@@ -170,13 +170,15 @@ struct mpage_da_data {
|
||||||
|
};
|
||||||
|
#define EXT4_IO_UNWRITTEN 0x1
|
||||||
|
typedef struct ext4_io_end {
|
||||||
|
- struct list_head list; /* per-file finished AIO list */
|
||||||
|
+ struct list_head list; /* per-file finished IO list */
|
||||||
|
struct inode *inode; /* file being written to */
|
||||||
|
unsigned int flag; /* unwritten or not */
|
||||||
|
struct page *page; /* page struct for buffer write */
|
||||||
|
loff_t offset; /* offset in the file */
|
||||||
|
ssize_t size; /* size of the extent */
|
||||||
|
struct work_struct work; /* data work queue */
|
||||||
|
+ struct kiocb *iocb; /* iocb struct for AIO */
|
||||||
|
+ int result; /* error value for AIO */
|
||||||
|
} ext4_io_end_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
|
||||||
|
index 609159e..46d2079 100644
|
||||||
|
--- a/fs/ext4/inode.c
|
||||||
|
+++ b/fs/ext4/inode.c
|
||||||
|
@@ -3668,6 +3668,8 @@ static int ext4_end_io_nolock(ext4_io_end_t *io)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (io->iocb)
|
||||||
|
+ aio_complete(io->iocb, io->result, 0);
|
||||||
|
/* clear the DIO AIO unwritten flag */
|
||||||
|
io->flag = 0;
|
||||||
|
return ret;
|
||||||
|
@@ -3767,6 +3769,8 @@ static ext4_io_end_t *ext4_init_io_end (struct inode *inode, gfp_t flags)
|
||||||
|
io->offset = 0;
|
||||||
|
io->size = 0;
|
||||||
|
io->page = NULL;
|
||||||
|
+ io->iocb = NULL;
|
||||||
|
+ io->result = 0;
|
||||||
|
INIT_WORK(&io->work, ext4_end_io_work);
|
||||||
|
INIT_LIST_HEAD(&io->list);
|
||||||
|
}
|
||||||
|
@@ -3796,12 +3800,18 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,
|
||||||
|
if (io_end->flag != EXT4_IO_UNWRITTEN){
|
||||||
|
ext4_free_io_end(io_end);
|
||||||
|
iocb->private = NULL;
|
||||||
|
- goto out;
|
||||||
|
+out:
|
||||||
|
+ if (is_async)
|
||||||
|
+ aio_complete(iocb, ret, 0);
|
||||||
|
+ return;
|
||||||
|
}
|
||||||
|
|
||||||
|
io_end->offset = offset;
|
||||||
|
io_end->size = size;
|
||||||
|
- io_end->flag = EXT4_IO_UNWRITTEN;
|
||||||
|
+ if (is_async) {
|
||||||
|
+ io_end->iocb = iocb;
|
||||||
|
+ io_end->result = ret;
|
||||||
|
+ }
|
||||||
|
wq = EXT4_SB(io_end->inode->i_sb)->dio_unwritten_wq;
|
||||||
|
|
||||||
|
/* queue the work to convert unwritten extents to written */
|
||||||
|
@@ -3813,9 +3823,6 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,
|
||||||
|
list_add_tail(&io_end->list, &ei->i_completed_io_list);
|
||||||
|
spin_unlock_irqrestore(&ei->i_completed_io_lock, flags);
|
||||||
|
iocb->private = NULL;
|
||||||
|
-out:
|
||||||
|
- if (is_async)
|
||||||
|
- aio_complete(iocb, ret, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ext4_end_io_buffer_write(struct buffer_head *bh, int uptodate)
|
|
@ -0,0 +1,44 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
#
|
||||||
|
# find-provides: munge the provides dependencies from the kabideps file
|
||||||
|
#
|
||||||
|
# This software may be freely redistributed under the terms of the GNU
|
||||||
|
# General Public License (GPL).
|
||||||
|
#
|
||||||
|
# Takes a directory prefix, then outputs the kabideps file contents.
|
||||||
|
|
||||||
|
__author__ = "Jon Masters <jcm@redhat.com>"
|
||||||
|
__version__ = "1.0"
|
||||||
|
__date__ = "Tue 25 Jul 2006 04:00 GMT"
|
||||||
|
__copyright__ = "Copyright (C) 2006 Red Hat, Inc"
|
||||||
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import string
|
||||||
|
import sys
|
||||||
|
|
||||||
|
false = 0
|
||||||
|
true = 1
|
||||||
|
|
||||||
|
kabideps=""
|
||||||
|
|
||||||
|
p = re.compile('^(.*)/symvers-(.*).gz$')
|
||||||
|
while true:
|
||||||
|
foo = sys.stdin.readline()
|
||||||
|
if foo == "":
|
||||||
|
break
|
||||||
|
string.split(foo)
|
||||||
|
m = p.match(foo)
|
||||||
|
if m:
|
||||||
|
kabideps=sys.argv[1] + "/kernel-" + m.group(2) + "-kabideps"
|
||||||
|
|
||||||
|
if kabideps == "":
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
if not (os.path.isfile(kabideps)):
|
||||||
|
sys.stderr.write(sys.argv[0] + ": cannot locate kabideps file: " + kabideps + "\n")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
sys.stderr.write(sys.argv[0] + ": processing kABI: " + kabideps)
|
||||||
|
os.system("cat " + kabideps)
|
|
@ -0,0 +1,34 @@
|
||||||
|
|
||||||
|
Legacy hypervisors (RHEL 5.0 and RHEL 5.1) do not handle guest writes to
|
||||||
|
cr4 gracefully. If a guest attempts to write a bit of cr4 that is
|
||||||
|
unsupported, then the HV is so offended it crashes the domain. While
|
||||||
|
later guest kernels (such as RHEL6) don't assume the HV supports all
|
||||||
|
features, they do expect nicer responses. That assumption introduced
|
||||||
|
code that probes whether or not xsave is supported early in the boot. So
|
||||||
|
now when attempting to boot a RHEL6 guest on RHEL5.0 or RHEL5.1 an early
|
||||||
|
crash will occur.
|
||||||
|
|
||||||
|
This patch is quite obviously an undesirable hack. The real fix for this
|
||||||
|
problem should be in the HV, and is, in later HVs. However, to support
|
||||||
|
running on old HVs, RHEL6 can take this small change. No impact will
|
||||||
|
occur for running on any RHEL HV (not even RHEL 5.5 supports xsave).
|
||||||
|
There is only potential for guest performance loss on upstream Xen.
|
||||||
|
|
||||||
|
---
|
||||||
|
arch/x86/xen/enlighten.c | 1 +
|
||||||
|
1 files changed, 1 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
|
||||||
|
index 52f8e19..6db3d67 100644
|
||||||
|
--- a/arch/x86/xen/enlighten.c
|
||||||
|
+++ b/arch/x86/xen/enlighten.c
|
||||||
|
@@ -802,6 +802,7 @@ static void xen_write_cr4(unsigned long cr4)
|
||||||
|
{
|
||||||
|
cr4 &= ~X86_CR4_PGE;
|
||||||
|
cr4 &= ~X86_CR4_PSE;
|
||||||
|
+ cr4 &= ~X86_CR4_OSXSAVE;
|
||||||
|
|
||||||
|
native_write_cr4(cr4);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.6.6.1
|
|
@ -0,0 +1,30 @@
|
||||||
|
diff --git a/drivers/media/dvb/b2c2/flexcop-pci.c b/drivers/media/dvb/b2c2/flexcop-pci.c
|
||||||
|
index 227c020..7465308 100644
|
||||||
|
--- a/drivers/media/dvb/b2c2/flexcop-pci.c
|
||||||
|
+++ b/drivers/media/dvb/b2c2/flexcop-pci.c
|
||||||
|
@@ -39,6 +39,7 @@ MODULE_PARM_DESC(debug,
|
||||||
|
|
||||||
|
#define DRIVER_VERSION "0.1"
|
||||||
|
#define DRIVER_NAME "Technisat/B2C2 FlexCop II/IIb/III Digital TV PCI Driver"
|
||||||
|
+#define FLEXCOP_MODULE_NAME "b2c2-flexcop"
|
||||||
|
#define DRIVER_AUTHOR "Patrick Boettcher <patrick.boettcher@desy.de>"
|
||||||
|
|
||||||
|
struct flexcop_pci {
|
||||||
|
@@ -299,7 +300,7 @@ static int flexcop_pci_init(struct flexcop_pci *fc_pci)
|
||||||
|
return ret;
|
||||||
|
pci_set_master(fc_pci->pdev);
|
||||||
|
|
||||||
|
- if ((ret = pci_request_regions(fc_pci->pdev, DRIVER_NAME)) != 0)
|
||||||
|
+ if ((ret = pci_request_regions(fc_pci->pdev, FLEXCOP_MODULE_NAME)) != 0)
|
||||||
|
goto err_pci_disable_device;
|
||||||
|
|
||||||
|
fc_pci->io_mem = pci_iomap(fc_pci->pdev, 0, 0x800);
|
||||||
|
@@ -313,7 +314,7 @@ static int flexcop_pci_init(struct flexcop_pci *fc_pci)
|
||||||
|
pci_set_drvdata(fc_pci->pdev, fc_pci);
|
||||||
|
spin_lock_init(&fc_pci->irq_lock);
|
||||||
|
if ((ret = request_irq(fc_pci->pdev->irq, flexcop_pci_isr,
|
||||||
|
- IRQF_SHARED, DRIVER_NAME, fc_pci)) != 0)
|
||||||
|
+ IRQF_SHARED, FLEXCOP_MODULE_NAME, fc_pci)) != 0)
|
||||||
|
goto err_pci_iounmap;
|
||||||
|
|
||||||
|
fc_pci->init_state |= FC_PCI_INIT;
|
|
@ -0,0 +1,65 @@
|
||||||
|
From linux-fsdevel-owner@vger.kernel.org Thu Nov 18 21:03:11 2010
|
||||||
|
From: Josef Bacik <josef@redhat.com>
|
||||||
|
To: linux-fsdevel@vger.kernel.org, eparis@redhat.com,
|
||||||
|
linux-kernel@vger.kernel.org, sds@tycho.nsa.gov,
|
||||||
|
selinux@tycho.nsa.gov, bfields@fieldses.org
|
||||||
|
Subject: [PATCH] fs: call security_d_instantiate in d_obtain_alias V2
|
||||||
|
Date: Thu, 18 Nov 2010 20:52:55 -0500
|
||||||
|
Message-Id: <1290131575-2489-1-git-send-email-josef@redhat.com>
|
||||||
|
X-Mailing-List: linux-fsdevel@vger.kernel.org
|
||||||
|
|
||||||
|
While trying to track down some NFS problems with BTRFS, I kept noticing I was
|
||||||
|
getting -EACCESS for no apparent reason. Eric Paris and printk() helped me
|
||||||
|
figure out that it was SELinux that was giving me grief, with the following
|
||||||
|
denial
|
||||||
|
|
||||||
|
type=AVC msg=audit(1290013638.413:95): avc: denied { 0x800000 } for pid=1772
|
||||||
|
comm="nfsd" name="" dev=sda1 ino=256 scontext=system_u:system_r:kernel_t:s0
|
||||||
|
tcontext=system_u:object_r:unlabeled_t:s0 tclass=file
|
||||||
|
|
||||||
|
Turns out this is because in d_obtain_alias if we can't find an alias we create
|
||||||
|
one and do all the normal instantiation stuff, but we don't do the
|
||||||
|
security_d_instantiate.
|
||||||
|
|
||||||
|
Usually we are protected from getting a hashed dentry that hasn't yet run
|
||||||
|
security_d_instantiate() by the parent's i_mutex, but obviously this isn't an
|
||||||
|
option there, so in order to deal with the case that a second thread comes in
|
||||||
|
and finds our new dentry before we get to run security_d_instantiate(), we go
|
||||||
|
ahead and call it if we find a dentry already. Eric assures me that this is ok
|
||||||
|
as the code checks to see if the dentry has been initialized already so calling
|
||||||
|
security_d_instantiate() against the same dentry multiple times is ok. With
|
||||||
|
this patch I'm no longer getting errant -EACCESS values.
|
||||||
|
|
||||||
|
Signed-off-by: Josef Bacik <josef@redhat.com>
|
||||||
|
---
|
||||||
|
V1->V2:
|
||||||
|
-added second security_d_instantiate() call
|
||||||
|
|
||||||
|
fs/dcache.c | 3 +++
|
||||||
|
1 files changed, 3 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/fs/dcache.c b/fs/dcache.c
|
||||||
|
index 23702a9..119d489 100644
|
||||||
|
--- a/fs/dcache.c
|
||||||
|
+++ b/fs/dcache.c
|
||||||
|
@@ -1201,9 +1201,12 @@ struct dentry *d_obtain_alias(struct inode *inode)
|
||||||
|
spin_unlock(&tmp->d_lock);
|
||||||
|
|
||||||
|
spin_unlock(&dcache_lock);
|
||||||
|
+ security_d_instantiate(tmp, inode);
|
||||||
|
return tmp;
|
||||||
|
|
||||||
|
out_iput:
|
||||||
|
+ if (res && !IS_ERR(res))
|
||||||
|
+ security_d_instantiate(res, inode);
|
||||||
|
iput(inode);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
||||||
|
--
|
||||||
|
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
|
||||||
|
the body of a message to majordomo@vger.kernel.org
|
||||||
|
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
%pubring kernel.pub
|
||||||
|
%secring kernel.sec
|
||||||
|
Key-Type: DSA
|
||||||
|
Key-Length: 512
|
||||||
|
Name-Real: Red Hat, Inc.
|
||||||
|
Name-Comment: Kernel Module GPG key
|
||||||
|
%commit
|
|
@ -0,0 +1,47 @@
|
||||||
|
From c69fcbd1f60b0842f7c1ad2c95692ffd19c4932b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Mon, 29 Mar 2010 23:56:08 -0400
|
||||||
|
Subject: hda_intel-prealloc-4mb-dmabuffer
|
||||||
|
|
||||||
|
---
|
||||||
|
sound/pci/hda/hda_intel.c | 14 +++++++++++++-
|
||||||
|
1 files changed, 13 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
|
||||||
|
index 4bb9067..37db515 100644
|
||||||
|
--- a/sound/pci/hda/hda_intel.c
|
||||||
|
+++ b/sound/pci/hda/hda_intel.c
|
||||||
|
@@ -1986,6 +1986,7 @@ azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
|
||||||
|
struct azx_pcm *apcm;
|
||||||
|
int pcm_dev = cpcm->device;
|
||||||
|
int s, err;
|
||||||
|
+ size_t prealloc_min = 64*1024; /* 64KB */
|
||||||
|
|
||||||
|
if (pcm_dev >= HDA_MAX_PCMS) {
|
||||||
|
snd_printk(KERN_ERR SFX "Invalid PCM device number %d\n",
|
||||||
|
@@ -2019,10 +2020,21 @@ azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
|
||||||
|
if (cpcm->stream[s].substreams)
|
||||||
|
snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
/* buffer pre-allocation */
|
||||||
|
+
|
||||||
|
+ /* subtle, don't allocate a big buffer for modems...
|
||||||
|
+ * also, don't just test 32BIT_MASK, since azx supports
|
||||||
|
+ * 64-bit DMA in some cases.
|
||||||
|
+ */
|
||||||
|
+ /* lennart wants a 2.2MB buffer for 2sec of 48khz */
|
||||||
|
+ if (pcm->dev_class == SNDRV_PCM_CLASS_GENERIC &&
|
||||||
|
+ chip->pci->dma_mask >= DMA_32BIT_MASK)
|
||||||
|
+ prealloc_min = 4 * 1024 * 1024; /* 4MB */
|
||||||
|
+
|
||||||
|
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
|
||||||
|
snd_dma_pci_data(chip->pci),
|
||||||
|
- 1024 * 64, 32 * 1024 * 1024);
|
||||||
|
+ prealloc_min, 32 * 1024 * 1024);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,216 @@
|
||||||
|
drivers/media/video/hdpvr/Makefile | 4 +-
|
||||||
|
drivers/media/video/hdpvr/hdpvr-core.c | 12 ++---
|
||||||
|
drivers/media/video/hdpvr/hdpvr-i2c.c | 83 ++++++++++++++++++++++----------
|
||||||
|
drivers/media/video/hdpvr/hdpvr.h | 2 +-
|
||||||
|
4 files changed, 64 insertions(+), 37 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/media/video/hdpvr/Makefile b/drivers/media/video/hdpvr/Makefile
|
||||||
|
index e0230fc..a0b9a43 100644
|
||||||
|
--- a/drivers/media/video/hdpvr/Makefile
|
||||||
|
+++ b/drivers/media/video/hdpvr/Makefile
|
||||||
|
@@ -1,6 +1,4 @@
|
||||||
|
-hdpvr-objs := hdpvr-control.o hdpvr-core.o hdpvr-video.o
|
||||||
|
-
|
||||||
|
-hdpvr-$(CONFIG_I2C) += hdpvr-i2c.o
|
||||||
|
+hdpvr-objs := hdpvr-control.o hdpvr-i2c.o hdpvr-core.o hdpvr-video.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_VIDEO_HDPVR) += hdpvr.o
|
||||||
|
|
||||||
|
diff --git a/drivers/media/video/hdpvr/hdpvr-core.c b/drivers/media/video/hdpvr/hdpvr-core.c
|
||||||
|
index 2fc9865..c72793a 100644
|
||||||
|
--- a/drivers/media/video/hdpvr/hdpvr-core.c
|
||||||
|
+++ b/drivers/media/video/hdpvr/hdpvr-core.c
|
||||||
|
@@ -364,9 +364,8 @@ static int hdpvr_probe(struct usb_interface *interface,
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
-#ifdef CONFIG_I2C
|
||||||
|
- /* until i2c is working properly */
|
||||||
|
- retval = 0; /* hdpvr_register_i2c_adapter(dev); */
|
||||||
|
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
|
||||||
|
+ retval = hdpvr_register_i2c_adapter(dev);
|
||||||
|
if (retval < 0) {
|
||||||
|
v4l2_err(&dev->v4l2_dev, "registering i2c adapter failed\n");
|
||||||
|
goto error;
|
||||||
|
@@ -412,12 +411,9 @@ static void hdpvr_disconnect(struct usb_interface *interface)
|
||||||
|
mutex_unlock(&dev->io_mutex);
|
||||||
|
|
||||||
|
/* deregister I2C adapter */
|
||||||
|
-#ifdef CONFIG_I2C
|
||||||
|
+#if defined(CONFIG_I2C) || (CONFIG_I2C_MODULE)
|
||||||
|
mutex_lock(&dev->i2c_mutex);
|
||||||
|
- if (dev->i2c_adapter)
|
||||||
|
- i2c_del_adapter(dev->i2c_adapter);
|
||||||
|
- kfree(dev->i2c_adapter);
|
||||||
|
- dev->i2c_adapter = NULL;
|
||||||
|
+ i2c_del_adapter(&dev->i2c_adapter);
|
||||||
|
mutex_unlock(&dev->i2c_mutex);
|
||||||
|
#endif /* CONFIG_I2C */
|
||||||
|
|
||||||
|
diff --git a/drivers/media/video/hdpvr/hdpvr-i2c.c b/drivers/media/video/hdpvr/hdpvr-i2c.c
|
||||||
|
index 463b81b..a0557e4 100644
|
||||||
|
--- a/drivers/media/video/hdpvr/hdpvr-i2c.c
|
||||||
|
+++ b/drivers/media/video/hdpvr/hdpvr-i2c.c
|
||||||
|
@@ -10,6 +10,8 @@
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
|
||||||
|
+
|
||||||
|
#include <linux/i2c.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
|
||||||
|
@@ -22,8 +24,11 @@
|
||||||
|
#define REQTYPE_I2C_WRITE 0xb0
|
||||||
|
#define REQTYPE_I2C_WRITE_STATT 0xd0
|
||||||
|
|
||||||
|
-static int hdpvr_i2c_read(struct hdpvr_device *dev, unsigned char addr,
|
||||||
|
- char *data, int len)
|
||||||
|
+#define HDPVR_HW_Z8F0811_IR_TX_I2C_ADDR 0x70
|
||||||
|
+#define HDPVR_HW_Z8F0811_IR_RX_I2C_ADDR 0x71
|
||||||
|
+
|
||||||
|
+static int hdpvr_i2c_read(struct hdpvr_device *dev, int bus,
|
||||||
|
+ unsigned char addr, char *data, int len)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char *buf = kmalloc(len, GFP_KERNEL);
|
||||||
|
@@ -33,7 +38,7 @@ static int hdpvr_i2c_read(struct hdpvr_device *dev, unsigned char addr,
|
||||||
|
ret = usb_control_msg(dev->udev,
|
||||||
|
usb_rcvctrlpipe(dev->udev, 0),
|
||||||
|
REQTYPE_I2C_READ, CTRL_READ_REQUEST,
|
||||||
|
- 0x100|addr, 0, buf, len, 1000);
|
||||||
|
+ (bus << 8) | addr, 0, buf, len, 1000);
|
||||||
|
|
||||||
|
if (ret == len) {
|
||||||
|
memcpy(data, buf, len);
|
||||||
|
@@ -46,8 +51,8 @@ static int hdpvr_i2c_read(struct hdpvr_device *dev, unsigned char addr,
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int hdpvr_i2c_write(struct hdpvr_device *dev, unsigned char addr,
|
||||||
|
- char *data, int len)
|
||||||
|
+static int hdpvr_i2c_write(struct hdpvr_device *dev, int bus,
|
||||||
|
+ unsigned char addr, char *data, int len)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char *buf = kmalloc(len, GFP_KERNEL);
|
||||||
|
@@ -58,7 +63,7 @@ static int hdpvr_i2c_write(struct hdpvr_device *dev, unsigned char addr,
|
||||||
|
ret = usb_control_msg(dev->udev,
|
||||||
|
usb_sndctrlpipe(dev->udev, 0),
|
||||||
|
REQTYPE_I2C_WRITE, CTRL_WRITE_REQUEST,
|
||||||
|
- 0x100|addr, 0, buf, len, 1000);
|
||||||
|
+ (bus << 8) | addr, 0, buf, len, 1000);
|
||||||
|
|
||||||
|
if (ret < 0)
|
||||||
|
goto error;
|
||||||
|
@@ -68,7 +73,7 @@ static int hdpvr_i2c_write(struct hdpvr_device *dev, unsigned char addr,
|
||||||
|
REQTYPE_I2C_WRITE_STATT, CTRL_READ_REQUEST,
|
||||||
|
0, 0, buf, 2, 1000);
|
||||||
|
|
||||||
|
- if (ret == 2)
|
||||||
|
+ if ((ret == 2) && (buf[1] == (len - 1)))
|
||||||
|
ret = 0;
|
||||||
|
else if (ret >= 0)
|
||||||
|
ret = -EIO;
|
||||||
|
@@ -93,10 +98,10 @@ static int hdpvr_transfer(struct i2c_adapter *i2c_adapter, struct i2c_msg *msgs,
|
||||||
|
addr = msgs[i].addr << 1;
|
||||||
|
|
||||||
|
if (msgs[i].flags & I2C_M_RD)
|
||||||
|
- retval = hdpvr_i2c_read(dev, addr, msgs[i].buf,
|
||||||
|
+ retval = hdpvr_i2c_read(dev, 1, addr, msgs[i].buf,
|
||||||
|
msgs[i].len);
|
||||||
|
else
|
||||||
|
- retval = hdpvr_i2c_write(dev, addr, msgs[i].buf,
|
||||||
|
+ retval = hdpvr_i2c_write(dev, 1, addr, msgs[i].buf,
|
||||||
|
msgs[i].len);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -115,31 +120,59 @@ static struct i2c_algorithm hdpvr_algo = {
|
||||||
|
.functionality = hdpvr_functionality,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static struct i2c_adapter hdpvr_i2c_adapter_template = {
|
||||||
|
+ .name = "Hauppage HD PVR I2C",
|
||||||
|
+ .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 = {
|
||||||
|
+ I2C_BOARD_INFO("ir_tx_z8f0811_haup", HDPVR_HW_Z8F0811_IR_TX_I2C_ADDR),
|
||||||
|
+ I2C_BOARD_INFO("ir_rx_z8f0811_haup", HDPVR_HW_Z8F0811_IR_RX_I2C_ADDR),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int hdpvr_activate_ir(struct hdpvr_device *dev)
|
||||||
|
+{
|
||||||
|
+ char buffer[8];
|
||||||
|
+
|
||||||
|
+ mutex_lock(&dev->i2c_mutex);
|
||||||
|
+
|
||||||
|
+ hdpvr_i2c_read(dev, 0, 0x54, buffer, 1);
|
||||||
|
+
|
||||||
|
+ buffer[0] = 0;
|
||||||
|
+ buffer[1] = 0x8;
|
||||||
|
+ hdpvr_i2c_write(dev, 1, 0x54, buffer, 2);
|
||||||
|
+
|
||||||
|
+ buffer[1] = 0x18;
|
||||||
|
+ hdpvr_i2c_write(dev, 1, 0x54, buffer, 2);
|
||||||
|
+
|
||||||
|
+ mutex_unlock(&dev->i2c_mutex);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int hdpvr_register_i2c_adapter(struct hdpvr_device *dev)
|
||||||
|
{
|
||||||
|
- struct i2c_adapter *i2c_adap;
|
||||||
|
int retval = -ENOMEM;
|
||||||
|
|
||||||
|
- i2c_adap = kzalloc(sizeof(struct i2c_adapter), GFP_KERNEL);
|
||||||
|
- if (i2c_adap == NULL)
|
||||||
|
- goto error;
|
||||||
|
+ hdpvr_activate_ir(dev);
|
||||||
|
|
||||||
|
- 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,
|
||||||
|
+ sizeof(struct i2c_adapter));
|
||||||
|
+ dev->i2c_adapter.dev.parent = &dev->udev->dev;
|
||||||
|
|
||||||
|
- i2c_set_adapdata(i2c_adap, dev);
|
||||||
|
+ i2c_set_adapdata(&dev->i2c_adapter, dev);
|
||||||
|
|
||||||
|
- retval = i2c_add_adapter(i2c_adap);
|
||||||
|
+ retval = i2c_add_adapter(&dev->i2c_adapter);
|
||||||
|
+ if (retval)
|
||||||
|
+ goto error;
|
||||||
|
|
||||||
|
- if (!retval)
|
||||||
|
- dev->i2c_adapter = i2c_adap;
|
||||||
|
- else
|
||||||
|
- kfree(i2c_adap);
|
||||||
|
+ i2c_new_device(&dev->i2c_adapter, &hdpvr_i2c_board_info);
|
||||||
|
|
||||||
|
error:
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+#endif /* CONFIG_I2C */
|
||||||
|
diff --git a/drivers/media/video/hdpvr/hdpvr.h b/drivers/media/video/hdpvr/hdpvr.h
|
||||||
|
index 49ae25d..8a5729a 100644
|
||||||
|
--- a/drivers/media/video/hdpvr/hdpvr.h
|
||||||
|
+++ b/drivers/media/video/hdpvr/hdpvr.h
|
||||||
|
@@ -102,7 +102,7 @@ struct hdpvr_device {
|
||||||
|
struct work_struct worker;
|
||||||
|
|
||||||
|
/* I2C adapter */
|
||||||
|
- struct i2c_adapter *i2c_adapter;
|
||||||
|
+ struct i2c_adapter i2c_adapter;
|
||||||
|
/* I2C lock */
|
||||||
|
struct mutex i2c_mutex;
|
||||||
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
From sgruszka@redhat.com Mon Jan 17 08:04:28 2011
|
||||||
|
Return-Path: sgruszka@redhat.com
|
||||||
|
Received: from zmta03.collab.prod.int.phx2.redhat.com (LHLO
|
||||||
|
zmta03.collab.prod.int.phx2.redhat.com) (10.5.5.33) by
|
||||||
|
mail03.corp.redhat.com with LMTP; Mon, 17 Jan 2011 08:04:28 -0500 (EST)
|
||||||
|
Received: from localhost (localhost.localdomain [127.0.0.1])
|
||||||
|
by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 5CF754C96B;
|
||||||
|
Mon, 17 Jan 2011 08:04:28 -0500 (EST)
|
||||||
|
Received: from zmta03.collab.prod.int.phx2.redhat.com ([127.0.0.1])
|
||||||
|
by localhost (zmta03.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)
|
||||||
|
with ESMTP id qCtjRMUf-IeX; Mon, 17 Jan 2011 08:04:28 -0500 (EST)
|
||||||
|
Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
|
||||||
|
by zmta03.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id 4B8794C91D;
|
||||||
|
Mon, 17 Jan 2011 08:04:28 -0500 (EST)
|
||||||
|
Received: from localhost (vpn-235-108.phx2.redhat.com [10.3.235.108])
|
||||||
|
by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p0HD4RC9017134;
|
||||||
|
Mon, 17 Jan 2011 08:04:27 -0500
|
||||||
|
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||||
|
To: stable@kernel.org, kernel@lists.fedoraproject.org
|
||||||
|
Cc: Kyle McMartin <kmcmartin@redhat.com>,
|
||||||
|
Stanislaw Gruszka <sgruszka@redhat.com>,
|
||||||
|
Dominik Brodowski <linux@dominikbrodowski.net>,
|
||||||
|
Tim Gardner <tim.gardner@canonical.com>,
|
||||||
|
linux-wireless@vger.kernel.org
|
||||||
|
Subject: [PATCH 2.6.34.y] hostap_cs: fix sleeping function called from invalid context
|
||||||
|
Date: Mon, 17 Jan 2011 14:04:25 +0100
|
||||||
|
Message-Id: <1295269465-4903-1-git-send-email-sgruszka@redhat.com>
|
||||||
|
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
|
||||||
|
|
||||||
|
commit 4e5518ca53be29c1ec3c00089c97bef36bfed515 upstream.
|
||||||
|
|
||||||
|
pcmcia_request_irq() and pcmcia_enable_device() are intended
|
||||||
|
to be called from process context (first function allocate memory
|
||||||
|
with GFP_KERNEL, second take a mutex). We can not take spin lock
|
||||||
|
and call them.
|
||||||
|
|
||||||
|
It's safe to move spin lock after pcmcia_enable_device() as we
|
||||||
|
still hold off IRQ until dev->base_addr is 0 and driver will
|
||||||
|
not proceed with interrupts when is not ready.
|
||||||
|
|
||||||
|
Patch resolves:
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=643758
|
||||||
|
|
||||||
|
Reported-and-tested-by: rbugz@biobind.com
|
||||||
|
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/net/wireless/hostap/hostap_cs.c | 14 +++-----------
|
||||||
|
1 files changed, 3 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c
|
||||||
|
index f33e18e..116b5c6 100644
|
||||||
|
--- a/drivers/net/wireless/hostap/hostap_cs.c
|
||||||
|
+++ b/drivers/net/wireless/hostap/hostap_cs.c
|
||||||
|
@@ -638,12 +638,6 @@ static int prism2_config(struct pcmcia_device *link)
|
||||||
|
link->dev_node = &hw_priv->node;
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * Make sure the IRQ handler cannot proceed until at least
|
||||||
|
- * dev->base_addr is initialized.
|
||||||
|
- */
|
||||||
|
- spin_lock_irqsave(&local->irq_init_lock, flags);
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
* Allocate an interrupt line. Note that this does not assign a
|
||||||
|
* handler to the interrupt, unless the 'Handler' member of the
|
||||||
|
* irq structure is initialized.
|
||||||
|
@@ -653,7 +647,7 @@ static int prism2_config(struct pcmcia_device *link)
|
||||||
|
link->irq.Handler = prism2_interrupt;
|
||||||
|
ret = pcmcia_request_irq(link, &link->irq);
|
||||||
|
if (ret)
|
||||||
|
- goto failed_unlock;
|
||||||
|
+ goto failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -663,11 +657,11 @@ static int prism2_config(struct pcmcia_device *link)
|
||||||
|
*/
|
||||||
|
ret = pcmcia_request_configuration(link, &link->conf);
|
||||||
|
if (ret)
|
||||||
|
- goto failed_unlock;
|
||||||
|
+ goto failed;
|
||||||
|
|
||||||
|
+ spin_lock_irqsave(&local->irq_init_lock, flags);
|
||||||
|
dev->irq = link->irq.AssignedIRQ;
|
||||||
|
dev->base_addr = link->io.BasePort1;
|
||||||
|
-
|
||||||
|
spin_unlock_irqrestore(&local->irq_init_lock, flags);
|
||||||
|
|
||||||
|
/* Finally, report what we've done */
|
||||||
|
@@ -698,8 +692,6 @@ static int prism2_config(struct pcmcia_device *link)
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
- failed_unlock:
|
||||||
|
- spin_unlock_irqrestore(&local->irq_init_lock, flags);
|
||||||
|
failed:
|
||||||
|
kfree(hw_priv);
|
||||||
|
prism2_release((u_long)link);
|
||||||
|
--
|
||||||
|
1.7.1
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
From dec23057518b7035117a1a732aa48be6d34f1be8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andrew Lutomirski <luto@mit.edu>
|
||||||
|
Date: Sat, 12 Jun 2010 09:21:18 +0000
|
||||||
|
Subject: i915: Fix CRT hotplug regression in 2.6.35-rc1
|
||||||
|
|
||||||
|
Commit 7a772c492fcfffae812ffca78a628e76fa57fe58 has two bugs which
|
||||||
|
made the hotplug problems on my laptop worse instead of better.
|
||||||
|
|
||||||
|
First, it did not, in fact, disable the CRT plug interrupt -- it
|
||||||
|
disabled all the other hotplug interrupts. It seems rather doubtful
|
||||||
|
that that bit of the patch fixed anything, so let's just remove it.
|
||||||
|
(If you want to add it back, you probably meant ~CRT_HOTPLUG_INT_EN.)
|
||||||
|
|
||||||
|
Second, on at least my GM45, setting CRT_HOTPLUG_ACTIVATION_PERIOD_64
|
||||||
|
and CRT_HOTPLUG_VOLTAGE_COMPARE_50 (when they were previously unset)
|
||||||
|
causes a hotplug interrupt about three seconds later. The old code
|
||||||
|
never restored PORT_HOTPLUG_EN so this could only happen once, but
|
||||||
|
they new code restores those registers. So just set those bits when
|
||||||
|
we set up the interrupt in the first place.
|
||||||
|
|
||||||
|
Signed-off-by: Andy Lutomirski <luto@mit.edu>
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/i915/i915_irq.c | 12 +++++++++++-
|
||||||
|
drivers/gpu/drm/i915/i915_reg.h | 1 -
|
||||||
|
drivers/gpu/drm/i915/intel_crt.c | 6 ------
|
||||||
|
3 files changed, 11 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
|
||||||
|
index 2479be0..7acb1a6 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_irq.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_irq.c
|
||||||
|
@@ -1400,8 +1400,18 @@ int i915_driver_irq_postinstall(struct drm_device *dev)
|
||||||
|
hotplug_en |= SDVOC_HOTPLUG_INT_EN;
|
||||||
|
if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS)
|
||||||
|
hotplug_en |= SDVOB_HOTPLUG_INT_EN;
|
||||||
|
- if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS)
|
||||||
|
+ if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) {
|
||||||
|
hotplug_en |= CRT_HOTPLUG_INT_EN;
|
||||||
|
+
|
||||||
|
+ /* Programming the CRT detection parameters tends
|
||||||
|
+ to generate a spurious hotplug event about three
|
||||||
|
+ seconds later. So just do it once.
|
||||||
|
+ */
|
||||||
|
+ if (IS_G4X(dev))
|
||||||
|
+ hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64;
|
||||||
|
+ hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Ignore TV since it's buggy */
|
||||||
|
|
||||||
|
I915_WRITE(PORT_HOTPLUG_EN, hotplug_en);
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
|
||||||
|
index 64b0a3a..d390b17 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_reg.h
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_reg.h
|
||||||
|
@@ -1130,7 +1130,6 @@
|
||||||
|
#define CRT_HOTPLUG_DETECT_DELAY_2G (1 << 4)
|
||||||
|
#define CRT_HOTPLUG_DETECT_VOLTAGE_325MV (0 << 2)
|
||||||
|
#define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2)
|
||||||
|
-#define CRT_HOTPLUG_MASK (0x3fc) /* Bits 9-2 */
|
||||||
|
|
||||||
|
#define PORT_HOTPLUG_STAT 0x61114
|
||||||
|
#define HDMIB_HOTPLUG_INT_STATUS (1 << 29)
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
|
||||||
|
index 22ff384..ee0732b 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_crt.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_crt.c
|
||||||
|
@@ -234,14 +234,8 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
|
||||||
|
else
|
||||||
|
tries = 1;
|
||||||
|
hotplug_en = orig = I915_READ(PORT_HOTPLUG_EN);
|
||||||
|
- hotplug_en &= CRT_HOTPLUG_MASK;
|
||||||
|
hotplug_en |= CRT_HOTPLUG_FORCE_DETECT;
|
||||||
|
|
||||||
|
- if (IS_G4X(dev))
|
||||||
|
- hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64;
|
||||||
|
-
|
||||||
|
- hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50;
|
||||||
|
-
|
||||||
|
for (i = 0; i < tries ; i++) {
|
||||||
|
unsigned long timeout;
|
||||||
|
/* turn on the FORCE_DETECT */
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,142 @@
|
||||||
|
From 785465d9cffd65b5a69dd2f465d2f7c917713220 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@mcmartin.ca>
|
||||||
|
Date: Mon, 18 Oct 2010 13:30:39 -0400
|
||||||
|
Subject: [PATCH] ima: provide a toggle to disable it entirely
|
||||||
|
|
||||||
|
Signed-off-by: Kyle McMartin <kyle@redhat.com>
|
||||||
|
---
|
||||||
|
security/integrity/ima/ima.h | 1 +
|
||||||
|
security/integrity/ima/ima_iint.c | 9 +++++++++
|
||||||
|
security/integrity/ima/ima_main.c | 24 +++++++++++++++++++++---
|
||||||
|
3 files changed, 31 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/security/integrity/ima/ima_iint.c b/security/integrity/ima/ima_iint.c
|
||||||
|
index afba4ae..3d191ef 100644
|
||||||
|
--- a/security/integrity/ima/ima_iint.c
|
||||||
|
+++ b/security/integrity/ima/ima_iint.c
|
||||||
|
@@ -54,6 +54,9 @@ int ima_inode_alloc(struct inode *inode)
|
||||||
|
struct ima_iint_cache *iint = NULL;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
+ if (!ima_enabled)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
iint = kmem_cache_alloc(iint_cache, GFP_NOFS);
|
||||||
|
if (!iint)
|
||||||
|
return -ENOMEM;
|
||||||
|
@@ -116,6 +119,9 @@ void ima_inode_free(struct inode *inode)
|
||||||
|
{
|
||||||
|
struct ima_iint_cache *iint;
|
||||||
|
|
||||||
|
+ if (!ima_enabled)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
spin_lock(&ima_iint_lock);
|
||||||
|
iint = radix_tree_delete(&ima_iint_store, (unsigned long)inode);
|
||||||
|
spin_unlock(&ima_iint_lock);
|
||||||
|
@@ -139,6 +145,9 @@ static void init_once(void *foo)
|
||||||
|
|
||||||
|
static int __init ima_iintcache_init(void)
|
||||||
|
{
|
||||||
|
+ if (!ima_enabled)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
iint_cache =
|
||||||
|
kmem_cache_create("iint_cache", sizeof(struct ima_iint_cache), 0,
|
||||||
|
SLAB_PANIC, init_once);
|
||||||
|
diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c
|
||||||
|
index e662b89..6e91905 100644
|
||||||
|
--- a/security/integrity/ima/ima_main.c
|
||||||
|
+++ b/security/integrity/ima/ima_main.c
|
||||||
|
@@ -26,6 +26,7 @@
|
||||||
|
#include "ima.h"
|
||||||
|
|
||||||
|
int ima_initialized;
|
||||||
|
+int ima_enabled;
|
||||||
|
|
||||||
|
char *ima_hash = "sha1";
|
||||||
|
static int __init hash_setup(char *str)
|
||||||
|
@@ -36,6 +37,14 @@ static int __init hash_setup(char *str)
|
||||||
|
}
|
||||||
|
__setup("ima_hash=", hash_setup);
|
||||||
|
|
||||||
|
+static int __init ima_enable(char *str)
|
||||||
|
+{
|
||||||
|
+ if (strncmp(str, "on", 2) == 0)
|
||||||
|
+ ima_enabled = 1;
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+__setup("ima=", ima_enable);
|
||||||
|
+
|
||||||
|
struct ima_imbalance {
|
||||||
|
struct hlist_node node;
|
||||||
|
unsigned long fsmagic;
|
||||||
|
@@ -148,7 +157,7 @@ void ima_counts_get(struct file *file)
|
||||||
|
struct ima_iint_cache *iint;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
- if (!ima_initialized || !S_ISREG(inode->i_mode))
|
||||||
|
+ if (!ima_enabled || !ima_initialized || !S_ISREG(inode->i_mode))
|
||||||
|
return;
|
||||||
|
iint = ima_iint_find_get(inode);
|
||||||
|
if (!iint)
|
||||||
|
@@ -215,7 +224,7 @@ void ima_file_free(struct file *file)
|
||||||
|
struct inode *inode = file->f_dentry->d_inode;
|
||||||
|
struct ima_iint_cache *iint;
|
||||||
|
|
||||||
|
- if (!ima_initialized || !S_ISREG(inode->i_mode))
|
||||||
|
+ if (!ima_enabled || !ima_initialized || !S_ISREG(inode->i_mode))
|
||||||
|
return;
|
||||||
|
iint = ima_iint_find_get(inode);
|
||||||
|
if (!iint)
|
||||||
|
@@ -269,7 +278,7 @@ int ima_file_mmap(struct file *file, unsigned long prot)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
- if (!file)
|
||||||
|
+ if (!ima_enabled || !file)
|
||||||
|
return 0;
|
||||||
|
if (prot & PROT_EXEC)
|
||||||
|
rc = process_measurement(file, file->f_dentry->d_name.name,
|
||||||
|
@@ -294,6 +303,9 @@ int ima_bprm_check(struct linux_binprm *bprm)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
+ if (!ima_enabled)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
rc = process_measurement(bprm->file, bprm->filename,
|
||||||
|
MAY_EXEC, BPRM_CHECK);
|
||||||
|
return 0;
|
||||||
|
@@ -313,6 +325,9 @@ int ima_file_check(struct file *file, int mask)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
+ if (!ima_enabled)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
rc = process_measurement(file, file->f_dentry->d_name.name,
|
||||||
|
mask & (MAY_READ | MAY_WRITE | MAY_EXEC),
|
||||||
|
FILE_CHECK);
|
||||||
|
@@ -324,6 +339,9 @@ static int __init init_ima(void)
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
|
||||||
|
+ if (!ima_enabled)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
error = ima_init();
|
||||||
|
ima_initialized = 1;
|
||||||
|
return error;
|
||||||
|
diff --git a/security/integrity/ima/ima.h b/security/integrity/ima/ima.h
|
||||||
|
index 47fb65d..8919c4e 100644
|
||||||
|
--- a/security/integrity/ima/ima.h
|
||||||
|
+++ b/security/integrity/ima/ima.h
|
||||||
|
@@ -36,6 +36,7 @@ enum tpm_pcrs { TPM_PCR0 = 0, TPM_PCR8 = 8 };
|
||||||
|
|
||||||
|
/* set during initialization */
|
||||||
|
extern int ima_initialized;
|
||||||
|
+extern int ima_enabled;
|
||||||
|
extern int ima_used_chip;
|
||||||
|
extern char *ima_hash;
|
||||||
|
|
|
@ -0,0 +1,105 @@
|
||||||
|
From 2e9684595ceeb850702f21b84f25f39c4cece24c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nelson Elhage <nelhage@ksplice.com>
|
||||||
|
Date: Wed, 3 Nov 2010 16:35:41 +0000
|
||||||
|
Subject: inet_diag: Make sure we actually run the same bytecode we audited.
|
||||||
|
|
||||||
|
We were using nlmsg_find_attr() to look up the bytecode by attribute when
|
||||||
|
auditing, but then just using the first attribute when actually running
|
||||||
|
bytecode. So, if we received a message with two attribute elements, where only
|
||||||
|
the second had type INET_DIAG_REQ_BYTECODE, we would validate and run different
|
||||||
|
bytecode strings.
|
||||||
|
|
||||||
|
Fix this by consistently using nlmsg_find_attr everywhere.
|
||||||
|
|
||||||
|
Signed-off-by: Nelson Elhage <nelhage@ksplice.com>
|
||||||
|
Signed-off-by: Thomas Graf <tgraf@infradead.org>
|
||||||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||||
|
---
|
||||||
|
net/ipv4/inet_diag.c | 27 ++++++++++++++++-----------
|
||||||
|
1 files changed, 16 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c
|
||||||
|
index e5fa2dd..7403b9b 100644
|
||||||
|
--- a/net/ipv4/inet_diag.c
|
||||||
|
+++ b/net/ipv4/inet_diag.c
|
||||||
|
@@ -490,9 +490,11 @@ static int inet_csk_diag_dump(struct sock *sk,
|
||||||
|
{
|
||||||
|
struct inet_diag_req *r = NLMSG_DATA(cb->nlh);
|
||||||
|
|
||||||
|
- if (cb->nlh->nlmsg_len > 4 + NLMSG_SPACE(sizeof(*r))) {
|
||||||
|
+ if (nlmsg_attrlen(cb->nlh, sizeof(*r))) {
|
||||||
|
struct inet_diag_entry entry;
|
||||||
|
- struct rtattr *bc = (struct rtattr *)(r + 1);
|
||||||
|
+ const struct nlattr *bc = nlmsg_find_attr(cb->nlh,
|
||||||
|
+ sizeof(*r),
|
||||||
|
+ INET_DIAG_REQ_BYTECODE);
|
||||||
|
struct inet_sock *inet = inet_sk(sk);
|
||||||
|
|
||||||
|
entry.family = sk->sk_family;
|
||||||
|
@@ -512,7 +514,7 @@ static int inet_csk_diag_dump(struct sock *sk,
|
||||||
|
entry.dport = ntohs(inet->inet_dport);
|
||||||
|
entry.userlocks = sk->sk_userlocks;
|
||||||
|
|
||||||
|
- if (!inet_diag_bc_run(RTA_DATA(bc), RTA_PAYLOAD(bc), &entry))
|
||||||
|
+ if (!inet_diag_bc_run(nla_data(bc), nla_len(bc), &entry))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -527,9 +529,11 @@ static int inet_twsk_diag_dump(struct inet_timewait_sock *tw,
|
||||||
|
{
|
||||||
|
struct inet_diag_req *r = NLMSG_DATA(cb->nlh);
|
||||||
|
|
||||||
|
- if (cb->nlh->nlmsg_len > 4 + NLMSG_SPACE(sizeof(*r))) {
|
||||||
|
+ if (nlmsg_attrlen(cb->nlh, sizeof(*r))) {
|
||||||
|
struct inet_diag_entry entry;
|
||||||
|
- struct rtattr *bc = (struct rtattr *)(r + 1);
|
||||||
|
+ const struct nlattr *bc = nlmsg_find_attr(cb->nlh,
|
||||||
|
+ sizeof(*r),
|
||||||
|
+ INET_DIAG_REQ_BYTECODE);
|
||||||
|
|
||||||
|
entry.family = tw->tw_family;
|
||||||
|
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
|
||||||
|
@@ -548,7 +552,7 @@ static int inet_twsk_diag_dump(struct inet_timewait_sock *tw,
|
||||||
|
entry.dport = ntohs(tw->tw_dport);
|
||||||
|
entry.userlocks = 0;
|
||||||
|
|
||||||
|
- if (!inet_diag_bc_run(RTA_DATA(bc), RTA_PAYLOAD(bc), &entry))
|
||||||
|
+ if (!inet_diag_bc_run(nla_data(bc), nla_len(bc), &entry))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -618,7 +622,7 @@ static int inet_diag_dump_reqs(struct sk_buff *skb, struct sock *sk,
|
||||||
|
struct inet_diag_req *r = NLMSG_DATA(cb->nlh);
|
||||||
|
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||||
|
struct listen_sock *lopt;
|
||||||
|
- struct rtattr *bc = NULL;
|
||||||
|
+ const struct nlattr *bc = NULL;
|
||||||
|
struct inet_sock *inet = inet_sk(sk);
|
||||||
|
int j, s_j;
|
||||||
|
int reqnum, s_reqnum;
|
||||||
|
@@ -638,8 +642,9 @@ static int inet_diag_dump_reqs(struct sk_buff *skb, struct sock *sk,
|
||||||
|
if (!lopt || !lopt->qlen)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
- if (cb->nlh->nlmsg_len > 4 + NLMSG_SPACE(sizeof(*r))) {
|
||||||
|
- bc = (struct rtattr *)(r + 1);
|
||||||
|
+ if (nlmsg_attrlen(cb->nlh, sizeof(*r))) {
|
||||||
|
+ bc = nlmsg_find_attr(cb->nlh, sizeof(*r),
|
||||||
|
+ INET_DIAG_REQ_BYTECODE);
|
||||||
|
entry.sport = inet->inet_num;
|
||||||
|
entry.userlocks = sk->sk_userlocks;
|
||||||
|
}
|
||||||
|
@@ -672,8 +677,8 @@ static int inet_diag_dump_reqs(struct sk_buff *skb, struct sock *sk,
|
||||||
|
&ireq->rmt_addr;
|
||||||
|
entry.dport = ntohs(ireq->rmt_port);
|
||||||
|
|
||||||
|
- if (!inet_diag_bc_run(RTA_DATA(bc),
|
||||||
|
- RTA_PAYLOAD(bc), &entry))
|
||||||
|
+ if (!inet_diag_bc_run(nla_data(bc),
|
||||||
|
+ nla_len(bc), &entry))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.3.2
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
|
||||||
|
Date: Wed, 21 Jul 2010 07:01:19 +0000 (-0700)
|
||||||
|
Subject: Input: synaptics - relax capability ID checks on newer hardware
|
||||||
|
X-Git-Tag: v2.6.35-rc6~1^2
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=3619b8fead04ab9de643712e757ef6b5f79fd1ab
|
||||||
|
|
||||||
|
Input: synaptics - relax capability ID checks on newer hardware
|
||||||
|
|
||||||
|
Older firmwares fixed the middle byte of the Synaptics capabilities
|
||||||
|
query to 0x47, but starting with firmware 7.5 the middle byte
|
||||||
|
represents submodel ID, sometimes also called "dash number".
|
||||||
|
|
||||||
|
Reported-and-tested-by: Miroslav Šulc <fordfrog@gmail.com>
|
||||||
|
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
|
||||||
|
index 9ba9c4a..705589d 100644
|
||||||
|
--- a/drivers/input/mouse/synaptics.c
|
||||||
|
+++ b/drivers/input/mouse/synaptics.c
|
||||||
|
@@ -141,8 +141,13 @@ static int synaptics_capability(struct psmouse *psmouse)
|
||||||
|
priv->capabilities = (cap[0] << 16) | (cap[1] << 8) | cap[2];
|
||||||
|
priv->ext_cap = priv->ext_cap_0c = 0;
|
||||||
|
|
||||||
|
- if (!SYN_CAP_VALID(priv->capabilities))
|
||||||
|
+ /*
|
||||||
|
+ * Older firmwares had submodel ID fixed to 0x47
|
||||||
|
+ */
|
||||||
|
+ if (SYN_ID_FULL(priv->identity) < 0x705 &&
|
||||||
|
+ SYN_CAP_SUBMODEL_ID(priv->capabilities) != 0x47) {
|
||||||
|
return -1;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Unless capExtended is set the rest of the flags should be ignored
|
||||||
|
diff --git a/drivers/input/mouse/synaptics.h b/drivers/input/mouse/synaptics.h
|
||||||
|
index 7d4d5e1..b6aa7d2 100644
|
||||||
|
--- a/drivers/input/mouse/synaptics.h
|
||||||
|
+++ b/drivers/input/mouse/synaptics.h
|
||||||
|
@@ -47,7 +47,7 @@
|
||||||
|
#define SYN_CAP_FOUR_BUTTON(c) ((c) & (1 << 3))
|
||||||
|
#define SYN_CAP_MULTIFINGER(c) ((c) & (1 << 1))
|
||||||
|
#define SYN_CAP_PALMDETECT(c) ((c) & (1 << 0))
|
||||||
|
-#define SYN_CAP_VALID(c) ((((c) & 0x00ff00) >> 8) == 0x47)
|
||||||
|
+#define SYN_CAP_SUBMODEL_ID(c) (((c) & 0x00ff00) >> 8)
|
||||||
|
#define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20)
|
||||||
|
#define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12)
|
||||||
|
#define SYN_CAP_PRODUCT_ID(ec) (((ec) & 0xff0000) >> 16)
|
||||||
|
@@ -66,6 +66,7 @@
|
||||||
|
#define SYN_ID_MODEL(i) (((i) >> 4) & 0x0f)
|
||||||
|
#define SYN_ID_MAJOR(i) ((i) & 0x0f)
|
||||||
|
#define SYN_ID_MINOR(i) (((i) >> 16) & 0xff)
|
||||||
|
+#define SYN_ID_FULL(i) ((SYN_ID_MAJOR(i) << 8) | SYN_ID_MINOR(i))
|
||||||
|
#define SYN_ID_IS_SYNAPTICS(i) ((((i) >> 8) & 0xff) == 0x47)
|
||||||
|
|
||||||
|
/* synaptics special commands */
|
|
@ -0,0 +1,162 @@
|
||||||
|
From 5b51e801eef53be8e521316eea9e78e5c4595fd4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Date: Thu, 4 Mar 2010 13:38:59 -0800
|
||||||
|
Subject: [PATCH] iwlwifi: Recover TX flow failure
|
||||||
|
|
||||||
|
Monitors the tx statistics to detect the drop in throughput.
|
||||||
|
When the throughput drops, the ratio of the actual_ack_count and the
|
||||||
|
expected_ack_count also drops. At the same time, the aggregated
|
||||||
|
ba_timeout (the number of ba timeout retries) also rises. If the
|
||||||
|
actual_ack_count/expected_ack_count ratio is 0 and the number of ba
|
||||||
|
timeout retries rises to BA_TIMEOUT_MAX, no tx packets can be delivered.
|
||||||
|
Reloading the uCode and bring the system back to normal operational
|
||||||
|
state.
|
||||||
|
|
||||||
|
Signed-off-by: Trieu 'Andrew' Nguyen <trieux.t.nguyen@intel.com>
|
||||||
|
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||||
|
---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-agn.c | 14 ++++++++-
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-dev.h | 21 +++++++++++++
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-rx.c | 50 +++++++++++++++++++++++++++++++-
|
||||||
|
3 files changed, 83 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
index 07a9a02..dc751cb 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
@@ -2965,10 +2965,21 @@ static int iwl_mac_ampdu_action(struct ieee80211_hw *hw,
|
||||||
|
return ret;
|
||||||
|
case IEEE80211_AMPDU_TX_START:
|
||||||
|
IWL_DEBUG_HT(priv, "start Tx\n");
|
||||||
|
- return iwl_tx_agg_start(priv, sta->addr, tid, ssn);
|
||||||
|
+ ret = iwl_tx_agg_start(priv, sta->addr, tid, ssn);
|
||||||
|
+ if (ret == 0) {
|
||||||
|
+ priv->_agn.agg_tids_count++;
|
||||||
|
+ IWL_DEBUG_HT(priv, "priv->_agn.agg_tids_count = %u\n",
|
||||||
|
+ priv->_agn.agg_tids_count);
|
||||||
|
+ }
|
||||||
|
+ return ret;
|
||||||
|
case IEEE80211_AMPDU_TX_STOP:
|
||||||
|
IWL_DEBUG_HT(priv, "stop Tx\n");
|
||||||
|
ret = iwl_tx_agg_stop(priv, sta->addr, tid);
|
||||||
|
+ if ((ret == 0) && (priv->_agn.agg_tids_count > 0)) {
|
||||||
|
+ priv->_agn.agg_tids_count--;
|
||||||
|
+ IWL_DEBUG_HT(priv, "priv->_agn.agg_tids_count = %u\n",
|
||||||
|
+ priv->_agn.agg_tids_count);
|
||||||
|
+ }
|
||||||
|
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
@@ -3399,6 +3410,7 @@ static int iwl_init_drv(struct iwl_priv *priv)
|
||||||
|
priv->iw_mode = NL80211_IFTYPE_STATION;
|
||||||
|
priv->current_ht_config.smps = IEEE80211_SMPS_STATIC;
|
||||||
|
priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF;
|
||||||
|
+ priv->_agn.agg_tids_count = 0;
|
||||||
|
|
||||||
|
/* initialize force reset */
|
||||||
|
priv->force_reset[IWL_RF_RESET].reset_duration =
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
index 447e14b..e2a6b76 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
@@ -1275,6 +1275,26 @@ struct iwl_priv {
|
||||||
|
void *shared_virt;
|
||||||
|
dma_addr_t shared_phys;
|
||||||
|
/*End*/
|
||||||
|
+ union {
|
||||||
|
+#if defined(CONFIG_IWLAGN) || defined(CONFIG_IWLAGN_MODULE)
|
||||||
|
+ struct {
|
||||||
|
+ /* INT ICT Table */
|
||||||
|
+ __le32 *ict_tbl;
|
||||||
|
+ void *ict_tbl_vir;
|
||||||
|
+ dma_addr_t ict_tbl_dma;
|
||||||
|
+ dma_addr_t aligned_ict_tbl_dma;
|
||||||
|
+ int ict_index;
|
||||||
|
+ u32 inta;
|
||||||
|
+ bool use_ict;
|
||||||
|
+ /*
|
||||||
|
+ * reporting the number of tids has AGG on. 0 means
|
||||||
|
+ * no AGGREGATION
|
||||||
|
+ */
|
||||||
|
+ u8 agg_tids_count;
|
||||||
|
+ } _agn;
|
||||||
|
+#endif
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
struct iwl_hw_params hw_params;
|
||||||
|
|
||||||
|
/* INT ICT Table */
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
index fabc52f..f48d685 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
@@ -617,9 +617,18 @@ static void iwl_accumulative_statistics(struct iwl_priv *priv,
|
||||||
|
|
||||||
|
#define REG_RECALIB_PERIOD (60)
|
||||||
|
|
||||||
|
+/* the threshold ratio of actual_ack_cnt to expected_ack_cnt in percent */
|
||||||
|
+#define ACK_CNT_RATIO (50)
|
||||||
|
+#define BA_TIMEOUT_CNT (5)
|
||||||
|
+#define BA_TIMEOUT_MAX (16)
|
||||||
|
+
|
||||||
|
#define PLCP_MSG "plcp_err exceeded %u, %u, %u, %u, %u, %d, %u mSecs\n"
|
||||||
|
/*
|
||||||
|
- * This function checks for plcp error.
|
||||||
|
+ * This function checks for plcp error, ACK count ratios, aggregated BA
|
||||||
|
+ * timeout retries.
|
||||||
|
+ * - When the ACK count ratio is 0 and aggregated BA timeout retries is
|
||||||
|
+ * exceeding the BA_TIMEOUT_MAX, it will recover the failure by resetting
|
||||||
|
+ * the firmware.
|
||||||
|
* - When the plcp error is exceeding the thresholds, it will reset the radio
|
||||||
|
* to improve the throughput.
|
||||||
|
*/
|
||||||
|
@@ -629,6 +638,45 @@ void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
int combined_plcp_delta;
|
||||||
|
unsigned int plcp_msec;
|
||||||
|
unsigned long plcp_received_jiffies;
|
||||||
|
+ int actual_ack_cnt_delta;
|
||||||
|
+ int expected_ack_cnt_delta;
|
||||||
|
+ int ba_timeout_delta;
|
||||||
|
+
|
||||||
|
+ actual_ack_cnt_delta =
|
||||||
|
+ le32_to_cpu(pkt->u.stats.tx.actual_ack_cnt) -
|
||||||
|
+ le32_to_cpu(priv->statistics.tx.actual_ack_cnt);
|
||||||
|
+ expected_ack_cnt_delta =
|
||||||
|
+ le32_to_cpu(pkt->u.stats.tx.expected_ack_cnt) -
|
||||||
|
+ le32_to_cpu(priv->statistics.tx.expected_ack_cnt);
|
||||||
|
+ ba_timeout_delta =
|
||||||
|
+ le32_to_cpu(pkt->u.stats.tx.agg.ba_timeout) -
|
||||||
|
+ le32_to_cpu(priv->statistics.tx.agg.ba_timeout);
|
||||||
|
+ if ((priv->_agn.agg_tids_count > 0) &&
|
||||||
|
+ (expected_ack_cnt_delta > 0) &&
|
||||||
|
+ (((actual_ack_cnt_delta * 100) / expected_ack_cnt_delta)
|
||||||
|
+ < ACK_CNT_RATIO) &&
|
||||||
|
+ (ba_timeout_delta > BA_TIMEOUT_CNT)) {
|
||||||
|
+ IWL_DEBUG_RADIO(priv, "actual_ack_cnt delta = %d,"
|
||||||
|
+ " expected_ack_cnt = %d\n",
|
||||||
|
+ actual_ack_cnt_delta, expected_ack_cnt_delta);
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
+ IWL_DEBUG_RADIO(priv, "rx_detected_cnt delta = %d\n",
|
||||||
|
+ priv->delta_statistics.tx.rx_detected_cnt);
|
||||||
|
+ IWL_DEBUG_RADIO(priv,
|
||||||
|
+ "ack_or_ba_timeout_collision delta = %d\n",
|
||||||
|
+ priv->delta_statistics.tx.
|
||||||
|
+ ack_or_ba_timeout_collision);
|
||||||
|
+#endif
|
||||||
|
+ IWL_DEBUG_RADIO(priv, "agg ba_timeout delta = %d\n",
|
||||||
|
+ ba_timeout_delta);
|
||||||
|
+ if ((actual_ack_cnt_delta == 0) &&
|
||||||
|
+ (ba_timeout_delta >= BA_TIMEOUT_MAX)) {
|
||||||
|
+ IWL_DEBUG_RADIO(priv,
|
||||||
|
+ "call iwl_force_reset(IWL_FW_RESET)\n");
|
||||||
|
+ iwl_force_reset(priv, IWL_FW_RESET);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/*
|
||||||
|
* check for plcp_err and trigger radio reset if it exceeds
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
From dcde3533b9f501ad079c297b3bf7659739c4c287 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Date: Wed, 24 Feb 2010 08:28:30 -0800
|
||||||
|
Subject: [PATCH] iwlwifi: add internal short scan support for 3945
|
||||||
|
|
||||||
|
Add internal short scan support for 3945 NIC, This allows 3945 NIC
|
||||||
|
to support radio reset request like the other series of NICs.
|
||||||
|
|
||||||
|
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||||
|
---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl3945-base.c | 22 ++++++++++++++--------
|
||||||
|
1 files changed, 14 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
index b74a56c..19c77a8 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
@@ -2821,7 +2821,6 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
|
||||||
|
.len = sizeof(struct iwl3945_scan_cmd),
|
||||||
|
.flags = CMD_SIZE_HUGE,
|
||||||
|
};
|
||||||
|
- int rc = 0;
|
||||||
|
struct iwl3945_scan_cmd *scan;
|
||||||
|
struct ieee80211_conf *conf = NULL;
|
||||||
|
u8 n_probes = 0;
|
||||||
|
@@ -2849,7 +2848,6 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
|
||||||
|
if (test_bit(STATUS_SCAN_HW, &priv->status)) {
|
||||||
|
IWL_DEBUG_INFO(priv, "Multiple concurrent scan requests "
|
||||||
|
"Ignoring second request.\n");
|
||||||
|
- rc = -EIO;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2884,7 +2882,7 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
|
||||||
|
priv->scan = kmalloc(sizeof(struct iwl3945_scan_cmd) +
|
||||||
|
IWL_MAX_SCAN_SIZE, GFP_KERNEL);
|
||||||
|
if (!priv->scan) {
|
||||||
|
- rc = -ENOMEM;
|
||||||
|
+ IWL_DEBUG_SCAN(priv, "Fail to allocate scan memory\n");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -2927,7 +2925,9 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
|
||||||
|
scan_suspend_time, interval);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (priv->scan_request->n_ssids) {
|
||||||
|
+ if (priv->is_internal_short_scan) {
|
||||||
|
+ IWL_DEBUG_SCAN(priv, "Start internal passive scan.\n");
|
||||||
|
+ } else if (priv->scan_request->n_ssids) {
|
||||||
|
int i, p = 0;
|
||||||
|
IWL_DEBUG_SCAN(priv, "Kicking off active scan\n");
|
||||||
|
for (i = 0; i < priv->scan_request->n_ssids; i++) {
|
||||||
|
@@ -2975,13 +2975,20 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
- scan->tx_cmd.len = cpu_to_le16(
|
||||||
|
+ if (!priv->is_internal_short_scan) {
|
||||||
|
+ scan->tx_cmd.len = cpu_to_le16(
|
||||||
|
iwl_fill_probe_req(priv,
|
||||||
|
(struct ieee80211_mgmt *)scan->data,
|
||||||
|
priv->scan_request->ie,
|
||||||
|
priv->scan_request->ie_len,
|
||||||
|
IWL_MAX_SCAN_SIZE - sizeof(*scan)));
|
||||||
|
-
|
||||||
|
+ } else {
|
||||||
|
+ scan->tx_cmd.len = cpu_to_le16(
|
||||||
|
+ iwl_fill_probe_req(priv,
|
||||||
|
+ (struct ieee80211_mgmt *)scan->data,
|
||||||
|
+ NULL, 0,
|
||||||
|
+ IWL_MAX_SCAN_SIZE - sizeof(*scan)));
|
||||||
|
+ }
|
||||||
|
/* select Rx antennas */
|
||||||
|
scan->flags |= iwl3945_get_antenna_flags(priv);
|
||||||
|
|
||||||
|
@@ -3003,8 +3010,7 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
|
||||||
|
scan->len = cpu_to_le16(cmd.len);
|
||||||
|
|
||||||
|
set_bit(STATUS_SCAN_HW, &priv->status);
|
||||||
|
- rc = iwl_send_cmd_sync(priv, &cmd);
|
||||||
|
- if (rc)
|
||||||
|
+ if (iwl_send_cmd_sync(priv, &cmd))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
queue_delayed_work(priv->workqueue, &priv->scan_check,
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,278 @@
|
||||||
|
From 56cf16e34b896ac40c6707eb053d45d2cab18bbd Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Date: Fri, 5 Mar 2010 14:22:46 -0800
|
||||||
|
Subject: [PATCH] iwlwifi: code cleanup for connectivity recovery
|
||||||
|
|
||||||
|
Split the connectivity check and recovery routine into separated
|
||||||
|
functions based on the types
|
||||||
|
1. iwl_good_ack_health() - check for ack count
|
||||||
|
2. iwl_good_plcp_health() - check for plcp error
|
||||||
|
|
||||||
|
Based on the type of errors being detected, different recovery methods
|
||||||
|
will be used to bring the system back to normal operational state.
|
||||||
|
|
||||||
|
Because different NIC has different HW and uCode, the behavior is also
|
||||||
|
different; these functions thus now form part of the ops infrastructure,
|
||||||
|
so we can have more control on how to monitor and recover from error condition
|
||||||
|
case per device.
|
||||||
|
|
||||||
|
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||||
|
---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-1000.c | 3 +-
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-4965.c | 2 +-
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-5000.c | 6 +-
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-6000.c | 6 +-
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-core.h | 11 +++-
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-rx.c | 97 +++++++++++++++++++++----------
|
||||||
|
6 files changed, 85 insertions(+), 40 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||||
|
index 2597574..7087631 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||||
|
@@ -212,7 +212,8 @@ static struct iwl_lib_ops iwl1000_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
- .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
+ .check_plcp_health = iwl_good_plcp_health,
|
||||||
|
+ .check_ack_health = iwl_good_ack_health,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl1000_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||||
|
index 6dd4328..dcca310 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||||
|
@@ -2217,7 +2217,7 @@ static struct iwl_lib_ops iwl4965_lib = {
|
||||||
|
.set_ct_kill = iwl4965_set_ct_threshold,
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
- .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
+ .check_plcp_health = iwl_good_plcp_health,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl4965_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||||
|
index 0c2469c..8e0dd13 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||||
|
@@ -1501,7 +1501,8 @@ struct iwl_lib_ops iwl5000_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
- .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
+ .check_plcp_health = iwl_good_plcp_health,
|
||||||
|
+ .check_ack_health = iwl_good_ack_health,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct iwl_lib_ops iwl5150_lib = {
|
||||||
|
@@ -1557,7 +1558,8 @@ static struct iwl_lib_ops iwl5150_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
- .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
+ .check_plcp_health = iwl_good_plcp_health,
|
||||||
|
+ .check_ack_health = iwl_good_ack_health,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl5000_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||||
|
index 189a8ce..1d4fea1 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||||
|
@@ -278,7 +278,8 @@ static struct iwl_lib_ops iwl6000_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
- .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
+ .check_plcp_health = iwl_good_plcp_health,
|
||||||
|
+ .check_ack_health = iwl_good_ack_health,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl6000_ops = {
|
||||||
|
@@ -345,7 +346,8 @@ static struct iwl_lib_ops iwl6050_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
- .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
+ .check_plcp_health = iwl_good_plcp_health,
|
||||||
|
+ .check_ack_health = iwl_good_ack_health,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl6050_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
index d67048e..5234a85 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
@@ -193,8 +193,11 @@ struct iwl_lib_ops {
|
||||||
|
void (*add_bcast_station)(struct iwl_priv *priv);
|
||||||
|
/* recover from tx queue stall */
|
||||||
|
void (*recover_from_tx_stall)(unsigned long data);
|
||||||
|
- /* recover from errors showed in statistics */
|
||||||
|
- void (*recover_from_statistics)(struct iwl_priv *priv,
|
||||||
|
+ /* check for plcp health */
|
||||||
|
+ bool (*check_plcp_health)(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt);
|
||||||
|
+ /* check for ack health */
|
||||||
|
+ bool (*check_ack_health)(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_packet *pkt);
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -438,7 +441,9 @@ void iwl_rx_missed_beacon_notif(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb);
|
||||||
|
void iwl_rx_spectrum_measure_notif(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb);
|
||||||
|
-void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
+bool iwl_good_plcp_health(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt);
|
||||||
|
+bool iwl_good_ack_health(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_packet *pkt);
|
||||||
|
void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb);
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
index f48d685..506ccf7 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
@@ -622,24 +622,18 @@ static void iwl_accumulative_statistics(struct iwl_priv *priv,
|
||||||
|
#define BA_TIMEOUT_CNT (5)
|
||||||
|
#define BA_TIMEOUT_MAX (16)
|
||||||
|
|
||||||
|
-#define PLCP_MSG "plcp_err exceeded %u, %u, %u, %u, %u, %d, %u mSecs\n"
|
||||||
|
-/*
|
||||||
|
- * This function checks for plcp error, ACK count ratios, aggregated BA
|
||||||
|
- * timeout retries.
|
||||||
|
- * - When the ACK count ratio is 0 and aggregated BA timeout retries is
|
||||||
|
- * exceeding the BA_TIMEOUT_MAX, it will recover the failure by resetting
|
||||||
|
- * the firmware.
|
||||||
|
- * - When the plcp error is exceeding the thresholds, it will reset the radio
|
||||||
|
- * to improve the throughput.
|
||||||
|
+/**
|
||||||
|
+ * iwl_good_ack_health - checks for ACK count ratios, BA timeout retries.
|
||||||
|
+ *
|
||||||
|
+ * When the ACK count ratio is 0 and aggregated BA timeout retries exceeding
|
||||||
|
+ * the BA_TIMEOUT_MAX, reload firmware and bring system back to normal
|
||||||
|
+ * operation state.
|
||||||
|
*/
|
||||||
|
-void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
- struct iwl_rx_packet *pkt)
|
||||||
|
+bool iwl_good_ack_health(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt)
|
||||||
|
{
|
||||||
|
- int combined_plcp_delta;
|
||||||
|
- unsigned int plcp_msec;
|
||||||
|
- unsigned long plcp_received_jiffies;
|
||||||
|
- int actual_ack_cnt_delta;
|
||||||
|
- int expected_ack_cnt_delta;
|
||||||
|
+ bool rc = true;
|
||||||
|
+ int actual_ack_cnt_delta, expected_ack_cnt_delta;
|
||||||
|
int ba_timeout_delta;
|
||||||
|
|
||||||
|
actual_ack_cnt_delta =
|
||||||
|
@@ -670,13 +664,27 @@ void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
#endif
|
||||||
|
IWL_DEBUG_RADIO(priv, "agg ba_timeout delta = %d\n",
|
||||||
|
ba_timeout_delta);
|
||||||
|
- if ((actual_ack_cnt_delta == 0) &&
|
||||||
|
- (ba_timeout_delta >= BA_TIMEOUT_MAX)) {
|
||||||
|
- IWL_DEBUG_RADIO(priv,
|
||||||
|
- "call iwl_force_reset(IWL_FW_RESET)\n");
|
||||||
|
- iwl_force_reset(priv, IWL_FW_RESET);
|
||||||
|
- }
|
||||||
|
+ if (!actual_ack_cnt_delta &&
|
||||||
|
+ (ba_timeout_delta >= BA_TIMEOUT_MAX))
|
||||||
|
+ rc = false;
|
||||||
|
}
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL(iwl_good_ack_health);
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * iwl_good_plcp_health - checks for plcp error.
|
||||||
|
+ *
|
||||||
|
+ * When the plcp error is exceeding the thresholds, reset the radio
|
||||||
|
+ * to improve the throughput.
|
||||||
|
+ */
|
||||||
|
+bool iwl_good_plcp_health(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt)
|
||||||
|
+{
|
||||||
|
+ bool rc = true;
|
||||||
|
+ int combined_plcp_delta;
|
||||||
|
+ unsigned int plcp_msec;
|
||||||
|
+ unsigned long plcp_received_jiffies;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* check for plcp_err and trigger radio reset if it exceeds
|
||||||
|
@@ -711,7 +719,8 @@ void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
* combined_plcp_delta,
|
||||||
|
* plcp_msec
|
||||||
|
*/
|
||||||
|
- IWL_DEBUG_RADIO(priv, PLCP_MSG,
|
||||||
|
+ IWL_DEBUG_RADIO(priv, "plcp_err exceeded %u, "
|
||||||
|
+ "%u, %u, %u, %u, %d, %u mSecs\n",
|
||||||
|
priv->cfg->plcp_delta_threshold,
|
||||||
|
le32_to_cpu(pkt->u.stats.rx.ofdm.plcp_err),
|
||||||
|
le32_to_cpu(priv->statistics.rx.ofdm.plcp_err),
|
||||||
|
@@ -719,15 +728,42 @@ void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
le32_to_cpu(
|
||||||
|
priv->statistics.rx.ofdm_ht.plcp_err),
|
||||||
|
combined_plcp_delta, plcp_msec);
|
||||||
|
- /*
|
||||||
|
- * Reset the RF radio due to the high plcp
|
||||||
|
- * error rate
|
||||||
|
- */
|
||||||
|
- iwl_force_reset(priv, IWL_RF_RESET);
|
||||||
|
+ rc = false;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL(iwl_good_plcp_health);
|
||||||
|
+
|
||||||
|
+static void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt)
|
||||||
|
+{
|
||||||
|
+ if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||||
|
+ return;
|
||||||
|
+ if (iwl_is_associated(priv)) {
|
||||||
|
+ if (priv->cfg->ops->lib->check_ack_health) {
|
||||||
|
+ if (!priv->cfg->ops->lib->check_ack_health(
|
||||||
|
+ priv, pkt)) {
|
||||||
|
+ /*
|
||||||
|
+ * low ack count detected
|
||||||
|
+ * restart Firmware
|
||||||
|
+ */
|
||||||
|
+ IWL_ERR(priv, "low ack count detected, "
|
||||||
|
+ "restart firmware\n");
|
||||||
|
+ iwl_force_reset(priv, IWL_FW_RESET);
|
||||||
|
+ }
|
||||||
|
+ } else if (priv->cfg->ops->lib->check_plcp_health) {
|
||||||
|
+ if (!priv->cfg->ops->lib->check_plcp_health(
|
||||||
|
+ priv, pkt)) {
|
||||||
|
+ /*
|
||||||
|
+ * high plcp error detected
|
||||||
|
+ * reset Radio
|
||||||
|
+ */
|
||||||
|
+ iwl_force_reset(priv, IWL_RF_RESET);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
-EXPORT_SYMBOL(iwl_recover_from_statistics);
|
||||||
|
|
||||||
|
void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb)
|
||||||
|
@@ -749,8 +785,7 @@ void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
iwl_accumulative_statistics(priv, (__le32 *)&pkt->u.stats);
|
||||||
|
#endif
|
||||||
|
- if (priv->cfg->ops->lib->recover_from_statistics)
|
||||||
|
- priv->cfg->ops->lib->recover_from_statistics(priv, pkt);
|
||||||
|
+ iwl_recover_from_statistics(priv, pkt);
|
||||||
|
|
||||||
|
memcpy(&priv->statistics, &pkt->u.stats, sizeof(priv->statistics));
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,150 @@
|
||||||
|
From 8ac33071b4c991e302be67fd0dae1d9cc4b502e3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Date: Tue, 16 Mar 2010 10:46:31 -0700
|
||||||
|
Subject: [PATCH] iwlwifi: iwl_good_ack_health() only apply to AGN device
|
||||||
|
|
||||||
|
iwl_good_ack_health() check for expected and actual ack count which only
|
||||||
|
apply to aggregation mode. Move the function to iwlagn module.
|
||||||
|
|
||||||
|
Reported-by: Chantry Xavier <chantry.xavier@gmail.com>
|
||||||
|
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||||
|
---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-agn.c | 54 +++++++++++++++++++++++++++++++
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-rx.c | 55 --------------------------------
|
||||||
|
2 files changed, 54 insertions(+), 55 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
index dc751cb..b5d410b 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
@@ -1448,6 +1448,60 @@ static void iwl_irq_tasklet(struct iwl_priv *priv)
|
||||||
|
iwl_enable_interrupts(priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* the threshold ratio of actual_ack_cnt to expected_ack_cnt in percent */
|
||||||
|
+#define ACK_CNT_RATIO (50)
|
||||||
|
+#define BA_TIMEOUT_CNT (5)
|
||||||
|
+#define BA_TIMEOUT_MAX (16)
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * iwl_good_ack_health - checks for ACK count ratios, BA timeout retries.
|
||||||
|
+ *
|
||||||
|
+ * When the ACK count ratio is 0 and aggregated BA timeout retries exceeding
|
||||||
|
+ * the BA_TIMEOUT_MAX, reload firmware and bring system back to normal
|
||||||
|
+ * operation state.
|
||||||
|
+ */
|
||||||
|
+bool iwl_good_ack_health(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt)
|
||||||
|
+{
|
||||||
|
+ bool rc = true;
|
||||||
|
+ int actual_ack_cnt_delta, expected_ack_cnt_delta;
|
||||||
|
+ int ba_timeout_delta;
|
||||||
|
+
|
||||||
|
+ actual_ack_cnt_delta =
|
||||||
|
+ le32_to_cpu(pkt->u.stats.tx.actual_ack_cnt) -
|
||||||
|
+ le32_to_cpu(priv->statistics.tx.actual_ack_cnt);
|
||||||
|
+ expected_ack_cnt_delta =
|
||||||
|
+ le32_to_cpu(pkt->u.stats.tx.expected_ack_cnt) -
|
||||||
|
+ le32_to_cpu(priv->statistics.tx.expected_ack_cnt);
|
||||||
|
+ ba_timeout_delta =
|
||||||
|
+ le32_to_cpu(pkt->u.stats.tx.agg.ba_timeout) -
|
||||||
|
+ le32_to_cpu(priv->statistics.tx.agg.ba_timeout);
|
||||||
|
+ if ((priv->_agn.agg_tids_count > 0) &&
|
||||||
|
+ (expected_ack_cnt_delta > 0) &&
|
||||||
|
+ (((actual_ack_cnt_delta * 100) / expected_ack_cnt_delta)
|
||||||
|
+ < ACK_CNT_RATIO) &&
|
||||||
|
+ (ba_timeout_delta > BA_TIMEOUT_CNT)) {
|
||||||
|
+ IWL_DEBUG_RADIO(priv, "actual_ack_cnt delta = %d,"
|
||||||
|
+ " expected_ack_cnt = %d\n",
|
||||||
|
+ actual_ack_cnt_delta, expected_ack_cnt_delta);
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
+ IWL_DEBUG_RADIO(priv, "rx_detected_cnt delta = %d\n",
|
||||||
|
+ priv->delta_statistics.tx.rx_detected_cnt);
|
||||||
|
+ IWL_DEBUG_RADIO(priv,
|
||||||
|
+ "ack_or_ba_timeout_collision delta = %d\n",
|
||||||
|
+ priv->delta_statistics.tx.
|
||||||
|
+ ack_or_ba_timeout_collision);
|
||||||
|
+#endif
|
||||||
|
+ IWL_DEBUG_RADIO(priv, "agg ba_timeout delta = %d\n",
|
||||||
|
+ ba_timeout_delta);
|
||||||
|
+ if (!actual_ack_cnt_delta &&
|
||||||
|
+ (ba_timeout_delta >= BA_TIMEOUT_MAX))
|
||||||
|
+ rc = false;
|
||||||
|
+ }
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
index 506ccf7..def5042 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
@@ -617,61 +617,6 @@ static void iwl_accumulative_statistics(struct iwl_priv *priv,
|
||||||
|
|
||||||
|
#define REG_RECALIB_PERIOD (60)
|
||||||
|
|
||||||
|
-/* the threshold ratio of actual_ack_cnt to expected_ack_cnt in percent */
|
||||||
|
-#define ACK_CNT_RATIO (50)
|
||||||
|
-#define BA_TIMEOUT_CNT (5)
|
||||||
|
-#define BA_TIMEOUT_MAX (16)
|
||||||
|
-
|
||||||
|
-/**
|
||||||
|
- * iwl_good_ack_health - checks for ACK count ratios, BA timeout retries.
|
||||||
|
- *
|
||||||
|
- * When the ACK count ratio is 0 and aggregated BA timeout retries exceeding
|
||||||
|
- * the BA_TIMEOUT_MAX, reload firmware and bring system back to normal
|
||||||
|
- * operation state.
|
||||||
|
- */
|
||||||
|
-bool iwl_good_ack_health(struct iwl_priv *priv,
|
||||||
|
- struct iwl_rx_packet *pkt)
|
||||||
|
-{
|
||||||
|
- bool rc = true;
|
||||||
|
- int actual_ack_cnt_delta, expected_ack_cnt_delta;
|
||||||
|
- int ba_timeout_delta;
|
||||||
|
-
|
||||||
|
- actual_ack_cnt_delta =
|
||||||
|
- le32_to_cpu(pkt->u.stats.tx.actual_ack_cnt) -
|
||||||
|
- le32_to_cpu(priv->statistics.tx.actual_ack_cnt);
|
||||||
|
- expected_ack_cnt_delta =
|
||||||
|
- le32_to_cpu(pkt->u.stats.tx.expected_ack_cnt) -
|
||||||
|
- le32_to_cpu(priv->statistics.tx.expected_ack_cnt);
|
||||||
|
- ba_timeout_delta =
|
||||||
|
- le32_to_cpu(pkt->u.stats.tx.agg.ba_timeout) -
|
||||||
|
- le32_to_cpu(priv->statistics.tx.agg.ba_timeout);
|
||||||
|
- if ((priv->_agn.agg_tids_count > 0) &&
|
||||||
|
- (expected_ack_cnt_delta > 0) &&
|
||||||
|
- (((actual_ack_cnt_delta * 100) / expected_ack_cnt_delta)
|
||||||
|
- < ACK_CNT_RATIO) &&
|
||||||
|
- (ba_timeout_delta > BA_TIMEOUT_CNT)) {
|
||||||
|
- IWL_DEBUG_RADIO(priv, "actual_ack_cnt delta = %d,"
|
||||||
|
- " expected_ack_cnt = %d\n",
|
||||||
|
- actual_ack_cnt_delta, expected_ack_cnt_delta);
|
||||||
|
-
|
||||||
|
-#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
- IWL_DEBUG_RADIO(priv, "rx_detected_cnt delta = %d\n",
|
||||||
|
- priv->delta_statistics.tx.rx_detected_cnt);
|
||||||
|
- IWL_DEBUG_RADIO(priv,
|
||||||
|
- "ack_or_ba_timeout_collision delta = %d\n",
|
||||||
|
- priv->delta_statistics.tx.
|
||||||
|
- ack_or_ba_timeout_collision);
|
||||||
|
-#endif
|
||||||
|
- IWL_DEBUG_RADIO(priv, "agg ba_timeout delta = %d\n",
|
||||||
|
- ba_timeout_delta);
|
||||||
|
- if (!actual_ack_cnt_delta &&
|
||||||
|
- (ba_timeout_delta >= BA_TIMEOUT_MAX))
|
||||||
|
- rc = false;
|
||||||
|
- }
|
||||||
|
- return rc;
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(iwl_good_ack_health);
|
||||||
|
-
|
||||||
|
/**
|
||||||
|
* iwl_good_plcp_health - checks for plcp error.
|
||||||
|
*
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,361 @@
|
||||||
|
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||||
|
To: kernel@lists.fedoraproject.org, "John W. Linville" <linville@redhat.com>
|
||||||
|
Subject: [PATCH 2/4 2.6.34.y] iwlwifi: manage QoS by mac stack
|
||||||
|
Date: Fri, 11 Jun 2010 17:05:12 +0200
|
||||||
|
|
||||||
|
commit e61146e36b40fd9d346118c40285913236c329f3 upstream.
|
||||||
|
|
||||||
|
We activate/deactivate QoS and setup default queue parameters in iwlwifi
|
||||||
|
driver. Mac stack do the same, so we do not need repeat that work here.
|
||||||
|
Stack also will tell when disable QoS, this will fix driver when working
|
||||||
|
with older APs, that do not have QoS implemented.
|
||||||
|
|
||||||
|
Patch make "force = true" in iwl_active_qos() assuming we always want
|
||||||
|
to do with QoS what mac stack wish.
|
||||||
|
|
||||||
|
Patch also remove unused qos_cap bits, do not initialize qos_active = 0,
|
||||||
|
as we have it initialized to zero by kzalloc.
|
||||||
|
|
||||||
|
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-agn.c | 15 ---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-core.c | 142 +++------------------------
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-core.h | 3 +-
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-dev.h | 21 ----
|
||||||
|
drivers/net/wireless/iwlwifi/iwl3945-base.c | 7 --
|
||||||
|
5 files changed, 17 insertions(+), 171 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
index bdff565..21c3ef0 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
@@ -2515,7 +2515,6 @@ void iwl_post_associate(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
struct ieee80211_conf *conf = NULL;
|
||||||
|
int ret = 0;
|
||||||
|
- unsigned long flags;
|
||||||
|
|
||||||
|
if (priv->iw_mode == NL80211_IFTYPE_AP) {
|
||||||
|
IWL_ERR(priv, "%s Should not be called in AP mode\n", __func__);
|
||||||
|
@@ -2600,10 +2599,6 @@ void iwl_post_associate(struct iwl_priv *priv)
|
||||||
|
if (priv->iw_mode == NL80211_IFTYPE_ADHOC)
|
||||||
|
priv->assoc_station_added = 1;
|
||||||
|
|
||||||
|
- spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
- iwl_activate_qos(priv, 0);
|
||||||
|
- spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
-
|
||||||
|
/* the chain noise calibration will enabled PM upon completion
|
||||||
|
* If chain noise has already been run, then we need to enable
|
||||||
|
* power management here */
|
||||||
|
@@ -2780,7 +2775,6 @@ static int iwl_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||||
|
void iwl_config_ap(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
- unsigned long flags;
|
||||||
|
|
||||||
|
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||||
|
return;
|
||||||
|
@@ -2832,10 +2826,6 @@ void iwl_config_ap(struct iwl_priv *priv)
|
||||||
|
/* restore RXON assoc */
|
||||||
|
priv->staging_rxon.filter_flags |= RXON_FILTER_ASSOC_MSK;
|
||||||
|
iwlcore_commit_rxon(priv);
|
||||||
|
- iwl_reset_qos(priv);
|
||||||
|
- spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
- iwl_activate_qos(priv, 1);
|
||||||
|
- spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
iwl_add_bcast_station(priv);
|
||||||
|
}
|
||||||
|
iwl_send_beacon_cmd(priv);
|
||||||
|
@@ -3396,11 +3386,6 @@ static int iwl_init_drv(struct iwl_priv *priv)
|
||||||
|
|
||||||
|
iwl_init_scan_params(priv);
|
||||||
|
|
||||||
|
- iwl_reset_qos(priv);
|
||||||
|
-
|
||||||
|
- priv->qos_data.qos_active = 0;
|
||||||
|
- priv->qos_data.qos_cap.val = 0;
|
||||||
|
-
|
||||||
|
priv->rates_mask = IWL_RATES_MASK;
|
||||||
|
/* Set the tx_power_user_lmt to the lowest power level
|
||||||
|
* this value will get overwritten by channel max power avg
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||||
|
index 049b652..2dd8aaa 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||||
|
@@ -325,17 +325,13 @@ EXPORT_SYMBOL(iwl_hw_nic_init);
|
||||||
|
/*
|
||||||
|
* QoS support
|
||||||
|
*/
|
||||||
|
-void iwl_activate_qos(struct iwl_priv *priv, u8 force)
|
||||||
|
+static void iwl_update_qos(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||||
|
return;
|
||||||
|
|
||||||
|
priv->qos_data.def_qos_parm.qos_flags = 0;
|
||||||
|
|
||||||
|
- if (priv->qos_data.qos_cap.q_AP.queue_request &&
|
||||||
|
- !priv->qos_data.qos_cap.q_AP.txop_request)
|
||||||
|
- priv->qos_data.def_qos_parm.qos_flags |=
|
||||||
|
- QOS_PARAM_FLG_TXOP_TYPE_MSK;
|
||||||
|
if (priv->qos_data.qos_active)
|
||||||
|
priv->qos_data.def_qos_parm.qos_flags |=
|
||||||
|
QOS_PARAM_FLG_UPDATE_EDCA_MSK;
|
||||||
|
@@ -343,118 +339,14 @@ void iwl_activate_qos(struct iwl_priv *priv, u8 force)
|
||||||
|
if (priv->current_ht_config.is_ht)
|
||||||
|
priv->qos_data.def_qos_parm.qos_flags |= QOS_PARAM_FLG_TGN_MSK;
|
||||||
|
|
||||||
|
- if (force || iwl_is_associated(priv)) {
|
||||||
|
- IWL_DEBUG_QOS(priv, "send QoS cmd with Qos active=%d FLAGS=0x%X\n",
|
||||||
|
- priv->qos_data.qos_active,
|
||||||
|
- priv->qos_data.def_qos_parm.qos_flags);
|
||||||
|
+ IWL_DEBUG_QOS(priv, "send QoS cmd with Qos active=%d FLAGS=0x%X\n",
|
||||||
|
+ priv->qos_data.qos_active,
|
||||||
|
+ priv->qos_data.def_qos_parm.qos_flags);
|
||||||
|
|
||||||
|
- iwl_send_cmd_pdu_async(priv, REPLY_QOS_PARAM,
|
||||||
|
- sizeof(struct iwl_qosparam_cmd),
|
||||||
|
- &priv->qos_data.def_qos_parm, NULL);
|
||||||
|
- }
|
||||||
|
+ iwl_send_cmd_pdu_async(priv, REPLY_QOS_PARAM,
|
||||||
|
+ sizeof(struct iwl_qosparam_cmd),
|
||||||
|
+ &priv->qos_data.def_qos_parm, NULL);
|
||||||
|
}
|
||||||
|
-EXPORT_SYMBOL(iwl_activate_qos);
|
||||||
|
-
|
||||||
|
-/*
|
||||||
|
- * AC CWmin CW max AIFSN TXOP Limit TXOP Limit
|
||||||
|
- * (802.11b) (802.11a/g)
|
||||||
|
- * AC_BK 15 1023 7 0 0
|
||||||
|
- * AC_BE 15 1023 3 0 0
|
||||||
|
- * AC_VI 7 15 2 6.016ms 3.008ms
|
||||||
|
- * AC_VO 3 7 2 3.264ms 1.504ms
|
||||||
|
- */
|
||||||
|
-void iwl_reset_qos(struct iwl_priv *priv)
|
||||||
|
-{
|
||||||
|
- u16 cw_min = 15;
|
||||||
|
- u16 cw_max = 1023;
|
||||||
|
- u8 aifs = 2;
|
||||||
|
- bool is_legacy = false;
|
||||||
|
- unsigned long flags;
|
||||||
|
- int i;
|
||||||
|
-
|
||||||
|
- spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
- /* QoS always active in AP and ADHOC mode
|
||||||
|
- * In STA mode wait for association
|
||||||
|
- */
|
||||||
|
- if (priv->iw_mode == NL80211_IFTYPE_ADHOC ||
|
||||||
|
- priv->iw_mode == NL80211_IFTYPE_AP)
|
||||||
|
- priv->qos_data.qos_active = 1;
|
||||||
|
- else
|
||||||
|
- priv->qos_data.qos_active = 0;
|
||||||
|
-
|
||||||
|
- /* check for legacy mode */
|
||||||
|
- if ((priv->iw_mode == NL80211_IFTYPE_ADHOC &&
|
||||||
|
- (priv->active_rate & IWL_OFDM_RATES_MASK) == 0) ||
|
||||||
|
- (priv->iw_mode == NL80211_IFTYPE_STATION &&
|
||||||
|
- (priv->staging_rxon.flags & RXON_FLG_SHORT_SLOT_MSK) == 0)) {
|
||||||
|
- cw_min = 31;
|
||||||
|
- is_legacy = 1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (priv->qos_data.qos_active)
|
||||||
|
- aifs = 3;
|
||||||
|
-
|
||||||
|
- /* AC_BE */
|
||||||
|
- priv->qos_data.def_qos_parm.ac[0].cw_min = cpu_to_le16(cw_min);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[0].cw_max = cpu_to_le16(cw_max);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[0].aifsn = aifs;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[0].edca_txop = 0;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[0].reserved1 = 0;
|
||||||
|
-
|
||||||
|
- if (priv->qos_data.qos_active) {
|
||||||
|
- /* AC_BK */
|
||||||
|
- i = 1;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_min = cpu_to_le16(cw_min);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_max = cpu_to_le16(cw_max);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].aifsn = 7;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop = 0;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
|
||||||
|
-
|
||||||
|
- /* AC_VI */
|
||||||
|
- i = 2;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_min =
|
||||||
|
- cpu_to_le16((cw_min + 1) / 2 - 1);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_max =
|
||||||
|
- cpu_to_le16(cw_min);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].aifsn = 2;
|
||||||
|
- if (is_legacy)
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop =
|
||||||
|
- cpu_to_le16(6016);
|
||||||
|
- else
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop =
|
||||||
|
- cpu_to_le16(3008);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
|
||||||
|
-
|
||||||
|
- /* AC_VO */
|
||||||
|
- i = 3;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_min =
|
||||||
|
- cpu_to_le16((cw_min + 1) / 4 - 1);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_max =
|
||||||
|
- cpu_to_le16((cw_min + 1) / 2 - 1);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].aifsn = 2;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
|
||||||
|
- if (is_legacy)
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop =
|
||||||
|
- cpu_to_le16(3264);
|
||||||
|
- else
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop =
|
||||||
|
- cpu_to_le16(1504);
|
||||||
|
- } else {
|
||||||
|
- for (i = 1; i < 4; i++) {
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_min =
|
||||||
|
- cpu_to_le16(cw_min);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_max =
|
||||||
|
- cpu_to_le16(cw_max);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].aifsn = aifs;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop = 0;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- IWL_DEBUG_QOS(priv, "set QoS to default \n");
|
||||||
|
-
|
||||||
|
- spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(iwl_reset_qos);
|
||||||
|
|
||||||
|
#define MAX_BIT_RATE_40_MHZ 150 /* Mbps */
|
||||||
|
#define MAX_BIT_RATE_20_MHZ 72 /* Mbps */
|
||||||
|
@@ -2306,12 +2198,6 @@ int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue,
|
||||||
|
cpu_to_le16((params->txop * 32));
|
||||||
|
|
||||||
|
priv->qos_data.def_qos_parm.ac[q].reserved1 = 0;
|
||||||
|
- priv->qos_data.qos_active = 1;
|
||||||
|
-
|
||||||
|
- if (priv->iw_mode == NL80211_IFTYPE_AP)
|
||||||
|
- iwl_activate_qos(priv, 1);
|
||||||
|
- else if (priv->assoc_id && iwl_is_associated(priv))
|
||||||
|
- iwl_activate_qos(priv, 0);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
|
||||||
|
@@ -2587,11 +2473,8 @@ int iwl_mac_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||||
|
IWL_DEBUG_MAC80211(priv, "leave\n");
|
||||||
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
|
||||||
|
- iwl_reset_qos(priv);
|
||||||
|
-
|
||||||
|
priv->cfg->ops->lib->post_associate(priv);
|
||||||
|
|
||||||
|
-
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(iwl_mac_beacon_update);
|
||||||
|
@@ -2833,6 +2716,15 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
|
||||||
|
iwl_set_tx_power(priv, conf->power_level, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (changed & IEEE80211_CONF_CHANGE_QOS) {
|
||||||
|
+ bool qos_active = !!(conf->flags & IEEE80211_CONF_QOS);
|
||||||
|
+
|
||||||
|
+ spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
+ priv->qos_data.qos_active = qos_active;
|
||||||
|
+ iwl_update_qos(priv);
|
||||||
|
+ spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (!iwl_is_ready(priv)) {
|
||||||
|
IWL_DEBUG_MAC80211(priv, "leave - not ready\n");
|
||||||
|
goto out;
|
||||||
|
@@ -2867,8 +2759,6 @@ void iwl_mac_reset_tsf(struct ieee80211_hw *hw)
|
||||||
|
memset(&priv->current_ht_config, 0, sizeof(struct iwl_ht_config));
|
||||||
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
|
||||||
|
- iwl_reset_qos(priv);
|
||||||
|
-
|
||||||
|
spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
priv->assoc_id = 0;
|
||||||
|
priv->assoc_capability = 0;
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
index 36940a9..70af968 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
@@ -304,8 +304,7 @@ struct iwl_cfg {
|
||||||
|
struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg,
|
||||||
|
struct ieee80211_ops *hw_ops);
|
||||||
|
void iwl_hw_detect(struct iwl_priv *priv);
|
||||||
|
-void iwl_reset_qos(struct iwl_priv *priv);
|
||||||
|
-void iwl_activate_qos(struct iwl_priv *priv, u8 force);
|
||||||
|
+void iwl_activate_qos(struct iwl_priv *priv);
|
||||||
|
int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue,
|
||||||
|
const struct ieee80211_tx_queue_params *params);
|
||||||
|
void iwl_set_rxon_hwcrypto(struct iwl_priv *priv, int hw_decrypt);
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
index ef1720a..cc12e89 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
@@ -519,30 +519,9 @@ struct iwl_ht_config {
|
||||||
|
u8 non_GF_STA_present;
|
||||||
|
};
|
||||||
|
|
||||||
|
-union iwl_qos_capabity {
|
||||||
|
- struct {
|
||||||
|
- u8 edca_count:4; /* bit 0-3 */
|
||||||
|
- u8 q_ack:1; /* bit 4 */
|
||||||
|
- u8 queue_request:1; /* bit 5 */
|
||||||
|
- u8 txop_request:1; /* bit 6 */
|
||||||
|
- u8 reserved:1; /* bit 7 */
|
||||||
|
- } q_AP;
|
||||||
|
- struct {
|
||||||
|
- u8 acvo_APSD:1; /* bit 0 */
|
||||||
|
- u8 acvi_APSD:1; /* bit 1 */
|
||||||
|
- u8 ac_bk_APSD:1; /* bit 2 */
|
||||||
|
- u8 ac_be_APSD:1; /* bit 3 */
|
||||||
|
- u8 q_ack:1; /* bit 4 */
|
||||||
|
- u8 max_len:2; /* bit 5-6 */
|
||||||
|
- u8 more_data_ack:1; /* bit 7 */
|
||||||
|
- } q_STA;
|
||||||
|
- u8 val;
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
/* QoS structures */
|
||||||
|
struct iwl_qos_info {
|
||||||
|
int qos_active;
|
||||||
|
- union iwl_qos_capabity qos_cap;
|
||||||
|
struct iwl_qosparam_cmd def_qos_parm;
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
index b74a56c..c054527 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
@@ -3152,8 +3152,6 @@ void iwl3945_post_associate(struct iwl_priv *priv)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- iwl_activate_qos(priv, 0);
|
||||||
|
-
|
||||||
|
/* we have just associated, don't start scan too early */
|
||||||
|
priv->next_scan_jiffies = jiffies + IWL_DELAY_NEXT_SCAN;
|
||||||
|
}
|
||||||
|
@@ -3861,11 +3859,6 @@ static int iwl3945_init_drv(struct iwl_priv *priv)
|
||||||
|
priv->iw_mode = NL80211_IFTYPE_STATION;
|
||||||
|
priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF;
|
||||||
|
|
||||||
|
- iwl_reset_qos(priv);
|
||||||
|
-
|
||||||
|
- priv->qos_data.qos_active = 0;
|
||||||
|
- priv->qos_data.qos_cap.val = 0;
|
||||||
|
-
|
||||||
|
priv->rates_mask = IWL_RATES_MASK;
|
||||||
|
priv->tx_power_user_lmt = IWL_DEFAULT_TX_POWER;
|
||||||
|
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
||||||
|
_______________________________________________
|
||||||
|
kernel mailing list
|
||||||
|
kernel@lists.fedoraproject.org
|
||||||
|
https://admin.fedoraproject.org/mailman/listinfo/kernel
|
||||||
|
|
|
@ -0,0 +1,208 @@
|
||||||
|
From b3786de4e1033b00d522a5c457a3ea9f8376d0d0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Date: Thu, 4 Mar 2010 13:38:58 -0800
|
||||||
|
Subject: [PATCH] iwlwifi: move plcp check to separated function
|
||||||
|
|
||||||
|
Move the plcp error checking into stand alone function and pointed by ops
|
||||||
|
to accommodate devices not needing this recovery.
|
||||||
|
|
||||||
|
Signed-off-by: Trieu 'Andrew' Nguyen <trieux.t.nguyen@intel.com>
|
||||||
|
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||||
|
---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-1000.c | 1 +
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-4965.c | 1 +
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-5000.c | 2 +
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-6000.c | 2 +
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-core.h | 5 +++
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-rx.c | 58 +++++++++++++++++++------------
|
||||||
|
6 files changed, 47 insertions(+), 22 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||||
|
index 89dc401..2597574 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||||
|
@@ -212,6 +212,7 @@ static struct iwl_lib_ops iwl1000_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl1000_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||||
|
index aa49a6e..6dd4328 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||||
|
@@ -2217,6 +2217,7 @@ static struct iwl_lib_ops iwl4965_lib = {
|
||||||
|
.set_ct_kill = iwl4965_set_ct_threshold,
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl4965_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||||
|
index d05fad4..0c2469c 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||||
|
@@ -1501,6 +1501,7 @@ struct iwl_lib_ops iwl5000_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct iwl_lib_ops iwl5150_lib = {
|
||||||
|
@@ -1556,6 +1557,7 @@ static struct iwl_lib_ops iwl5150_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl5000_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||||
|
index 0c965cd..189a8ce 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||||
|
@@ -278,6 +278,7 @@ static struct iwl_lib_ops iwl6000_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl6000_ops = {
|
||||||
|
@@ -344,6 +345,7 @@ static struct iwl_lib_ops iwl6050_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl6050_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
index 9076576..d67048e 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
@@ -193,6 +193,9 @@ struct iwl_lib_ops {
|
||||||
|
void (*add_bcast_station)(struct iwl_priv *priv);
|
||||||
|
/* recover from tx queue stall */
|
||||||
|
void (*recover_from_tx_stall)(unsigned long data);
|
||||||
|
+ /* recover from errors showed in statistics */
|
||||||
|
+ void (*recover_from_statistics)(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iwl_led_ops {
|
||||||
|
@@ -435,6 +438,8 @@ void iwl_rx_missed_beacon_notif(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb);
|
||||||
|
void iwl_rx_spectrum_measure_notif(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb);
|
||||||
|
+void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt);
|
||||||
|
void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb);
|
||||||
|
void iwl_reply_statistics(struct iwl_priv *priv,
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
index e5eb339..fabc52f 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
@@ -618,28 +618,18 @@ static void iwl_accumulative_statistics(struct iwl_priv *priv,
|
||||||
|
#define REG_RECALIB_PERIOD (60)
|
||||||
|
|
||||||
|
#define PLCP_MSG "plcp_err exceeded %u, %u, %u, %u, %u, %d, %u mSecs\n"
|
||||||
|
-void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
- struct iwl_rx_mem_buffer *rxb)
|
||||||
|
+/*
|
||||||
|
+ * This function checks for plcp error.
|
||||||
|
+ * - When the plcp error is exceeding the thresholds, it will reset the radio
|
||||||
|
+ * to improve the throughput.
|
||||||
|
+ */
|
||||||
|
+void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt)
|
||||||
|
{
|
||||||
|
- int change;
|
||||||
|
- struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
||||||
|
int combined_plcp_delta;
|
||||||
|
unsigned int plcp_msec;
|
||||||
|
unsigned long plcp_received_jiffies;
|
||||||
|
|
||||||
|
- IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n",
|
||||||
|
- (int)sizeof(priv->statistics),
|
||||||
|
- le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK);
|
||||||
|
-
|
||||||
|
- change = ((priv->statistics.general.temperature !=
|
||||||
|
- pkt->u.stats.general.temperature) ||
|
||||||
|
- ((priv->statistics.flag &
|
||||||
|
- STATISTICS_REPLY_FLG_HT40_MODE_MSK) !=
|
||||||
|
- (pkt->u.stats.flag & STATISTICS_REPLY_FLG_HT40_MODE_MSK)));
|
||||||
|
-
|
||||||
|
-#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
- iwl_accumulative_statistics(priv, (__le32 *)&pkt->u.stats);
|
||||||
|
-#endif
|
||||||
|
/*
|
||||||
|
* check for plcp_err and trigger radio reset if it exceeds
|
||||||
|
* the plcp error threshold plcp_delta.
|
||||||
|
@@ -660,11 +650,11 @@ void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
le32_to_cpu(priv->statistics.rx.ofdm_ht.plcp_err));
|
||||||
|
|
||||||
|
if ((combined_plcp_delta > 0) &&
|
||||||
|
- ((combined_plcp_delta * 100) / plcp_msec) >
|
||||||
|
+ ((combined_plcp_delta * 100) / plcp_msec) >
|
||||||
|
priv->cfg->plcp_delta_threshold) {
|
||||||
|
/*
|
||||||
|
- * if plcp_err exceed the threshold, the following
|
||||||
|
- * data is printed in csv format:
|
||||||
|
+ * if plcp_err exceed the threshold,
|
||||||
|
+ * the following data is printed in csv format:
|
||||||
|
* Text: plcp_err exceeded %d,
|
||||||
|
* Received ofdm.plcp_err,
|
||||||
|
* Current ofdm.plcp_err,
|
||||||
|
@@ -679,9 +669,8 @@ void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
le32_to_cpu(priv->statistics.rx.ofdm.plcp_err),
|
||||||
|
le32_to_cpu(pkt->u.stats.rx.ofdm_ht.plcp_err),
|
||||||
|
le32_to_cpu(
|
||||||
|
- priv->statistics.rx.ofdm_ht.plcp_err),
|
||||||
|
+ priv->statistics.rx.ofdm_ht.plcp_err),
|
||||||
|
combined_plcp_delta, plcp_msec);
|
||||||
|
-
|
||||||
|
/*
|
||||||
|
* Reset the RF radio due to the high plcp
|
||||||
|
* error rate
|
||||||
|
@@ -689,6 +678,31 @@ void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
iwl_force_reset(priv, IWL_RF_RESET);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL(iwl_recover_from_statistics);
|
||||||
|
+
|
||||||
|
+void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_mem_buffer *rxb)
|
||||||
|
+{
|
||||||
|
+ int change;
|
||||||
|
+ struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n",
|
||||||
|
+ (int)sizeof(priv->statistics),
|
||||||
|
+ le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK);
|
||||||
|
+
|
||||||
|
+ change = ((priv->statistics.general.temperature !=
|
||||||
|
+ pkt->u.stats.general.temperature) ||
|
||||||
|
+ ((priv->statistics.flag &
|
||||||
|
+ STATISTICS_REPLY_FLG_HT40_MODE_MSK) !=
|
||||||
|
+ (pkt->u.stats.flag & STATISTICS_REPLY_FLG_HT40_MODE_MSK)));
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
+ iwl_accumulative_statistics(priv, (__le32 *)&pkt->u.stats);
|
||||||
|
+#endif
|
||||||
|
+ if (priv->cfg->ops->lib->recover_from_statistics)
|
||||||
|
+ priv->cfg->ops->lib->recover_from_statistics(priv, pkt);
|
||||||
|
|
||||||
|
memcpy(&priv->statistics, &pkt->u.stats, sizeof(priv->statistics));
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,98 @@
|
||||||
|
From: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
|
||||||
|
Date: Tue, 29 Jun 2010 05:53:50 +0000 (+0900)
|
||||||
|
Subject: kprobes/x86: Fix kprobes to skip prefixes correctly
|
||||||
|
X-Git-Tag: v2.6.36-rc1~41^2~53
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=567a9fd86735ccdc897768ed2dacdd5e83a13509
|
||||||
|
|
||||||
|
kprobes/x86: Fix kprobes to skip prefixes correctly
|
||||||
|
|
||||||
|
Fix resume_execution() and is_IF_modifier() to skip x86
|
||||||
|
instruction prefixes correctly by using x86 instruction
|
||||||
|
attribute.
|
||||||
|
|
||||||
|
Without this fix, resume_execution() can't handle instructions
|
||||||
|
which have non-REX prefixes (REX prefixes are skipped). This
|
||||||
|
will cause unexpected kernel panic by hitting bad address when a
|
||||||
|
kprobe hits on two-byte ret (e.g. "repz ret" generated for
|
||||||
|
Athlon/K8 optimization), because it just checks "repz" and can't
|
||||||
|
recognize the "ret" instruction.
|
||||||
|
|
||||||
|
These prefixes can be found easily with x86 instruction
|
||||||
|
attribute. This patch introduces skip_prefixes() and uses it in
|
||||||
|
resume_execution() and is_IF_modifier() to skip prefixes.
|
||||||
|
|
||||||
|
Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
|
||||||
|
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
|
||||||
|
LKML-Reference: <4C298A6E.8070609@hitachi.com>
|
||||||
|
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c
|
||||||
|
index 345a4b1..175f85c 100644
|
||||||
|
--- a/arch/x86/kernel/kprobes.c
|
||||||
|
+++ b/arch/x86/kernel/kprobes.c
|
||||||
|
@@ -126,16 +126,22 @@ static void __kprobes synthesize_reljump(void *from, void *to)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * Check for the REX prefix which can only exist on X86_64
|
||||||
|
- * X86_32 always returns 0
|
||||||
|
+ * Skip the prefixes of the instruction.
|
||||||
|
*/
|
||||||
|
-static int __kprobes is_REX_prefix(kprobe_opcode_t *insn)
|
||||||
|
+static kprobe_opcode_t *__kprobes skip_prefixes(kprobe_opcode_t *insn)
|
||||||
|
{
|
||||||
|
+ insn_attr_t attr;
|
||||||
|
+
|
||||||
|
+ attr = inat_get_opcode_attribute((insn_byte_t)*insn);
|
||||||
|
+ while (inat_is_legacy_prefix(attr)) {
|
||||||
|
+ insn++;
|
||||||
|
+ attr = inat_get_opcode_attribute((insn_byte_t)*insn);
|
||||||
|
+ }
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
|
- if ((*insn & 0xf0) == 0x40)
|
||||||
|
- return 1;
|
||||||
|
+ if (inat_is_rex_prefix(attr))
|
||||||
|
+ insn++;
|
||||||
|
#endif
|
||||||
|
- return 0;
|
||||||
|
+ return insn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -272,6 +278,9 @@ static int __kprobes can_probe(unsigned long paddr)
|
||||||
|
*/
|
||||||
|
static int __kprobes is_IF_modifier(kprobe_opcode_t *insn)
|
||||||
|
{
|
||||||
|
+ /* Skip prefixes */
|
||||||
|
+ insn = skip_prefixes(insn);
|
||||||
|
+
|
||||||
|
switch (*insn) {
|
||||||
|
case 0xfa: /* cli */
|
||||||
|
case 0xfb: /* sti */
|
||||||
|
@@ -280,13 +289,6 @@ static int __kprobes is_IF_modifier(kprobe_opcode_t *insn)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * on X86_64, 0x40-0x4f are REX prefixes so we need to look
|
||||||
|
- * at the next byte instead.. but of course not recurse infinitely
|
||||||
|
- */
|
||||||
|
- if (is_REX_prefix(insn))
|
||||||
|
- return is_IF_modifier(++insn);
|
||||||
|
-
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -803,9 +805,8 @@ static void __kprobes resume_execution(struct kprobe *p,
|
||||||
|
unsigned long orig_ip = (unsigned long)p->addr;
|
||||||
|
kprobe_opcode_t *insn = p->ainsn.insn;
|
||||||
|
|
||||||
|
- /*skip the REX prefix*/
|
||||||
|
- if (is_REX_prefix(insn))
|
||||||
|
- insn++;
|
||||||
|
+ /* Skip prefixes */
|
||||||
|
+ insn = skip_prefixes(insn);
|
||||||
|
|
||||||
|
regs->flags &= ~X86_EFLAGS_TF;
|
||||||
|
switch (*insn) {
|
|
@ -0,0 +1,49 @@
|
||||||
|
From: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
|
||||||
|
Date: Wed, 30 Jun 2010 08:02:45 +0000 (+0800)
|
||||||
|
Subject: KVM: MMU: fix conflict access permissions in direct sp
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=6aa0b9dec5d6dde26ea17b0b5be8fccfe19df3c9
|
||||||
|
|
||||||
|
KVM: MMU: fix conflict access permissions in direct sp
|
||||||
|
|
||||||
|
In no-direct mapping, we mark sp is 'direct' when we mapping the
|
||||||
|
guest's larger page, but its access is encoded form upper page-struct
|
||||||
|
entire not include the last mapping, it will cause access conflict.
|
||||||
|
|
||||||
|
For example, have this mapping:
|
||||||
|
[W]
|
||||||
|
/ PDE1 -> |---|
|
||||||
|
P[W] | | LPA
|
||||||
|
\ PDE2 -> |---|
|
||||||
|
[R]
|
||||||
|
|
||||||
|
P have two children, PDE1 and PDE2, both PDE1 and PDE2 mapping the
|
||||||
|
same lage page(LPA). The P's access is WR, PDE1's access is WR,
|
||||||
|
PDE2's access is RO(just consider read-write permissions here)
|
||||||
|
|
||||||
|
When guest access PDE1, we will create a direct sp for LPA, the sp's
|
||||||
|
access is from P, is W, then we will mark the ptes is W in this sp.
|
||||||
|
|
||||||
|
Then, guest access PDE2, we will find LPA's shadow page, is the same as
|
||||||
|
PDE's, and mark the ptes is RO.
|
||||||
|
|
||||||
|
So, if guest access PDE1, the incorrect #PF is occured.
|
||||||
|
|
||||||
|
Fixed by encode the last mapping access into direct shadow page
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
|
||||||
|
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
|
||||||
|
Signed-off-by: Avi Kivity <avi@redhat.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
|
||||||
|
index 89d66ca..2331bdc 100644
|
||||||
|
--- a/arch/x86/kvm/paging_tmpl.h
|
||||||
|
+++ b/arch/x86/kvm/paging_tmpl.h
|
||||||
|
@@ -342,6 +342,7 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
|
||||||
|
/* advance table_gfn when emulating 1gb pages with 4k */
|
||||||
|
if (delta == 0)
|
||||||
|
table_gfn += PT_INDEX(addr, level);
|
||||||
|
+ access &= gw->pte_access;
|
||||||
|
} else {
|
||||||
|
direct = 0;
|
||||||
|
table_gfn = gw->table_gfn[level - 2];
|
|
@ -0,0 +1,33 @@
|
||||||
|
diff -up linux-2.6.34.x86_64/drivers/acpi/acpica/dsobject.c.mjg59 linux-2.6.34.x86_64/drivers/acpi/acpica/dsobject.c
|
||||||
|
--- linux-2.6.34.x86_64/drivers/acpi/acpica/dsobject.c.mjg59 2010-05-16 17:17:36.000000000 -0400
|
||||||
|
+++ linux-2.6.34.x86_64/drivers/acpi/acpica/dsobject.c 2011-02-09 12:08:58.430275518 -0500
|
||||||
|
@@ -81,6 +81,7 @@ acpi_ds_build_internal_object(struct acp
|
||||||
|
{
|
||||||
|
union acpi_operand_object *obj_desc;
|
||||||
|
acpi_status status;
|
||||||
|
+ acpi_object_type type;
|
||||||
|
|
||||||
|
ACPI_FUNCTION_TRACE(ds_build_internal_object);
|
||||||
|
|
||||||
|
@@ -172,7 +173,20 @@ acpi_ds_build_internal_object(struct acp
|
||||||
|
return_ACPI_STATUS(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
- switch (op->common.node->type) {
|
||||||
|
+ /*
|
||||||
|
+ * Special handling for Alias objects. We need to setup the type
|
||||||
|
+ * and the Op->Common.Node to point to the Alias target. Note,
|
||||||
|
+ * Alias has at most one level of indirection internally.
|
||||||
|
+ */
|
||||||
|
+ type = op->common.node->type;
|
||||||
|
+ if (type == ACPI_TYPE_LOCAL_ALIAS) {
|
||||||
|
+ type = obj_desc->common.type;
|
||||||
|
+ op->common.node =
|
||||||
|
+ ACPI_CAST_PTR(struct acpi_namespace_node,
|
||||||
|
+ op->common.node->object);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ switch (type) {
|
||||||
|
/*
|
||||||
|
* For these types, we need the actual node, not the subobject.
|
||||||
|
* However, the subobject did not get an extra reference count above.
|
|
@ -0,0 +1,17 @@
|
||||||
|
Disable firmware video brightness change on AC/Battery switch by default
|
||||||
|
|
||||||
|
-- mjg59
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
|
||||||
|
index bac2901..93b1a9e 100644
|
||||||
|
--- a/drivers/acpi/video.c
|
||||||
|
+++ b/drivers/acpi/video.c
|
||||||
|
@@ -1818,7 +1818,7 @@ static int acpi_video_bus_put_devices(struct acpi_video_bus *video)
|
||||||
|
|
||||||
|
static int acpi_video_bus_start_devices(struct acpi_video_bus *video)
|
||||||
|
{
|
||||||
|
- return acpi_video_bus_DOS(video, 0, 0);
|
||||||
|
+ return acpi_video_bus_DOS(video, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int acpi_video_bus_stop_devices(struct acpi_video_bus *video)
|
|
@ -0,0 +1,199 @@
|
||||||
|
From 023f5b2d1fdad6ffe33a204a4e76e38edba9d9e5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@dreadnought.i.jkkm.org>
|
||||||
|
Date: Thu, 20 May 2010 08:59:58 -0400
|
||||||
|
Subject: linux-2.6-acpi-video-export-edid.patch
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/acpi/video.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++----
|
||||||
|
include/acpi/video.h | 16 +++++++
|
||||||
|
2 files changed, 118 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
|
||||||
|
index a0c93b3..4b8bda1 100644
|
||||||
|
--- a/drivers/acpi/video.c
|
||||||
|
+++ b/drivers/acpi/video.c
|
||||||
|
@@ -45,6 +45,7 @@
|
||||||
|
#include <acpi/acpi_bus.h>
|
||||||
|
#include <acpi/acpi_drivers.h>
|
||||||
|
#include <linux/suspend.h>
|
||||||
|
+#include <acpi/video.h>
|
||||||
|
|
||||||
|
#define PREFIX "ACPI: "
|
||||||
|
|
||||||
|
@@ -65,11 +66,6 @@
|
||||||
|
|
||||||
|
#define MAX_NAME_LEN 20
|
||||||
|
|
||||||
|
-#define ACPI_VIDEO_DISPLAY_CRT 1
|
||||||
|
-#define ACPI_VIDEO_DISPLAY_TV 2
|
||||||
|
-#define ACPI_VIDEO_DISPLAY_DVI 3
|
||||||
|
-#define ACPI_VIDEO_DISPLAY_LCD 4
|
||||||
|
-
|
||||||
|
#define _COMPONENT ACPI_VIDEO_COMPONENT
|
||||||
|
ACPI_MODULE_NAME("video");
|
||||||
|
|
||||||
|
@@ -1748,11 +1744,27 @@ acpi_video_get_device_attr(struct acpi_video_bus *video, unsigned long device_id
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
+acpi_video_get_device_type(struct acpi_video_bus *video,
|
||||||
|
+ unsigned long device_id)
|
||||||
|
+{
|
||||||
|
+ struct acpi_video_enumerated_device *ids;
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < video->attached_count; i++) {
|
||||||
|
+ ids = &video->attached_array[i];
|
||||||
|
+ if ((ids->value.int_val & 0xffff) == device_id)
|
||||||
|
+ return ids->value.int_val;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
acpi_video_bus_get_one_device(struct acpi_device *device,
|
||||||
|
struct acpi_video_bus *video)
|
||||||
|
{
|
||||||
|
unsigned long long device_id;
|
||||||
|
- int status;
|
||||||
|
+ int status, device_type;
|
||||||
|
struct acpi_video_device *data;
|
||||||
|
struct acpi_video_device_attrib* attribute;
|
||||||
|
|
||||||
|
@@ -1797,8 +1809,25 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
|
||||||
|
}
|
||||||
|
if(attribute->bios_can_detect)
|
||||||
|
data->flags.bios = 1;
|
||||||
|
- } else
|
||||||
|
- data->flags.unknown = 1;
|
||||||
|
+ } else {
|
||||||
|
+ /* Check for legacy IDs */
|
||||||
|
+ device_type = acpi_video_get_device_type(video,
|
||||||
|
+ device_id);
|
||||||
|
+ /* Ignore bits 16 and 18-20 */
|
||||||
|
+ switch (device_type & 0xffe2ffff) {
|
||||||
|
+ case ACPI_VIDEO_DISPLAY_LEGACY_MONITOR:
|
||||||
|
+ data->flags.crt = 1;
|
||||||
|
+ break;
|
||||||
|
+ case ACPI_VIDEO_DISPLAY_LEGACY_PANEL:
|
||||||
|
+ data->flags.lcd = 1;
|
||||||
|
+ break;
|
||||||
|
+ case ACPI_VIDEO_DISPLAY_LEGACY_TV:
|
||||||
|
+ data->flags.tvout = 1;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ data->flags.unknown = 1;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
acpi_video_device_bind(video, data);
|
||||||
|
acpi_video_device_find_cap(data);
|
||||||
|
@@ -2032,6 +2061,71 @@ out:
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int acpi_video_get_edid(struct acpi_device *device, int type, int device_id,
|
||||||
|
+ void **edid)
|
||||||
|
+{
|
||||||
|
+ struct acpi_video_bus *video;
|
||||||
|
+ struct acpi_video_device *video_device;
|
||||||
|
+ union acpi_object *buffer = NULL;
|
||||||
|
+ acpi_status status;
|
||||||
|
+ int i, length;
|
||||||
|
+
|
||||||
|
+ if (!device || !acpi_driver_data(device))
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ video = acpi_driver_data(device);
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < video->attached_count; i++) {
|
||||||
|
+ video_device = video->attached_array[i].bind_info;
|
||||||
|
+ length = 256;
|
||||||
|
+
|
||||||
|
+ if (!video_device)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ if (type) {
|
||||||
|
+ switch (type) {
|
||||||
|
+ case ACPI_VIDEO_DISPLAY_CRT:
|
||||||
|
+ if (!video_device->flags.crt)
|
||||||
|
+ continue;
|
||||||
|
+ break;
|
||||||
|
+ case ACPI_VIDEO_DISPLAY_TV:
|
||||||
|
+ if (!video_device->flags.tvout)
|
||||||
|
+ continue;
|
||||||
|
+ break;
|
||||||
|
+ case ACPI_VIDEO_DISPLAY_DVI:
|
||||||
|
+ if (!video_device->flags.dvi)
|
||||||
|
+ continue;
|
||||||
|
+ break;
|
||||||
|
+ case ACPI_VIDEO_DISPLAY_LCD:
|
||||||
|
+ if (!video_device->flags.lcd)
|
||||||
|
+ continue;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ } else if (video_device->device_id != device_id) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ status = acpi_video_device_EDID(video_device, &buffer, length);
|
||||||
|
+
|
||||||
|
+ if (ACPI_FAILURE(status) || !buffer ||
|
||||||
|
+ buffer->type != ACPI_TYPE_BUFFER) {
|
||||||
|
+ length = 128;
|
||||||
|
+ status = acpi_video_device_EDID(video_device, &buffer,
|
||||||
|
+ length);
|
||||||
|
+ if (ACPI_FAILURE(status) || !buffer ||
|
||||||
|
+ buffer->type != ACPI_TYPE_BUFFER) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ *edid = buffer->buffer.pointer;
|
||||||
|
+ return length;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return -ENODEV;
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL(acpi_video_get_edid);
|
||||||
|
+
|
||||||
|
static int
|
||||||
|
acpi_video_bus_get_devices(struct acpi_video_bus *video,
|
||||||
|
struct acpi_device *device)
|
||||||
|
diff --git a/include/acpi/video.h b/include/acpi/video.h
|
||||||
|
index cf7be3d..551793c 100644
|
||||||
|
--- a/include/acpi/video.h
|
||||||
|
+++ b/include/acpi/video.h
|
||||||
|
@@ -1,12 +1,28 @@
|
||||||
|
#ifndef __ACPI_VIDEO_H
|
||||||
|
#define __ACPI_VIDEO_H
|
||||||
|
|
||||||
|
+#define ACPI_VIDEO_DISPLAY_CRT 1
|
||||||
|
+#define ACPI_VIDEO_DISPLAY_TV 2
|
||||||
|
+#define ACPI_VIDEO_DISPLAY_DVI 3
|
||||||
|
+#define ACPI_VIDEO_DISPLAY_LCD 4
|
||||||
|
+
|
||||||
|
+#define ACPI_VIDEO_DISPLAY_LEGACY_MONITOR 0x0100
|
||||||
|
+#define ACPI_VIDEO_DISPLAY_LEGACY_PANEL 0x0110
|
||||||
|
+#define ACPI_VIDEO_DISPLAY_LEGACY_TV 0x0200
|
||||||
|
+
|
||||||
|
#if (defined CONFIG_ACPI_VIDEO || defined CONFIG_ACPI_VIDEO_MODULE)
|
||||||
|
extern int acpi_video_register(void);
|
||||||
|
extern void acpi_video_unregister(void);
|
||||||
|
+extern int acpi_video_get_edid(struct acpi_device *device, int type,
|
||||||
|
+ int device_id, void **edid);
|
||||||
|
#else
|
||||||
|
static inline int acpi_video_register(void) { return 0; }
|
||||||
|
static inline void acpi_video_unregister(void) { return; }
|
||||||
|
+static inline int acpi_video_get_edid(struct acpi_device *device, int type,
|
||||||
|
+ int device_id, void **edid)
|
||||||
|
+{
|
||||||
|
+ return -ENODEV;
|
||||||
|
+}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
From: Neil Horman <nhorman@tuxdriver.com>
|
||||||
|
Date: Tue, 5 Oct 2010 03:39:21 +0000 (+0000)
|
||||||
|
Subject: bonding: fix WARN_ON when writing to bond_master sysfs file
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdavem%2Fnet-2.6.git;a=commitdiff_plain;h=27e6f065df132b5270014d3285889b15185e9da9
|
||||||
|
|
||||||
|
bonding: fix WARN_ON when writing to bond_master sysfs file
|
||||||
|
|
||||||
|
Fix a WARN_ON failure in bond_masters sysfs file
|
||||||
|
|
||||||
|
Got a report of this warning recently
|
||||||
|
|
||||||
|
bonding: bond0 is being created...
|
||||||
|
------------[ cut here ]------------
|
||||||
|
WARNING: at fs/proc/generic.c:590 proc_register+0x14d/0x185()
|
||||||
|
Hardware name: ProLiant BL465c G1
|
||||||
|
proc_dir_entry 'bonding/bond0' already registered
|
||||||
|
Modules linked in: bonding ipv6 tg3 bnx2 shpchp amd64_edac_mod edac_core
|
||||||
|
ipmi_si
|
||||||
|
ipmi_msghandler serio_raw i2c_piix4 k8temp edac_mce_amd hpwdt microcode hpsa
|
||||||
|
cc
|
||||||
|
iss radeon ttm drm_kms_helper drm i2c_algo_bit i2c_core [last unloaded:
|
||||||
|
scsi_wai
|
||||||
|
t_scan]
|
||||||
|
Pid: 935, comm: ifup-eth Not tainted 2.6.33.5-124.fc13.x86_64 #1
|
||||||
|
Call Trace:
|
||||||
|
[<ffffffff8104b54c>] warn_slowpath_common+0x77/0x8f
|
||||||
|
[<ffffffff8104b5b1>] warn_slowpath_fmt+0x3c/0x3e
|
||||||
|
[<ffffffff8114bf0b>] proc_register+0x14d/0x185
|
||||||
|
[<ffffffff8114c20c>] proc_create_data+0x87/0xa1
|
||||||
|
[<ffffffffa0211e9b>] bond_create_proc_entry+0x55/0x95 [bonding]
|
||||||
|
[<ffffffffa0215e5d>] bond_init+0x95/0xd0 [bonding]
|
||||||
|
[<ffffffff8138cd97>] register_netdevice+0xdd/0x29e
|
||||||
|
[<ffffffffa021240b>] bond_create+0x8e/0xb8 [bonding]
|
||||||
|
[<ffffffffa021c4be>] bonding_store_bonds+0xb3/0x1c1 [bonding]
|
||||||
|
[<ffffffff812aec85>] class_attr_store+0x27/0x29
|
||||||
|
[<ffffffff8115423d>] sysfs_write_file+0x10f/0x14b
|
||||||
|
[<ffffffff81101acf>] vfs_write+0xa9/0x106
|
||||||
|
[<ffffffff81101be2>] sys_write+0x45/0x69
|
||||||
|
[<ffffffff81009b02>] system_call_fastpath+0x16/0x1b
|
||||||
|
---[ end trace a677c3f7f8b16b1e ]---
|
||||||
|
bonding: Bond creation failed.
|
||||||
|
|
||||||
|
It happens because a user space writer to bond_master can try to
|
||||||
|
register an already existing bond interface name. Fix it by teaching
|
||||||
|
bond_create to check for the existance of devices with that name first
|
||||||
|
in cases where a non-NULL name parameter has been passed in
|
||||||
|
|
||||||
|
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
|
||||||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
|
||||||
|
index 3b16f62..e953c6a 100644
|
||||||
|
--- a/drivers/net/bonding/bond_main.c
|
||||||
|
+++ b/drivers/net/bonding/bond_main.c
|
||||||
|
@@ -5164,6 +5164,15 @@ int bond_create(struct net *net, const char *name)
|
||||||
|
res = dev_alloc_name(bond_dev, "bond%d");
|
||||||
|
if (res < 0)
|
||||||
|
goto out;
|
||||||
|
+ } else {
|
||||||
|
+ /*
|
||||||
|
+ * If we're given a name to register
|
||||||
|
+ * we need to ensure that its not already
|
||||||
|
+ * registered
|
||||||
|
+ */
|
||||||
|
+ res = -EEXIST;
|
||||||
|
+ if (__dev_get_by_name(net, name) != NULL)
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = register_netdevice(bond_dev);
|
|
@ -0,0 +1,128 @@
|
||||||
|
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile
|
||||||
|
index 6d69c7c..ff84d12 100644
|
||||||
|
--- a/scripts/kconfig/Makefile
|
||||||
|
+++ b/scripts/kconfig/Makefile
|
||||||
|
@@ -58,6 +58,11 @@ localyesconfig: $(obj)/streamline_config.pl $(obj)/conf
|
||||||
|
fi
|
||||||
|
$(Q)rm -f .tmp.config
|
||||||
|
|
||||||
|
+nonint_oldconfig: $(obj)/conf
|
||||||
|
+ $< -b $(Kconfig)
|
||||||
|
+loose_nonint_oldconfig: $(obj)/conf
|
||||||
|
+ $< -B $(Kconfig)
|
||||||
|
+
|
||||||
|
# Create new linux.pot file
|
||||||
|
# Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files
|
||||||
|
# The symlink is used to repair a deficiency in arch/um
|
||||||
|
diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c
|
||||||
|
index 9960d1c..ac8d455 100644
|
||||||
|
--- a/scripts/kconfig/conf.c
|
||||||
|
+++ b/scripts/kconfig/conf.c
|
||||||
|
@@ -23,6 +23,8 @@ enum {
|
||||||
|
ask_all,
|
||||||
|
ask_new,
|
||||||
|
ask_silent,
|
||||||
|
+ dont_ask,
|
||||||
|
+ dont_ask_dont_tell,
|
||||||
|
set_default,
|
||||||
|
set_yes,
|
||||||
|
set_mod,
|
||||||
|
@@ -360,7 +362,10 @@ static void conf(struct menu *menu)
|
||||||
|
|
||||||
|
switch (prop->type) {
|
||||||
|
case P_MENU:
|
||||||
|
- if (input_mode == ask_silent && rootEntry != menu) {
|
||||||
|
+ if ((input_mode == ask_silent ||
|
||||||
|
+ input_mode == dont_ask ||
|
||||||
|
+ input_mode == dont_ask_dont_tell) &&
|
||||||
|
+ rootEntry != menu) {
|
||||||
|
check_conf(menu);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
@@ -406,6 +411,8 @@ conf_childs:
|
||||||
|
indent -= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int return_value;
|
||||||
|
+
|
||||||
|
static void check_conf(struct menu *menu)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
@@ -418,12 +425,21 @@ static void check_conf(struct menu *menu)
|
||||||
|
if (sym && !sym_has_value(sym)) {
|
||||||
|
if (sym_is_changable(sym) ||
|
||||||
|
(sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
|
||||||
|
+ if (input_mode == dont_ask ||
|
||||||
|
+ input_mode == dont_ask_dont_tell) {
|
||||||
|
+ if (input_mode == dont_ask &&
|
||||||
|
+ sym->name && !sym_is_choice_value(sym)) {
|
||||||
|
+ fprintf(stderr,"CONFIG_%s\n",sym->name);
|
||||||
|
+ ++return_value;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
if (!conf_cnt++)
|
||||||
|
printf(_("*\n* Restart config...\n*\n"));
|
||||||
|
rootEntry = menu_get_parent_menu(menu);
|
||||||
|
conf(rootEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ }
|
||||||
|
|
||||||
|
for (child = menu->list; child; child = child->next)
|
||||||
|
check_conf(child);
|
||||||
|
@@ -439,7 +455,7 @@ int main(int ac, char **av)
|
||||||
|
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||||
|
textdomain(PACKAGE);
|
||||||
|
|
||||||
|
- while ((opt = getopt(ac, av, "osdD:nmyrh")) != -1) {
|
||||||
|
+ while ((opt = getopt(ac, av, "osbBdD:nmyrh")) != -1) {
|
||||||
|
switch (opt) {
|
||||||
|
case 'o':
|
||||||
|
input_mode = ask_silent;
|
||||||
|
@@ -448,6 +464,12 @@ int main(int ac, char **av)
|
||||||
|
input_mode = ask_silent;
|
||||||
|
sync_kconfig = 1;
|
||||||
|
break;
|
||||||
|
+ case 'b':
|
||||||
|
+ input_mode = dont_ask;
|
||||||
|
+ break;
|
||||||
|
+ case 'B':
|
||||||
|
+ input_mode = dont_ask_dont_tell;
|
||||||
|
+ break;
|
||||||
|
case 'd':
|
||||||
|
input_mode = set_default;
|
||||||
|
break;
|
||||||
|
@@ -525,6 +547,8 @@ int main(int ac, char **av)
|
||||||
|
case ask_silent:
|
||||||
|
case ask_all:
|
||||||
|
case ask_new:
|
||||||
|
+ case dont_ask:
|
||||||
|
+ case dont_ask_dont_tell:
|
||||||
|
conf_read(NULL);
|
||||||
|
break;
|
||||||
|
case set_no:
|
||||||
|
@@ -586,12 +610,16 @@ int main(int ac, char **av)
|
||||||
|
conf(&rootmenu);
|
||||||
|
input_mode = ask_silent;
|
||||||
|
/* fall through */
|
||||||
|
+ case dont_ask:
|
||||||
|
+ case dont_ask_dont_tell:
|
||||||
|
case ask_silent:
|
||||||
|
/* Update until a loop caused no more changes */
|
||||||
|
do {
|
||||||
|
conf_cnt = 0;
|
||||||
|
check_conf(&rootmenu);
|
||||||
|
- } while (conf_cnt);
|
||||||
|
+ } while (conf_cnt &&
|
||||||
|
+ (input_mode != dont_ask &&
|
||||||
|
+ input_mode != dont_ask_dont_tell));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -613,5 +641,5 @@ int main(int ac, char **av)
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- return 0;
|
||||||
|
+ return return_value;
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
|
||||||
|
index 4173125..baa32a0 100644
|
||||||
|
--- a/drivers/pci/intel-iommu.c
|
||||||
|
+++ b/drivers/pci/intel-iommu.c
|
||||||
|
@@ -340,7 +340,7 @@ int dmar_disabled = 0;
|
||||||
|
int dmar_disabled = 1;
|
||||||
|
#endif /*CONFIG_DMAR_DEFAULT_ON*/
|
||||||
|
|
||||||
|
-static int __initdata dmar_map_gfx = 1;
|
||||||
|
+static int dmar_map_gfx = 1;
|
||||||
|
static int dmar_forcedac;
|
||||||
|
static int intel_iommu_strict;
|
||||||
|
|
||||||
|
@@ -3728,6 +3728,12 @@ static void __devinit quirk_iommu_rwbf(struct pci_dev *dev)
|
||||||
|
*/
|
||||||
|
printk(KERN_INFO "DMAR: Forcing write-buffer flush capability\n");
|
||||||
|
rwbf_quirk = 1;
|
||||||
|
+
|
||||||
|
+ /* https://bugzilla.redhat.com/show_bug.cgi?id=538163 */
|
||||||
|
+ if (dev->revision == 0x07) {
|
||||||
|
+ printk(KERN_INFO "DMAR: Disabling IOMMU for graphics on this chipset\n");
|
||||||
|
+ dmar_map_gfx = 0;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf);
|
|
@ -0,0 +1,6 @@
|
||||||
|
#
|
||||||
|
# Small compile fixes (For more involved fixes, please use a separate patch).
|
||||||
|
#
|
||||||
|
# Please add the errors from gcc before the diffs to save others having
|
||||||
|
# to do a compile to figure out what your diff is fixing. Thanks.
|
||||||
|
#
|
|
@ -0,0 +1,385 @@
|
||||||
|
From df42d15cd28f468ecd4c30465b98a53cce90617c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Tue, 30 Mar 2010 00:16:25 -0400
|
||||||
|
Subject: dev-crash-driver.patch
|
||||||
|
|
||||||
|
---
|
||||||
|
arch/ia64/include/asm/crash.h | 90 +++++++++++++++++++++++++++++
|
||||||
|
arch/ia64/kernel/ia64_ksyms.c | 3 +
|
||||||
|
arch/x86/include/asm/crash.h | 75 ++++++++++++++++++++++++
|
||||||
|
arch/x86/mm/ioremap.c | 2 +
|
||||||
|
drivers/char/Kconfig | 2 +
|
||||||
|
drivers/char/Makefile | 2 +
|
||||||
|
drivers/char/crash.c | 128 +++++++++++++++++++++++++++++++++++++++++
|
||||||
|
7 files changed, 302 insertions(+), 0 deletions(-)
|
||||||
|
create mode 100644 arch/ia64/include/asm/crash.h
|
||||||
|
create mode 100644 arch/x86/include/asm/crash.h
|
||||||
|
create mode 100644 drivers/char/crash.c
|
||||||
|
|
||||||
|
diff --git a/arch/ia64/include/asm/crash.h b/arch/ia64/include/asm/crash.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..541af84
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/arch/ia64/include/asm/crash.h
|
||||||
|
@@ -0,0 +1,90 @@
|
||||||
|
+#ifndef _ASM_IA64_CRASH_H
|
||||||
|
+#define _ASM_IA64_CRASH_H
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * linux/include/asm-ia64/crash.h
|
||||||
|
+ *
|
||||||
|
+ * Copyright (c) 2004 Red Hat, Inc. All rights reserved.
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License as published by
|
||||||
|
+ * the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
+ * any later version.
|
||||||
|
+ *
|
||||||
|
+ * This program is distributed in the hope that it will be useful,
|
||||||
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU General Public License
|
||||||
|
+ * along with this program; if not, write to the Free Software
|
||||||
|
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifdef __KERNEL__
|
||||||
|
+
|
||||||
|
+#include <linux/efi.h>
|
||||||
|
+#include <linux/mm.h>
|
||||||
|
+#include <asm/mmzone.h>
|
||||||
|
+
|
||||||
|
+static inline void *
|
||||||
|
+map_virtual(u64 offset, struct page **pp)
|
||||||
|
+{
|
||||||
|
+ struct page *page;
|
||||||
|
+ unsigned long pfn;
|
||||||
|
+ u32 type;
|
||||||
|
+
|
||||||
|
+ if (REGION_NUMBER(offset) == 5) {
|
||||||
|
+ char byte;
|
||||||
|
+
|
||||||
|
+ if (__get_user(byte, (char *)offset) == 0)
|
||||||
|
+ return (void *)offset;
|
||||||
|
+ else
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ switch (type = efi_mem_type(offset))
|
||||||
|
+ {
|
||||||
|
+ case EFI_LOADER_CODE:
|
||||||
|
+ case EFI_LOADER_DATA:
|
||||||
|
+ case EFI_BOOT_SERVICES_CODE:
|
||||||
|
+ case EFI_BOOT_SERVICES_DATA:
|
||||||
|
+ case EFI_CONVENTIONAL_MEMORY:
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ default:
|
||||||
|
+ printk(KERN_INFO
|
||||||
|
+ "crash memory driver: invalid memory type for %lx: %d\n",
|
||||||
|
+ offset, type);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ pfn = offset >> PAGE_SHIFT;
|
||||||
|
+
|
||||||
|
+ if (!pfn_valid(pfn)) {
|
||||||
|
+ printk(KERN_INFO
|
||||||
|
+ "crash memory driver: invalid pfn: %lx )\n", pfn);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ page = pfn_to_page(pfn);
|
||||||
|
+
|
||||||
|
+ if (!page->virtual) {
|
||||||
|
+ printk(KERN_INFO
|
||||||
|
+ "crash memory driver: offset: %lx page: %lx page->virtual: NULL\n",
|
||||||
|
+ offset, (unsigned long)page);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return (page->virtual + (offset & (PAGE_SIZE-1)));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline void unmap_virtual(struct page *page)
|
||||||
|
+{
|
||||||
|
+ return;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#endif /* __KERNEL__ */
|
||||||
|
+
|
||||||
|
+#endif /* _ASM_IA64_CRASH_H */
|
||||||
|
diff --git a/arch/ia64/kernel/ia64_ksyms.c b/arch/ia64/kernel/ia64_ksyms.c
|
||||||
|
index 7f4a0ed..552fe24 100644
|
||||||
|
--- a/arch/ia64/kernel/ia64_ksyms.c
|
||||||
|
+++ b/arch/ia64/kernel/ia64_ksyms.c
|
||||||
|
@@ -84,6 +84,9 @@ EXPORT_SYMBOL(ia64_save_scratch_fpregs);
|
||||||
|
#include <asm/unwind.h>
|
||||||
|
EXPORT_SYMBOL(unw_init_running);
|
||||||
|
|
||||||
|
+#include <linux/efi.h>
|
||||||
|
+EXPORT_SYMBOL_GPL(efi_mem_type);
|
||||||
|
+
|
||||||
|
#if defined(CONFIG_IA64_ESI) || defined(CONFIG_IA64_ESI_MODULE)
|
||||||
|
extern void esi_call_phys (void);
|
||||||
|
EXPORT_SYMBOL_GPL(esi_call_phys);
|
||||||
|
diff --git a/arch/x86/include/asm/crash.h b/arch/x86/include/asm/crash.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..dfcc006
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/arch/x86/include/asm/crash.h
|
||||||
|
@@ -0,0 +1,75 @@
|
||||||
|
+#ifndef _ASM_I386_CRASH_H
|
||||||
|
+#define _ASM_I386_CRASH_H
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * linux/include/asm-i386/crash.h
|
||||||
|
+ *
|
||||||
|
+ * Copyright (c) 2004 Red Hat, Inc. All rights reserved.
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License as published by
|
||||||
|
+ * the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
+ * any later version.
|
||||||
|
+ *
|
||||||
|
+ * This program is distributed in the hope that it will be useful,
|
||||||
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU General Public License
|
||||||
|
+ * along with this program; if not, write to the Free Software
|
||||||
|
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifdef __KERNEL__
|
||||||
|
+
|
||||||
|
+#include <linux/mm.h>
|
||||||
|
+#include <linux/highmem.h>
|
||||||
|
+#include <asm/mmzone.h>
|
||||||
|
+
|
||||||
|
+extern int page_is_ram(unsigned long);
|
||||||
|
+
|
||||||
|
+static inline void *
|
||||||
|
+map_virtual(u64 offset, struct page **pp)
|
||||||
|
+{
|
||||||
|
+ struct page *page;
|
||||||
|
+ unsigned long pfn;
|
||||||
|
+ void *vaddr;
|
||||||
|
+
|
||||||
|
+ pfn = (unsigned long)(offset >> PAGE_SHIFT);
|
||||||
|
+
|
||||||
|
+ if (!page_is_ram(pfn)) {
|
||||||
|
+ printk(KERN_INFO
|
||||||
|
+ "crash memory driver: !page_is_ram(pfn: %lx)\n", pfn);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!pfn_valid(pfn)) {
|
||||||
|
+ printk(KERN_INFO
|
||||||
|
+ "crash memory driver: invalid pfn: %lx )\n", pfn);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ page = pfn_to_page(pfn);
|
||||||
|
+
|
||||||
|
+ vaddr = kmap(page);
|
||||||
|
+ if (!vaddr) {
|
||||||
|
+ printk(KERN_INFO
|
||||||
|
+ "crash memory driver: pfn: %lx kmap(page: %lx) failed\n",
|
||||||
|
+ pfn, (unsigned long)page);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ *pp = page;
|
||||||
|
+ return (vaddr + (offset & (PAGE_SIZE-1)));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline void unmap_virtual(struct page *page)
|
||||||
|
+{
|
||||||
|
+ kunmap(page);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#endif /* __KERNEL__ */
|
||||||
|
+
|
||||||
|
+#endif /* _ASM_I386_CRASH_H */
|
||||||
|
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
|
||||||
|
index 5eb1ba7..3e525d2 100644
|
||||||
|
--- a/arch/x86/mm/ioremap.c
|
||||||
|
+++ b/arch/x86/mm/ioremap.c
|
||||||
|
@@ -24,6 +24,8 @@
|
||||||
|
|
||||||
|
#include "physaddr.h"
|
||||||
|
|
||||||
|
+EXPORT_SYMBOL_GPL(page_is_ram);
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Fix up the linear direct mapping of the kernel to avoid cache attribute
|
||||||
|
* conflicts.
|
||||||
|
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
|
||||||
|
index 3141dd3..153658c 100644
|
||||||
|
--- a/drivers/char/Kconfig
|
||||||
|
+++ b/drivers/char/Kconfig
|
||||||
|
@@ -471,6 +471,8 @@ config LEGACY_PTYS
|
||||||
|
security. This option enables these legacy devices; on most
|
||||||
|
systems, it is safe to say N.
|
||||||
|
|
||||||
|
+config CRASH
|
||||||
|
+ tristate "Crash Utility memory driver"
|
||||||
|
|
||||||
|
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
|
||||||
|
index 0000000..e5437de
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/char/crash.c
|
||||||
|
@@ -0,0 +1,128 @@
|
||||||
|
+/*
|
||||||
|
+ * linux/drivers/char/crash.c
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2004 Dave Anderson <anderson@redhat.com>
|
||||||
|
+ * Copyright (C) 2004 Red Hat, Inc.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+/******************************************************************************
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License as published by
|
||||||
|
+ * the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
+ * any later version.
|
||||||
|
+ *
|
||||||
|
+ * This program is distributed in the hope that it will be useful,
|
||||||
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU General Public License
|
||||||
|
+ * along with this program; if not, write to the Free Software
|
||||||
|
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
+ *
|
||||||
|
+ *****************************************************************************/
|
||||||
|
+
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/types.h>
|
||||||
|
+#include <linux/miscdevice.h>
|
||||||
|
+#include <linux/init.h>
|
||||||
|
+#include <asm/io.h>
|
||||||
|
+#include <asm/uaccess.h>
|
||||||
|
+#include <asm/types.h>
|
||||||
|
+#include <asm/crash.h>
|
||||||
|
+
|
||||||
|
+#define CRASH_VERSION "1.0"
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * These are the file operation functions that allow crash utility
|
||||||
|
+ * access to physical memory.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+static loff_t
|
||||||
|
+crash_llseek(struct file * file, loff_t offset, int orig)
|
||||||
|
+{
|
||||||
|
+ switch (orig) {
|
||||||
|
+ case 0:
|
||||||
|
+ file->f_pos = offset;
|
||||||
|
+ return file->f_pos;
|
||||||
|
+ case 1:
|
||||||
|
+ file->f_pos += offset;
|
||||||
|
+ return file->f_pos;
|
||||||
|
+ default:
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Determine the page address for an address offset value,
|
||||||
|
+ * get a virtual address for it, and copy it out.
|
||||||
|
+ * Accesses must fit within a page.
|
||||||
|
+ */
|
||||||
|
+static ssize_t
|
||||||
|
+crash_read(struct file *file, char *buf, size_t count, loff_t *poff)
|
||||||
|
+{
|
||||||
|
+ void *vaddr;
|
||||||
|
+ struct page *page;
|
||||||
|
+ u64 offset;
|
||||||
|
+ ssize_t read;
|
||||||
|
+
|
||||||
|
+ offset = *poff;
|
||||||
|
+ if (offset >> PAGE_SHIFT != (offset+count-1) >> PAGE_SHIFT)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ vaddr = map_virtual(offset, &page);
|
||||||
|
+ if (!vaddr)
|
||||||
|
+ return -EFAULT;
|
||||||
|
+
|
||||||
|
+ if (copy_to_user(buf, vaddr, count)) {
|
||||||
|
+ unmap_virtual(page);
|
||||||
|
+ return -EFAULT;
|
||||||
|
+ }
|
||||||
|
+ unmap_virtual(page);
|
||||||
|
+
|
||||||
|
+ read = count;
|
||||||
|
+ *poff += read;
|
||||||
|
+ return read;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct file_operations crash_fops = {
|
||||||
|
+ .owner = THIS_MODULE,
|
||||||
|
+ .llseek = crash_llseek,
|
||||||
|
+ .read = crash_read,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct miscdevice crash_dev = {
|
||||||
|
+ MISC_DYNAMIC_MINOR,
|
||||||
|
+ "crash",
|
||||||
|
+ &crash_fops
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int __init
|
||||||
|
+crash_init(void)
|
||||||
|
+{
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = misc_register(&crash_dev);
|
||||||
|
+ if (ret) {
|
||||||
|
+ printk(KERN_ERR
|
||||||
|
+ "crash memory driver: cannot misc_register (MISC_DYNAMIC_MINOR)\n");
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = 0;
|
||||||
|
+ printk(KERN_INFO "crash memory driver: version %s\n", CRASH_VERSION);
|
||||||
|
+out:
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void __exit
|
||||||
|
+crash_cleanup_module(void)
|
||||||
|
+{
|
||||||
|
+ misc_deregister(&crash_dev);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+module_init(crash_init);
|
||||||
|
+module_exit(crash_cleanup_module);
|
||||||
|
+
|
||||||
|
+MODULE_LICENSE("GPL");
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
From 76ec0e2e6d6edf81abc0331d5e7873ef7b2f6019 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Wed, 8 Jul 2009 13:06:01 -0400
|
||||||
|
Subject: [PATCH 6/6] fedora: linux-2.6-debug-always-inline-kzalloc.patch
|
||||||
|
|
||||||
|
---
|
||||||
|
include/linux/slab.h | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/linux/slab.h b/include/linux/slab.h
|
||||||
|
index 2da8372..d4ef74f 100644
|
||||||
|
--- a/include/linux/slab.h
|
||||||
|
+++ b/include/linux/slab.h
|
||||||
|
@@ -310,7 +310,7 @@ static inline void *kmem_cache_zalloc(struct kmem_cache *k, gfp_t flags)
|
||||||
|
* @size: how many bytes of memory are required.
|
||||||
|
* @flags: the type of memory to allocate (see kmalloc).
|
||||||
|
*/
|
||||||
|
-static inline void *kzalloc(size_t size, gfp_t flags)
|
||||||
|
+static __always_inline void *kzalloc(size_t size, gfp_t flags)
|
||||||
|
{
|
||||||
|
return kmalloc(size, flags | __GFP_ZERO);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
From 542dee6f43067fa0101b53925aadf1d08c997cd4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Mon, 29 Mar 2010 23:40:27 -0400
|
||||||
|
Subject: linux-2.6-debug-nmi-timeout
|
||||||
|
|
||||||
|
---
|
||||||
|
arch/x86/kernel/apic/nmi.c | 2 +-
|
||||||
|
lib/Kconfig.debug | 8 ++++++++
|
||||||
|
2 files changed, 9 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/arch/x86/kernel/apic/nmi.c b/arch/x86/kernel/apic/nmi.c
|
||||||
|
index 8aa65ad..ba7d55e 100644
|
||||||
|
--- a/arch/x86/kernel/apic/nmi.c
|
||||||
|
+++ b/arch/x86/kernel/apic/nmi.c
|
||||||
|
@@ -439,7 +439,7 @@ nmi_watchdog_tick(struct pt_regs *regs, unsigned reason)
|
||||||
|
* wait a few IRQs (5 seconds) before doing the oops ...
|
||||||
|
*/
|
||||||
|
__this_cpu_inc(alert_counter);
|
||||||
|
- if (__this_cpu_read(alert_counter) == 5 * nmi_hz)
|
||||||
|
+ if (__this_cpu_read(alert_counter) == CONFIG_DEBUG_NMI_TIMEOUT * nmi_hz)
|
||||||
|
/*
|
||||||
|
* die_nmi will return ONLY if NOTIFY_STOP happens..
|
||||||
|
*/
|
||||||
|
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
|
||||||
|
index 1fafb4b..963e78b 100644
|
||||||
|
--- a/lib/Kconfig.debug
|
||||||
|
+++ b/lib/Kconfig.debug
|
||||||
|
@@ -254,6 +254,14 @@ config SCHEDSTATS
|
||||||
|
application, you can say N to avoid the very slight overhead
|
||||||
|
this adds.
|
||||||
|
|
||||||
|
+config DEBUG_NMI_TIMEOUT
|
||||||
|
+ int "Number of seconds before NMI timeout"
|
||||||
|
+ depends on X86
|
||||||
|
+ default 5
|
||||||
|
+ help
|
||||||
|
+ This value is the number of seconds the NMI watchdog will tick
|
||||||
|
+ before it decides the machine has hung.
|
||||||
|
+
|
||||||
|
config TIMER_STATS
|
||||||
|
bool "Collect kernel timers statistics"
|
||||||
|
depends on DEBUG_KERNEL && PROC_FS
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
diff --git a/init/main.c b/init/main.c
|
||||||
|
index 7449819..98cfaae 100644
|
||||||
|
--- a/init/main.c
|
||||||
|
+++ b/init/main.c
|
||||||
|
@@ -369,6 +369,10 @@ static void __init setup_nr_cpu_ids(void)
|
||||||
|
nr_cpu_ids = find_last_bit(cpumask_bits(cpu_possible_mask),NR_CPUS) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#include <linux/ext3_fs_i.h>
|
||||||
|
+#include <linux/skbuff.h>
|
||||||
|
+#include <linux/sched.h>
|
||||||
|
+
|
||||||
|
/* Called by boot processor to activate the rest. */
|
||||||
|
static void __init smp_init(void)
|
||||||
|
{
|
||||||
|
@@ -391,6 +395,15 @@ static void __init smp_init(void)
|
||||||
|
/* Any cleanup work */
|
||||||
|
printk(KERN_INFO "Brought up %ld CPUs\n", (long)num_online_cpus());
|
||||||
|
smp_cpus_done(setup_max_cpus);
|
||||||
|
+
|
||||||
|
+ printk(KERN_DEBUG "sizeof(vma)=%u bytes\n", (unsigned int) sizeof(struct vm_area_struct));
|
||||||
|
+ printk(KERN_DEBUG "sizeof(page)=%u bytes\n", (unsigned int) sizeof(struct page));
|
||||||
|
+ printk(KERN_DEBUG "sizeof(inode)=%u bytes\n", (unsigned int) sizeof(struct inode));
|
||||||
|
+ printk(KERN_DEBUG "sizeof(dentry)=%u bytes\n", (unsigned int) sizeof(struct dentry));
|
||||||
|
+ printk(KERN_DEBUG "sizeof(ext3inode)=%u bytes\n", (unsigned int) sizeof(struct ext3_inode_info));
|
||||||
|
+ printk(KERN_DEBUG "sizeof(buffer_head)=%u bytes\n", (unsigned int) sizeof(struct buffer_head));
|
||||||
|
+ printk(KERN_DEBUG "sizeof(skbuff)=%u bytes\n", (unsigned int) sizeof(struct sk_buff));
|
||||||
|
+ printk(KERN_DEBUG "sizeof(task_struct)=%u bytes\n", (unsigned int) sizeof(struct task_struct));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,65 @@
|
||||||
|
From b04c57d9dc889462951312be2ac81ff6c702e954 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Wed, 8 Jul 2009 13:05:09 -0400
|
||||||
|
Subject: [PATCH 3/6] fedora: linux-2.6-debug-taint-vm.patch
|
||||||
|
|
||||||
|
---
|
||||||
|
kernel/panic.c | 4 +++-
|
||||||
|
mm/slab.c | 8 ++++----
|
||||||
|
mm/slub.c | 2 +-
|
||||||
|
4 files changed, 11 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/kernel/panic.c b/kernel/panic.c
|
||||||
|
index 984b3ec..6d1c3be 100644
|
||||||
|
--- a/kernel/panic.c
|
||||||
|
+++ b/kernel/panic.c
|
||||||
|
@@ -199,6 +199,7 @@ const char *print_tainted(void)
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
+EXPORT_SYMBOL(print_tainted);
|
||||||
|
|
||||||
|
int test_taint(unsigned flag)
|
||||||
|
{
|
||||||
|
diff --git a/mm/slab.c b/mm/slab.c
|
||||||
|
index e74a16e..7bc287e 100644
|
||||||
|
--- a/mm/slab.c
|
||||||
|
+++ b/mm/slab.c
|
||||||
|
@@ -1803,8 +1803,8 @@ static void check_poison_obj(struct kmem_cache *cachep, void *objp)
|
||||||
|
/* Print header */
|
||||||
|
if (lines == 0) {
|
||||||
|
printk(KERN_ERR
|
||||||
|
- "Slab corruption: %s start=%p, len=%d\n",
|
||||||
|
- cachep->name, realobj, size);
|
||||||
|
+ "Slab corruption (%s): %s start=%p, len=%d\n",
|
||||||
|
+ print_tainted(), cachep->name, realobj, size);
|
||||||
|
print_objinfo(cachep, objp, 0);
|
||||||
|
}
|
||||||
|
/* Hexdump the affected line */
|
||||||
|
@@ -2902,8 +2902,8 @@ static void check_slabp(struct kmem_cache *cachep, struct slab *slabp)
|
||||||
|
if (entries != cachep->num - slabp->inuse) {
|
||||||
|
bad:
|
||||||
|
printk(KERN_ERR "slab: Internal list corruption detected in "
|
||||||
|
- "cache '%s'(%d), slabp %p(%d). Hexdump:\n",
|
||||||
|
- cachep->name, cachep->num, slabp, slabp->inuse);
|
||||||
|
+ "cache '%s'(%d), slabp %p(%d). Tainted(%s). Hexdump:\n",
|
||||||
|
+ cachep->name, cachep->num, slabp, slabp->inuse, print_tainted());
|
||||||
|
for (i = 0;
|
||||||
|
i < sizeof(*slabp) + cachep->num * sizeof(kmem_bufctl_t);
|
||||||
|
i++) {
|
||||||
|
diff --git a/mm/slub.c b/mm/slub.c
|
||||||
|
index 819f056..8eff0f4 100644
|
||||||
|
--- a/mm/slub.c
|
||||||
|
+++ b/mm/slub.c
|
||||||
|
@@ -433,7 +433,7 @@ static void slab_bug(struct kmem_cache *s, char *fmt, ...)
|
||||||
|
va_end(args);
|
||||||
|
printk(KERN_ERR "========================================"
|
||||||
|
"=====================================\n");
|
||||||
|
- printk(KERN_ERR "BUG %s: %s\n", s->name, buf);
|
||||||
|
+ printk(KERN_ERR "BUG %s (%s): %s\n", s->name, print_tainted(), buf);
|
||||||
|
printk(KERN_ERR "----------------------------------------"
|
||||||
|
"-------------------------------------\n\n");
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
From 03657519851cd180983db4bd0c38eaeed4aa2962 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@treachery.i.jkkm.org>
|
||||||
|
Date: Mon, 11 Jan 2010 08:25:12 -0500
|
||||||
|
Subject: linux-2.6-debug-vm-would-have-oomkilled.patch
|
||||||
|
|
||||||
|
---
|
||||||
|
kernel/sysctl.c | 8 ++++++++
|
||||||
|
mm/oom_kill.c | 7 +++++++
|
||||||
|
2 files changed, 15 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
|
||||||
|
index 8a68b24..72a4ff1 100644
|
||||||
|
--- a/kernel/sysctl.c
|
||||||
|
+++ b/kernel/sysctl.c
|
||||||
|
@@ -71,6 +71,7 @@ extern int sysctl_overcommit_ratio;
|
||||||
|
extern int sysctl_panic_on_oom;
|
||||||
|
extern int sysctl_oom_kill_allocating_task;
|
||||||
|
extern int sysctl_oom_dump_tasks;
|
||||||
|
+extern int sysctl_would_have_oomkilled;
|
||||||
|
extern int max_threads;
|
||||||
|
extern int core_uses_pid;
|
||||||
|
extern int suid_dumpable;
|
||||||
|
@@ -973,6 +974,13 @@ static struct ctl_table vm_table[] = {
|
||||||
|
.proc_handler = proc_dointvec,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
+ .procname = "would_have_oomkilled",
|
||||||
|
+ .data = &sysctl_would_have_oomkilled,
|
||||||
|
+ .maxlen = sizeof(sysctl_would_have_oomkilled),
|
||||||
|
+ .mode = 0644,
|
||||||
|
+ .proc_handler = &proc_dointvec,
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
.procname = "overcommit_ratio",
|
||||||
|
.data = &sysctl_overcommit_ratio,
|
||||||
|
.maxlen = sizeof(sysctl_overcommit_ratio),
|
||||||
|
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
|
||||||
|
index f52481b..a892f07 100644
|
||||||
|
--- a/mm/oom_kill.c
|
||||||
|
+++ b/mm/oom_kill.c
|
||||||
|
@@ -31,6 +31,7 @@
|
||||||
|
int sysctl_panic_on_oom;
|
||||||
|
int sysctl_oom_kill_allocating_task;
|
||||||
|
int sysctl_oom_dump_tasks;
|
||||||
|
+int sysctl_would_have_oomkilled;
|
||||||
|
static DEFINE_SPINLOCK(zone_scan_lock);
|
||||||
|
/* #define DEBUG */
|
||||||
|
|
||||||
|
@@ -396,6 +397,12 @@ static void __oom_kill_task(struct task_struct *p, int verbose)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (sysctl_would_have_oomkilled == 1) {
|
||||||
|
+ printk(KERN_ERR "Would have killed process %d (%s). But continuing instead.\n",
|
||||||
|
+ task_pid_nr(p), p->comm);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (verbose)
|
||||||
|
printk(KERN_ERR "Killed process %d (%s) "
|
||||||
|
"vsz:%lukB, anon-rss:%lukB, file-rss:%lukB\n",
|
||||||
|
--
|
||||||
|
1.6.5.2
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
|
||||||
|
index 7743fb1..3a7f094 100644
|
||||||
|
--- a/arch/x86/pci/acpi.c
|
||||||
|
+++ b/arch/x86/pci/acpi.c
|
||||||
|
@@ -16,7 +16,7 @@ struct pci_root_info {
|
||||||
|
int busnum;
|
||||||
|
};
|
||||||
|
|
||||||
|
-static bool pci_use_crs = true;
|
||||||
|
+static bool pci_use_crs = false;
|
||||||
|
|
||||||
|
static int __init set_use_crs(const struct dmi_system_id *id)
|
||||||
|
{
|
|
@ -0,0 +1,13 @@
|
||||||
|
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
|
||||||
|
index d8d7596..a1b7117 100644
|
||||||
|
--- a/drivers/acpi/video.c
|
||||||
|
+++ b/drivers/acpi/video.c
|
||||||
|
@@ -71,7 +71,7 @@ MODULE_AUTHOR("Bruno Ducrot");
|
||||||
|
MODULE_DESCRIPTION("ACPI Video Driver");
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
|
||||||
|
-static int brightness_switch_enabled = 1;
|
||||||
|
+static int brightness_switch_enabled = 0;
|
||||||
|
module_param(brightness_switch_enabled, bool, 0644);
|
||||||
|
|
||||||
|
static int acpi_video_bus_add(struct acpi_device *device);
|
|
@ -0,0 +1,11 @@
|
||||||
|
--- linux-2.6.34.noarch.orig/kernel/power/main.c
|
||||||
|
+++ linux-2.6.34.noarch/kernel/power/main.c
|
||||||
|
@@ -45,7 +45,7 @@ int pm_notifier_call_chain(unsigned long
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If set, devices may be suspended and resumed asynchronously. */
|
||||||
|
-int pm_async_enabled = 1;
|
||||||
|
+int pm_async_enabled;
|
||||||
|
|
||||||
|
static ssize_t pm_async_show(struct kobject *kobj, struct kobj_attribute *attr,
|
||||||
|
char *buf)
|
|
@ -0,0 +1,110 @@
|
||||||
|
From 14bdd0d36f5284108468bb73afd50726b07c7a84 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Mon, 29 Mar 2010 23:43:49 -0400
|
||||||
|
Subject: linux-2.6-defaults-pci_no_msi
|
||||||
|
|
||||||
|
---
|
||||||
|
Documentation/kernel-parameters.txt | 3 +++
|
||||||
|
drivers/pci/Kconfig | 12 ++++++++++++
|
||||||
|
drivers/pci/msi.c | 9 +++++++++
|
||||||
|
drivers/pci/pci.c | 2 ++
|
||||||
|
drivers/pci/pci.h | 2 ++
|
||||||
|
5 files changed, 28 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
|
||||||
|
index e4cbca5..8154a0f 100644
|
||||||
|
--- a/Documentation/kernel-parameters.txt
|
||||||
|
+++ b/Documentation/kernel-parameters.txt
|
||||||
|
@@ -1911,6 +1911,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
|
check_enable_amd_mmconf [X86] check for and enable
|
||||||
|
properly configured MMIO access to PCI
|
||||||
|
config space on AMD family 10h CPU
|
||||||
|
+ msi [MSI] If the PCI_MSI kernel config parameter is
|
||||||
|
+ enabled, this kernel boot option can be used to
|
||||||
|
+ enable the use of MSI interrupts system-wide.
|
||||||
|
nomsi [MSI] If the PCI_MSI kernel config parameter is
|
||||||
|
enabled, this kernel boot option can be used to
|
||||||
|
disable the use of MSI interrupts system-wide.
|
||||||
|
diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
|
||||||
|
index 7858a11..b12fcad 100644
|
||||||
|
--- a/drivers/pci/Kconfig
|
||||||
|
+++ b/drivers/pci/Kconfig
|
||||||
|
@@ -21,6 +21,18 @@ config PCI_MSI
|
||||||
|
|
||||||
|
If you don't know what to do here, say N.
|
||||||
|
|
||||||
|
+config PCI_MSI_DEFAULT_ON
|
||||||
|
+ def_bool y
|
||||||
|
+ prompt "Use Message Signaled Interrupts by default"
|
||||||
|
+ depends on PCI_MSI
|
||||||
|
+ help
|
||||||
|
+ Selecting this option will enable use of PCI MSI where applicable
|
||||||
|
+ by default. Support for MSI can be disabled through the use of the
|
||||||
|
+ pci=nomsi boot flag. Conversely, if this option is not selected,
|
||||||
|
+ support for PCI MSI can be enabled by passing the pci=msi flag.
|
||||||
|
+
|
||||||
|
+ If you don't know what to do here, say N.
|
||||||
|
+
|
||||||
|
config PCI_DEBUG
|
||||||
|
bool "PCI Debugging"
|
||||||
|
depends on PCI && DEBUG_KERNEL
|
||||||
|
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
|
||||||
|
index f9cf317..6b0539a 100644
|
||||||
|
--- a/drivers/pci/msi.c
|
||||||
|
+++ b/drivers/pci/msi.c
|
||||||
|
@@ -22,7 +22,11 @@
|
||||||
|
#include "pci.h"
|
||||||
|
#include "msi.h"
|
||||||
|
|
||||||
|
+#ifdef CONFIG_PCI_MSI_DEFAULT_ON
|
||||||
|
static int pci_msi_enable = 1;
|
||||||
|
+#else
|
||||||
|
+static int pci_msi_enable = 0;
|
||||||
|
+#endif /*CONFIG_PCI_MSI_DEFAULT_ON*/
|
||||||
|
|
||||||
|
/* Arch hooks */
|
||||||
|
|
||||||
|
@@ -836,6 +840,11 @@ int pci_msi_enabled(void)
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(pci_msi_enabled);
|
||||||
|
|
||||||
|
+void pci_yes_msi(void)
|
||||||
|
+{
|
||||||
|
+ pci_msi_enable = 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void pci_msi_init_pci_dev(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
INIT_LIST_HEAD(&dev->msi_list);
|
||||||
|
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
|
||||||
|
index 1531f3a..3cb332b 100644
|
||||||
|
--- a/drivers/pci/pci.c
|
||||||
|
+++ b/drivers/pci/pci.c
|
||||||
|
@@ -2983,6 +2983,8 @@ static int __init pci_setup(char *str)
|
||||||
|
if (*str && (str = pcibios_setup(str)) && *str) {
|
||||||
|
if (!strcmp(str, "nomsi")) {
|
||||||
|
pci_no_msi();
|
||||||
|
+ } else if (!strcmp(str, "msi")) {
|
||||||
|
+ pci_yes_msi();
|
||||||
|
} else if (!strcmp(str, "noaer")) {
|
||||||
|
pci_no_aer();
|
||||||
|
} else if (!strcmp(str, "nodomains")) {
|
||||||
|
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
|
||||||
|
index 4eb10f4..caa051e 100644
|
||||||
|
--- a/drivers/pci/pci.h
|
||||||
|
+++ b/drivers/pci/pci.h
|
||||||
|
@@ -122,9 +122,11 @@ extern unsigned int pci_pm_d3_delay;
|
||||||
|
|
||||||
|
#ifdef CONFIG_PCI_MSI
|
||||||
|
void pci_no_msi(void);
|
||||||
|
+void pci_yes_msi(void);
|
||||||
|
extern void pci_msi_init_pci_dev(struct pci_dev *dev);
|
||||||
|
#else
|
||||||
|
static inline void pci_no_msi(void) { }
|
||||||
|
+static inline void pci_yes_msi(void) { }
|
||||||
|
static inline void pci_msi_init_pci_dev(struct pci_dev *dev) { }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
commit 7d0d20a25c6f477fb198b85510c78156d7d7c5af
|
||||||
|
Author: Matthew Garrett <mjg@redhat.com>
|
||||||
|
Date: Tue Jun 9 20:11:47 2009 +0100
|
||||||
|
|
||||||
|
usb: Allow drivers to enable USB autosuspend on a per-device basis
|
||||||
|
|
||||||
|
USB autosuspend is currently only enabled by default for hubs. On other
|
||||||
|
hardware the decision is made by userspace. This is unnecessary in cases
|
||||||
|
where we know that the hardware supports autosuspend, so this patch adds
|
||||||
|
a function to allow drivers to enable it at probe time.
|
||||||
|
|
||||||
|
Signed-off-by: Matthew Garrett <mjg@redhat.com>
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/usb/core/driver.c | 16 ++++++++++++++++
|
||||||
|
include/linux/usb.h | 4 ++++
|
||||||
|
2 files changed, 20 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
|
||||||
|
index 60a45f1..03e0228 100644
|
||||||
|
--- a/drivers/usb/core/driver.c
|
||||||
|
+++ b/drivers/usb/core/driver.c
|
||||||
|
@@ -1648,6 +1648,21 @@ void usb_autopm_put_interface_async(struct usb_interface *intf)
|
||||||
|
EXPORT_SYMBOL_GPL(usb_autopm_put_interface_async);
|
||||||
|
|
||||||
|
/**
|
||||||
|
+ * usb_device_autosuspend_enable - enable autosuspend on a device
|
||||||
|
+ * @udev: the usb_device to be autosuspended
|
||||||
|
+ *
|
||||||
|
+ * This routine should be called by an interface driver when it knows that
|
||||||
|
+ * the device in question supports USB autosuspend.
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+void usb_device_autosuspend_enable(struct usb_device *udev)
|
||||||
|
+{
|
||||||
|
+ udev->autosuspend_disabled = 0;
|
||||||
|
+ usb_external_suspend_device(udev, PMSG_USER_SUSPEND);
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL_GPL(usb_device_autosuspend_enable);
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
* usb_autopm_get_interface - increment a USB interface's PM-usage counter
|
||||||
|
* @intf: the usb_interface whose counter should be incremented
|
||||||
|
*
|
||||||
|
diff --git a/include/linux/usb.h b/include/linux/usb.h
|
||||||
|
index e101a2d..dd47590 100644
|
||||||
|
--- a/include/linux/usb.h
|
||||||
|
+++ b/include/linux/usb.h
|
||||||
|
@@ -540,6 +540,7 @@ extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id);
|
||||||
|
|
||||||
|
/* USB autosuspend and autoresume */
|
||||||
|
#ifdef CONFIG_USB_SUSPEND
|
||||||
|
+extern void usb_device_autosuspend_enable(struct usb_device *udev);
|
||||||
|
extern int usb_autopm_get_interface(struct usb_interface *intf);
|
||||||
|
extern void usb_autopm_put_interface(struct usb_interface *intf);
|
||||||
|
extern int usb_autopm_get_interface_async(struct usb_interface *intf);
|
||||||
|
@@ -563,6 +564,9 @@ static inline void usb_mark_last_busy(struct usb_device *udev)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
+static inline void usb_device_autosuspend_enable(struct usb_device *udev)
|
||||||
|
+{ }
|
||||||
|
+
|
||||||
|
static inline int usb_autopm_get_interface(struct usb_interface *intf)
|
||||||
|
{ return 0; }
|
||||||
|
static inline int usb_autopm_get_interface_async(struct usb_interface *intf)
|
||||||
|
--
|
||||||
|
1.6.5.2
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue