Compare commits
30 Commits
master
...
f13-2.6.33
Author | SHA1 | Date |
---|---|---|
Chuck Ebbert | 42b62631f5 | |
Chuck Ebbert | e158521737 | |
Chuck Ebbert | b0632f00ee | |
Chuck Ebbert | 7139dd832a | |
Chuck Ebbert | b5010d0d56 | |
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,297 @@
|
|||
# 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
|
||||
|
||||
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,682 @@
|
|||
commit 92c912df2a0725d719263357176f98b2201a2acd
|
||||
Author: Bastien Nocera <hadess@hadess.net>
|
||||
Date: Wed Apr 21 14:51:58 2010 +0100
|
||||
|
||||
Input: add appleir USB driver
|
||||
|
||||
This driver was originally written by James McKenzie, updated by
|
||||
Greg Kroah-Hartman, further updated by myself, with suspend support
|
||||
added.
|
||||
|
||||
More recent versions of the IR receiver are also supported through
|
||||
a patch by Alex Karpenko.
|
||||
|
||||
Tested on a MacbookAir1,1
|
||||
|
||||
Signed-off-by: Bastien Nocera <hadess@hadess.net>
|
||||
|
||||
commit 6ffcbf68913840e9e882db14441576ffee6eba0c
|
||||
Author: Bastien Nocera <hadess@hadess.net>
|
||||
Date: Fri Apr 16 17:19:50 2010 +0100
|
||||
|
||||
Add HID_QUIRK_HIDDEV_FORCE and HID_QUIRK_NO_IGNORE
|
||||
|
||||
Add two quirks to make it possible for usbhid module options to
|
||||
override whether a device is ignored (HID_QUIRK_NO_IGNORE) and
|
||||
whether to connect a hiddev device (HID_QUIRK_HIDDEV_FORCE).
|
||||
|
||||
Passing HID_QUIRK_NO_IGNORE for your device means that it will
|
||||
not be ignored by the HID layer, even if present in a blacklist.
|
||||
|
||||
HID_QUIRK_HIDDEV_FORCE will force the creation of a hiddev for that
|
||||
device, making it accessible from user-space.
|
||||
|
||||
Tested with an Apple IR Receiver, switching it from using appleir
|
||||
to using lirc's macmini driver.
|
||||
|
||||
Signed-off-by: Bastien Nocera <hadess@hadess.net>
|
||||
|
||||
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 5b4d66d..b0e1811 100644
|
||||
--- a/drivers/hid/hid-apple.c
|
||||
+++ b/drivers/hid/hid-apple.c
|
||||
@@ -353,10 +353,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 8455f3d..e795d8c 100644
|
||||
--- a/drivers/hid/hid-core.c
|
||||
+++ b/drivers/hid/hid-core.c
|
||||
@@ -1170,6 +1170,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))
|
||||
@@ -1250,8 +1252,6 @@ EXPORT_SYMBOL_GPL(hid_disconnect);
|
||||
static const struct hid_device_id hid_blacklist[] = {
|
||||
{ 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_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO) },
|
||||
@@ -1545,6 +1545,9 @@ static const struct hid_device_id hid_ignore_list[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_LCM)},
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_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) },
|
||||
@@ -1749,7 +1752,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 793691f..9255c1a 100644
|
||||
--- a/drivers/hid/hid-ids.h
|
||||
+++ b/drivers/hid/hid-ids.h
|
||||
@@ -93,6 +93,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 2f84237..2de42e1 100644
|
||||
--- a/drivers/hid/usbhid/hid-core.c
|
||||
+++ b/drivers/hid/usbhid/hid-core.c
|
||||
@@ -1142,6 +1142,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 16ec523..4340986 100644
|
||||
--- a/drivers/input/misc/Kconfig
|
||||
+++ b/drivers/input/misc/Kconfig
|
||||
@@ -149,6 +149,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 a8b8485..041e6f5 100644
|
||||
--- a/drivers/input/misc/Makefile
|
||||
+++ b/drivers/input/misc/Makefile
|
||||
@@ -5,6 +5,7 @@
|
||||
# Each configuration option enables a list of files.
|
||||
|
||||
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 8709365..662596b 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
|
|
@ -0,0 +1,348 @@
|
|||
From 82ff9c3b767ec5bfaed3d99c9ed1160e44cbfd53 Mon Sep 17 00:00:00 2001
|
||||
From: Jaroslav Kysela <perex@perex.cz>
|
||||
Date: Thu, 11 Feb 2010 17:50:44 +0100
|
||||
Subject: ALSA: usbmixer - add possibility to remap dB values
|
||||
|
||||
USB devices tends to represent dB ranges in different way than ALSA expects.
|
||||
Add possibility to override these values and add guessed values for
|
||||
SoundBlaster MP3+.
|
||||
|
||||
Also rename 'Capture Input Source' control to 'Capture Source' for
|
||||
SoundBlaster MP3+ and Extigy.
|
||||
|
||||
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
|
||||
---
|
||||
sound/usb/usbmixer.c | 125 +++++++++++++++++++++++++++------------------
|
||||
sound/usb/usbmixer_maps.c | 23 ++++++--
|
||||
2 files changed, 93 insertions(+), 55 deletions(-)
|
||||
|
||||
diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c
|
||||
index c998220..c72ad0c 100644
|
||||
--- a/sound/usb/usbmixer.c
|
||||
+++ b/sound/usb/usbmixer.c
|
||||
@@ -123,6 +123,7 @@ struct usb_mixer_elem_info {
|
||||
int channels;
|
||||
int val_type;
|
||||
int min, max, res;
|
||||
+ int dBmin, dBmax;
|
||||
int cached;
|
||||
int cache_val[MAX_CHANNELS];
|
||||
u8 initialized;
|
||||
@@ -194,42 +195,50 @@ enum {
|
||||
*/
|
||||
#include "usbmixer_maps.c"
|
||||
|
||||
-/* get the mapped name if the unit matches */
|
||||
-static int check_mapped_name(struct mixer_build *state, int unitid, int control, char *buf, int buflen)
|
||||
+static const struct usbmix_name_map *
|
||||
+find_map(struct mixer_build *state, int unitid, int control)
|
||||
{
|
||||
- const struct usbmix_name_map *p;
|
||||
+ const struct usbmix_name_map *p = state->map;
|
||||
|
||||
- if (! state->map)
|
||||
- return 0;
|
||||
+ if (!p)
|
||||
+ return NULL;
|
||||
|
||||
for (p = state->map; p->id; p++) {
|
||||
- if (p->id == unitid && p->name &&
|
||||
- (! control || ! p->control || control == p->control)) {
|
||||
- buflen--;
|
||||
- return strlcpy(buf, p->name, buflen);
|
||||
- }
|
||||
+ if (p->id == unitid &&
|
||||
+ (!control || !p->control || control == p->control))
|
||||
+ return p;
|
||||
}
|
||||
- return 0;
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
-/* check whether the control should be ignored */
|
||||
-static int check_ignored_ctl(struct mixer_build *state, int unitid, int control)
|
||||
+/* get the mapped name if the unit matches */
|
||||
+static int
|
||||
+check_mapped_name(const struct usbmix_name_map *p, char *buf, int buflen)
|
||||
{
|
||||
- const struct usbmix_name_map *p;
|
||||
+ if (!p || !p->name)
|
||||
+ return 0;
|
||||
|
||||
- if (! state->map)
|
||||
+ buflen--;
|
||||
+ return strlcpy(buf, p->name, buflen);
|
||||
+}
|
||||
+
|
||||
+/* check whether the control should be ignored */
|
||||
+static inline int
|
||||
+check_ignored_ctl(const struct usbmix_name_map *p)
|
||||
+{
|
||||
+ if (!p || p->name || p->dB)
|
||||
return 0;
|
||||
- for (p = state->map; p->id; p++) {
|
||||
- if (p->id == unitid && ! p->name &&
|
||||
- (! control || ! p->control || control == p->control)) {
|
||||
- /*
|
||||
- printk(KERN_DEBUG "ignored control %d:%d\n",
|
||||
- unitid, control);
|
||||
- */
|
||||
- return 1;
|
||||
- }
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+/* dB mapping */
|
||||
+static inline void check_mapped_dB(const struct usbmix_name_map *p,
|
||||
+ struct usb_mixer_elem_info *cval)
|
||||
+{
|
||||
+ if (p && p->dB) {
|
||||
+ cval->dBmin = p->dB->min;
|
||||
+ cval->dBmax = p->dB->max;
|
||||
}
|
||||
- return 0;
|
||||
}
|
||||
|
||||
/* get the mapped selector source name */
|
||||
@@ -466,20 +475,8 @@ static int mixer_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
|
||||
|
||||
if (size < sizeof(scale))
|
||||
return -ENOMEM;
|
||||
- /* USB descriptions contain the dB scale in 1/256 dB unit
|
||||
- * while ALSA TLV contains in 1/100 dB unit
|
||||
- */
|
||||
- scale[2] = (convert_signed_value(cval, cval->min) * 100) / 256;
|
||||
- scale[3] = (convert_signed_value(cval, cval->max) * 100) / 256;
|
||||
- if (scale[3] <= scale[2]) {
|
||||
- /* something is wrong; assume it's either from/to 0dB */
|
||||
- if (scale[2] < 0)
|
||||
- scale[3] = 0;
|
||||
- else if (scale[2] > 0)
|
||||
- scale[2] = 0;
|
||||
- else /* totally crap, return an error */
|
||||
- return -EINVAL;
|
||||
- }
|
||||
+ scale[2] = cval->dBmin;
|
||||
+ scale[3] = cval->dBmax;
|
||||
if (copy_to_user(_tlv, scale, sizeof(scale)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
@@ -720,6 +717,7 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min)
|
||||
cval->min = default_min;
|
||||
cval->max = cval->min + 1;
|
||||
cval->res = 1;
|
||||
+ cval->dBmin = cval->dBmax = 0;
|
||||
|
||||
if (cval->val_type == USB_MIXER_BOOLEAN ||
|
||||
cval->val_type == USB_MIXER_INV_BOOLEAN) {
|
||||
@@ -787,6 +785,24 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min)
|
||||
|
||||
cval->initialized = 1;
|
||||
}
|
||||
+
|
||||
+ /* USB descriptions contain the dB scale in 1/256 dB unit
|
||||
+ * while ALSA TLV contains in 1/100 dB unit
|
||||
+ */
|
||||
+ cval->dBmin = (convert_signed_value(cval, cval->min) * 100) / 256;
|
||||
+ cval->dBmax = (convert_signed_value(cval, cval->max) * 100) / 256;
|
||||
+ if (cval->dBmin > cval->dBmax) {
|
||||
+ /* something is wrong; assume it's either from/to 0dB */
|
||||
+ if (cval->dBmin < 0)
|
||||
+ cval->dBmax = 0;
|
||||
+ else if (cval->dBmin > 0)
|
||||
+ cval->dBmin = 0;
|
||||
+ if (cval->dBmin > cval->dBmax) {
|
||||
+ /* totally crap, return an error */
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -912,6 +928,7 @@ static void build_feature_ctl(struct mixer_build *state, unsigned char *desc,
|
||||
int nameid = desc[desc[0] - 1];
|
||||
struct snd_kcontrol *kctl;
|
||||
struct usb_mixer_elem_info *cval;
|
||||
+ const struct usbmix_name_map *map;
|
||||
|
||||
control++; /* change from zero-based to 1-based value */
|
||||
|
||||
@@ -920,7 +937,8 @@ static void build_feature_ctl(struct mixer_build *state, unsigned char *desc,
|
||||
return;
|
||||
}
|
||||
|
||||
- if (check_ignored_ctl(state, unitid, control))
|
||||
+ map = find_map(state, unitid, control);
|
||||
+ if (check_ignored_ctl(map))
|
||||
return;
|
||||
|
||||
cval = kzalloc(sizeof(*cval), GFP_KERNEL);
|
||||
@@ -954,10 +972,11 @@ static void build_feature_ctl(struct mixer_build *state, unsigned char *desc,
|
||||
}
|
||||
kctl->private_free = usb_mixer_elem_free;
|
||||
|
||||
- len = check_mapped_name(state, unitid, control, kctl->id.name, sizeof(kctl->id.name));
|
||||
+ len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name));
|
||||
mapped_name = len != 0;
|
||||
if (! len && nameid)
|
||||
- len = snd_usb_copy_string_desc(state, nameid, kctl->id.name, sizeof(kctl->id.name));
|
||||
+ len = snd_usb_copy_string_desc(state, nameid,
|
||||
+ kctl->id.name, sizeof(kctl->id.name));
|
||||
|
||||
switch (control) {
|
||||
case USB_FEATURE_MUTE:
|
||||
@@ -995,6 +1014,7 @@ static void build_feature_ctl(struct mixer_build *state, unsigned char *desc,
|
||||
kctl->vd[0].access |=
|
||||
SNDRV_CTL_ELEM_ACCESS_TLV_READ |
|
||||
SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
|
||||
+ check_mapped_dB(map, cval);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1122,8 +1142,10 @@ static void build_mixer_unit_ctl(struct mixer_build *state, unsigned char *desc,
|
||||
unsigned int num_outs = desc[5 + input_pins];
|
||||
unsigned int i, len;
|
||||
struct snd_kcontrol *kctl;
|
||||
+ const struct usbmix_name_map *map;
|
||||
|
||||
- if (check_ignored_ctl(state, unitid, 0))
|
||||
+ map = find_map(state, unitid, 0);
|
||||
+ if (check_ignored_ctl(map))
|
||||
return;
|
||||
|
||||
cval = kzalloc(sizeof(*cval), GFP_KERNEL);
|
||||
@@ -1152,7 +1174,7 @@ static void build_mixer_unit_ctl(struct mixer_build *state, unsigned char *desc,
|
||||
}
|
||||
kctl->private_free = usb_mixer_elem_free;
|
||||
|
||||
- len = check_mapped_name(state, unitid, 0, kctl->id.name, sizeof(kctl->id.name));
|
||||
+ len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name));
|
||||
if (! len)
|
||||
len = get_term_name(state, iterm, kctl->id.name, sizeof(kctl->id.name), 0);
|
||||
if (! len)
|
||||
@@ -1342,6 +1364,7 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, unsigned
|
||||
int i, err, nameid, type, len;
|
||||
struct procunit_info *info;
|
||||
struct procunit_value_info *valinfo;
|
||||
+ const struct usbmix_name_map *map;
|
||||
static struct procunit_value_info default_value_info[] = {
|
||||
{ 0x01, "Switch", USB_MIXER_BOOLEAN },
|
||||
{ 0 }
|
||||
@@ -1371,7 +1394,8 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, unsigned
|
||||
/* FIXME: bitmap might be longer than 8bit */
|
||||
if (! (dsc[12 + num_ins] & (1 << (valinfo->control - 1))))
|
||||
continue;
|
||||
- if (check_ignored_ctl(state, unitid, valinfo->control))
|
||||
+ map = find_map(state, unitid, valinfo->control);
|
||||
+ if (check_ignored_ctl(map))
|
||||
continue;
|
||||
cval = kzalloc(sizeof(*cval), GFP_KERNEL);
|
||||
if (! cval) {
|
||||
@@ -1402,8 +1426,9 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, unsigned
|
||||
}
|
||||
kctl->private_free = usb_mixer_elem_free;
|
||||
|
||||
- if (check_mapped_name(state, unitid, cval->control, kctl->id.name, sizeof(kctl->id.name)))
|
||||
- ;
|
||||
+ if (check_mapped_name(map, kctl->id.name,
|
||||
+ sizeof(kctl->id.name)))
|
||||
+ /* nothing */ ;
|
||||
else if (info->name)
|
||||
strlcpy(kctl->id.name, info->name, sizeof(kctl->id.name));
|
||||
else {
|
||||
@@ -1542,6 +1567,7 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, unsi
|
||||
int err;
|
||||
struct usb_mixer_elem_info *cval;
|
||||
struct snd_kcontrol *kctl;
|
||||
+ const struct usbmix_name_map *map;
|
||||
char **namelist;
|
||||
|
||||
if (! num_ins || desc[0] < 5 + num_ins) {
|
||||
@@ -1557,7 +1583,8 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, unsi
|
||||
if (num_ins == 1) /* only one ? nonsense! */
|
||||
return 0;
|
||||
|
||||
- if (check_ignored_ctl(state, unitid, 0))
|
||||
+ map = find_map(state, unitid, 0);
|
||||
+ if (check_ignored_ctl(map))
|
||||
return 0;
|
||||
|
||||
cval = kzalloc(sizeof(*cval), GFP_KERNEL);
|
||||
@@ -1612,7 +1639,7 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, unsi
|
||||
kctl->private_free = usb_mixer_selector_elem_free;
|
||||
|
||||
nameid = desc[desc[0] - 1];
|
||||
- len = check_mapped_name(state, unitid, 0, kctl->id.name, sizeof(kctl->id.name));
|
||||
+ len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name));
|
||||
if (len)
|
||||
;
|
||||
else if (nameid)
|
||||
diff --git a/sound/usb/usbmixer_maps.c b/sound/usb/usbmixer_maps.c
|
||||
index 77c3588..79e903a 100644
|
||||
--- a/sound/usb/usbmixer_maps.c
|
||||
+++ b/sound/usb/usbmixer_maps.c
|
||||
@@ -19,11 +19,16 @@
|
||||
*
|
||||
*/
|
||||
|
||||
+struct usbmix_dB_map {
|
||||
+ u32 min;
|
||||
+ u32 max;
|
||||
+};
|
||||
|
||||
struct usbmix_name_map {
|
||||
int id;
|
||||
const char *name;
|
||||
int control;
|
||||
+ struct usbmix_dB_map *dB;
|
||||
};
|
||||
|
||||
struct usbmix_selector_map {
|
||||
@@ -72,7 +77,7 @@ static struct usbmix_name_map extigy_map[] = {
|
||||
{ 8, "Line Playback" }, /* FU */
|
||||
/* 9: IT mic */
|
||||
{ 10, "Mic Playback" }, /* FU */
|
||||
- { 11, "Capture Input Source" }, /* SU */
|
||||
+ { 11, "Capture Source" }, /* SU */
|
||||
{ 12, "Capture" }, /* FU */
|
||||
/* 13: OT pcm capture */
|
||||
/* 14: MU (w/o controls) */
|
||||
@@ -102,6 +107,9 @@ static struct usbmix_name_map extigy_map[] = {
|
||||
* e.g. no Master and fake PCM volume
|
||||
* Pavel Mihaylov <bin@bash.info>
|
||||
*/
|
||||
+static struct usbmix_dB_map mp3plus_dB_1 = {-4781, 0}; /* just guess */
|
||||
+static struct usbmix_dB_map mp3plus_dB_2 = {-1781, 618}; /* just guess */
|
||||
+
|
||||
static struct usbmix_name_map mp3plus_map[] = {
|
||||
/* 1: IT pcm */
|
||||
/* 2: IT mic */
|
||||
@@ -110,16 +118,19 @@ static struct usbmix_name_map mp3plus_map[] = {
|
||||
/* 5: OT digital out */
|
||||
/* 6: OT speaker */
|
||||
/* 7: OT pcm capture */
|
||||
- { 8, "Capture Input Source" }, /* FU, default PCM Capture Source */
|
||||
+ { 8, "Capture Source" }, /* FU, default PCM Capture Source */
|
||||
/* (Mic, Input 1 = Line input, Input 2 = Optical input) */
|
||||
{ 9, "Master Playback" }, /* FU, default Speaker 1 */
|
||||
/* { 10, "Mic Capture", 1 }, */ /* FU, Mic Capture */
|
||||
- /* { 10, "Mic Capture", 2 }, */ /* FU, Mic Capture */
|
||||
+ { 10, /* "Mic Capture", */ NULL, 2, .dB = &mp3plus_dB_2 },
|
||||
+ /* FU, Mic Capture */
|
||||
{ 10, "Mic Boost", 7 }, /* FU, default Auto Gain Input */
|
||||
- { 11, "Line Capture" }, /* FU, default PCM Capture */
|
||||
+ { 11, "Line Capture", .dB = &mp3plus_dB_2 },
|
||||
+ /* FU, default PCM Capture */
|
||||
{ 12, "Digital In Playback" }, /* FU, default PCM 1 */
|
||||
- /* { 13, "Mic Playback" }, */ /* FU, default Mic Playback */
|
||||
- { 14, "Line Playback" }, /* FU, default Speaker */
|
||||
+ { 13, /* "Mic Playback", */ .dB = &mp3plus_dB_1 },
|
||||
+ /* FU, default Mic Playback */
|
||||
+ { 14, "Line Playback", .dB = &mp3plus_dB_1 }, /* FU, default Speaker */
|
||||
/* 15: MU */
|
||||
{ 0 } /* terminator */
|
||||
};
|
||||
--
|
||||
1.7.0.1
|
||||
|
|
@ -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,107 @@
|
|||
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
|
|
@ -0,0 +1,78 @@
|
|||
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_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_FUNCTION_TRACER=y
|
||||
CONFIG_STACK_TRACER=y
|
||||
CONFIG_DYNAMIC_FTRACE=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
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,5 @@
|
|||
# CONFIG_HIGHMEM4G is not set
|
||||
CONFIG_HIGHMEM64G=y
|
||||
|
||||
CONFIG_XEN_DEV_EVTCHN=m
|
||||
CONFIG_XEN_SYS_HYPERVISOR=y
|
|
@ -0,0 +1,215 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
#
|
||||
|
||||
#
|
||||
# Processor type and features
|
||||
#
|
||||
CONFIG_IA64=y
|
||||
CONFIG_64BIT=y
|
||||
# CONFIG_XEN is not set
|
||||
# CONFIG_ARCH_XEN is not set
|
||||
# CONFIG_XEN_PRIVILEGED_GUEST is not set
|
||||
# CONFIG_XEN_VT is not set
|
||||
CONFIG_MMU=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=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_IDE_MAX_HWIFS=4
|
||||
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_IA64_SGI_SN_XP=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_BAY is not set
|
||||
# CONFIG_ACPI_BATTERY is not set
|
||||
CONFIG_ACPI_BLACKLIST_YEAR=0
|
||||
CONFIG_ACPI_BUTTON=y
|
||||
# CONFIG_ACPI_DOCK is not set
|
||||
CONFIG_ACPI_EC=y
|
||||
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_SYSTEM=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_BCM43XX is not set
|
||||
|
||||
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,78 @@
|
|||
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_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_FUNCTION_TRACER is not set
|
||||
# CONFIG_STACK_TRACER is not set
|
||||
# CONFIG_DYNAMIC_FTRACE 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
|
|
@ -0,0 +1,345 @@
|
|||
# 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_PPC=y
|
||||
CONFIG_RTC_DRV_GENERIC=y
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
# CONFIG_CMDLINE_BOOL is not set
|
||||
CONFIG_ELECTRA_IDE=y
|
||||
|
||||
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_USB_HIDINPUT_POWERBOOK=y
|
||||
|
||||
# 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_IDEDISK=y
|
||||
CONFIG_IDEDISK_MULTI_MODE=y
|
||||
# CONFIG_BLK_DEV_IDECS is not set
|
||||
CONFIG_BLK_DEV_IDECD=m
|
||||
# CONFIG_BLK_DEV_IDETAPE is not set
|
||||
CONFIG_BLK_DEV_IDEFLOPPY=m
|
||||
# CONFIG_BLK_DEV_IDESCSI 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_IDEPCI_SHARE_IRQ=y
|
||||
# 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_HPT34X 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_PMAC=y
|
||||
# CONFIG_IDE_ARM is not set
|
||||
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_MT9M001_PCA9536_SWITCH is not set
|
||||
# CONFIG_MT9V022_PCA9536_SWITCH is not set
|
||||
# CONFIG_KGDB_CONSOLE is not set
|
||||
|
||||
CONFIG_MDIO_OF_GPIO=m
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,190 @@
|
|||
# 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_CLASSIC32=y
|
||||
CONFIG_CPU_FREQ_PMAC=y
|
||||
CONFIG_PPC_MULTIPLATFORM=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_GFAR_NAPI=y
|
||||
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_SENSORS_M41T00=m
|
||||
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_MAMBO 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_83xx_WDT=m
|
||||
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_BLK_DEV_HD_ONLY=y
|
||||
# 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_SBC8240 is not set
|
||||
|
||||
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,197 @@
|
|||
CONFIG_WINDFARM_PM81=y
|
||||
CONFIG_WINDFARM_PM91=y
|
||||
CONFIG_WINDFARM_PM121=y
|
||||
CONFIG_PPC_PMAC64=y
|
||||
CONFIG_PPC_MAPLE=y
|
||||
CONFIG_PPC_SYSTEMSIM=y
|
||||
CONFIG_BLK_DEV_SYSTEMSIM=m
|
||||
CONFIG_SYSTEMSIM_NET=m
|
||||
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_USE_LPAR_ADDR is not set
|
||||
CONFIG_PS3_ADVANCED=y
|
||||
CONFIG_PS3_HTAB_SIZE=20
|
||||
# CONFIG_PS3_DYNAMIC_DMA is not set
|
||||
CONFIG_PS3_USE_LPAR_ADDR=y
|
||||
CONFIG_PS3_VUART=y
|
||||
CONFIG_PS3_PS3AV=y
|
||||
CONFIG_PS3_STORAGE=m
|
||||
CONFIG_PS3_STORAGE_EXPECTED_NUM_DRIVES=3
|
||||
CONFIG_PS3_STORAGE_MAX_SPINUP_WAIT_TIME=10
|
||||
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_MAMBO=y
|
||||
CONFIG_MAMBO_DISK=m
|
||||
CONFIG_MAMBO_NET=m
|
||||
CONFIG_CBE_RAS=y
|
||||
|
||||
# iSeries device drivers
|
||||
#
|
||||
CONFIG_ISERIES_VETH=m
|
||||
# CONFIG_VIOCONS is not set
|
||||
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_SPU_TRACE=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_BLK_DEV_HD_ONLY=y
|
||||
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,213 @@
|
|||
# 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_CS4232 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_TIPAR 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_IFORCE_USB=y
|
||||
# CONFIG_JOYSTICK_IFORCE_232=y
|
||||
# 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_MIROPCM20_RDS 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_TUNER_3036 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_DPC 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_FB_TRIDENT_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,237 @@
|
|||
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_RWSEM_XCHGADD_ALGORITHM=y
|
||||
|
||||
CONFIG_LOG_BUF_SHIFT=16
|
||||
CONFIG_NO_IDLE_HZ=y
|
||||
CONFIG_NO_IDLE_HZ_INIT=y
|
||||
|
||||
CONFIG_SMP=y
|
||||
|
||||
#
|
||||
# I/O subsystem configuration
|
||||
#
|
||||
CONFIG_MACHCHK_WARNING=y
|
||||
CONFIG_QDIO=m
|
||||
# CONFIG_QDIO_DEBUG is not set
|
||||
|
||||
#
|
||||
# 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_VIRT_TIMER=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_SHAPER is not set
|
||||
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_QETH_VLAN=y
|
||||
CONFIG_CCWGROUP=m
|
||||
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_WIRELESS_EXT is not set
|
||||
# CONFIG_WLAN_80211 is not set
|
||||
# CONFIG_MAC80211 is not set
|
||||
# CONFIG_IEEE80211 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_BOOT_DELAY 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_SWITCH_AMODE=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_PAGE_STATES=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_PREEMPT_TRACER is not set
|
|
@ -0,0 +1,215 @@
|
|||
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_SPARC32_COMPAT=y
|
||||
CONFIG_COMPAT=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_BINFMT_ELF32=y
|
||||
CONFIG_BINFMT_AOUT32=y
|
||||
CONFIG_SUNOS_EMUL=y
|
||||
CONFIG_SOLARIS_EMUL=m
|
||||
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_PVR150 is not set
|
||||
# CONFIG_LIRC_PARALLEL is not set
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
# CONFIG_I2C_SAVAGE4 is not set
|
||||
# CONFIG_I2C_SIMTEC is not set
|
||||
# CONFIG_I2C_VOODOO3 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_XVR1000=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_PROM_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_SUN_MOSTEK_RTC=y
|
||||
CONFIG_OBP_FLASH=m
|
||||
# CONFIG_SUN_VIDEOPIX is not set
|
||||
# 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_HPT34X 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_SBA=y
|
||||
CONFIG_ATM_FORE200E_SBA_DEFAULT_FW=y
|
||||
# CONFIG_ATM_FORE200E_SBA_FW 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_SUN_BPP=m
|
||||
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
|
|
@ -0,0 +1,513 @@
|
|||
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_PC is not set
|
||||
CONFIG_X86_GENERICARCH=y
|
||||
CONFIG_X86_EXTENDED_PLATFORM=y
|
||||
CONFIG_X86_32_NON_STANDARD=y
|
||||
|
||||
# CONFIG_X86_ELAN is not set
|
||||
# CONFIG_X86_VOYAGER 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_MWINCHIP2 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_CMPXCHG=y
|
||||
CONFIG_X86_L1_CACHE_SHIFT=7
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_X86_PPRO_FENCE=y
|
||||
CONFIG_X86_WP_WORKS_OK=y
|
||||
CONFIG_X86_INVLPG=y
|
||||
CONFIG_X86_BSWAP=y
|
||||
CONFIG_X86_POPAD_OK=y
|
||||
CONFIG_X86_GOOD_APIC=y
|
||||
CONFIG_X86_INTEL_USERCOPY=y
|
||||
CONFIG_X86_USE_PPRO_CHECKSUM=y
|
||||
CONFIG_HPET=y
|
||||
CONFIG_HPET_TIMER=y
|
||||
# CONFIG_HPET_RTC_IRQ is not set
|
||||
# CONFIG_HPET_MMAP is not set
|
||||
CONFIG_X86_LOCAL_APIC=y
|
||||
CONFIG_X86_IO_APIC=y
|
||||
CONFIG_X86_TSC=y
|
||||
CONFIG_X86_MCE=y
|
||||
# CONFIG_X86_MCE_NONFATAL is not set
|
||||
CONFIG_X86_MCE_P4THERMAL=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_X86_CPU_DEBUG is not set
|
||||
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
|
||||
|
||||
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_EXT_ADAPTEC_DMA64=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
|
||||
# CONFIG_APM_REAL_MODE_POWER_OFF is not set
|
||||
|
||||
#
|
||||
# Kernel debugging
|
||||
#
|
||||
CONFIG_X86_FIND_SMP_CONFIG=y
|
||||
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_BAY=y
|
||||
CONFIG_ACPI_BLACKLIST_YEAR=1999
|
||||
CONFIG_ACPI_BUTTON=y
|
||||
CONFIG_ACPI_CONTAINER=m
|
||||
CONFIG_ACPI_DOCK=y
|
||||
CONFIG_ACPI_EC=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_SYSTEM=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_ACPI_CPUFREQ_PROC_INTF is not set
|
||||
# CONFIG_X86_POWERNOW_K6 is not set
|
||||
CONFIG_X86_POWERNOW_K7=y
|
||||
CONFIG_X86_POWERNOW_K8=m
|
||||
CONFIG_X86_POWERNOW_K8_ACPI=y
|
||||
# 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_SMP=y
|
||||
CONFIG_X86_HT=y
|
||||
CONFIG_X86_BIOS_REBOOT=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_I810=m
|
||||
CONFIG_I2C_ISCH=m
|
||||
CONFIG_I2C_NFORCE2=m
|
||||
CONFIG_I2C_NFORCE2_S4985=m
|
||||
CONFIG_I2C_PIIX4=m
|
||||
CONFIG_I2C_PROSAVAGE=m
|
||||
CONFIG_I2C_SAVAGE4=m
|
||||
CONFIG_I2C_SIS5595=m
|
||||
CONFIG_I2C_SIS630=m
|
||||
CONFIG_I2C_SIS96X=m
|
||||
|
||||
CONFIG_I2C_VIA=m
|
||||
CONFIG_I2C_VIAPRO=m
|
||||
CONFIG_I2C_VOODOO3=m
|
||||
|
||||
CONFIG_SCx200_ACB=m
|
||||
|
||||
# CONFIG_X86_REBOOTFIXUPS is not set
|
||||
|
||||
CONFIG_DELL_RBU=m
|
||||
CONFIG_DCDBAS=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_USB_HIDINPUT_POWERBOOK=y
|
||||
|
||||
# CONFIG_COMPAT_VDSO is not set
|
||||
|
||||
# CONFIG_SGI_IOC4 is not set
|
||||
|
||||
CONFIG_X86_PLATFORM_DEVICES=y
|
||||
CONFIG_ACERHDF=m
|
||||
CONFIG_ASUS_LAPTOP=m
|
||||
CONFIG_COMPAL_LAPTOP=m
|
||||
CONFIG_EEEPC_LAPTOP=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_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_KVM_TRACE=y
|
||||
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_BAY=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_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_OLD_MCE is not set
|
||||
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
|
|
@ -0,0 +1,414 @@
|
|||
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_X86_CPU_DEBUG is not set
|
||||
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_POWERNOW_K8_ACPI=y
|
||||
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_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_EXT_ADAPTEC_DMA64=y
|
||||
CONFIG_I2O_CONFIG_OLD_IOCTL=y
|
||||
CONFIG_I2O_BUS=m
|
||||
|
||||
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_ACPI_CPUFREQ=m
|
||||
# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set
|
||||
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_BAY=m
|
||||
CONFIG_ACPI_BLACKLIST_YEAR=0
|
||||
CONFIG_ACPI_BUTTON=y
|
||||
CONFIG_ACPI_CONTAINER=m
|
||||
CONFIG_ACPI_DOCK=y
|
||||
CONFIG_ACPI_EC=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_SYSTEM=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_ACERHDF=m
|
||||
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_DELL_LAPTOP=m
|
||||
CONFIG_ACPI_WMI=m
|
||||
CONFIG_ACER_WMI=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_BAY=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_HPET_RTC_IRQ 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
|
||||
CONFIG_CRYPTO_AES_NI_INTEL=m
|
||||
|
||||
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_I810 is not set
|
||||
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_USB_HIDINPUT_POWERBOOK=y
|
||||
|
||||
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||
CONFIG_DEBUG_NMI_TIMEOUT=5
|
||||
|
||||
# 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_CC_STACKPROTECTOR_ALL is not set
|
||||
|
||||
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_KVM_TRACE=y
|
||||
|
||||
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_MEMTEST_BOOTPARAM=y
|
||||
CONFIG_MEMTEST_BOOTPARAM_VALUE=0
|
||||
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_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_NUMA_MIGRATE_IRQ_DESC=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
|
|
@ -0,0 +1,9 @@
|
|||
diff --git a/arch/x86/crypto/aesni-intel_glue.c b/arch/x86/crypto/aesni-intel_glue.c
|
||||
index 49c552c..ae88694 100644
|
||||
--- a/arch/x86/crypto/aesni-intel_glue.c
|
||||
+++ b/arch/x86/crypto/aesni-intel_glue.c
|
||||
@@ -720,4 +720,3 @@ module_exit(aesni_exit);
|
||||
|
||||
MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm, Intel AES-NI instructions optimized");
|
||||
MODULE_LICENSE("GPL");
|
||||
-MODULE_ALIAS("aes");
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,18 @@
|
|||
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.
|
||||
|
||||
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
|
||||
index 91b7530..2ea84a6 100644
|
||||
--- a/drivers/block/floppy.c
|
||||
+++ b/drivers/block/floppy.c
|
||||
@@ -4631,7 +4631,7 @@ static const struct pnp_device_id floppy_pnpids[] = {
|
||||
{ "PNP0700", 0 },
|
||||
{ }
|
||||
};
|
||||
-MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
|
||||
+/* MODULE_DEVICE_TABLE(pnp, floppy_pnpids); */
|
||||
|
||||
#else
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
From d01268ff135052cd40c375c6b7ebadbee3281b4d Mon Sep 17 00:00:00 2001
|
||||
From: Bastien Nocera <hadess@hadess.net>
|
||||
Date: Wed, 20 Jan 2010 18:23:13 +0000
|
||||
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 b54aee7..5e1e59c 100644
|
||||
--- a/drivers/input/serio/i8042.c
|
||||
+++ b/drivers/input/serio/i8042.c
|
||||
@@ -1446,12 +1446,34 @@ 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)
|
||||
{
|
||||
int err;
|
||||
|
||||
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,29 @@
|
|||
From 65a1d7cab62b4f514eaaf608b2f16e26a0e48042 Mon Sep 17 00:00:00 2001
|
||||
From: Adam Jackson <ajax@redhat.com>
|
||||
Date: Thu, 13 May 2010 14:55:28 -0400
|
||||
Subject: [PATCH] drm/edid: Fix 1024x768@85Hz
|
||||
|
||||
Having hsync both start and end on pixel 1072 ain't gonna work very
|
||||
well. Matches the X server's list.
|
||||
|
||||
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
||||
---
|
||||
drivers/gpu/drm/drm_edid.c | 2 +-
|
||||
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
|
||||
index 18f41d7..10348d3 100644
|
||||
--- a/drivers/gpu/drm/drm_edid.c
|
||||
+++ b/drivers/gpu/drm/drm_edid.c
|
||||
@@ -335,7 +335,7 @@ static struct drm_display_mode drm_dmt_modes[] = {
|
||||
DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
/* 1024x768@85Hz */
|
||||
{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 94500, 1024, 1072,
|
||||
- 1072, 1376, 0, 768, 769, 772, 808, 0,
|
||||
+ 1168, 1376, 0, 768, 769, 772, 808, 0,
|
||||
DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
/* 1152x864@75Hz */
|
||||
{ DRM_MODE("1152x864", DRM_MODE_TYPE_DRIVER, 108000, 1152, 1216,
|
||||
--
|
||||
1.7.0.1
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
diff -up linux-2.6.30.noarch/drivers/gpu/drm/drm_crtc_helper.c.jx linux-2.6.30.noarch/drivers/gpu/drm/drm_crtc_helper.c
|
||||
--- linux-2.6.30.noarch/drivers/gpu/drm/drm_crtc_helper.c.jx 2009-09-09 08:57:39.000000000 -0400
|
||||
+++ linux-2.6.30.noarch/drivers/gpu/drm/drm_crtc_helper.c 2009-09-09 09:35:24.000000000 -0400
|
||||
@@ -92,6 +92,18 @@ int drm_helper_probe_single_connector_mo
|
||||
|
||||
connector->status = connector->funcs->detect(connector);
|
||||
|
||||
+ /* fast path if the driver tracks disconnection */
|
||||
+ if (connector->status == connector_status_cached) {
|
||||
+ DRM_DEBUG_KMS("%s still connected\n",
|
||||
+ drm_get_connector_name(connector));
|
||||
+ list_for_each_entry_safe(mode, t, &connector->modes, head) {
|
||||
+ count++;
|
||||
+ mode->status = MODE_OK;
|
||||
+ }
|
||||
+ connector->status = connector_status_connected;
|
||||
+ return count;
|
||||
+ }
|
||||
+
|
||||
if (connector->status == connector_status_disconnected) {
|
||||
DRM_DEBUG_KMS("%s is disconnected\n",
|
||||
drm_get_connector_name(connector));
|
||||
diff -up linux-2.6.30.noarch/drivers/gpu/drm/i915/intel_lvds.c.jx linux-2.6.30.noarch/drivers/gpu/drm/i915/intel_lvds.c
|
||||
--- linux-2.6.30.noarch/drivers/gpu/drm/i915/intel_lvds.c.jx 2009-09-09 08:57:39.000000000 -0400
|
||||
+++ linux-2.6.30.noarch/drivers/gpu/drm/i915/intel_lvds.c 2009-09-09 09:56:18.000000000 -0400
|
||||
@@ -593,7 +593,14 @@ static void intel_lvds_mode_set(struct d
|
||||
*/
|
||||
static enum drm_connector_status intel_lvds_detect(struct drm_connector *connector)
|
||||
{
|
||||
- return connector_status_connected;
|
||||
+ static int done;
|
||||
+
|
||||
+ if (!done) {
|
||||
+ done = 1;
|
||||
+ return connector_status_connected;
|
||||
+ } else {
|
||||
+ return connector_status_cached;
|
||||
+ }
|
||||
}
|
||||
|
||||
/**
|
||||
diff -up linux-2.6.30.noarch/include/drm/drm_crtc.h.jx linux-2.6.30.noarch/include/drm/drm_crtc.h
|
||||
--- linux-2.6.30.noarch/include/drm/drm_crtc.h.jx 2009-09-09 08:57:39.000000000 -0400
|
||||
+++ linux-2.6.30.noarch/include/drm/drm_crtc.h 2009-09-09 09:35:24.000000000 -0400
|
||||
@@ -172,6 +172,7 @@ enum drm_connector_status {
|
||||
connector_status_connected = 1,
|
||||
connector_status_disconnected = 2,
|
||||
connector_status_unknown = 3,
|
||||
+ connector_status_cached = 4,
|
||||
};
|
||||
|
||||
enum subpixel_order {
|
||||
diff -up linux-2.6.30.x86_64/drivers/gpu/drm/drm_crtc.c.jx linux-2.6.30.x86_64/drivers/gpu/drm/drm_crtc.c
|
||||
--- linux-2.6.30.x86_64/drivers/gpu/drm/drm_crtc.c.jx 2009-09-09 10:10:44.000000000 -0400
|
||||
+++ linux-2.6.30.x86_64/drivers/gpu/drm/drm_crtc.c 2009-09-09 11:23:14.000000000 -0400
|
||||
@@ -185,7 +185,8 @@ EXPORT_SYMBOL(drm_get_connector_name);
|
||||
|
||||
char *drm_get_connector_status_name(enum drm_connector_status status)
|
||||
{
|
||||
- if (status == connector_status_connected)
|
||||
+ if (status == connector_status_connected ||
|
||||
+ status == connector_status_cached)
|
||||
return "connected";
|
||||
else if (status == connector_status_disconnected)
|
||||
return "disconnected";
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,34 @@
|
|||
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-28 09:50:36.000000000 +1000
|
||||
+++ linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_dp.c 2010-06-28 09:53:24.000000000 +1000
|
||||
@@ -135,6 +135,12 @@ intel_dp_link_required(struct drm_device
|
||||
}
|
||||
|
||||
static int
|
||||
+intel_dp_max_data_rate(int max_link_clock, int max_lanes)
|
||||
+{
|
||||
+ return (max_link_clock * max_lanes * 8) / 10;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
intel_dp_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
@@ -144,7 +150,7 @@ intel_dp_mode_valid(struct drm_connector
|
||||
int max_lanes = intel_dp_max_lane_count(intel_encoder);
|
||||
|
||||
if (intel_dp_link_required(connector->dev, intel_encoder, mode->clock)
|
||||
- > max_link_clock * max_lanes)
|
||||
+ > intel_dp_max_data_rate(max_link_clock, max_lanes))
|
||||
return MODE_CLOCK_HIGH;
|
||||
|
||||
if (mode->clock < 10000)
|
||||
@@ -505,7 +511,7 @@ intel_dp_mode_fixup(struct drm_encoder *
|
||||
|
||||
for (lane_count = 1; lane_count <= max_lane_count; lane_count <<= 1) {
|
||||
for (clock = 0; clock <= max_clock; clock++) {
|
||||
- int link_avail = intel_dp_link_clock(bws[clock]) * lane_count;
|
||||
+ int link_avail = intel_dp_max_data_rate(intel_dp_link_clock(bws[clock]), lane_count);
|
||||
|
||||
if (intel_dp_link_required(encoder->dev, intel_encoder, mode->clock)
|
||||
<= link_avail) {
|
|
@ -0,0 +1,43 @@
|
|||
From 1918ad77f7f908ed67cf37c505c6ad4ac52f1ecf Mon Sep 17 00:00:00 2001
|
||||
From: Jesse Barnes <jbarnes@virtuousgeek.org>
|
||||
Date: Fri, 23 Apr 2010 09:32:23 -0700
|
||||
Subject: drm/i915: fix non-Ironlake 965 class crashes
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
From: Jesse Barnes <jbarnes@virtuousgeek.org>
|
||||
|
||||
commit 1918ad77f7f908ed67cf37c505c6ad4ac52f1ecf upstream.
|
||||
|
||||
My PIPE_CONTROL fix (just sent via Eric's tree) was buggy; I was
|
||||
testing a whole set of patches together and missed a conversion to the
|
||||
new HAS_PIPE_CONTROL macro, which will cause breakage on non-Ironlake
|
||||
965 class chips. Fortunately, the fix is trivial and has been tested.
|
||||
|
||||
Be sure to use the HAS_PIPE_CONTROL macro in i915_get_gem_seqno, or
|
||||
we'll end up reading the wrong graphics memory, likely causing hangs,
|
||||
crashes, or worse.
|
||||
|
||||
Reported-by: Zdenek Kabelac <zdenek.kabelac@gmail.com>
|
||||
Reported-by: Toralf Förster <toralf.foerster@gmx.de>
|
||||
Tested-by: Toralf Förster <toralf.foerster@gmx.de>
|
||||
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
|
||||
---
|
||||
drivers/gpu/drm/i915/i915_gem.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/gpu/drm/i915/i915_gem.c
|
||||
+++ b/drivers/gpu/drm/i915/i915_gem.c
|
||||
@@ -1785,7 +1785,7 @@ i915_get_gem_seqno(struct drm_device *de
|
||||
{
|
||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||
|
||||
- if (IS_I965G(dev))
|
||||
+ if (HAS_PIPE_CONTROL(dev))
|
||||
return ((volatile u32 *)(dev_priv->seqno_page))[0];
|
||||
else
|
||||
return READ_HWSP(dev_priv, I915_GEM_HWS_INDEX);
|
|
@ -0,0 +1,333 @@
|
|||
From e552eb7038a36d9b18860f525aa02875e313fe16 Mon Sep 17 00:00:00 2001
|
||||
From: Jesse Barnes <jbarnes@virtuousgeek.org>
|
||||
Date: Wed, 21 Apr 2010 11:39:23 -0700
|
||||
Subject: drm/i915: use PIPE_CONTROL instruction on Ironlake and Sandy Bridge
|
||||
|
||||
From: Jesse Barnes <jbarnes@virtuousgeek.org>
|
||||
|
||||
commit e552eb7038a36d9b18860f525aa02875e313fe16 upstream.
|
||||
|
||||
Since 965, the hardware has supported the PIPE_CONTROL command, which
|
||||
provides fine grained GPU cache flushing control. On recent chipsets,
|
||||
this instruction is required for reliable interrupt and sequence number
|
||||
reporting in the driver.
|
||||
|
||||
So add support for this instruction, including workarounds, on Ironlake
|
||||
and Sandy Bridge hardware.
|
||||
|
||||
https://bugs.freedesktop.org/show_bug.cgi?id=27108
|
||||
|
||||
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
|
||||
Tested-by: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
|
||||
---
|
||||
drivers/gpu/drm/i915/i915_drv.h | 4 +
|
||||
drivers/gpu/drm/i915/i915_gem.c | 145 ++++++++++++++++++++++++++++++++++++----
|
||||
drivers/gpu/drm/i915/i915_irq.c | 8 +-
|
||||
drivers/gpu/drm/i915/i915_reg.h | 11 +++
|
||||
4 files changed, 152 insertions(+), 16 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/i915/i915_drv.h
|
||||
+++ b/drivers/gpu/drm/i915/i915_drv.h
|
||||
@@ -206,11 +206,14 @@ typedef struct drm_i915_private {
|
||||
|
||||
drm_dma_handle_t *status_page_dmah;
|
||||
void *hw_status_page;
|
||||
+ void *seqno_page;
|
||||
dma_addr_t dma_status_page;
|
||||
uint32_t counter;
|
||||
unsigned int status_gfx_addr;
|
||||
+ unsigned int seqno_gfx_addr;
|
||||
drm_local_map_t hws_map;
|
||||
struct drm_gem_object *hws_obj;
|
||||
+ struct drm_gem_object *seqno_obj;
|
||||
struct drm_gem_object *pwrctx;
|
||||
|
||||
struct resource mch_res;
|
||||
@@ -1090,6 +1093,7 @@ extern int i915_wait_ring(struct drm_dev
|
||||
|
||||
#define INTEL_PCH_TYPE(dev) (((struct drm_i915_private *)(dev)->dev_private)->pch_type)
|
||||
#define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT)
|
||||
+#define HAS_PIPE_CONTROL(dev) (IS_IRONLAKE(dev) || IS_GEN6(dev))
|
||||
|
||||
#define PRIMARY_RINGBUFFER_SIZE (128*1024)
|
||||
|
||||
--- a/drivers/gpu/drm/i915/i915_gem.c
|
||||
+++ b/drivers/gpu/drm/i915/i915_gem.c
|
||||
@@ -1559,6 +1559,13 @@ i915_gem_object_move_to_inactive(struct
|
||||
i915_verify_inactive(dev, __FILE__, __LINE__);
|
||||
}
|
||||
|
||||
+#define PIPE_CONTROL_FLUSH(addr) \
|
||||
+ OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE | \
|
||||
+ PIPE_CONTROL_DEPTH_STALL); \
|
||||
+ OUT_RING(addr | PIPE_CONTROL_GLOBAL_GTT); \
|
||||
+ OUT_RING(0); \
|
||||
+ OUT_RING(0); \
|
||||
+
|
||||
/**
|
||||
* Creates a new sequence number, emitting a write of it to the status page
|
||||
* plus an interrupt, which will trigger i915_user_interrupt_handler.
|
||||
@@ -1593,13 +1600,47 @@ i915_add_request(struct drm_device *dev,
|
||||
if (dev_priv->mm.next_gem_seqno == 0)
|
||||
dev_priv->mm.next_gem_seqno++;
|
||||
|
||||
- BEGIN_LP_RING(4);
|
||||
- OUT_RING(MI_STORE_DWORD_INDEX);
|
||||
- OUT_RING(I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
|
||||
- OUT_RING(seqno);
|
||||
+ if (HAS_PIPE_CONTROL(dev)) {
|
||||
+ u32 scratch_addr = dev_priv->seqno_gfx_addr + 128;
|
||||
|
||||
- OUT_RING(MI_USER_INTERRUPT);
|
||||
- ADVANCE_LP_RING();
|
||||
+ /*
|
||||
+ * Workaround qword write incoherence by flushing the
|
||||
+ * PIPE_NOTIFY buffers out to memory before requesting
|
||||
+ * an interrupt.
|
||||
+ */
|
||||
+ BEGIN_LP_RING(32);
|
||||
+ OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE |
|
||||
+ PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_TC_FLUSH);
|
||||
+ OUT_RING(dev_priv->seqno_gfx_addr | PIPE_CONTROL_GLOBAL_GTT);
|
||||
+ OUT_RING(seqno);
|
||||
+ OUT_RING(0);
|
||||
+ PIPE_CONTROL_FLUSH(scratch_addr);
|
||||
+ scratch_addr += 128; /* write to separate cachelines */
|
||||
+ PIPE_CONTROL_FLUSH(scratch_addr);
|
||||
+ scratch_addr += 128;
|
||||
+ PIPE_CONTROL_FLUSH(scratch_addr);
|
||||
+ scratch_addr += 128;
|
||||
+ PIPE_CONTROL_FLUSH(scratch_addr);
|
||||
+ scratch_addr += 128;
|
||||
+ PIPE_CONTROL_FLUSH(scratch_addr);
|
||||
+ scratch_addr += 128;
|
||||
+ PIPE_CONTROL_FLUSH(scratch_addr);
|
||||
+ OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE |
|
||||
+ PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_TC_FLUSH |
|
||||
+ PIPE_CONTROL_NOTIFY);
|
||||
+ OUT_RING(dev_priv->seqno_gfx_addr | PIPE_CONTROL_GLOBAL_GTT);
|
||||
+ OUT_RING(seqno);
|
||||
+ OUT_RING(0);
|
||||
+ ADVANCE_LP_RING();
|
||||
+ } else {
|
||||
+ BEGIN_LP_RING(4);
|
||||
+ OUT_RING(MI_STORE_DWORD_INDEX);
|
||||
+ OUT_RING(I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
|
||||
+ OUT_RING(seqno);
|
||||
+
|
||||
+ OUT_RING(MI_USER_INTERRUPT);
|
||||
+ ADVANCE_LP_RING();
|
||||
+ }
|
||||
|
||||
DRM_DEBUG_DRIVER("%d\n", seqno);
|
||||
|
||||
@@ -1744,7 +1785,10 @@ i915_get_gem_seqno(struct drm_device *de
|
||||
{
|
||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||
|
||||
- return READ_HWSP(dev_priv, I915_GEM_HWS_INDEX);
|
||||
+ if (IS_I965G(dev))
|
||||
+ return ((volatile u32 *)(dev_priv->seqno_page))[0];
|
||||
+ else
|
||||
+ return READ_HWSP(dev_priv, I915_GEM_HWS_INDEX);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -4576,6 +4620,49 @@ i915_gem_idle(struct drm_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * 965+ support PIPE_CONTROL commands, which provide finer grained control
|
||||
+ * over cache flushing.
|
||||
+ */
|
||||
+static int
|
||||
+i915_gem_init_pipe_control(struct drm_device *dev)
|
||||
+{
|
||||
+ drm_i915_private_t *dev_priv = dev->dev_private;
|
||||
+ struct drm_gem_object *obj;
|
||||
+ struct drm_i915_gem_object *obj_priv;
|
||||
+ int ret;
|
||||
+
|
||||
+ obj = drm_gem_object_alloc(dev, 4096);
|
||||
+ if (obj == NULL) {
|
||||
+ DRM_ERROR("Failed to allocate seqno page\n");
|
||||
+ ret = -ENOMEM;
|
||||
+ goto err;
|
||||
+ }
|
||||
+ obj_priv = obj->driver_private;
|
||||
+ obj_priv->agp_type = AGP_USER_CACHED_MEMORY;
|
||||
+
|
||||
+ ret = i915_gem_object_pin(obj, 4096);
|
||||
+ if (ret)
|
||||
+ goto err_unref;
|
||||
+
|
||||
+ dev_priv->seqno_gfx_addr = obj_priv->gtt_offset;
|
||||
+ dev_priv->seqno_page = kmap(obj_priv->pages[0]);
|
||||
+ if (dev_priv->seqno_page == NULL)
|
||||
+ goto err_unpin;
|
||||
+
|
||||
+ dev_priv->seqno_obj = obj;
|
||||
+ memset(dev_priv->seqno_page, 0, PAGE_SIZE);
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+err_unpin:
|
||||
+ i915_gem_object_unpin(obj);
|
||||
+err_unref:
|
||||
+ drm_gem_object_unreference(obj);
|
||||
+err:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static int
|
||||
i915_gem_init_hws(struct drm_device *dev)
|
||||
{
|
||||
@@ -4593,7 +4680,8 @@ i915_gem_init_hws(struct drm_device *dev
|
||||
obj = drm_gem_object_alloc(dev, 4096);
|
||||
if (obj == NULL) {
|
||||
DRM_ERROR("Failed to allocate status page\n");
|
||||
- return -ENOMEM;
|
||||
+ ret = -ENOMEM;
|
||||
+ goto err;
|
||||
}
|
||||
obj_priv = to_intel_bo(obj);
|
||||
obj_priv->agp_type = AGP_USER_CACHED_MEMORY;
|
||||
@@ -4601,7 +4689,7 @@ i915_gem_init_hws(struct drm_device *dev
|
||||
ret = i915_gem_object_pin(obj, 4096);
|
||||
if (ret != 0) {
|
||||
drm_gem_object_unreference(obj);
|
||||
- return ret;
|
||||
+ goto err_unref;
|
||||
}
|
||||
|
||||
dev_priv->status_gfx_addr = obj_priv->gtt_offset;
|
||||
@@ -4610,10 +4698,16 @@ i915_gem_init_hws(struct drm_device *dev
|
||||
if (dev_priv->hw_status_page == NULL) {
|
||||
DRM_ERROR("Failed to map status page.\n");
|
||||
memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
|
||||
- i915_gem_object_unpin(obj);
|
||||
- drm_gem_object_unreference(obj);
|
||||
- return -EINVAL;
|
||||
+ ret = -EINVAL;
|
||||
+ goto err_unpin;
|
||||
}
|
||||
+
|
||||
+ if (HAS_PIPE_CONTROL(dev)) {
|
||||
+ ret = i915_gem_init_pipe_control(dev);
|
||||
+ if (ret)
|
||||
+ goto err_unpin;
|
||||
+ }
|
||||
+
|
||||
dev_priv->hws_obj = obj;
|
||||
memset(dev_priv->hw_status_page, 0, PAGE_SIZE);
|
||||
I915_WRITE(HWS_PGA, dev_priv->status_gfx_addr);
|
||||
@@ -4621,6 +4715,30 @@ i915_gem_init_hws(struct drm_device *dev
|
||||
DRM_DEBUG_DRIVER("hws offset: 0x%08x\n", dev_priv->status_gfx_addr);
|
||||
|
||||
return 0;
|
||||
+
|
||||
+err_unpin:
|
||||
+ i915_gem_object_unpin(obj);
|
||||
+err_unref:
|
||||
+ drm_gem_object_unreference(obj);
|
||||
+err:
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+i915_gem_cleanup_pipe_control(struct drm_device *dev)
|
||||
+{
|
||||
+ drm_i915_private_t *dev_priv = dev->dev_private;
|
||||
+ struct drm_gem_object *obj;
|
||||
+ struct drm_i915_gem_object *obj_priv;
|
||||
+
|
||||
+ obj = dev_priv->seqno_obj;
|
||||
+ obj_priv = obj->driver_private;
|
||||
+ kunmap(obj_priv->pages[0]);
|
||||
+ i915_gem_object_unpin(obj);
|
||||
+ drm_gem_object_unreference(obj);
|
||||
+ dev_priv->seqno_obj = NULL;
|
||||
+
|
||||
+ dev_priv->seqno_page = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -4644,6 +4762,9 @@ i915_gem_cleanup_hws(struct drm_device *
|
||||
memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
|
||||
dev_priv->hw_status_page = NULL;
|
||||
|
||||
+ if (HAS_PIPE_CONTROL(dev))
|
||||
+ i915_gem_cleanup_pipe_control(dev);
|
||||
+
|
||||
/* Write high address into HWS_PGA when disabling. */
|
||||
I915_WRITE(HWS_PGA, 0x1ffff000);
|
||||
}
|
||||
--- a/drivers/gpu/drm/i915/i915_irq.c
|
||||
+++ b/drivers/gpu/drm/i915/i915_irq.c
|
||||
@@ -297,7 +297,7 @@ irqreturn_t ironlake_irq_handler(struct
|
||||
READ_BREADCRUMB(dev_priv);
|
||||
}
|
||||
|
||||
- if (gt_iir & GT_USER_INTERRUPT) {
|
||||
+ if (gt_iir & GT_PIPE_NOTIFY) {
|
||||
u32 seqno = i915_get_gem_seqno(dev);
|
||||
dev_priv->mm.irq_gem_seqno = seqno;
|
||||
trace_i915_gem_request_complete(dev, seqno);
|
||||
@@ -738,7 +738,7 @@ void i915_user_irq_get(struct drm_device
|
||||
spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags);
|
||||
if (dev->irq_enabled && (++dev_priv->user_irq_refcount == 1)) {
|
||||
if (HAS_PCH_SPLIT(dev))
|
||||
- ironlake_enable_graphics_irq(dev_priv, GT_USER_INTERRUPT);
|
||||
+ ironlake_enable_graphics_irq(dev_priv, GT_PIPE_NOTIFY);
|
||||
else
|
||||
i915_enable_irq(dev_priv, I915_USER_INTERRUPT);
|
||||
}
|
||||
@@ -754,7 +754,7 @@ void i915_user_irq_put(struct drm_device
|
||||
BUG_ON(dev->irq_enabled && dev_priv->user_irq_refcount <= 0);
|
||||
if (dev->irq_enabled && (--dev_priv->user_irq_refcount == 0)) {
|
||||
if (HAS_PCH_SPLIT(dev))
|
||||
- ironlake_disable_graphics_irq(dev_priv, GT_USER_INTERRUPT);
|
||||
+ ironlake_disable_graphics_irq(dev_priv, GT_PIPE_NOTIFY);
|
||||
else
|
||||
i915_disable_irq(dev_priv, I915_USER_INTERRUPT);
|
||||
}
|
||||
@@ -1034,7 +1034,7 @@ static int ironlake_irq_postinstall(stru
|
||||
/* enable kind of interrupts always enabled */
|
||||
u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT |
|
||||
DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE;
|
||||
- u32 render_mask = GT_USER_INTERRUPT;
|
||||
+ u32 render_mask = GT_PIPE_NOTIFY;
|
||||
u32 hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG |
|
||||
SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG;
|
||||
|
||||
--- a/drivers/gpu/drm/i915/i915_reg.h
|
||||
+++ b/drivers/gpu/drm/i915/i915_reg.h
|
||||
@@ -210,6 +210,16 @@
|
||||
#define ASYNC_FLIP (1<<22)
|
||||
#define DISPLAY_PLANE_A (0<<20)
|
||||
#define DISPLAY_PLANE_B (1<<20)
|
||||
+#define GFX_OP_PIPE_CONTROL ((0x3<<29)|(0x3<<27)|(0x2<<24)|2)
|
||||
+#define PIPE_CONTROL_QW_WRITE (1<<14)
|
||||
+#define PIPE_CONTROL_DEPTH_STALL (1<<13)
|
||||
+#define PIPE_CONTROL_WC_FLUSH (1<<12)
|
||||
+#define PIPE_CONTROL_IS_FLUSH (1<<11) /* MBZ on Ironlake */
|
||||
+#define PIPE_CONTROL_TC_FLUSH (1<<10) /* GM45+ only */
|
||||
+#define PIPE_CONTROL_ISP_DIS (1<<9)
|
||||
+#define PIPE_CONTROL_NOTIFY (1<<8)
|
||||
+#define PIPE_CONTROL_GLOBAL_GTT (1<<2) /* in addr dword */
|
||||
+#define PIPE_CONTROL_STALL_EN (1<<1) /* in addr word, Ironlake+ only */
|
||||
|
||||
/*
|
||||
* Fence registers
|
||||
@@ -2111,6 +2121,7 @@
|
||||
#define DEIER 0x4400c
|
||||
|
||||
/* GT interrupt */
|
||||
+#define GT_PIPE_NOTIFY (1 << 4)
|
||||
#define GT_SYNC_STATUS (1 << 2)
|
||||
#define GT_USER_INTERRUPT (1 << 0)
|
||||
|
|
@ -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,57 @@
|
|||
From b44ee8a479c3adb22b818b8b6aff29c6a08c1cb1 Mon Sep 17 00:00:00 2001
|
||||
From: Adam Jackson <ajax@redhat.com>
|
||||
Date: Mon, 19 Apr 2010 15:52:32 -0400
|
||||
Subject: [PATCH] drm/i915: Use spatio-temporal dithering on PCH
|
||||
|
||||
Spatial dither is better than nothing, but ST is even better.
|
||||
|
||||
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
||||
---
|
||||
drivers/gpu/drm/i915/i915_reg.h | 5 ++++-
|
||||
drivers/gpu/drm/i915/intel_display.c | 10 ++++++----
|
||||
2 files changed, 10 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
|
||||
index 527d30a..0bbbb77 100644
|
||||
--- a/drivers/gpu/drm/i915/i915_reg.h
|
||||
+++ b/drivers/gpu/drm/i915/i915_reg.h
|
||||
@@ -1922,7 +1922,10 @@
|
||||
/* Display & cursor control */
|
||||
|
||||
/* dithering flag on Ironlake */
|
||||
-#define PIPE_ENABLE_DITHER (1 << 4)
|
||||
+#define PIPE_ENABLE_DITHER (1 << 4)
|
||||
+#define PIPE_DITHER_TYPE_MASK (3 << 2)
|
||||
+#define PIPE_DITHER_TYPE_SPATIAL (0 << 2)
|
||||
+#define PIPE_DITHER_TYPE_ST01 (1 << 2)
|
||||
/* Pipe A */
|
||||
#define PIPEADSL 0x70000
|
||||
#define PIPEACONF 0x70008
|
||||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
|
||||
index 58668c4..36ead0e 100644
|
||||
--- a/drivers/gpu/drm/i915/intel_display.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_display.c
|
||||
@@ -3676,14 +3676,16 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
|
||||
/* set the dithering flag */
|
||||
if (IS_I965G(dev)) {
|
||||
if (dev_priv->lvds_dither) {
|
||||
- if (HAS_PCH_SPLIT(dev))
|
||||
+ if (HAS_PCH_SPLIT(dev)) {
|
||||
pipeconf |= PIPE_ENABLE_DITHER;
|
||||
- else
|
||||
+ pipeconf |= PIPE_DITHER_TYPE_ST01;
|
||||
+ } else
|
||||
lvds |= LVDS_ENABLE_DITHER;
|
||||
} else {
|
||||
- if (HAS_PCH_SPLIT(dev))
|
||||
+ if (HAS_PCH_SPLIT(dev)) {
|
||||
pipeconf &= ~PIPE_ENABLE_DITHER;
|
||||
- else
|
||||
+ pipeconf &= ~PIPE_DITHER_TYPE_MASK;
|
||||
+ } else
|
||||
lvds &= ~LVDS_ENABLE_DITHER;
|
||||
}
|
||||
}
|
||||
--
|
||||
1.7.0.1
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
diff -up linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_display.c.jx linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_display.c
|
||||
--- linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_display.c.jx 2010-04-19 17:13:31.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_display.c 2010-04-19 17:13:59.753994103 -0400
|
||||
@@ -4141,7 +4141,6 @@ void intel_release_load_detect_pipe(stru
|
||||
struct drm_connector *connector, 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;
|
||||
@@ -4151,7 +4150,6 @@ void intel_release_load_detect_pipe(stru
|
||||
connector->encoder = NULL;
|
||||
intel_encoder->load_detect_temp = false;
|
||||
crtc->enabled = drm_helper_crtc_in_use(crtc);
|
||||
- drm_helper_disable_unused_functions(dev);
|
||||
}
|
||||
|
||||
/* Switch crtc and encoder back off if necessary */
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,107 @@
|
|||
From 4fd1c5ed73fc02d8bcabcb3a457c4c4efaef2099 Mon Sep 17 00:00:00 2001
|
||||
From: Adam Jackson <ajax@redhat.com>
|
||||
Date: Thu, 29 Apr 2010 14:05:18 -0400
|
||||
Subject: [PATCH] drm/i915: Be extra careful about A/D matching for multifunction SDVO
|
||||
|
||||
If we're both RGB and TMDS capable, we'll have set up one connector for
|
||||
each. When determining connectivity, require analog/digital state in
|
||||
the EDID block to match analog/digital support in the connector.
|
||||
Otherwise, both DVI and VGA will appear to be connected.
|
||||
|
||||
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
||||
---
|
||||
drivers/gpu/drm/i915/intel_sdvo.c | 45 +++++++++++++++++-------------------
|
||||
1 files changed, 21 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
|
||||
index f55c0d7..31ce975 100644
|
||||
--- a/drivers/gpu/drm/i915/intel_sdvo.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
|
||||
@@ -1503,16 +1503,17 @@ intel_analog_is_connected(struct drm_device *dev)
|
||||
}
|
||||
|
||||
enum drm_connector_status
|
||||
-intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response)
|
||||
+intel_sdvo_hdmi_sink_detect(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
||||
+ struct intel_connector *intel_connector = to_intel_connector(connector);
|
||||
+ struct intel_sdvo_connector *sdvo_connector = intel_connector->dev_priv;
|
||||
enum drm_connector_status status = connector_status_connected;
|
||||
struct edid *edid = NULL;
|
||||
|
||||
- edid = drm_get_edid(connector,
|
||||
- intel_encoder->ddc_bus);
|
||||
+ edid = drm_get_edid(connector, intel_encoder->ddc_bus);
|
||||
|
||||
/* This is only applied to SDVO cards with multiple outputs */
|
||||
if (edid == NULL && intel_sdvo_multifunc_encoder(intel_encoder)) {
|
||||
@@ -1525,8 +1526,7 @@ intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response)
|
||||
*/
|
||||
while(temp_ddc > 1) {
|
||||
sdvo_priv->ddc_bus = temp_ddc;
|
||||
- edid = drm_get_edid(connector,
|
||||
- intel_encoder->ddc_bus);
|
||||
+ edid = drm_get_edid(connector, intel_encoder->ddc_bus);
|
||||
if (edid) {
|
||||
/*
|
||||
* When we can get the EDID, maybe it is the
|
||||
@@ -1543,28 +1543,25 @@ intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response)
|
||||
/* when there is no edid and no monitor is connected with VGA
|
||||
* port, try to use the CRT ddc to read the EDID for DVI-connector
|
||||
*/
|
||||
- if (edid == NULL &&
|
||||
- sdvo_priv->analog_ddc_bus &&
|
||||
+ if (edid == NULL && sdvo_priv->analog_ddc_bus &&
|
||||
!intel_analog_is_connected(connector->dev))
|
||||
- edid = drm_get_edid(connector,
|
||||
- sdvo_priv->analog_ddc_bus);
|
||||
+ edid = drm_get_edid(connector, sdvo_priv->analog_ddc_bus);
|
||||
+
|
||||
if (edid != NULL) {
|
||||
- /* Don't report the output as connected if it's a DVI-I
|
||||
- * connector with a non-digital EDID coming out.
|
||||
- */
|
||||
- if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) {
|
||||
- if (edid->input & DRM_EDID_INPUT_DIGITAL)
|
||||
- sdvo_priv->is_hdmi =
|
||||
- drm_detect_hdmi_monitor(edid);
|
||||
- else
|
||||
- status = connector_status_disconnected;
|
||||
- }
|
||||
+ bool is_digital = !!(edid->input & DRM_EDID_INPUT_DIGITAL);
|
||||
+ bool need_digital = !!(sdvo_connector->output_flag & SDVO_TMDS_MASK);
|
||||
|
||||
- kfree(edid);
|
||||
- connector->display_info.raw_edid = NULL;
|
||||
+ /* DDC bus is shared, match EDID to connector type */
|
||||
+ if (is_digital && need_digital)
|
||||
+ sdvo_priv->is_hdmi = drm_detect_hdmi_monitor(edid);
|
||||
+ else if (is_digital != need_digital)
|
||||
+ status = connector_status_disconnected;
|
||||
|
||||
- } else if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1))
|
||||
+ connector->display_info.raw_edid = NULL;
|
||||
+ } else
|
||||
status = connector_status_disconnected;
|
||||
+
|
||||
+ kfree(edid);
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -1600,8 +1597,8 @@ static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connect
|
||||
|
||||
if ((sdvo_connector->output_flag & response) == 0)
|
||||
ret = connector_status_disconnected;
|
||||
- else if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1))
|
||||
- ret = intel_sdvo_hdmi_sink_detect(connector, response);
|
||||
+ else if (response & SDVO_TMDS_MASK)
|
||||
+ ret = intel_sdvo_hdmi_sink_detect(connector);
|
||||
else
|
||||
ret = connector_status_connected;
|
||||
|
||||
--
|
||||
1.7.0.1
|
||||
|
|
@ -0,0 +1,114 @@
|
|||
From ef59fcdd9d7fe818d36a0072c80770c0d1a3cc9c Mon Sep 17 00:00:00 2001
|
||||
From: Adam Jackson <ajax@redhat.com>
|
||||
Date: Fri, 23 Apr 2010 16:07:40 -0400
|
||||
Subject: [PATCH] drm/i915: Fix DDC bus selection for multifunction SDVO
|
||||
|
||||
Multifunction SDVO cards stopped working after 14571b4, and would report
|
||||
something that looked remarkably like an ADD2 SPD ROM instead of EDID.
|
||||
This appears to be because DDC bus selection was utterly horked by that
|
||||
commit; controlled_output was no longer always a single bit, so
|
||||
intel_sdvo_select_ddc_bus would pick bus 0, which is (unsurprisingly)
|
||||
the SPD ROM bus, not a DDC bus.
|
||||
|
||||
So, instead of that, let's just use the DDC bus the child device table
|
||||
tells us to use. I'm guessing at the bitmask and shifting from VBIOS
|
||||
dumps, but it can't possibly be worse.
|
||||
|
||||
cf. https://bugzilla.redhat.com/584229
|
||||
|
||||
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
||||
---
|
||||
drivers/gpu/drm/i915/i915_drv.h | 1 +
|
||||
drivers/gpu/drm/i915/intel_bios.c | 1 +
|
||||
drivers/gpu/drm/i915/intel_sdvo.c | 41 ++++++++----------------------------
|
||||
3 files changed, 11 insertions(+), 32 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
|
||||
index a43a4f5..5d609a8 100644
|
||||
--- a/drivers/gpu/drm/i915/i915_drv.h
|
||||
+++ b/drivers/gpu/drm/i915/i915_drv.h
|
||||
@@ -135,6 +135,7 @@ struct sdvo_device_mapping {
|
||||
u8 slave_addr;
|
||||
u8 dvo_wiring;
|
||||
u8 initialized;
|
||||
+ u8 ddc_pin;
|
||||
};
|
||||
|
||||
struct drm_i915_error_state {
|
||||
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
|
||||
index f9ba452..4c748d8 100644
|
||||
--- a/drivers/gpu/drm/i915/intel_bios.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_bios.c
|
||||
@@ -366,6 +366,7 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv,
|
||||
p_mapping->dvo_port = p_child->dvo_port;
|
||||
p_mapping->slave_addr = p_child->slave_addr;
|
||||
p_mapping->dvo_wiring = p_child->dvo_wiring;
|
||||
+ p_mapping->ddc_pin = p_child->ddc_pin;
|
||||
p_mapping->initialized = 1;
|
||||
} else {
|
||||
DRM_DEBUG_KMS("Maybe one SDVO port is shared by "
|
||||
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
|
||||
index df9f997..f55c0d7 100644
|
||||
--- a/drivers/gpu/drm/i915/intel_sdvo.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
|
||||
@@ -2053,40 +2053,17 @@ static const struct drm_encoder_funcs intel_sdvo_enc_funcs = {
|
||||
* outputs, then LVDS outputs.
|
||||
*/
|
||||
static void
|
||||
-intel_sdvo_select_ddc_bus(struct intel_sdvo_priv *dev_priv)
|
||||
+intel_sdvo_select_ddc_bus(struct drm_i915_private *dev_priv,
|
||||
+ struct intel_sdvo_priv *sdvo, u32 reg)
|
||||
{
|
||||
- uint16_t mask = 0;
|
||||
- unsigned int num_bits;
|
||||
+ struct sdvo_device_mapping *mapping;
|
||||
|
||||
- /* Make a mask of outputs less than or equal to our own priority in the
|
||||
- * list.
|
||||
- */
|
||||
- switch (dev_priv->controlled_output) {
|
||||
- case SDVO_OUTPUT_LVDS1:
|
||||
- mask |= SDVO_OUTPUT_LVDS1;
|
||||
- case SDVO_OUTPUT_LVDS0:
|
||||
- mask |= SDVO_OUTPUT_LVDS0;
|
||||
- case SDVO_OUTPUT_TMDS1:
|
||||
- mask |= SDVO_OUTPUT_TMDS1;
|
||||
- case SDVO_OUTPUT_TMDS0:
|
||||
- mask |= SDVO_OUTPUT_TMDS0;
|
||||
- case SDVO_OUTPUT_RGB1:
|
||||
- mask |= SDVO_OUTPUT_RGB1;
|
||||
- case SDVO_OUTPUT_RGB0:
|
||||
- mask |= SDVO_OUTPUT_RGB0;
|
||||
- break;
|
||||
- }
|
||||
-
|
||||
- /* Count bits to find what number we are in the priority list. */
|
||||
- mask &= dev_priv->caps.output_flags;
|
||||
- num_bits = hweight16(mask);
|
||||
- if (num_bits > 3) {
|
||||
- /* if more than 3 outputs, default to DDC bus 3 for now */
|
||||
- num_bits = 3;
|
||||
- }
|
||||
+ if (IS_SDVOB(reg))
|
||||
+ mapping = &(dev_priv->sdvo_mappings[0]);
|
||||
+ else
|
||||
+ mapping = &(dev_priv->sdvo_mappings[1]);
|
||||
|
||||
- /* Corresponds to SDVO_CONTROL_BUS_DDCx */
|
||||
- dev_priv->ddc_bus = 1 << num_bits;
|
||||
+ sdvo->ddc_bus = 1 << ((mapping->ddc_pin & 0xf0) >> 4);
|
||||
}
|
||||
|
||||
static bool
|
||||
@@ -2863,7 +2840,7 @@ bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg)
|
||||
goto err_i2c;
|
||||
}
|
||||
|
||||
- intel_sdvo_select_ddc_bus(sdvo_priv);
|
||||
+ intel_sdvo_select_ddc_bus(dev_priv, sdvo_priv, sdvo_reg);
|
||||
|
||||
/* Set the input timing to the screen. Assume always input 0. */
|
||||
intel_sdvo_set_target_input(intel_encoder, true, false);
|
||||
--
|
||||
1.7.0.1
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,239 @@
|
|||
From 782468d6a9fb865677c166ceffc2271e1f709cc5 Mon Sep 17 00:00:00 2001
|
||||
From: Ben Skeggs <bskeggs@redhat.com>
|
||||
Date: Fri, 16 Apr 2010 08:12:34 +1000
|
||||
Subject: [PATCH 2/3] drm-nouveau-acpi-edid-fallback
|
||||
|
||||
---
|
||||
drivers/gpu/drm/nouveau/nouveau_acpi.c | 81 ++++++++++++++++++++++++--
|
||||
drivers/gpu/drm/nouveau/nouveau_connector.c | 8 +++
|
||||
drivers/gpu/drm/nouveau/nouveau_drv.h | 20 +++++--
|
||||
drivers/gpu/drm/nouveau/nouveau_state.c | 5 +-
|
||||
4 files changed, 98 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c
|
||||
index 48227e7..ac7fd04 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nouveau_acpi.c
|
||||
+++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c
|
||||
@@ -2,11 +2,13 @@
|
||||
#include <linux/acpi.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
+#include <acpi/video.h>
|
||||
|
||||
#include "drmP.h"
|
||||
#include "drm.h"
|
||||
#include "drm_sarea.h"
|
||||
#include "drm_crtc_helper.h"
|
||||
+#include "nouveau_connector.h"
|
||||
#include "nouveau_drv.h"
|
||||
#include "nouveau_drm.h"
|
||||
#include "nv50_display.h"
|
||||
@@ -35,7 +37,7 @@ static int nouveau_dsm(struct drm_device *dev, int func, int arg, int *result)
|
||||
0xB3, 0x4D, 0x7E, 0x5F, 0xEA, 0x12, 0x9F, 0xD4,
|
||||
};
|
||||
|
||||
- struct pci_dev *pdev = dev->pdev;
|
||||
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||
struct acpi_handle *handle;
|
||||
struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
struct acpi_object_list input;
|
||||
@@ -43,11 +45,11 @@ static int nouveau_dsm(struct drm_device *dev, int func, int arg, int *result)
|
||||
union acpi_object *obj;
|
||||
int err;
|
||||
|
||||
- handle = DEVICE_ACPI_HANDLE(&pdev->dev);
|
||||
-
|
||||
- if (!handle)
|
||||
+ if (!dev_priv->acpi_device)
|
||||
return -ENODEV;
|
||||
|
||||
+ handle = dev_priv->acpi_device->handle;
|
||||
+
|
||||
input.count = 4;
|
||||
input.pointer = params;
|
||||
params[0].type = ACPI_TYPE_BUFFER;
|
||||
@@ -62,7 +64,8 @@ static int nouveau_dsm(struct drm_device *dev, int func, int arg, int *result)
|
||||
|
||||
err = acpi_evaluate_object(handle, "_DSM", &input, &output);
|
||||
if (err) {
|
||||
- NV_INFO(dev, "failed to evaluate _DSM: %d\n", err);
|
||||
+ if (err != AE_NOT_FOUND)
|
||||
+ NV_INFO(dev, "failed to evaluate _DSM: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -86,7 +89,7 @@ static int nouveau_dsm(struct drm_device *dev, int func, int arg, int *result)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-int nouveau_hybrid_setup(struct drm_device *dev)
|
||||
+static int nouveau_hybrid_setup(struct drm_device *dev)
|
||||
{
|
||||
int result;
|
||||
|
||||
@@ -110,7 +113,7 @@ int nouveau_hybrid_setup(struct drm_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-bool nouveau_dsm_probe(struct drm_device *dev)
|
||||
+static bool nouveau_dsm_probe(struct drm_device *dev)
|
||||
{
|
||||
int support = 0;
|
||||
|
||||
@@ -123,3 +126,67 @@ bool nouveau_dsm_probe(struct drm_device *dev)
|
||||
|
||||
return true;
|
||||
}
|
||||
+
|
||||
+int nouveau_acpi_get_edid(struct drm_device *dev,
|
||||
+ struct drm_connector *connector,
|
||||
+ struct edid **pedid)
|
||||
+{
|
||||
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||
+ void *edid;
|
||||
+ int connector_type = 0;
|
||||
+ int ret;
|
||||
+
|
||||
+ switch (connector->connector_type) {
|
||||
+ case DRM_MODE_CONNECTOR_VGA:
|
||||
+ connector_type = ACPI_VIDEO_DISPLAY_CRT;
|
||||
+ break;
|
||||
+ case DRM_MODE_CONNECTOR_Composite:
|
||||
+ case DRM_MODE_CONNECTOR_SVIDEO:
|
||||
+ case DRM_MODE_CONNECTOR_Component:
|
||||
+ case DRM_MODE_CONNECTOR_9PinDIN:
|
||||
+ connector_type = ACPI_VIDEO_DISPLAY_TV;
|
||||
+ break;
|
||||
+ case DRM_MODE_CONNECTOR_DVII:
|
||||
+ case DRM_MODE_CONNECTOR_DVID:
|
||||
+ case DRM_MODE_CONNECTOR_HDMIA:
|
||||
+ case DRM_MODE_CONNECTOR_HDMIB:
|
||||
+ case DRM_MODE_CONNECTOR_DisplayPort:
|
||||
+ connector_type = ACPI_VIDEO_DISPLAY_DVI;
|
||||
+ break;
|
||||
+ case DRM_MODE_CONNECTOR_LVDS:
|
||||
+ connector_type = ACPI_VIDEO_DISPLAY_LCD;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ ret = acpi_video_get_edid(dev_priv->acpi_device, connector_type, -1, &edid);
|
||||
+
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ *pedid = edid;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int nouveau_acpi_setup(struct drm_device *dev)
|
||||
+{
|
||||
+ struct pci_dev *pdev = dev->pdev;
|
||||
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||
+ acpi_handle handle;
|
||||
+ struct acpi_device *acpi_dev;
|
||||
+
|
||||
+ handle = DEVICE_ACPI_HANDLE(&pdev->dev);
|
||||
+
|
||||
+ if (!handle)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ if (acpi_bus_get_device(handle, &acpi_dev))
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ dev_priv->acpi_device = acpi_dev;
|
||||
+ dev_priv->acpi_dsm = nouveau_dsm_probe(dev);
|
||||
+
|
||||
+ if (dev_priv->acpi_dsm)
|
||||
+ nouveau_hybrid_setup(dev);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
|
||||
index fb51958..5832b60 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
|
||||
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
|
||||
@@ -356,6 +356,14 @@ nouveau_connector_detect_lvds(struct drm_connector *connector)
|
||||
}
|
||||
}
|
||||
|
||||
+ /* Let's try ACPI */
|
||||
+ if (status != connector_status_connected &&
|
||||
+ !dev_priv->vbios.fp_no_ddc) {
|
||||
+ nouveau_acpi_get_edid(dev, connector, &nv_connector->edid);
|
||||
+ if (nv_connector->edid)
|
||||
+ status = connector_status_connected;
|
||||
+ }
|
||||
+
|
||||
out:
|
||||
#ifdef CONFIG_ACPI
|
||||
if (status == connector_status_connected &&
|
||||
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
|
||||
index c31159a..675d7ac 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
|
||||
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
|
||||
@@ -39,6 +39,8 @@
|
||||
#define NOUVEAU_FAMILY 0x0000FFFF
|
||||
#define NOUVEAU_FLAGS 0xFFFF0000
|
||||
|
||||
+#include <linux/acpi.h>
|
||||
+
|
||||
#include "ttm/ttm_bo_api.h"
|
||||
#include "ttm/ttm_bo_driver.h"
|
||||
#include "ttm/ttm_placement.h"
|
||||
@@ -615,7 +617,11 @@ struct drm_nouveau_private {
|
||||
} susres;
|
||||
|
||||
struct backlight_device *backlight;
|
||||
+
|
||||
+#ifdef CONFIG_ACPI
|
||||
bool acpi_dsm;
|
||||
+ struct acpi_device *acpi_device;
|
||||
+#endif
|
||||
|
||||
struct nouveau_channel *evo;
|
||||
|
||||
@@ -846,16 +852,20 @@ extern int nouveau_dma_wait(struct nouveau_channel *, int slots, int size);
|
||||
|
||||
/* nouveau_acpi.c */
|
||||
#ifdef CONFIG_ACPI
|
||||
-extern int nouveau_hybrid_setup(struct drm_device *dev);
|
||||
-extern bool nouveau_dsm_probe(struct drm_device *dev);
|
||||
+extern int nouveau_acpi_setup(struct drm_device *dev);
|
||||
+extern int nouveau_acpi_get_edid(struct drm_device *dev,
|
||||
+ struct drm_connector *connector,
|
||||
+ struct edid **edid);
|
||||
#else
|
||||
-static inline int nouveau_hybrid_setup(struct drm_device *dev)
|
||||
+static inline int nouveau_acpi_setup(struct drm_device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
-static inline bool nouveau_dsm_probe(struct drm_device *dev)
|
||||
+static inline int nouveau_acpi_get_edid(struct drm_device *dev,
|
||||
+ struct drm_connector *connector,
|
||||
+ struct edid **edid)
|
||||
{
|
||||
- return false;
|
||||
+ return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
|
||||
index 7c1d252..7ca9465 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nouveau_state.c
|
||||
+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
|
||||
@@ -627,10 +627,7 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
|
||||
NV_DEBUG(dev, "vendor: 0x%X device: 0x%X class: 0x%X\n",
|
||||
dev->pci_vendor, dev->pci_device, dev->pdev->class);
|
||||
|
||||
- dev_priv->acpi_dsm = nouveau_dsm_probe(dev);
|
||||
-
|
||||
- if (dev_priv->acpi_dsm)
|
||||
- nouveau_hybrid_setup(dev);
|
||||
+ nouveau_acpi_setup(dev);
|
||||
|
||||
dev_priv->wq = create_workqueue("nouveau");
|
||||
if (!dev_priv->wq)
|
||||
--
|
||||
1.7.1
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
From 841045c942be3fd2bf928a7de3e730a00665347e Mon Sep 17 00:00:00 2001
|
||||
From: Ben Skeggs <bskeggs@redhat.com>
|
||||
Date: Wed, 28 Apr 2010 15:19:10 +1000
|
||||
Subject: [PATCH 3/3] drm-nouveau-drm-fixed-header
|
||||
|
||||
---
|
||||
drivers/gpu/drm/nouveau/drm_fixed.h | 67 +++++++++++++++++++++++++++++++++++
|
||||
1 files changed, 67 insertions(+), 0 deletions(-)
|
||||
create mode 100644 drivers/gpu/drm/nouveau/drm_fixed.h
|
||||
|
||||
diff --git a/drivers/gpu/drm/nouveau/drm_fixed.h b/drivers/gpu/drm/nouveau/drm_fixed.h
|
||||
new file mode 100644
|
||||
index 0000000..4a08a66
|
||||
--- /dev/null
|
||||
+++ b/drivers/gpu/drm/nouveau/drm_fixed.h
|
||||
@@ -0,0 +1,67 @@
|
||||
+/*
|
||||
+ * Copyright 2009 Red Hat Inc.
|
||||
+ *
|
||||
+ * Permission is hereby granted, free of charge, to any person obtaining a
|
||||
+ * copy of this software and associated documentation files (the "Software"),
|
||||
+ * to deal in the Software without restriction, including without limitation
|
||||
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
+ * and/or sell copies of the Software, and to permit persons to whom the
|
||||
+ * Software is furnished to do so, subject to the following conditions:
|
||||
+ *
|
||||
+ * The above copyright notice and this permission notice shall be included in
|
||||
+ * all copies or substantial portions of the Software.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
+ * OTHER DEALINGS IN THE SOFTWARE.
|
||||
+ *
|
||||
+ * Authors: Dave Airlie
|
||||
+ */
|
||||
+#ifndef DRM_FIXED_H
|
||||
+#define DRM_FIXED_H
|
||||
+
|
||||
+typedef union dfixed {
|
||||
+ u32 full;
|
||||
+} fixed20_12;
|
||||
+
|
||||
+
|
||||
+#define dfixed_const(A) (u32)(((A) << 12))/* + ((B + 0.000122)*4096)) */
|
||||
+#define dfixed_const_half(A) (u32)(((A) << 12) + 2048)
|
||||
+#define dfixed_const_666(A) (u32)(((A) << 12) + 2731)
|
||||
+#define dfixed_const_8(A) (u32)(((A) << 12) + 3277)
|
||||
+#define dfixed_mul(A, B) ((u64)((u64)(A).full * (B).full + 2048) >> 12)
|
||||
+#define dfixed_init(A) { .full = dfixed_const((A)) }
|
||||
+#define dfixed_init_half(A) { .full = dfixed_const_half((A)) }
|
||||
+#define dfixed_trunc(A) ((A).full >> 12)
|
||||
+
|
||||
+static inline u32 dfixed_floor(fixed20_12 A)
|
||||
+{
|
||||
+ u32 non_frac = dfixed_trunc(A);
|
||||
+
|
||||
+ return dfixed_const(non_frac);
|
||||
+}
|
||||
+
|
||||
+static inline u32 dfixed_ceil(fixed20_12 A)
|
||||
+{
|
||||
+ u32 non_frac = dfixed_trunc(A);
|
||||
+
|
||||
+ if (A.full > dfixed_const(non_frac))
|
||||
+ return dfixed_const(non_frac + 1);
|
||||
+ else
|
||||
+ return dfixed_const(non_frac);
|
||||
+}
|
||||
+
|
||||
+static inline u32 dfixed_div(fixed20_12 A, fixed20_12 B)
|
||||
+{
|
||||
+ u64 tmp = ((u64)A.full << 13);
|
||||
+
|
||||
+ do_div(tmp, B.full);
|
||||
+ tmp += 1;
|
||||
+ tmp /= 2;
|
||||
+ return lower_32_bits(tmp);
|
||||
+}
|
||||
+#endif
|
||||
--
|
||||
1.7.1
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,30 @@
|
|||
From 79b9517a33a283c5d9db875c263670ed1e055f7e Mon Sep 17 00:00:00 2001
|
||||
From: Dave Airlie <airlied@redhat.com>
|
||||
Date: Mon, 19 Apr 2010 17:54:31 +1000
|
||||
Subject: [PATCH] drm/radeon/kms: add FireMV 2400 PCI ID.
|
||||
|
||||
This is an M24/X600 chip.
|
||||
|
||||
From RH# 581927
|
||||
|
||||
cc: stable@kernel.org
|
||||
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
||||
---
|
||||
include/drm/drm_pciids.h | 1 +
|
||||
1 files changed, 1 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h
|
||||
index 04a6ebc..2d428b0 100644
|
||||
--- a/include/drm/drm_pciids.h
|
||||
+++ b/include/drm/drm_pciids.h
|
||||
@@ -6,6 +6,7 @@
|
||||
{0x1002, 0x3150, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \
|
||||
{0x1002, 0x3152, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x3154, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
+ {0x1002, 0x3155, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x3E50, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x3E54, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x4136, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS100|RADEON_IS_IGP}, \
|
||||
--
|
||||
1.6.6.1
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
From 30f69f3fb20bd719b5e1bf879339914063d38f47 Mon Sep 17 00:00:00 2001
|
||||
From: Jerome Glisse <jglisse@redhat.com>
|
||||
Date: Fri, 16 Apr 2010 18:46:35 +0200
|
||||
Subject: [PATCH] drm/radeon/kms: fix rs600 tlb flush
|
||||
|
||||
Typo in in flush leaded to no flush of the RS600 tlb which
|
||||
ultimately leaded to massive system ram corruption, with
|
||||
this patch everythings seems to work properly.
|
||||
|
||||
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
|
||||
Cc: stable <stable@kernel.org>
|
||||
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
||||
---
|
||||
drivers/gpu/drm/radeon/rs600.c | 2 +-
|
||||
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
|
||||
index abf824c..a81bc7a 100644
|
||||
--- a/drivers/gpu/drm/radeon/rs600.c
|
||||
+++ b/drivers/gpu/drm/radeon/rs600.c
|
||||
@@ -159,7 +159,7 @@ void rs600_gart_tlb_flush(struct radeon_device *rdev)
|
||||
WREG32_MC(R_000100_MC_PT0_CNTL, tmp);
|
||||
|
||||
tmp = RREG32_MC(R_000100_MC_PT0_CNTL);
|
||||
- tmp |= S_000100_INVALIDATE_ALL_L1_TLBS(1) & S_000100_INVALIDATE_L2_CACHE(1);
|
||||
+ tmp |= S_000100_INVALIDATE_ALL_L1_TLBS(1) | S_000100_INVALIDATE_L2_CACHE(1);
|
||||
WREG32_MC(R_000100_MC_PT0_CNTL, tmp);
|
||||
|
||||
tmp = RREG32_MC(R_000100_MC_PT0_CNTL);
|
||||
--
|
||||
1.6.6.1
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
From b317a9ce2259e64258a802a5ca70dec45ac15dda Mon Sep 17 00:00:00 2001
|
||||
From: Alex Deucher <alexdeucher@gmail.com>
|
||||
Date: Thu, 15 Apr 2010 16:54:38 -0400
|
||||
Subject: [PATCH] drm/radeon/kms/atom: fix dual-link DVI on DCE3.2/4.0
|
||||
|
||||
Got broken during the evergreen merge.
|
||||
Fixes fdo bug 27001.
|
||||
|
||||
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
|
||||
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
||||
---
|
||||
drivers/gpu/drm/radeon/radeon_encoders.c | 4 ++++
|
||||
1 files changed, 4 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c
|
||||
index c52fc30..9f7f56a 100644
|
||||
--- a/drivers/gpu/drm/radeon/radeon_encoders.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_encoders.c
|
||||
@@ -865,6 +865,8 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
|
||||
if (dig->coherent_mode)
|
||||
args.v3.acConfig.fCoherentMode = 1;
|
||||
+ if (radeon_encoder->pixel_clock > 165000)
|
||||
+ args.v3.acConfig.fDualLinkConnector = 1;
|
||||
}
|
||||
} else if (ASIC_IS_DCE32(rdev)) {
|
||||
args.v2.acConfig.ucEncoderSel = dig->dig_encoder;
|
||||
@@ -888,6 +890,8 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
|
||||
if (dig->coherent_mode)
|
||||
args.v2.acConfig.fCoherentMode = 1;
|
||||
+ if (radeon_encoder->pixel_clock > 165000)
|
||||
+ args.v2.acConfig.fDualLinkConnector = 1;
|
||||
}
|
||||
} else {
|
||||
args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL;
|
||||
--
|
||||
1.6.6.1
|
||||
|
|
@ -0,0 +1,97 @@
|
|||
From 7aac5b711ff4c64bad5a6027cf6d38f1bbd53efe Mon Sep 17 00:00:00 2001
|
||||
From: Dave Airlie <airlied@redhat.com>
|
||||
Date: Tue, 20 Apr 2010 18:30:37 +1000
|
||||
Subject: [PATCH] drm/radeon/kms: further spread spectrum fixes
|
||||
|
||||
Adjust modeset ordering to fix spread spectrum.
|
||||
The spread spectrum command table relies on the
|
||||
crtc routing to already be set in order to work
|
||||
properly on some asics.
|
||||
|
||||
Should fix fdo bug 25741.
|
||||
|
||||
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
|
||||
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
|
||||
drivers/gpu/drm/radeon/atombios_crtc.c
|
||||
---
|
||||
drivers/gpu/drm/radeon/atombios_crtc.c | 5 +++++
|
||||
drivers/gpu/drm/radeon/radeon_encoders.c | 25 +++++++++++++++----------
|
||||
2 files changed, 20 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
|
||||
index c076eac..e70b575 100644
|
||||
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
|
||||
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
|
||||
@@ -1115,6 +1115,11 @@ static bool atombios_crtc_mode_fixup(struct drm_crtc *crtc,
|
||||
|
||||
static void atombios_crtc_prepare(struct drm_crtc *crtc)
|
||||
{
|
||||
+ struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
|
||||
+
|
||||
+ /* pick pll */
|
||||
+ radeon_crtc->pll_id = radeon_atom_pick_pll(crtc);
|
||||
+
|
||||
atombios_lock_crtc(crtc, ATOM_ENABLE);
|
||||
atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
|
||||
}
|
||||
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c
|
||||
index cac9e06..ff28ad8 100644
|
||||
--- a/drivers/gpu/drm/radeon/radeon_encoders.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_encoders.c
|
||||
@@ -1207,6 +1207,9 @@ atombios_set_encoder_crtc_source(struct drm_encoder *encoder)
|
||||
}
|
||||
|
||||
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
||||
+
|
||||
+ /* update scratch regs with new routing */
|
||||
+ radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1317,19 +1320,9 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
- struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
|
||||
|
||||
- if (radeon_encoder->active_device &
|
||||
- (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) {
|
||||
- struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
|
||||
- if (dig)
|
||||
- dig->dig_encoder = radeon_atom_pick_dig_encoder(encoder);
|
||||
- }
|
||||
radeon_encoder->pixel_clock = adjusted_mode->clock;
|
||||
|
||||
- radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
|
||||
- atombios_set_encoder_crtc_source(encoder);
|
||||
-
|
||||
if (ASIC_IS_AVIVO(rdev)) {
|
||||
if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT | ATOM_DEVICE_TV_SUPPORT))
|
||||
atombios_yuv_setup(encoder, true);
|
||||
@@ -1483,8 +1476,20 @@ radeon_atom_dac_detect(struct drm_encoder *encoder, struct drm_connector *connec
|
||||
|
||||
static void radeon_atom_encoder_prepare(struct drm_encoder *encoder)
|
||||
{
|
||||
+ struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
+
|
||||
+ if (radeon_encoder->active_device &
|
||||
+ (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) {
|
||||
+ struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
|
||||
+ if (dig)
|
||||
+ dig->dig_encoder = radeon_atom_pick_dig_encoder(encoder);
|
||||
+ }
|
||||
+
|
||||
radeon_atom_output_lock(encoder, true);
|
||||
radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
|
||||
+
|
||||
+ /* this is needed for the pll/ss setup to work correctly in some cases */
|
||||
+ atombios_set_encoder_crtc_source(encoder);
|
||||
}
|
||||
|
||||
static void radeon_atom_encoder_commit(struct drm_encoder *encoder)
|
||||
--
|
||||
1.6.5.2
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
From: Theodore Ts'o <tytso@mit.edu>
|
||||
Date: Tue, 20 Apr 2010 20:51:59 +0000 (-0400)
|
||||
Subject: ext4: Issue the discard operation *before* releasing the blocks to be reused
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=b90f687018e6d6c77d981b09203780f7001407e5
|
||||
|
||||
ext4: Issue the discard operation *before* releasing the blocks to be reused
|
||||
|
||||
[ backported to 2.6.33 ]
|
||||
|
||||
Otherwise, we can end up having data corruption because the blocks
|
||||
could get reused and then discarded!
|
||||
|
||||
https://bugzilla.kernel.org/show_bug.cgi?id=15579
|
||||
|
||||
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
|
||||
---
|
||||
|
||||
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
|
||||
index 54df209..e5ab41b 100644
|
||||
--- a/fs/ext4/mballoc.c
|
||||
+++ b/fs/ext4/mballoc.c
|
||||
@@ -2534,6 +2534,20 @@ static void release_blocks_on_commit(journal_t *journal, transaction_t *txn)
|
||||
mb_debug(1, "gonna free %u blocks in group %u (0x%p):",
|
||||
entry->count, entry->group, entry);
|
||||
|
||||
+ if (test_opt(sb, DISCARD)) {
|
||||
+ ext4_fsblk_t discard_block;
|
||||
+ struct ext4_super_block *es = EXT4_SB(sb)->s_es;
|
||||
+
|
||||
+ discard_block = (ext4_fsblk_t)entry->group *
|
||||
+ EXT4_BLOCKS_PER_GROUP(sb)
|
||||
+ + entry->start_blk
|
||||
+ + le32_to_cpu(es->s_first_data_block);
|
||||
+ trace_ext4_discard_blocks(sb,
|
||||
+ (unsigned long long)discard_block,
|
||||
+ entry->count);
|
||||
+ sb_issue_discard(sb, discard_block, entry->count);
|
||||
+ }
|
||||
+
|
||||
err = ext4_mb_load_buddy(sb, entry->group, &e4b);
|
||||
/* we expect to find existing buddy because it's pinned */
|
||||
BUG_ON(err != 0);
|
||||
@@ -2555,19 +2566,6 @@ static void release_blocks_on_commit(journal_t *journal, transaction_t *txn)
|
||||
page_cache_release(e4b.bd_bitmap_page);
|
||||
}
|
||||
ext4_unlock_group(sb, entry->group);
|
||||
- if (test_opt(sb, DISCARD)) {
|
||||
- ext4_fsblk_t discard_block;
|
||||
- struct ext4_super_block *es = EXT4_SB(sb)->s_es;
|
||||
-
|
||||
- discard_block = (ext4_fsblk_t)entry->group *
|
||||
- EXT4_BLOCKS_PER_GROUP(sb)
|
||||
- + entry->start_blk
|
||||
- + le32_to_cpu(es->s_first_data_block);
|
||||
- trace_ext4_discard_blocks(sb,
|
||||
- (unsigned long long)discard_block,
|
||||
- entry->count);
|
||||
- sb_issue_discard(sb, discard_block, entry->count);
|
||||
- }
|
||||
kmem_cache_free(ext4_free_ext_cachep, entry);
|
||||
ext4_mb_release_desc(&e4b);
|
||||
}
|
|
@ -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,21 @@
|
|||
Subject: [PATCH] 9p: fscache: fix build breakage introduced by 201a15428bd54f83eccec8b7c64a04b8f9431204
|
||||
|
||||
While building 2.6.32-rc8-git2 for Fedora I noticed the following thinko in
|
||||
201a15428bd54f83eccec8b7c64a04b8f9431204. Patch below looks to be correct?
|
||||
|
||||
Signed-off-by: Kyle McMartin <kyle@redhat.com>
|
||||
|
||||
---
|
||||
diff --git a/fs/9p/cache.c b/fs/9p/cache.c
|
||||
index bcc5357..e777961 100644
|
||||
--- a/fs/9p/cache.c
|
||||
+++ b/fs/9p/cache.c
|
||||
@@ -343,7 +343,7 @@ int __v9fs_fscache_release_page(struct page *page, gfp_t gfp)
|
||||
|
||||
BUG_ON(!vcookie->fscache);
|
||||
|
||||
- return fscache_maybe_release_page(vnode->cache, page, gfp);
|
||||
+ return fscache_maybe_release_page(vcookie->fscache, page, gfp);
|
||||
}
|
||||
|
||||
void __v9fs_fscache_invalidate_page(struct page *page)
|
|
@ -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,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,319 @@
|
|||
commit 711909b33d6fdee149b5cb58bd888e7c10407acb
|
||||
Author: Bastien Nocera <hadess@hadess.net>
|
||||
Date: Wed Apr 21 15:24:56 2010 +0100
|
||||
|
||||
Add support for the Wacom Intuos 4 wireless
|
||||
|
||||
And to the HID blacklist.
|
||||
|
||||
Same command set as the Graphire Bluetooth tablet.
|
||||
|
||||
Signed-off-by: Bastien Nocera <hadess@hadess.net>
|
||||
|
||||
commit 1e03f3dc79ae5a9456545702f6dcac1023b06666
|
||||
Author: Antonio Ospite <ospite@studenti.unina.it>
|
||||
Date: Thu Apr 29 23:59:34 2010 +0200
|
||||
|
||||
hid/hid-sony: fix sony_set_operational_bt
|
||||
|
||||
Don't send the report type as part of the data, this prevents the
|
||||
controller from going into the operational state at all.
|
||||
|
||||
This is completely equivalent to what the code originally meant to accomplish:
|
||||
as per in net/bluetooth/hidp/core.c::hidp_output_raw_report(), by using
|
||||
HID_FEATURE_REPORT here, what will be actually sent is
|
||||
(HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE) which is exactly 0x53.
|
||||
|
||||
Signed-off-by: Antonio Ospite <ospite@studenti.unina.it>
|
||||
|
||||
commit ea42416024fb33c970dbc10a6c69c0831126d75e
|
||||
Author: Jiri Kosina <jkosina@suse.cz>
|
||||
Date: Wed Feb 3 15:52:31 2010 +0100
|
||||
|
||||
HID: make Wacom modesetting failures non-fatal
|
||||
|
||||
With Wacom tablet mode-setting moved from userspace into kernel,
|
||||
we don't have to consider failures of device queries through the
|
||||
_raw callback as hard failure, as the driver can safely continue
|
||||
anyway.
|
||||
|
||||
This is consistent with the current USB driver in wacom_sys.c
|
||||
|
||||
Reported-by: Ping Cheng <pinglinux@gmail.com>
|
||||
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
|
||||
|
||||
commit a37234f5fcd6ad44ada8c477c2ab531f3ed9fbe5
|
||||
Author: Bastien Nocera <hadess@hadess.net>
|
||||
Date: Wed Jan 20 12:01:53 2010 +0000
|
||||
|
||||
HID: Enable Sixaxis controller over Bluetooth
|
||||
|
||||
Now that hid_output_raw_report works, port the PS3 Sixaxis
|
||||
Bluetooth quirk from user-space, into kernel-space.
|
||||
|
||||
Signed-off-by: Bastien Nocera <hadess@hadess.net>
|
||||
Acked-by: Marcel Holtmann <marcel@holtmann.org>
|
||||
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
|
||||
|
||||
commit 6bc702ac6551532774171d593a805c3565befb4e
|
||||
Author: Bastien Nocera <hadess@hadess.net>
|
||||
Date: Wed Jan 20 12:00:53 2010 +0000
|
||||
|
||||
HID: Implement Wacom quirk in the kernel
|
||||
|
||||
The hid-wacom driver required user-space to poke at the tablet
|
||||
to make it send data about the cursor location.
|
||||
|
||||
This patch makes it do the same thing but in the kernel.
|
||||
|
||||
Signed-off-by: Bastien Nocera <hadess@hadess.net>
|
||||
Acked-by: Marcel Holtmann <marcel@holtmann.org>
|
||||
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
|
||||
|
||||
commit 6fd920bdba1752fdd6411a55b3c17e0fda67b8d2
|
||||
Author: Jiri Kosina <jkosina@suse.cz>
|
||||
Date: Fri Jan 29 15:03:36 2010 +0100
|
||||
|
||||
HID: make raw reports possible for both feature and output reports
|
||||
|
||||
In commit 2da31939a42 ("Bluetooth: Implement raw output support for HIDP
|
||||
layer"), support for Bluetooth hid_output_raw_report was added, but it
|
||||
pushes the data to the intr socket instead of the ctrl one. This has been
|
||||
fixed by 6bf8268f9a91f1 ("Bluetooth: Use the control channel for raw HID reports")
|
||||
|
||||
Still, it is necessary to distinguish whether the report in question should be
|
||||
either FEATURE or OUTPUT. For this, we have to extend the generic HID API,
|
||||
so that hid_output_raw_report() callback provides means to specify this
|
||||
value so that it can be passed down to lower level hardware drivers (currently
|
||||
Bluetooth and USB).
|
||||
|
||||
Based on original patch by Bastien Nocera <hadess@hadess.net>
|
||||
Acked-by: Marcel Holtmann <marcel@holtmann.org>
|
||||
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
|
||||
|
||||
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
|
||||
index 8455f3d..112568e 100644
|
||||
--- a/drivers/hid/hid-core.c
|
||||
+++ b/drivers/hid/hid-core.c
|
||||
@@ -1340,6 +1340,7 @@ static const struct hid_device_id hid_blacklist[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
|
||||
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) },
|
||||
@@ -1352,6 +1353,7 @@ static const struct hid_device_id hid_blacklist[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) },
|
||||
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) },
|
||||
|
||||
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
||||
index 793691f..4ccd60b 100644
|
||||
--- a/drivers/hid/hid-ids.h
|
||||
+++ b/drivers/hid/hid-ids.h
|
||||
@@ -428,6 +428,7 @@
|
||||
|
||||
#define USB_VENDOR_ID_WACOM 0x056a
|
||||
#define USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH 0x81
|
||||
+#define USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH 0xbd
|
||||
|
||||
#define USB_VENDOR_ID_WISEGROUP 0x0925
|
||||
#define USB_DEVICE_ID_SMARTJOY_PLUS 0x0005
|
||||
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
|
||||
index 4e84502..e71da89 100644
|
||||
--- a/drivers/hid/hid-sony.c
|
||||
+++ b/drivers/hid/hid-sony.c
|
||||
@@ -48,7 +48,7 @@ static void sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||
* to "operational". Without this, the ps3 controller will not report any
|
||||
* events.
|
||||
*/
|
||||
-static int sony_set_operational(struct hid_device *hdev)
|
||||
+static int sony_set_operational_usb(struct hid_device *hdev)
|
||||
{
|
||||
struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
|
||||
struct usb_device *dev = interface_to_usbdev(intf);
|
||||
@@ -73,6 +73,12 @@ static int sony_set_operational(struct hid_device *hdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int sony_set_operational_bt(struct hid_device *hdev)
|
||||
+{
|
||||
+ unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
|
||||
+ return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
|
||||
+}
|
||||
+
|
||||
static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
{
|
||||
int ret;
|
||||
@@ -101,7 +107,17 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
- ret = sony_set_operational(hdev);
|
||||
+ switch (hdev->bus) {
|
||||
+ case BUS_USB:
|
||||
+ ret = sony_set_operational_usb(hdev);
|
||||
+ break;
|
||||
+ case BUS_BLUETOOTH:
|
||||
+ ret = sony_set_operational_bt(hdev);
|
||||
+ break;
|
||||
+ default:
|
||||
+ ret = 0;
|
||||
+ }
|
||||
+
|
||||
if (ret < 0)
|
||||
goto err_stop;
|
||||
|
||||
@@ -121,6 +137,7 @@ static void sony_remove(struct hid_device *hdev)
|
||||
|
||||
static const struct hid_device_id sony_devices[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
|
||||
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
|
||||
.driver_data = VAIO_RDESC_CONSTANT },
|
||||
{ }
|
||||
diff --git a/drivers/hid/hid-wacom.c b/drivers/hid/hid-wacom.c
|
||||
index 12dcda5..91dbae3 100644
|
||||
--- a/drivers/hid/hid-wacom.c
|
||||
+++ b/drivers/hid/hid-wacom.c
|
||||
@@ -156,7 +156,9 @@ static int wacom_probe(struct hid_device *hdev,
|
||||
struct hid_input *hidinput;
|
||||
struct input_dev *input;
|
||||
struct wacom_data *wdata;
|
||||
+ char rep_data[2];
|
||||
int ret;
|
||||
+ int limit;
|
||||
|
||||
wdata = kzalloc(sizeof(*wdata), GFP_KERNEL);
|
||||
if (wdata == NULL) {
|
||||
@@ -166,6 +168,7 @@ static int wacom_probe(struct hid_device *hdev,
|
||||
|
||||
hid_set_drvdata(hdev, wdata);
|
||||
|
||||
+ /* Parse the HID report now */
|
||||
ret = hid_parse(hdev);
|
||||
if (ret) {
|
||||
dev_err(&hdev->dev, "parse failed\n");
|
||||
@@ -178,6 +181,31 @@ static int wacom_probe(struct hid_device *hdev,
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * Note that if the raw queries fail, it's not a hard failure and it
|
||||
+ * is safe to continue
|
||||
+ */
|
||||
+
|
||||
+ /* Set Wacom mode2 */
|
||||
+ rep_data[0] = 0x03; rep_data[1] = 0x00;
|
||||
+ limit = 3;
|
||||
+ do {
|
||||
+ ret = hdev->hid_output_raw_report(hdev, rep_data, 2,
|
||||
+ HID_FEATURE_REPORT);
|
||||
+ } while (ret < 0 && limit-- > 0);
|
||||
+ if (ret < 0)
|
||||
+ dev_warn(&hdev->dev, "failed to poke device #1, %d\n", ret);
|
||||
+
|
||||
+ /* 0x06 - high reporting speed, 0x05 - low speed */
|
||||
+ rep_data[0] = 0x06; rep_data[1] = 0x00;
|
||||
+ limit = 3;
|
||||
+ do {
|
||||
+ ret = hdev->hid_output_raw_report(hdev, rep_data, 2,
|
||||
+ HID_FEATURE_REPORT);
|
||||
+ } while (ret < 0 && limit-- > 0);
|
||||
+ if (ret < 0)
|
||||
+ dev_warn(&hdev->dev, "failed to poke device #2, %d\n", ret);
|
||||
+
|
||||
hidinput = list_entry(hdev->inputs.next, struct hid_input, list);
|
||||
input = hidinput->input;
|
||||
|
||||
@@ -228,7 +256,7 @@ static void wacom_remove(struct hid_device *hdev)
|
||||
|
||||
static const struct hid_device_id wacom_devices[] = {
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) },
|
||||
-
|
||||
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(hid, wacom_devices);
|
||||
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
|
||||
index cdd1369..d044767 100644
|
||||
--- a/drivers/hid/hidraw.c
|
||||
+++ b/drivers/hid/hidraw.c
|
||||
@@ -134,7 +134,7 @@ static ssize_t hidraw_write(struct file *file, const char __user *buffer, size_t
|
||||
goto out;
|
||||
}
|
||||
|
||||
- ret = dev->hid_output_raw_report(dev, buf, count);
|
||||
+ ret = dev->hid_output_raw_report(dev, buf, count, HID_OUTPUT_REPORT);
|
||||
out:
|
||||
kfree(buf);
|
||||
return ret;
|
||||
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
|
||||
index 2f84237..83c9f94 100644
|
||||
--- a/drivers/hid/usbhid/hid-core.c
|
||||
+++ b/drivers/hid/usbhid/hid-core.c
|
||||
@@ -798,7 +798,8 @@ static int hid_alloc_buffers(struct usb_device *dev, struct hid_device *hid)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int usbhid_output_raw_report(struct hid_device *hid, __u8 *buf, size_t count)
|
||||
+static int usbhid_output_raw_report(struct hid_device *hid, __u8 *buf, size_t count,
|
||||
+ unsigned char report_type)
|
||||
{
|
||||
struct usbhid_device *usbhid = hid->driver_data;
|
||||
struct usb_device *dev = hid_to_usb_dev(hid);
|
||||
@@ -809,7 +810,7 @@ static int usbhid_output_raw_report(struct hid_device *hid, __u8 *buf, size_t co
|
||||
ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
|
||||
HID_REQ_SET_REPORT,
|
||||
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
|
||||
- ((HID_OUTPUT_REPORT + 1) << 8) | *buf,
|
||||
+ ((report_type + 1) << 8) | *buf,
|
||||
interface->desc.bInterfaceNumber, buf + 1, count - 1,
|
||||
USB_CTRL_SET_TIMEOUT);
|
||||
|
||||
diff --git a/include/linux/hid.h b/include/linux/hid.h
|
||||
index 8709365..3661a62 100644
|
||||
--- a/include/linux/hid.h
|
||||
+++ b/include/linux/hid.h
|
||||
@@ -501,7 +501,7 @@ struct hid_device { /* device report descriptor */
|
||||
void (*hiddev_report_event) (struct hid_device *, struct hid_report *);
|
||||
|
||||
/* handler for raw output data, used by hidraw */
|
||||
- int (*hid_output_raw_report) (struct hid_device *, __u8 *, size_t);
|
||||
+ int (*hid_output_raw_report) (struct hid_device *, __u8 *, size_t, unsigned char);
|
||||
|
||||
/* debugging support via debugfs */
|
||||
unsigned short debug;
|
||||
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c
|
||||
index fc6ec1e..280529a 100644
|
||||
--- a/net/bluetooth/hidp/core.c
|
||||
+++ b/net/bluetooth/hidp/core.c
|
||||
@@ -313,10 +313,21 @@ static int hidp_send_report(struct hidp_session *session, struct hid_report *rep
|
||||
return hidp_queue_report(session, buf, rsize);
|
||||
}
|
||||
|
||||
-static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, size_t count)
|
||||
+static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, size_t count,
|
||||
+ unsigned char report_type)
|
||||
{
|
||||
- if (hidp_send_ctrl_message(hid->driver_data,
|
||||
- HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE,
|
||||
+ switch (report_type) {
|
||||
+ case HID_FEATURE_REPORT:
|
||||
+ report_type = HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE;
|
||||
+ break;
|
||||
+ case HID_OUTPUT_REPORT:
|
||||
+ report_type = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUPUT;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ if (hidp_send_ctrl_message(hid->driver_data, report_type,
|
||||
data, count))
|
||||
return -ENOMEM;
|
||||
return count;
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,35 @@
|
|||
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
|
||||
index c8d9178..7d3bb15 100644
|
||||
--- a/sound/pci/hda/hda_intel.c
|
||||
+++ b/sound/pci/hda/hda_intel.c
|
||||
@@ -1774,6 +1774,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 >= AZX_MAX_PCMS) {
|
||||
snd_printk(KERN_ERR SFX "Invalid PCM device number %d\n",
|
||||
@@ -1807,10 +1808,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;
|
||||
}
|
||||
|
|
@ -0,0 +1,213 @@
|
|||
diff -Naurp a/drivers/media/video/hdpvr/hdpvr-core.c b/drivers/media/video/hdpvr/hdpvr-core.c
|
||||
--- a/drivers/media/video/hdpvr/hdpvr-core.c 2010-07-06 17:36:44.000000000 -0400
|
||||
+++ b/drivers/media/video/hdpvr/hdpvr-core.c 2010-07-06 17:38:13.000000000 -0400
|
||||
@@ -363,9 +363,8 @@ static int hdpvr_probe(struct usb_interf
|
||||
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;
|
||||
@@ -411,12 +410,9 @@ static void hdpvr_disconnect(struct usb_
|
||||
mutex_unlock(&dev->io_mutex);
|
||||
|
||||
/* deregister I2C adapter */
|
||||
-#ifdef CONFIG_I2C
|
||||
+#if defined(CONFIG_I2C) || defined(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 -Naurp a/drivers/media/video/hdpvr/hdpvr.h b/drivers/media/video/hdpvr/hdpvr.h
|
||||
--- a/drivers/media/video/hdpvr/hdpvr.h 2010-02-24 13:52:17.000000000 -0500
|
||||
+++ b/drivers/media/video/hdpvr/hdpvr.h 2010-07-06 17:42:20.000000000 -0400
|
||||
@@ -101,7 +101,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;
|
||||
|
||||
diff -Naurp a/drivers/media/video/hdpvr/hdpvr-i2c.c b/drivers/media/video/hdpvr/hdpvr-i2c.c
|
||||
--- a/drivers/media/video/hdpvr/hdpvr-i2c.c 2010-07-06 17:36:51.000000000 -0400
|
||||
+++ b/drivers/media/video/hdpvr/hdpvr-i2c.c 2010-07-06 17:45:50.000000000 -0400
|
||||
@@ -10,6 +10,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
|
||||
+
|
||||
#include <linux/i2c.h>
|
||||
|
||||
#include "hdpvr.h"
|
||||
@@ -19,10 +21,13 @@
|
||||
|
||||
#define REQTYPE_I2C_READ 0xb1
|
||||
#define REQTYPE_I2C_WRITE 0xb0
|
||||
-#define REQTYPE_I2C_WRITE_STATT 0xd0
|
||||
+#define REQTYPE_I2C_WRITE_STAT 0xd0
|
||||
+
|
||||
+#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, unsigned char addr,
|
||||
- char *data, int len)
|
||||
+ char *data, int len, int bus)
|
||||
{
|
||||
int ret;
|
||||
char *buf = kmalloc(len, GFP_KERNEL);
|
||||
@@ -32,7 +37,7 @@ static int hdpvr_i2c_read(struct hdpvr_d
|
||||
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,7 +51,7 @@ static int hdpvr_i2c_read(struct hdpvr_d
|
||||
}
|
||||
|
||||
static int hdpvr_i2c_write(struct hdpvr_device *dev, unsigned char addr,
|
||||
- char *data, int len)
|
||||
+ char *data, int len, int bus)
|
||||
{
|
||||
int ret;
|
||||
char *buf = kmalloc(len, GFP_KERNEL);
|
||||
@@ -57,17 +62,17 @@ static int hdpvr_i2c_write(struct hdpvr_
|
||||
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;
|
||||
|
||||
ret = usb_control_msg(dev->udev,
|
||||
usb_rcvctrlpipe(dev->udev, 0),
|
||||
- REQTYPE_I2C_WRITE_STATT, CTRL_READ_REQUEST,
|
||||
+ REQTYPE_I2C_WRITE_STAT, 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_ada
|
||||
|
||||
if (msgs[i].flags & I2C_M_RD)
|
||||
retval = hdpvr_i2c_read(dev, addr, msgs[i].buf,
|
||||
- msgs[i].len);
|
||||
+ msgs[i].len, 1);
|
||||
else
|
||||
retval = hdpvr_i2c_write(dev, addr, msgs[i].buf,
|
||||
- msgs[i].len);
|
||||
+ msgs[i].len, 1);
|
||||
}
|
||||
|
||||
mutex_unlock(&dev->i2c_mutex);
|
||||
@@ -114,31 +119,61 @@ static struct i2c_algorithm hdpvr_algo =
|
||||
.functionality = hdpvr_functionality,
|
||||
};
|
||||
|
||||
+static struct i2c_adapter hdpvr_i2c_adap_template = {
|
||||
+ .name = "Hauppauge HD PVR I2C",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .id = I2C_HW_B_HDPVR,
|
||||
+ .algo = &hdpvr_algo,
|
||||
+ .algo_data = NULL,
|
||||
+ .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, 0x54, buffer, 1, 0);
|
||||
+
|
||||
+ buffer[0] = 0;
|
||||
+ buffer[1] = 0x8;
|
||||
+ hdpvr_i2c_write(dev, 0x54, buffer, 2, 1);
|
||||
+
|
||||
+ buffer[1] = 0x18;
|
||||
+ hdpvr_i2c_write(dev, 0x54, buffer, 2, 1);
|
||||
+
|
||||
+ 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)
|
||||
+ hdpvr_activate_ir(dev);
|
||||
+
|
||||
+ memcpy(&dev->i2c_adapter, &hdpvr_i2c_adap_template,
|
||||
+ sizeof(struct i2c_adapter));
|
||||
+ dev->i2c_adapter.dev.parent = &dev->udev->dev;
|
||||
+
|
||||
+ i2c_set_adapdata(&dev->i2c_adapter, dev);
|
||||
+
|
||||
+ retval = i2c_add_adapter(&dev->i2c_adapter);
|
||||
+
|
||||
+ if (retval)
|
||||
goto error;
|
||||
|
||||
- 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;
|
||||
-
|
||||
- i2c_set_adapdata(i2c_adap, dev);
|
||||
-
|
||||
- retval = i2c_add_adapter(i2c_adap);
|
||||
-
|
||||
- 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 -Naurp a/drivers/media/video/hdpvr/Makefile b/drivers/media/video/hdpvr/Makefile
|
||||
--- a/drivers/media/video/hdpvr/Makefile 2010-07-06 17:36:38.000000000 -0400
|
||||
+++ b/drivers/media/video/hdpvr/Makefile 2010-07-06 17:35:17.000000000 -0400
|
||||
@@ -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-core.o hdpvr-i2c.o hdpvr-video.o
|
||||
|
||||
obj-$(CONFIG_VIDEO_HDPVR) += hdpvr.o
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
From b395ecef0de15c10459856e56a590ac1fe16be76 Mon Sep 17 00:00:00 2001
|
||||
From: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
|
||||
Date: Fri, 2 Apr 2010 15:50:24 +0900
|
||||
Subject: [SCSI] ibmvscsi: fix DMA API misuse
|
||||
|
||||
ibmvscsi uses dma_unmap_single() for buffers mapped via
|
||||
dma_map_sg(). It works however it's the API violation. The DMA debug
|
||||
facility complains about it:
|
||||
|
||||
http://marc.info/?l=linux-scsi&m=127018555013151&w=2
|
||||
|
||||
Reported-by: Sachin Sant <sachinp@in.ibm.com>
|
||||
Tested-by: Sachin Sant <sachinp@in.ibm.com>
|
||||
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
|
||||
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
|
||||
|
||||
(cherry picked from a71fa1fc43a29133f13ae6ada1a389ca298c0934)
|
||||
---
|
||||
drivers/scsi/ibmvscsi/ibmvscsi.c | 29 ++---------------------------
|
||||
1 files changed, 2 insertions(+), 27 deletions(-)
|
||||
|
||||
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c
|
||||
index e475b79..3b14bbe 100644
|
||||
--- a/drivers/scsi/ibmvscsi/ibmvscsi.c
|
||||
+++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
|
||||
@@ -321,16 +321,6 @@ static void set_srp_direction(struct scsi_cmnd *cmd,
|
||||
srp_cmd->buf_fmt = fmt;
|
||||
}
|
||||
|
||||
-static void unmap_sg_list(int num_entries,
|
||||
- struct device *dev,
|
||||
- struct srp_direct_buf *md)
|
||||
-{
|
||||
- int i;
|
||||
-
|
||||
- for (i = 0; i < num_entries; ++i)
|
||||
- dma_unmap_single(dev, md[i].va, md[i].len, DMA_BIDIRECTIONAL);
|
||||
-}
|
||||
-
|
||||
/**
|
||||
* unmap_cmd_data: - Unmap data pointed in srp_cmd based on the format
|
||||
* @cmd: srp_cmd whose additional_data member will be unmapped
|
||||
@@ -348,24 +338,9 @@ static void unmap_cmd_data(struct srp_cmd *cmd,
|
||||
|
||||
if (out_fmt == SRP_NO_DATA_DESC && in_fmt == SRP_NO_DATA_DESC)
|
||||
return;
|
||||
- else if (out_fmt == SRP_DATA_DESC_DIRECT ||
|
||||
- in_fmt == SRP_DATA_DESC_DIRECT) {
|
||||
- struct srp_direct_buf *data =
|
||||
- (struct srp_direct_buf *) cmd->add_data;
|
||||
- dma_unmap_single(dev, data->va, data->len, DMA_BIDIRECTIONAL);
|
||||
- } else {
|
||||
- struct srp_indirect_buf *indirect =
|
||||
- (struct srp_indirect_buf *) cmd->add_data;
|
||||
- int num_mapped = indirect->table_desc.len /
|
||||
- sizeof(struct srp_direct_buf);
|
||||
|
||||
- if (num_mapped <= MAX_INDIRECT_BUFS) {
|
||||
- unmap_sg_list(num_mapped, dev, &indirect->desc_list[0]);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- unmap_sg_list(num_mapped, dev, evt_struct->ext_list);
|
||||
- }
|
||||
+ if (evt_struct->cmnd)
|
||||
+ scsi_dma_unmap(evt_struct->cmnd);
|
||||
}
|
||||
|
||||
static int map_sg_list(struct scsi_cmnd *cmd, int nseg,
|
||||
--
|
||||
1.7.0.1
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
#607327
|
||||
|
||||
During the large inotify rewrite to fsnotify I completely dropped support
|
||||
for IN_ONESHOT. Reimplement that support.
|
||||
|
||||
Signed-off-by: Eric Paris <eparis@redhat.com>
|
||||
---
|
||||
|
||||
fs/notify/inotify/inotify_fsnotify.c | 3 +++
|
||||
1 files changed, 3 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c
|
||||
index daa666a..388a150 100644
|
||||
--- a/fs/notify/inotify/inotify_fsnotify.c
|
||||
+++ b/fs/notify/inotify/inotify_fsnotify.c
|
||||
@@ -126,6 +126,9 @@ static int inotify_handle_event(struct fsnotify_group *group, struct fsnotify_ev
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
+ if (entry->mask & IN_ONESHOT)
|
||||
+ fsnotify_destroy_mark_by_entry(entry);
|
||||
+
|
||||
/*
|
||||
* If we hold the entry until after the event is on the queue
|
||||
* IN_IGNORED won't be able to pass this event in the queue
|
|
@ -0,0 +1,29 @@
|
|||
#607327 ?
|
||||
|
||||
Since the .31 or so notify rewrite inotify has not sent events about
|
||||
inodes which are unmounted. This patch restores those events.
|
||||
|
||||
Signed-off-by: Eric Paris <eparis@redhat.com>
|
||||
---
|
||||
|
||||
fs/notify/inotify/inotify_user.c | 7 +++++--
|
||||
1 files changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c
|
||||
index 44aeb0f..f381daf 100644
|
||||
--- a/fs/notify/inotify/inotify_user.c
|
||||
+++ b/fs/notify/inotify/inotify_user.c
|
||||
@@ -90,8 +90,11 @@ static inline __u32 inotify_arg_to_mask(u32 arg)
|
||||
{
|
||||
__u32 mask;
|
||||
|
||||
- /* everything should accept their own ignored and cares about children */
|
||||
- mask = (FS_IN_IGNORED | FS_EVENT_ON_CHILD);
|
||||
+ /*
|
||||
+ * everything should accept their own ignored, cares about children,
|
||||
+ * and should receive events when the inode is unmounted
|
||||
+ */
|
||||
+ mask = (FS_IN_IGNORED | FS_EVENT_ON_CHILD | FS_UNMOUNT);
|
||||
|
||||
/* mask off the flags used to open the fd */
|
||||
mask |= (arg & (IN_ALL_EVENTS | IN_ONESHOT));
|
|
@ -0,0 +1,123 @@
|
|||
From reinette.chatre@intel.com Thu May 13 17:49:59 2010
|
||||
Return-path: <reinette.chatre@intel.com>
|
||||
Envelope-to: linville@tuxdriver.com
|
||||
Delivery-date: Thu, 13 May 2010 17:49:59 -0400
|
||||
Received: from mga09.intel.com ([134.134.136.24])
|
||||
by smtp.tuxdriver.com with esmtp (Exim 4.63)
|
||||
(envelope-from <reinette.chatre@intel.com>)
|
||||
id 1OCgI1-0007H3-Eg
|
||||
for linville@tuxdriver.com; Thu, 13 May 2010 17:49:59 -0400
|
||||
Received: from orsmga002.jf.intel.com ([10.7.209.21])
|
||||
by orsmga102.jf.intel.com with ESMTP; 13 May 2010 14:48:04 -0700
|
||||
X-ExtLoop1: 1
|
||||
X-IronPort-AV: E=Sophos;i="4.53,224,1272870000";
|
||||
d="scan'208";a="517743256"
|
||||
Received: from rchatre-desk.amr.corp.intel.com.jf.intel.com (HELO localhost.localdomain) ([134.134.15.94])
|
||||
by orsmga002.jf.intel.com with ESMTP; 13 May 2010 14:49:12 -0700
|
||||
From: Reinette Chatre <reinette.chatre@intel.com>
|
||||
To: linville@tuxdriver.com
|
||||
Cc: linux-wireless@vger.kernel.org, ipw3945-devel@lists.sourceforge.net, Reinette Chatre <reinette.chatre@intel.com>
|
||||
Subject: [PATCH 1/2] iwlwifi: fix internal scan race
|
||||
Date: Thu, 13 May 2010 14:49:44 -0700
|
||||
Message-Id: <1273787385-9248-2-git-send-email-reinette.chatre@intel.com>
|
||||
X-Mailer: git-send-email 1.6.3.3
|
||||
In-Reply-To: <1273787385-9248-1-git-send-email-reinette.chatre@intel.com>
|
||||
References: <1273787385-9248-1-git-send-email-reinette.chatre@intel.com>
|
||||
X-Spam-Score: -4.2 (----)
|
||||
X-Spam-Status: No
|
||||
Status: RO
|
||||
Content-Length: 3370
|
||||
Lines: 91
|
||||
|
||||
From: Reinette Chatre <reinette.chatre@intel.com>
|
||||
|
||||
It is possible for internal scan to race against itself if the device is
|
||||
not returning the scan results from first requests. What happens in this
|
||||
case is the cleanup done during the abort of the first internal scan also
|
||||
cleans up part of the new scan, causing it to access memory it shouldn't.
|
||||
|
||||
Here are details:
|
||||
* First internal scan is triggered and scan command sent to device.
|
||||
* After seven seconds there is no scan results so the watchdog timer
|
||||
triggers a scan abort.
|
||||
* The scan abort succeeds and a SCAN_COMPLETE_NOTIFICATION is received for
|
||||
failed scan.
|
||||
* During processing of SCAN_COMPLETE_NOTIFICATION we clear STATUS_SCANNING
|
||||
and queue the "scan_completed" work.
|
||||
** At this time, since the problem that caused the internal scan in first
|
||||
place is still present, a new internal scan is triggered.
|
||||
The behavior at this point is a bit different between 2.6.34 and 2.6.35
|
||||
since 2.6.35 has a lot of this synchronized. The rest of the race
|
||||
description will thus be generalized.
|
||||
** As part of preparing for the scan "is_internal_short_scan" is set to
|
||||
true.
|
||||
* At this point the completion work for fist scan is run. As part of this
|
||||
there is some locking missing around the "is_internal_short_scan"
|
||||
variable and it is set to "false".
|
||||
** Now the second scan runs and it considers itself a real (not internal0
|
||||
scan and thus causes problems with wrong memory being accessed.
|
||||
|
||||
The fix is twofold.
|
||||
* Since "is_internal_short_scan" should be protected by mutex, fix this in
|
||||
scan completion work so that changes to it can be serialized.
|
||||
* Do not queue a new internal scan if one is in progress.
|
||||
|
||||
This fixes https://bugzilla.kernel.org/show_bug.cgi?id=15824
|
||||
|
||||
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||
---
|
||||
drivers/net/wireless/iwlwifi/iwl-scan.c | 21 ++++++++++++++++++---
|
||||
1 files changed, 18 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
|
||||
index 2367286..a2c4855 100644
|
||||
--- a/drivers/net/wireless/iwlwifi/iwl-scan.c
|
||||
+++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
|
||||
@@ -560,6 +560,11 @@ static void iwl_bg_start_internal_scan(struct work_struct *work)
|
||||
|
||||
mutex_lock(&priv->mutex);
|
||||
|
||||
+ if (priv->is_internal_short_scan == true) {
|
||||
+ IWL_DEBUG_SCAN(priv, "Internal scan already in progress\n");
|
||||
+ goto unlock;
|
||||
+ }
|
||||
+
|
||||
if (!iwl_is_ready_rf(priv)) {
|
||||
IWL_DEBUG_SCAN(priv, "not ready or exit pending\n");
|
||||
goto unlock;
|
||||
@@ -957,17 +962,27 @@ void iwl_bg_scan_completed(struct work_struct *work)
|
||||
{
|
||||
struct iwl_priv *priv =
|
||||
container_of(work, struct iwl_priv, scan_completed);
|
||||
+ bool internal = false;
|
||||
|
||||
IWL_DEBUG_SCAN(priv, "SCAN complete scan\n");
|
||||
|
||||
cancel_delayed_work(&priv->scan_check);
|
||||
|
||||
- if (!priv->is_internal_short_scan)
|
||||
- ieee80211_scan_completed(priv->hw, false);
|
||||
- else {
|
||||
+ mutex_lock(&priv->mutex);
|
||||
+ if (priv->is_internal_short_scan) {
|
||||
priv->is_internal_short_scan = false;
|
||||
IWL_DEBUG_SCAN(priv, "internal short scan completed\n");
|
||||
+ internal = true;
|
||||
}
|
||||
+ mutex_unlock(&priv->mutex);
|
||||
+
|
||||
+ /*
|
||||
+ * Do not hold mutex here since this will cause mac80211 to call
|
||||
+ * into driver again into functions that will attempt to take
|
||||
+ * mutex.
|
||||
+ */
|
||||
+ if (!internal)
|
||||
+ ieee80211_scan_completed(priv->hw, false);
|
||||
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
return;
|
||||
--
|
||||
1.6.3.3
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,139 @@
|
|||
commit 88be026490ed89c2ffead81a52531fbac5507e01
|
||||
Author: Johannes Berg <johannes.berg@intel.com>
|
||||
Date: Wed Apr 7 00:21:36 2010 -0700
|
||||
|
||||
iwlwifi: fix scan races
|
||||
|
||||
When an internal scan is started, nothing protects the
|
||||
is_internal_short_scan variable which can cause crashes,
|
||||
cf. https://bugzilla.kernel.org/show_bug.cgi?id=15667.
|
||||
Fix this by making the short scan request use the mutex
|
||||
for locking, which requires making the request go to a
|
||||
work struct so that it can sleep.
|
||||
|
||||
Reported-by: Peter Zijlstra <peterz@infradead.org>
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||
|
||||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||
index e4c2e1e..ba0fdba 100644
|
||||
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||
@@ -3330,6 +3330,7 @@ static void iwl_cancel_deferred_work(struct iwl_priv *priv)
|
||||
|
||||
cancel_delayed_work_sync(&priv->init_alive_start);
|
||||
cancel_delayed_work(&priv->scan_check);
|
||||
+ cancel_work_sync(&priv->start_internal_scan);
|
||||
cancel_delayed_work(&priv->alive_start);
|
||||
cancel_work_sync(&priv->beacon_update);
|
||||
del_timer_sync(&priv->statistics_periodic);
|
||||
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||
index 894bcb8..1459cdb 100644
|
||||
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||
@@ -3357,7 +3357,6 @@ static void iwl_force_rf_reset(struct iwl_priv *priv)
|
||||
*/
|
||||
IWL_DEBUG_INFO(priv, "perform radio reset.\n");
|
||||
iwl_internal_short_hw_scan(priv);
|
||||
- return;
|
||||
}
|
||||
|
||||
|
||||
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||
index 732590f..36940a9 100644
|
||||
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||
@@ -506,7 +506,7 @@ void iwl_init_scan_params(struct iwl_priv *priv);
|
||||
int iwl_scan_cancel(struct iwl_priv *priv);
|
||||
int iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms);
|
||||
int iwl_mac_hw_scan(struct ieee80211_hw *hw, struct cfg80211_scan_request *req);
|
||||
-int iwl_internal_short_hw_scan(struct iwl_priv *priv);
|
||||
+void iwl_internal_short_hw_scan(struct iwl_priv *priv);
|
||||
int iwl_force_reset(struct iwl_priv *priv, int mode);
|
||||
u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame,
|
||||
const u8 *ie, int ie_len, int left);
|
||||
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||
index 6054c5f..ef1720a 100644
|
||||
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||
@@ -1296,6 +1296,7 @@ struct iwl_priv {
|
||||
struct work_struct tt_work;
|
||||
struct work_struct ct_enter;
|
||||
struct work_struct ct_exit;
|
||||
+ struct work_struct start_internal_scan;
|
||||
|
||||
struct tasklet_struct irq_tasklet;
|
||||
|
||||
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
|
||||
index bd2f7c4..5062f4e 100644
|
||||
--- a/drivers/net/wireless/iwlwifi/iwl-scan.c
|
||||
+++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
|
||||
@@ -469,6 +469,8 @@ EXPORT_SYMBOL(iwl_init_scan_params);
|
||||
|
||||
static int iwl_scan_initiate(struct iwl_priv *priv)
|
||||
{
|
||||
+ WARN_ON(!mutex_is_locked(&priv->mutex));
|
||||
+
|
||||
IWL_DEBUG_INFO(priv, "Starting scan...\n");
|
||||
set_bit(STATUS_SCANNING, &priv->status);
|
||||
priv->is_internal_short_scan = false;
|
||||
@@ -546,24 +548,31 @@ EXPORT_SYMBOL(iwl_mac_hw_scan);
|
||||
* internal short scan, this function should only been called while associated.
|
||||
* It will reset and tune the radio to prevent possible RF related problem
|
||||
*/
|
||||
-int iwl_internal_short_hw_scan(struct iwl_priv *priv)
|
||||
+void iwl_internal_short_hw_scan(struct iwl_priv *priv)
|
||||
{
|
||||
- int ret = 0;
|
||||
+ queue_work(priv->workqueue, &priv->start_internal_scan);
|
||||
+}
|
||||
+
|
||||
+static void iwl_bg_start_internal_scan(struct work_struct *work)
|
||||
+{
|
||||
+ struct iwl_priv *priv =
|
||||
+ container_of(work, struct iwl_priv, start_internal_scan);
|
||||
+
|
||||
+ mutex_lock(&priv->mutex);
|
||||
|
||||
if (!iwl_is_ready_rf(priv)) {
|
||||
- ret = -EIO;
|
||||
IWL_DEBUG_SCAN(priv, "not ready or exit pending\n");
|
||||
- goto out;
|
||||
+ goto unlock;
|
||||
}
|
||||
+
|
||||
if (test_bit(STATUS_SCANNING, &priv->status)) {
|
||||
IWL_DEBUG_SCAN(priv, "Scan already in progress.\n");
|
||||
- ret = -EAGAIN;
|
||||
- goto out;
|
||||
+ goto unlock;
|
||||
}
|
||||
+
|
||||
if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) {
|
||||
IWL_DEBUG_SCAN(priv, "Scan request while abort pending\n");
|
||||
- ret = -EAGAIN;
|
||||
- goto out;
|
||||
+ goto unlock;
|
||||
}
|
||||
|
||||
priv->scan_bands = 0;
|
||||
@@ -576,9 +585,8 @@ int iwl_internal_short_hw_scan(struct iwl_priv *priv)
|
||||
set_bit(STATUS_SCANNING, &priv->status);
|
||||
priv->is_internal_short_scan = true;
|
||||
queue_work(priv->workqueue, &priv->request_scan);
|
||||
-
|
||||
-out:
|
||||
- return ret;
|
||||
+ unlock:
|
||||
+ mutex_unlock(&priv->mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_internal_short_hw_scan);
|
||||
|
||||
@@ -964,6 +972,7 @@ void iwl_setup_scan_deferred_work(struct iwl_priv *priv)
|
||||
INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed);
|
||||
INIT_WORK(&priv->request_scan, iwl_bg_request_scan);
|
||||
INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan);
|
||||
+ INIT_WORK(&priv->start_internal_scan, iwl_bg_start_internal_scan);
|
||||
INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check);
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_setup_scan_deferred_work);
|
|
@ -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.33.y] iwlwifi: manage QoS by mac stack
|
||||
Date: Fri, 11 Jun 2010 17:04:18 +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 5622a55..9ba4207 100644
|
||||
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||
@@ -2327,7 +2327,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__);
|
||||
@@ -2412,10 +2411,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 */
|
||||
@@ -2602,7 +2597,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;
|
||||
@@ -2654,10 +2648,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);
|
||||
@@ -3195,11 +3185,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 6e9e156..d79b1e9 100644
|
||||
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||
@@ -301,17 +301,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;
|
||||
@@ -319,118 +315,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 */
|
||||
@@ -2273,12 +2165,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);
|
||||
|
||||
@@ -2554,11 +2440,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);
|
||||
@@ -2790,6 +2673,15 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
|
||||
if (priv->cfg->ops->hcmd->set_rxon_chain)
|
||||
priv->cfg->ops->hcmd->set_rxon_chain(priv);
|
||||
|
||||
+ 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;
|
||||
@@ -2860,8 +2752,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 b69e972..403f512 100644
|
||||
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||
@@ -298,8 +298,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 3822cf5..f2a9356 100644
|
||||
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||
@@ -518,30 +518,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 adbb3ea..2280ba7 100644
|
||||
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||
@@ -3127,8 +3127,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;
|
||||
}
|
||||
@@ -3841,11 +3839,6 @@ static int iwl3945_init_drv(struct iwl_priv *priv)
|
||||
|
||||
priv->iw_mode = NL80211_IFTYPE_STATION;
|
||||
|
||||
- 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,13 @@
|
|||
https://bugzilla.redhat.com/show_bug.cgi?id=589777#c5
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-3945.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-3945.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-3945.c.orig 2010-05-19 16:07:15.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-3945.c 2010-05-19 16:09:42.000000000 -0400
|
||||
@@ -2794,6 +2794,7 @@ static struct iwl_lib_ops iwl3945_lib =
|
||||
.post_associate = iwl3945_post_associate,
|
||||
.isr = iwl_isr_legacy,
|
||||
.config_ap = iwl3945_config_ap,
|
||||
+ .recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||
};
|
||||
|
||||
static struct iwl_hcmd_utils_ops iwl3945_hcmd_utils = {
|
|
@ -0,0 +1,48 @@
|
|||
Backport of the following upstream commit...
|
||||
|
||||
commit 6c3872e1d52290dcd506473028867cacc6b7393d
|
||||
Author: Trieu 'Andrew' Nguyen <trieux.t.nguyen@intel.com>
|
||||
Date: Mon Feb 8 13:53:05 2010 -0800
|
||||
|
||||
iwlwifi: Adjusting PLCP error threshold for 1000 NIC
|
||||
|
||||
While testing the station with the NIC 1000 family, it is found that
|
||||
the plcp error can easily exceed 50 value in 100mSecs. This creates
|
||||
unneccessary radio reset/tuning. This patch raises the PLCP error
|
||||
threshold of the NIC 1000 from 50 to 200 error count.
|
||||
|
||||
Signed-off-by: Trieu 'Andrew' Nguyen <trieux.t.nguyen@intel.com>
|
||||
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c.orig 2010-04-13 13:44:14.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c 2010-04-13 13:45:51.000000000 -0400
|
||||
@@ -174,7 +174,7 @@ struct iwl_cfg iwl1000_bgn_cfg = {
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.support_ct_kill_exit = true,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
- .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl1000_bg_cfg = {
|
||||
@@ -201,7 +201,7 @@ struct iwl_cfg iwl1000_bg_cfg = {
|
||||
.led_compensation = 51,
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.support_ct_kill_exit = true,
|
||||
- .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL1000_MODULE_FIRMWARE(IWL1000_UCODE_API_MAX));
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig 2010-04-13 13:44:14.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h 2010-04-13 13:45:06.000000000 -0400
|
||||
@@ -991,6 +991,7 @@ struct iwl_switch_rxon {
|
||||
#define IWL_MAX_PLCP_ERR_THRESHOLD_MIN (0)
|
||||
#define IWL_MAX_PLCP_ERR_THRESHOLD_DEF (50)
|
||||
#define IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF (100)
|
||||
+#define IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF (200)
|
||||
#define IWL_MAX_PLCP_ERR_THRESHOLD_MAX (255)
|
||||
|
||||
enum iwl_reset {
|
|
@ -0,0 +1,81 @@
|
|||
Backport of the following upstream commit...
|
||||
|
||||
commit d4d59e88cb746165c6fe33eacb6f582d525c6ef1
|
||||
Author: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
Date: Fri Jan 22 14:22:45 2010 -0800
|
||||
|
||||
iwlwifi: Logic to control how frequent radio should be reset if needed
|
||||
|
||||
Add additional logic for internal scan routine to control how
|
||||
frequent this function should be performed.
|
||||
|
||||
The intent of this function is to reset/re-tune the radio and bring the
|
||||
RF/PHY back to normal state, it does not make sense calling it too
|
||||
frequent,
|
||||
if reset the radio can not bring it back to normal state, it indicate
|
||||
there are other reason to cause the radio not operate correctly.
|
||||
|
||||
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||
Signed-off-by: John W. Linville <linville@tuxdriver.com>
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig 2010-04-13 11:53:36.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h 2010-04-13 11:59:18.000000000 -0400
|
||||
@@ -1034,6 +1034,7 @@ struct iwl_priv {
|
||||
unsigned long scan_start;
|
||||
unsigned long scan_pass_start;
|
||||
unsigned long scan_start_tsf;
|
||||
+ unsigned long last_internal_scan_jiffies;
|
||||
void *scan;
|
||||
int scan_bands;
|
||||
struct cfg80211_scan_request *scan_request;
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c.orig 2010-04-13 11:53:36.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c 2010-04-13 12:01:06.000000000 -0400
|
||||
@@ -204,7 +204,8 @@ static void iwl_rx_scan_results_notif(st
|
||||
#endif
|
||||
|
||||
priv->last_scan_jiffies = jiffies;
|
||||
- priv->next_scan_jiffies = 0;
|
||||
+ if (!priv->is_internal_short_scan)
|
||||
+ priv->next_scan_jiffies = 0;
|
||||
}
|
||||
|
||||
/* Service SCAN_COMPLETE_NOTIFICATION (0x84) */
|
||||
@@ -251,7 +252,11 @@ static void iwl_rx_scan_complete_notif(s
|
||||
}
|
||||
|
||||
priv->last_scan_jiffies = jiffies;
|
||||
- priv->next_scan_jiffies = 0;
|
||||
+ if (!priv->is_internal_short_scan)
|
||||
+ priv->next_scan_jiffies = 0;
|
||||
+ else
|
||||
+ priv->last_internal_scan_jiffies = jiffies;
|
||||
+
|
||||
IWL_DEBUG_INFO(priv, "Setting scan to off\n");
|
||||
|
||||
clear_bit(STATUS_SCANNING, &priv->status);
|
||||
@@ -559,6 +564,8 @@ EXPORT_SYMBOL(iwl_mac_hw_scan);
|
||||
* internal short scan, this function should only been called while associated.
|
||||
* It will reset and tune the radio to prevent possible RF related problem
|
||||
*/
|
||||
+#define IWL_DELAY_NEXT_INTERNAL_SCAN (HZ*1)
|
||||
+
|
||||
int iwl_internal_short_hw_scan(struct iwl_priv *priv)
|
||||
{
|
||||
int ret = 0;
|
||||
@@ -578,6 +585,13 @@ int iwl_internal_short_hw_scan(struct iw
|
||||
ret = -EAGAIN;
|
||||
goto out;
|
||||
}
|
||||
+ if (priv->last_internal_scan_jiffies &&
|
||||
+ time_after(priv->last_internal_scan_jiffies +
|
||||
+ IWL_DELAY_NEXT_INTERNAL_SCAN, jiffies)) {
|
||||
+ IWL_DEBUG_SCAN(priv, "internal scan rejected\n");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
priv->scan_bands = 0;
|
||||
if (priv->band == IEEE80211_BAND_5GHZ)
|
||||
priv->scan_bands |= BIT(IEEE80211_BAND_5GHZ);
|
|
@ -0,0 +1,131 @@
|
|||
Backport of the following upstream commit...
|
||||
|
||||
commit d5a0ffa3eaf9e898f25a925813f1a723be7808f8
|
||||
Author: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
Date: Thu Mar 4 13:38:59 2010 -0800
|
||||
|
||||
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>
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c.orig 2010-04-13 14:44:38.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c 2010-04-13 14:53:47.000000000 -0400
|
||||
@@ -2783,10 +2783,21 @@ static int iwl_mac_ampdu_action(struct i
|
||||
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->agg_tids_count++;
|
||||
+ IWL_DEBUG_HT(priv, "priv->agg_tids_count = %u\n",
|
||||
+ priv->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->agg_tids_count > 0)) {
|
||||
+ priv->agg_tids_count--;
|
||||
+ IWL_DEBUG_HT(priv, "priv->agg_tids_count = %u\n",
|
||||
+ priv->agg_tids_count);
|
||||
+ }
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
return 0;
|
||||
else
|
||||
@@ -3204,6 +3215,7 @@ static int iwl_init_drv(struct iwl_priv
|
||||
priv->band = IEEE80211_BAND_2GHZ;
|
||||
|
||||
priv->iw_mode = NL80211_IFTYPE_STATION;
|
||||
+ priv->agg_tids_count = 0;
|
||||
|
||||
/* initialize force reset */
|
||||
priv->force_reset[IWL_RF_RESET].reset_duration =
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig 2010-04-13 14:44:38.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h 2010-04-13 14:53:19.000000000 -0400
|
||||
@@ -1239,6 +1239,11 @@ struct iwl_priv {
|
||||
void *ict_tbl_vir;
|
||||
u32 inta;
|
||||
bool use_ict;
|
||||
+ /*
|
||||
+ * reporting the number of tids has AGG on. 0 means
|
||||
+ * no AGGREGATION
|
||||
+ */
|
||||
+ u8 agg_tids_count;
|
||||
|
||||
u32 inta_mask;
|
||||
/* Current association information needed to configure the
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig 2010-04-13 14:44:38.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c 2010-04-13 14:56:17.000000000 -0400
|
||||
@@ -593,9 +593,18 @@ static void iwl_accumulative_statistics(
|
||||
|
||||
#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.
|
||||
*/
|
||||
@@ -605,6 +614,37 @@ void iwl_recover_from_statistics(struct
|
||||
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->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);
|
||||
+
|
||||
+ 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
|
|
@ -0,0 +1,472 @@
|
|||
Backport of the following upstream commit...
|
||||
|
||||
commit b74e31a9bc1013e69b85b139072485dc153453dd
|
||||
Author: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
Date: Mon Mar 1 17:23:50 2010 -0800
|
||||
|
||||
iwlwifi: Recover TX flow stall due to stuck queue
|
||||
|
||||
Monitors the internal TX queues periodically. When a queue is stuck
|
||||
for some unknown conditions causing the throughput to drop and the
|
||||
transfer is stop, the driver will force firmware reload and bring the
|
||||
system back to normal operational state.
|
||||
|
||||
The iwlwifi devices behave differently in this regard so this feature is
|
||||
made part of the ops infrastructure so we can have more control on how to
|
||||
monitor and recover from tx queue stall case per device.
|
||||
|
||||
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>
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c.orig 2010-04-13 14:33:10.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c 2010-04-13 14:34:23.000000000 -0400
|
||||
@@ -138,6 +138,7 @@ static struct iwl_lib_ops iwl1000_lib =
|
||||
.temperature = iwl5000_temperature,
|
||||
.set_ct_kill = iwl1000_set_ct_threshold,
|
||||
},
|
||||
+ .recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||
};
|
||||
|
||||
static struct iwl_ops iwl1000_ops = {
|
||||
@@ -175,6 +176,7 @@ struct iwl_cfg iwl1000_bgn_cfg = {
|
||||
.support_ct_kill_exit = true,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl1000_bg_cfg = {
|
||||
@@ -202,6 +204,7 @@ struct iwl_cfg iwl1000_bg_cfg = {
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.support_ct_kill_exit = true,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL1000_MODULE_FIRMWARE(IWL1000_UCODE_API_MAX));
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl3945-base.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl3945-base.c.orig 2010-04-13 14:33:10.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl3945-base.c 2010-04-13 14:33:49.000000000 -0400
|
||||
@@ -2483,6 +2483,13 @@ static void iwl3945_alive_start(struct i
|
||||
/* After the ALIVE response, we can send commands to 3945 uCode */
|
||||
set_bit(STATUS_ALIVE, &priv->status);
|
||||
|
||||
+ if (priv->cfg->ops->lib->recover_from_tx_stall) {
|
||||
+ /* Enable timer to monitor the driver queues */
|
||||
+ mod_timer(&priv->monitor_recover,
|
||||
+ jiffies +
|
||||
+ msecs_to_jiffies(priv->cfg->monitor_recover_period));
|
||||
+ }
|
||||
+
|
||||
if (iwl_is_rfkill(priv))
|
||||
return;
|
||||
|
||||
@@ -3768,6 +3775,13 @@ static void iwl3945_setup_deferred_work(
|
||||
|
||||
iwl3945_hw_setup_deferred_work(priv);
|
||||
|
||||
+ if (priv->cfg->ops->lib->recover_from_tx_stall) {
|
||||
+ init_timer(&priv->monitor_recover);
|
||||
+ priv->monitor_recover.data = (unsigned long)priv;
|
||||
+ priv->monitor_recover.function =
|
||||
+ priv->cfg->ops->lib->recover_from_tx_stall;
|
||||
+ }
|
||||
+
|
||||
tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long))
|
||||
iwl3945_irq_tasklet, (unsigned long)priv);
|
||||
}
|
||||
@@ -3780,6 +3794,8 @@ static void iwl3945_cancel_deferred_work
|
||||
cancel_delayed_work(&priv->scan_check);
|
||||
cancel_delayed_work(&priv->alive_start);
|
||||
cancel_work_sync(&priv->beacon_update);
|
||||
+ if (priv->cfg->ops->lib->recover_from_tx_stall)
|
||||
+ del_timer_sync(&priv->monitor_recover);
|
||||
}
|
||||
|
||||
static struct attribute *iwl3945_sysfs_entries[] = {
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-3945.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-3945.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-3945.c.orig 2010-04-13 14:33:10.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-3945.c 2010-04-13 14:33:49.000000000 -0400
|
||||
@@ -2829,6 +2829,7 @@ static struct iwl_cfg iwl3945_bg_cfg = {
|
||||
.led_compensation = 64,
|
||||
.broken_powersave = true,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
static struct iwl_cfg iwl3945_abg_cfg = {
|
||||
@@ -2847,6 +2848,7 @@ static struct iwl_cfg iwl3945_abg_cfg =
|
||||
.led_compensation = 64,
|
||||
.broken_powersave = true,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
struct pci_device_id iwl3945_hw_card_ids[] = {
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c.orig 2010-04-13 14:33:10.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c 2010-04-13 14:33:49.000000000 -0400
|
||||
@@ -2248,6 +2248,7 @@ struct iwl_cfg iwl4965_agn_cfg = {
|
||||
.chain_noise_num_beacons = IWL4965_CAL_NUM_BEACONS,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
/* Module firmware */
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c.orig 2010-04-13 14:33:10.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c 2010-04-13 14:35:01.000000000 -0400
|
||||
@@ -1506,6 +1506,7 @@ struct iwl_lib_ops iwl5000_lib = {
|
||||
.temperature = iwl5000_temperature,
|
||||
.set_ct_kill = iwl5000_set_ct_threshold,
|
||||
},
|
||||
+ .recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||
};
|
||||
|
||||
static struct iwl_lib_ops iwl5150_lib = {
|
||||
@@ -1558,6 +1559,7 @@ static struct iwl_lib_ops iwl5150_lib =
|
||||
.temperature = iwl5150_temperature,
|
||||
.set_ct_kill = iwl5150_set_ct_threshold,
|
||||
},
|
||||
+ .recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||
};
|
||||
|
||||
static struct iwl_ops iwl5000_ops = {
|
||||
@@ -1607,6 +1609,7 @@ struct iwl_cfg iwl5300_agn_cfg = {
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl5100_bgn_cfg = {
|
||||
@@ -1632,6 +1635,7 @@ struct iwl_cfg iwl5100_bgn_cfg = {
|
||||
.use_rts_for_ht = true, /* use rts/cts protection */
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl5100_abg_cfg = {
|
||||
@@ -1655,6 +1659,7 @@ struct iwl_cfg iwl5100_abg_cfg = {
|
||||
.led_compensation = 51,
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl5100_agn_cfg = {
|
||||
@@ -1681,6 +1686,7 @@ struct iwl_cfg iwl5100_agn_cfg = {
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl5350_agn_cfg = {
|
||||
@@ -1707,6 +1713,7 @@ struct iwl_cfg iwl5350_agn_cfg = {
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl5150_agn_cfg = {
|
||||
@@ -1733,6 +1740,7 @@ struct iwl_cfg iwl5150_agn_cfg = {
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl5150_abg_cfg = {
|
||||
@@ -1756,6 +1764,7 @@ struct iwl_cfg iwl5150_abg_cfg = {
|
||||
.led_compensation = 51,
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE(IWL5000_UCODE_API_MAX));
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c.orig 2010-04-13 14:33:10.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c 2010-04-13 14:36:12.000000000 -0400
|
||||
@@ -250,6 +250,7 @@ static struct iwl_lib_ops iwl6000_lib =
|
||||
.temperature = iwl5000_temperature,
|
||||
.set_ct_kill = iwl6000_set_ct_threshold,
|
||||
},
|
||||
+ .recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||
};
|
||||
|
||||
static struct iwl_ops iwl6000_ops = {
|
||||
@@ -308,6 +309,7 @@ struct iwl_cfg iwl6000i_2agn_cfg = {
|
||||
.support_ct_kill_exit = true,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6000i_2abg_cfg = {
|
||||
@@ -338,6 +340,7 @@ struct iwl_cfg iwl6000i_2abg_cfg = {
|
||||
.adv_thermal_throttle = true,
|
||||
.support_ct_kill_exit = true,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6000i_2bg_cfg = {
|
||||
@@ -368,6 +371,7 @@ struct iwl_cfg iwl6000i_2bg_cfg = {
|
||||
.adv_thermal_throttle = true,
|
||||
.support_ct_kill_exit = true,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6050_2agn_cfg = {
|
||||
@@ -400,6 +404,7 @@ struct iwl_cfg iwl6050_2agn_cfg = {
|
||||
.support_ct_kill_exit = true,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DYNAMIC,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6050_2abg_cfg = {
|
||||
@@ -430,6 +435,7 @@ struct iwl_cfg iwl6050_2abg_cfg = {
|
||||
.adv_thermal_throttle = true,
|
||||
.support_ct_kill_exit = true,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6000_3agn_cfg = {
|
||||
@@ -462,6 +468,7 @@ struct iwl_cfg iwl6000_3agn_cfg = {
|
||||
.support_ct_kill_exit = true,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c.orig 2010-04-13 14:33:10.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c 2010-04-13 14:37:04.000000000 -0400
|
||||
@@ -1912,6 +1912,13 @@ static void iwl_alive_start(struct iwl_p
|
||||
/* After the ALIVE response, we can send host commands to the uCode */
|
||||
set_bit(STATUS_ALIVE, &priv->status);
|
||||
|
||||
+ if (priv->cfg->ops->lib->recover_from_tx_stall) {
|
||||
+ /* Enable timer to monitor the driver queues */
|
||||
+ mod_timer(&priv->monitor_recover,
|
||||
+ jiffies +
|
||||
+ msecs_to_jiffies(priv->cfg->monitor_recover_period));
|
||||
+ }
|
||||
+
|
||||
if (iwl_is_rfkill(priv))
|
||||
return;
|
||||
|
||||
@@ -3126,6 +3133,13 @@ static void iwl_setup_deferred_work(stru
|
||||
priv->statistics_periodic.data = (unsigned long)priv;
|
||||
priv->statistics_periodic.function = iwl_bg_statistics_periodic;
|
||||
|
||||
+ if (priv->cfg->ops->lib->recover_from_tx_stall) {
|
||||
+ init_timer(&priv->monitor_recover);
|
||||
+ priv->monitor_recover.data = (unsigned long)priv;
|
||||
+ priv->monitor_recover.function =
|
||||
+ priv->cfg->ops->lib->recover_from_tx_stall;
|
||||
+ }
|
||||
+
|
||||
if (!priv->cfg->use_isr_legacy)
|
||||
tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long))
|
||||
iwl_irq_tasklet, (unsigned long)priv);
|
||||
@@ -3144,6 +3158,8 @@ static void iwl_cancel_deferred_work(str
|
||||
cancel_delayed_work(&priv->alive_start);
|
||||
cancel_work_sync(&priv->beacon_update);
|
||||
del_timer_sync(&priv->statistics_periodic);
|
||||
+ if (priv->cfg->ops->lib->recover_from_tx_stall)
|
||||
+ del_timer_sync(&priv->monitor_recover);
|
||||
}
|
||||
|
||||
static void iwl_init_hw_rates(struct iwl_priv *priv,
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c.orig 2010-04-13 14:33:10.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c 2010-04-13 14:33:49.000000000 -0400
|
||||
@@ -3263,6 +3263,99 @@ int iwl_force_reset(struct iwl_priv *pri
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL(iwl_force_reset);
|
||||
+
|
||||
+/**
|
||||
+ * iwl_bg_monitor_recover - Timer callback to check for stuck queue and recover
|
||||
+ *
|
||||
+ * During normal condition (no queue is stuck), the timer is continually set to
|
||||
+ * execute every monitor_recover_period milliseconds after the last timer
|
||||
+ * expired. When the queue read_ptr is at the same place, the timer is
|
||||
+ * shorten to 100mSecs. This is
|
||||
+ * 1) to reduce the chance that the read_ptr may wrap around (not stuck)
|
||||
+ * 2) to detect the stuck queues quicker before the station and AP can
|
||||
+ * disassociate each other.
|
||||
+ *
|
||||
+ * This function monitors all the tx queues and recover from it if any
|
||||
+ * of the queues are stuck.
|
||||
+ * 1. It first check the cmd queue for stuck conditions. If it is stuck,
|
||||
+ * it will recover by resetting the firmware and return.
|
||||
+ * 2. Then, it checks for station association. If it associates it will check
|
||||
+ * other queues. If any queue is stuck, it will recover by resetting
|
||||
+ * the firmware.
|
||||
+ * Note: It the number of times the queue read_ptr to be at the same place to
|
||||
+ * be MAX_REPEAT+1 in order to consider to be stuck.
|
||||
+ */
|
||||
+/*
|
||||
+ * The maximum number of times the read pointer of the tx queue at the
|
||||
+ * same place without considering to be stuck.
|
||||
+ */
|
||||
+#define MAX_REPEAT (2)
|
||||
+static int iwl_check_stuck_queue(struct iwl_priv *priv, int cnt)
|
||||
+{
|
||||
+ struct iwl_tx_queue *txq;
|
||||
+ struct iwl_queue *q;
|
||||
+
|
||||
+ txq = &priv->txq[cnt];
|
||||
+ q = &txq->q;
|
||||
+ /* queue is empty, skip */
|
||||
+ if (q->read_ptr != q->write_ptr) {
|
||||
+ if (q->read_ptr == q->last_read_ptr) {
|
||||
+ /* a queue has not been read from last time */
|
||||
+ if (q->repeat_same_read_ptr > MAX_REPEAT) {
|
||||
+ IWL_ERR(priv,
|
||||
+ "queue %d stuck %d time. Fw reload.\n",
|
||||
+ q->id, q->repeat_same_read_ptr);
|
||||
+ q->repeat_same_read_ptr = 0;
|
||||
+ iwl_force_reset(priv, IWL_FW_RESET);
|
||||
+ } else {
|
||||
+ q->repeat_same_read_ptr++;
|
||||
+ IWL_DEBUG_RADIO(priv,
|
||||
+ "queue %d, not read %d time\n",
|
||||
+ q->id,
|
||||
+ q->repeat_same_read_ptr);
|
||||
+ mod_timer(&priv->monitor_recover, jiffies +
|
||||
+ msecs_to_jiffies(IWL_ONE_HUNDRED_MSECS));
|
||||
+ }
|
||||
+ return 1;
|
||||
+ } else {
|
||||
+ q->last_read_ptr = q->read_ptr;
|
||||
+ q->repeat_same_read_ptr = 0;
|
||||
+ }
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void iwl_bg_monitor_recover(unsigned long data)
|
||||
+{
|
||||
+ struct iwl_priv *priv = (struct iwl_priv *)data;
|
||||
+ int cnt;
|
||||
+
|
||||
+ if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
+ return;
|
||||
+
|
||||
+ /* monitor and check for stuck cmd queue */
|
||||
+ if (iwl_check_stuck_queue(priv, IWL_CMD_QUEUE_NUM))
|
||||
+ return;
|
||||
+
|
||||
+ /* monitor and check for other stuck queues */
|
||||
+ if (iwl_is_associated(priv)) {
|
||||
+ for (cnt = 0; cnt < priv->hw_params.max_txq_num; cnt++) {
|
||||
+ /* skip as we already checked the command queue */
|
||||
+ if (cnt == IWL_CMD_QUEUE_NUM)
|
||||
+ continue;
|
||||
+ if (iwl_check_stuck_queue(priv, cnt))
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+ /*
|
||||
+ * Reschedule the timer to occur in
|
||||
+ * priv->cfg->monitor_recover_period
|
||||
+ */
|
||||
+ mod_timer(&priv->monitor_recover,
|
||||
+ jiffies + msecs_to_jiffies(priv->cfg->monitor_recover_period));
|
||||
+}
|
||||
+EXPORT_SYMBOL(iwl_bg_monitor_recover);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig 2010-04-13 14:33:10.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h 2010-04-13 14:38:21.000000000 -0400
|
||||
@@ -187,6 +187,8 @@ struct iwl_lib_ops {
|
||||
|
||||
/* temperature */
|
||||
struct iwl_temp_ops temp_ops;
|
||||
+ /* recover from tx queue stall */
|
||||
+ void (*recover_from_tx_stall)(unsigned long data);
|
||||
};
|
||||
|
||||
struct iwl_led_ops {
|
||||
@@ -292,6 +294,8 @@ struct iwl_cfg {
|
||||
u8 sm_ps_mode;
|
||||
const bool support_wimax_coexist;
|
||||
u8 plcp_delta_threshold;
|
||||
+ /* timer period for monitor the driver queues */
|
||||
+ u32 monitor_recover_period;
|
||||
};
|
||||
|
||||
/***************************
|
||||
@@ -579,6 +583,9 @@ static inline u16 iwl_pcie_link_ctl(stru
|
||||
pci_read_config_word(priv->pci_dev, pos + PCI_EXP_LNKCTL, &pci_lnk_ctl);
|
||||
return pci_lnk_ctl;
|
||||
}
|
||||
+
|
||||
+void iwl_bg_monitor_recover(unsigned long data);
|
||||
+
|
||||
#ifdef CONFIG_PM
|
||||
int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state);
|
||||
int iwl_pci_resume(struct pci_dev *pdev);
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig 2010-04-13 14:33:10.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h 2010-04-13 14:38:52.000000000 -0400
|
||||
@@ -183,6 +183,10 @@ struct iwl_queue {
|
||||
int n_bd; /* number of BDs in this queue */
|
||||
int write_ptr; /* 1-st empty entry (index) host_w*/
|
||||
int read_ptr; /* last used entry (index) host_r*/
|
||||
+ /* use for monitoring and recovering the stuck queue */
|
||||
+ int last_read_ptr; /* storing the last read_ptr */
|
||||
+ /* number of time read_ptr and last_read_ptr are the same */
|
||||
+ u8 repeat_same_read_ptr;
|
||||
dma_addr_t dma_addr; /* physical addr for BD's */
|
||||
int n_window; /* safe queue window */
|
||||
u32 id;
|
||||
@@ -997,6 +1001,11 @@ struct iwl_switch_rxon {
|
||||
#define IWL_DELAY_NEXT_FORCE_RF_RESET (HZ*3)
|
||||
#define IWL_DELAY_NEXT_FORCE_FW_RELOAD (HZ*5)
|
||||
|
||||
+/* timer constants use to monitor and recover stuck tx queues in mSecs */
|
||||
+#define IWL_MONITORING_PERIOD (1000)
|
||||
+#define IWL_ONE_HUNDRED_MSECS (100)
|
||||
+#define IWL_SIXTY_SECS (60000)
|
||||
+
|
||||
enum iwl_reset {
|
||||
IWL_RF_RESET = 0,
|
||||
IWL_FW_RESET,
|
||||
@@ -1295,6 +1304,7 @@ struct iwl_priv {
|
||||
u32 disable_tx_power_cal;
|
||||
struct work_struct run_time_calib_work;
|
||||
struct timer_list statistics_periodic;
|
||||
+ struct timer_list monitor_recover;
|
||||
bool hw_ready;
|
||||
/*For 3945*/
|
||||
#define IWL_DEFAULT_TX_POWER 0x0F
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-tx.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-tx.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-tx.c.orig 2010-04-13 14:33:10.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-tx.c 2010-04-13 14:33:49.000000000 -0400
|
||||
@@ -288,6 +288,8 @@ static int iwl_queue_init(struct iwl_pri
|
||||
q->high_mark = 2;
|
||||
|
||||
q->write_ptr = q->read_ptr = 0;
|
||||
+ q->last_read_ptr = 0;
|
||||
+ q->repeat_same_read_ptr = 0;
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,394 @@
|
|||
Backport of the following upstream commit...
|
||||
|
||||
commit 3e4fb5faefb57824f2e42305b3d5907845af978c
|
||||
Author: Trieu 'Andrew' Nguyen <trieux.t.nguyen@intel.com>
|
||||
Date: Fri Jan 22 14:22:46 2010 -0800
|
||||
|
||||
iwlwifi: Tune radio to prevent unexpected behavior
|
||||
|
||||
We have seen the throughput dropped due to external noisy environment
|
||||
and the radio is out of tune. There are lot of plcp errors indicating
|
||||
this condition. Eventually the station can get de-authenticated by the
|
||||
Access Point. By resetting and tuning the radio, the plcp errors are
|
||||
reduced or eliminated and the throughput starts to rise.
|
||||
|
||||
To prevent unexpected behavior such as drop in throughput or deauthentication,
|
||||
- The change provides the driver feature to monitor and tune the radio base on
|
||||
the statistics notification from the uCode.
|
||||
- It also allows the setting of the plcp error rate threshold via
|
||||
the plcp_delta under debugfs interface.
|
||||
|
||||
Signed-off-by: Trieu 'Andrew' Nguyen <trieux.t.nguyen@intel.com>
|
||||
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||
Signed-off-by: John W. Linville <linville@tuxdriver.com>
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c.orig 2010-04-13 14:30:36.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c 2010-04-13 14:30:41.000000000 -0400
|
||||
@@ -174,6 +174,7 @@ struct iwl_cfg iwl1000_bgn_cfg = {
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.support_ct_kill_exit = true,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl1000_bg_cfg = {
|
||||
@@ -200,6 +201,7 @@ struct iwl_cfg iwl1000_bg_cfg = {
|
||||
.led_compensation = 51,
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.support_ct_kill_exit = true,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL1000_MODULE_FIRMWARE(IWL1000_UCODE_API_MAX));
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-3945.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-3945.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-3945.c.orig 2010-04-13 14:30:36.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-3945.c 2010-04-13 14:30:41.000000000 -0400
|
||||
@@ -2828,6 +2828,7 @@ static struct iwl_cfg iwl3945_bg_cfg = {
|
||||
.ht_greenfield_support = false,
|
||||
.led_compensation = 64,
|
||||
.broken_powersave = true,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
static struct iwl_cfg iwl3945_abg_cfg = {
|
||||
@@ -2845,6 +2846,7 @@ static struct iwl_cfg iwl3945_abg_cfg =
|
||||
.ht_greenfield_support = false,
|
||||
.led_compensation = 64,
|
||||
.broken_powersave = true,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
struct pci_device_id iwl3945_hw_card_ids[] = {
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c.orig 2010-04-13 14:30:36.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c 2010-04-13 14:30:41.000000000 -0400
|
||||
@@ -2247,6 +2247,7 @@ struct iwl_cfg iwl4965_agn_cfg = {
|
||||
.led_compensation = 61,
|
||||
.chain_noise_num_beacons = IWL4965_CAL_NUM_BEACONS,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
/* Module firmware */
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c.orig 2010-04-13 14:30:36.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c 2010-04-13 14:30:41.000000000 -0400
|
||||
@@ -1606,6 +1606,7 @@ struct iwl_cfg iwl5300_agn_cfg = {
|
||||
.use_rts_for_ht = true, /* use rts/cts protection */
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl5100_bgn_cfg = {
|
||||
@@ -1630,6 +1631,7 @@ struct iwl_cfg iwl5100_bgn_cfg = {
|
||||
.led_compensation = 51,
|
||||
.use_rts_for_ht = true, /* use rts/cts protection */
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl5100_abg_cfg = {
|
||||
@@ -1652,6 +1654,7 @@ struct iwl_cfg iwl5100_abg_cfg = {
|
||||
.use_bsm = false,
|
||||
.led_compensation = 51,
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl5100_agn_cfg = {
|
||||
@@ -1677,6 +1680,7 @@ struct iwl_cfg iwl5100_agn_cfg = {
|
||||
.use_rts_for_ht = true, /* use rts/cts protection */
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl5350_agn_cfg = {
|
||||
@@ -1702,6 +1706,7 @@ struct iwl_cfg iwl5350_agn_cfg = {
|
||||
.use_rts_for_ht = true, /* use rts/cts protection */
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl5150_agn_cfg = {
|
||||
@@ -1727,6 +1732,7 @@ struct iwl_cfg iwl5150_agn_cfg = {
|
||||
.use_rts_for_ht = true, /* use rts/cts protection */
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl5150_abg_cfg = {
|
||||
@@ -1749,6 +1755,7 @@ struct iwl_cfg iwl5150_abg_cfg = {
|
||||
.use_bsm = false,
|
||||
.led_compensation = 51,
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE(IWL5000_UCODE_API_MAX));
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c.orig 2010-04-13 14:30:36.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c 2010-04-13 14:32:09.000000000 -0400
|
||||
@@ -307,6 +307,7 @@ struct iwl_cfg iwl6000i_2agn_cfg = {
|
||||
.adv_thermal_throttle = true,
|
||||
.support_ct_kill_exit = true,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6000i_2abg_cfg = {
|
||||
@@ -336,6 +337,7 @@ struct iwl_cfg iwl6000i_2abg_cfg = {
|
||||
.supports_idle = true,
|
||||
.adv_thermal_throttle = true,
|
||||
.support_ct_kill_exit = true,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6000i_2bg_cfg = {
|
||||
@@ -365,6 +367,7 @@ struct iwl_cfg iwl6000i_2bg_cfg = {
|
||||
.supports_idle = true,
|
||||
.adv_thermal_throttle = true,
|
||||
.support_ct_kill_exit = true,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6050_2agn_cfg = {
|
||||
@@ -396,6 +399,7 @@ struct iwl_cfg iwl6050_2agn_cfg = {
|
||||
.adv_thermal_throttle = true,
|
||||
.support_ct_kill_exit = true,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DYNAMIC,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6050_2abg_cfg = {
|
||||
@@ -425,6 +429,7 @@ struct iwl_cfg iwl6050_2abg_cfg = {
|
||||
.supports_idle = true,
|
||||
.adv_thermal_throttle = true,
|
||||
.support_ct_kill_exit = true,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6000_3agn_cfg = {
|
||||
@@ -456,6 +461,7 @@ struct iwl_cfg iwl6000_3agn_cfg = {
|
||||
.adv_thermal_throttle = true,
|
||||
.support_ct_kill_exit = true,
|
||||
.sm_ps_mode = WLAN_HT_CAP_SM_PS_DISABLED,
|
||||
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig 2010-04-13 14:30:36.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h 2010-04-13 14:30:41.000000000 -0400
|
||||
@@ -232,6 +232,8 @@ struct iwl_mod_params {
|
||||
* @support_ct_kill_exit: support ct kill exit condition
|
||||
* @sm_ps_mode: spatial multiplexing power save mode
|
||||
* @support_wimax_coexist: support wimax/wifi co-exist
|
||||
+ * @plcp_delta_threshold: plcp error rate threshold used to trigger
|
||||
+ * radio tuning when there is a high receiving plcp error rate
|
||||
*
|
||||
* We enable the driver to be backward compatible wrt API version. The
|
||||
* driver specifies which APIs it supports (with @ucode_api_max being the
|
||||
@@ -289,6 +291,7 @@ struct iwl_cfg {
|
||||
bool support_ct_kill_exit;
|
||||
u8 sm_ps_mode;
|
||||
const bool support_wimax_coexist;
|
||||
+ u8 plcp_delta_threshold;
|
||||
};
|
||||
|
||||
/***************************
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debugfs.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debugfs.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debugfs.c.orig 2010-04-13 14:30:36.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debugfs.c 2010-04-13 14:30:41.000000000 -0400
|
||||
@@ -1866,6 +1866,47 @@ static ssize_t iwl_dbgfs_internal_scan_w
|
||||
return count;
|
||||
}
|
||||
|
||||
+static ssize_t iwl_dbgfs_plcp_delta_read(struct file *file,
|
||||
+ char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos) {
|
||||
+
|
||||
+ struct iwl_priv *priv = (struct iwl_priv *)file->private_data;
|
||||
+ int pos = 0;
|
||||
+ char buf[12];
|
||||
+ const size_t bufsz = sizeof(buf);
|
||||
+ ssize_t ret;
|
||||
+
|
||||
+ pos += scnprintf(buf + pos, bufsz - pos, "%u\n",
|
||||
+ priv->cfg->plcp_delta_threshold);
|
||||
+
|
||||
+ ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static ssize_t iwl_dbgfs_plcp_delta_write(struct file *file,
|
||||
+ const char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos) {
|
||||
+
|
||||
+ struct iwl_priv *priv = file->private_data;
|
||||
+ char buf[8];
|
||||
+ int buf_size;
|
||||
+ int plcp;
|
||||
+
|
||||
+ memset(buf, 0, sizeof(buf));
|
||||
+ buf_size = min(count, sizeof(buf) - 1);
|
||||
+ if (copy_from_user(buf, user_buf, buf_size))
|
||||
+ return -EFAULT;
|
||||
+ if (sscanf(buf, "%d", &plcp) != 1)
|
||||
+ return -EINVAL;
|
||||
+ if ((plcp <= IWL_MAX_PLCP_ERR_THRESHOLD_MIN) ||
|
||||
+ (plcp > IWL_MAX_PLCP_ERR_THRESHOLD_MAX))
|
||||
+ priv->cfg->plcp_delta_threshold =
|
||||
+ IWL_MAX_PLCP_ERR_THRESHOLD_DEF;
|
||||
+ else
|
||||
+ priv->cfg->plcp_delta_threshold = plcp;
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
DEBUGFS_READ_FILE_OPS(rx_statistics);
|
||||
DEBUGFS_READ_FILE_OPS(tx_statistics);
|
||||
DEBUGFS_READ_WRITE_FILE_OPS(traffic_log);
|
||||
@@ -1881,6 +1922,7 @@ DEBUGFS_READ_FILE_OPS(power_save_status)
|
||||
DEBUGFS_WRITE_FILE_OPS(clear_ucode_statistics);
|
||||
DEBUGFS_WRITE_FILE_OPS(clear_traffic_statistics);
|
||||
DEBUGFS_WRITE_FILE_OPS(internal_scan);
|
||||
+DEBUGFS_READ_WRITE_FILE_OPS(plcp_delta);
|
||||
|
||||
/*
|
||||
* Create the debugfs files and directories
|
||||
@@ -1932,6 +1974,7 @@ int iwl_dbgfs_register(struct iwl_priv *
|
||||
DEBUGFS_ADD_FILE(clear_ucode_statistics, debug, S_IWUSR);
|
||||
DEBUGFS_ADD_FILE(clear_traffic_statistics, debug, S_IWUSR);
|
||||
DEBUGFS_ADD_FILE(internal_scan, debug, S_IWUSR);
|
||||
+ DEBUGFS_ADD_FILE(plcp_delta, debug, S_IWUSR | S_IRUSR);
|
||||
if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) {
|
||||
DEBUGFS_ADD_FILE(ucode_rx_stats, debug, S_IRUSR);
|
||||
DEBUGFS_ADD_FILE(ucode_tx_stats, debug, S_IRUSR);
|
||||
@@ -1990,6 +2033,7 @@ void iwl_dbgfs_unregister(struct iwl_pri
|
||||
DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.
|
||||
file_clear_traffic_statistics);
|
||||
DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_internal_scan);
|
||||
+ DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_plcp_delta);
|
||||
if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) {
|
||||
DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.
|
||||
file_ucode_rx_stats);
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debug.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debug.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debug.h.orig 2010-04-13 14:30:36.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debug.h 2010-04-13 14:30:41.000000000 -0400
|
||||
@@ -110,6 +110,7 @@ struct iwl_debugfs {
|
||||
struct dentry *file_clear_ucode_statistics;
|
||||
struct dentry *file_clear_traffic_statistics;
|
||||
struct dentry *file_internal_scan;
|
||||
+ struct dentry *file_plcp_delta;
|
||||
} dbgfs_debug_files;
|
||||
u32 sram_offset;
|
||||
u32 sram_len;
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig 2010-04-13 14:30:36.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h 2010-04-13 14:30:41.000000000 -0400
|
||||
@@ -984,6 +984,15 @@ struct iwl_switch_rxon {
|
||||
__le16 channel;
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * This is the threshold value of plcp error rate per 100mSecs. It is
|
||||
+ * used to set and check for the validity of plcp_delta.
|
||||
+ */
|
||||
+#define IWL_MAX_PLCP_ERR_THRESHOLD_MIN (0)
|
||||
+#define IWL_MAX_PLCP_ERR_THRESHOLD_DEF (50)
|
||||
+#define IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF (100)
|
||||
+#define IWL_MAX_PLCP_ERR_THRESHOLD_MAX (255)
|
||||
+
|
||||
struct iwl_priv {
|
||||
|
||||
/* ieee device used by generic ieee processing code */
|
||||
@@ -1012,6 +1021,9 @@ struct iwl_priv {
|
||||
/* ucode beacon time */
|
||||
u32 ucode_beacon_time;
|
||||
|
||||
+ /* storing the jiffies when the plcp error rate is received */
|
||||
+ unsigned long plcp_jiffies;
|
||||
+
|
||||
/* we allocate array of iwl4965_channel_info for NIC's valid channels.
|
||||
* Access via channel # using indirect index array */
|
||||
struct iwl_channel_info *channel_info; /* channel info array */
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig 2010-04-13 14:30:36.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c 2010-04-13 14:30:41.000000000 -0400
|
||||
@@ -593,11 +593,15 @@ static void iwl_accumulative_statistics(
|
||||
|
||||
#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)
|
||||
{
|
||||
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),
|
||||
@@ -612,6 +616,56 @@ void iwl_rx_statistics(struct iwl_priv *
|
||||
#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.
|
||||
+ */
|
||||
+ plcp_received_jiffies = jiffies;
|
||||
+ plcp_msec = jiffies_to_msecs((long) plcp_received_jiffies -
|
||||
+ (long) priv->plcp_jiffies);
|
||||
+ priv->plcp_jiffies = plcp_received_jiffies;
|
||||
+ /*
|
||||
+ * check to make sure plcp_msec is not 0 to prevent division
|
||||
+ * by zero.
|
||||
+ */
|
||||
+ if (plcp_msec) {
|
||||
+ combined_plcp_delta =
|
||||
+ (le32_to_cpu(pkt->u.stats.rx.ofdm.plcp_err) -
|
||||
+ 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));
|
||||
+
|
||||
+ if ((combined_plcp_delta > 0) &&
|
||||
+ ((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:
|
||||
+ * Text: plcp_err exceeded %d,
|
||||
+ * Received ofdm.plcp_err,
|
||||
+ * Current ofdm.plcp_err,
|
||||
+ * Received ofdm_ht.plcp_err,
|
||||
+ * Current ofdm_ht.plcp_err,
|
||||
+ * combined_plcp_delta,
|
||||
+ * plcp_msec
|
||||
+ */
|
||||
+ IWL_DEBUG_RADIO(priv, PLCP_MSG,
|
||||
+ priv->cfg->plcp_delta_threshold,
|
||||
+ le32_to_cpu(pkt->u.stats.rx.ofdm.plcp_err),
|
||||
+ 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),
|
||||
+ combined_plcp_delta, plcp_msec);
|
||||
+
|
||||
+ /*
|
||||
+ * Reset the RF radio due to the high plcp
|
||||
+ * error rate
|
||||
+ */
|
||||
+ iwl_force_rf_reset(priv);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
memcpy(&priv->statistics, &pkt->u.stats, sizeof(priv->statistics));
|
||||
|
||||
set_bit(STATUS_STATISTICS, &priv->status);
|
|
@ -0,0 +1,374 @@
|
|||
Backport of the following upstream commit...
|
||||
|
||||
commit afbdd69af0e6a0c40676d4d4b94a0a4414708eaa
|
||||
Author: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
Date: Fri Jan 22 14:22:43 2010 -0800
|
||||
|
||||
iwlwifi: add function to reset/tune radio if needed
|
||||
|
||||
Adding "radio reset" function to help reset and stabilize the radio.
|
||||
|
||||
During normal operation, sometime for unknown reason, radio encounter
|
||||
problem and can not recover by itself; the best way to
|
||||
recover from it is to reset and re-tune the radio. Currently, there is
|
||||
no RF reset command available, but since radio will get reset when
|
||||
switching channel, use internal hw scan request to force radio
|
||||
reset and get back to normal operation state.
|
||||
|
||||
The internal hw scan will only perform passive scan on the first
|
||||
available channel (not the channel being used) in associated state. The
|
||||
request should be ignored if already performing scan operation or STA is
|
||||
not in associated state.
|
||||
|
||||
Also include an "internal_scan" debugfs file to help trigger the
|
||||
internal scan from user mode.
|
||||
|
||||
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||
Signed-off-by: John W. Linville <linville@tuxdriver.com>
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c.orig 2010-04-13 11:41:15.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c 2010-04-13 11:53:36.000000000 -0400
|
||||
@@ -3197,6 +3197,30 @@ void iwl_update_stats(struct iwl_priv *p
|
||||
EXPORT_SYMBOL(iwl_update_stats);
|
||||
#endif
|
||||
|
||||
+void iwl_force_rf_reset(struct iwl_priv *priv)
|
||||
+{
|
||||
+ if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
+ return;
|
||||
+
|
||||
+ if (!iwl_is_associated(priv)) {
|
||||
+ IWL_DEBUG_SCAN(priv, "force reset rejected: not associated\n");
|
||||
+ return;
|
||||
+ }
|
||||
+ /*
|
||||
+ * There is no easy and better way to force reset the radio,
|
||||
+ * the only known method is switching channel which will force to
|
||||
+ * reset and tune the radio.
|
||||
+ * Use internal short scan (single channel) operation to should
|
||||
+ * achieve this objective.
|
||||
+ * Driver should reset the radio when number of consecutive missed
|
||||
+ * beacon, or any other uCode error condition detected.
|
||||
+ */
|
||||
+ IWL_DEBUG_INFO(priv, "perform radio reset.\n");
|
||||
+ iwl_internal_short_hw_scan(priv);
|
||||
+ return;
|
||||
+}
|
||||
+EXPORT_SYMBOL(iwl_force_rf_reset);
|
||||
+
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig 2010-02-24 13:52:17.000000000 -0500
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h 2010-04-13 11:53:36.000000000 -0400
|
||||
@@ -497,6 +497,8 @@ void iwl_init_scan_params(struct iwl_pri
|
||||
int iwl_scan_cancel(struct iwl_priv *priv);
|
||||
int iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms);
|
||||
int iwl_mac_hw_scan(struct ieee80211_hw *hw, struct cfg80211_scan_request *req);
|
||||
+int iwl_internal_short_hw_scan(struct iwl_priv *priv);
|
||||
+void iwl_force_rf_reset(struct iwl_priv *priv);
|
||||
u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame,
|
||||
const u8 *ie, int ie_len, int left);
|
||||
void iwl_setup_rx_scan_handlers(struct iwl_priv *priv);
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debugfs.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debugfs.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debugfs.c.orig 2010-02-24 13:52:17.000000000 -0500
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debugfs.c 2010-04-13 11:56:15.000000000 -0400
|
||||
@@ -1845,6 +1845,27 @@ static ssize_t iwl_dbgfs_clear_ucode_sta
|
||||
return count;
|
||||
}
|
||||
|
||||
+static ssize_t iwl_dbgfs_internal_scan_write(struct file *file,
|
||||
+ const char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct iwl_priv *priv = file->private_data;
|
||||
+ char buf[8];
|
||||
+ int buf_size;
|
||||
+ int scan;
|
||||
+
|
||||
+ memset(buf, 0, sizeof(buf));
|
||||
+ buf_size = min(count, sizeof(buf) - 1);
|
||||
+ if (copy_from_user(buf, user_buf, buf_size))
|
||||
+ return -EFAULT;
|
||||
+ if (sscanf(buf, "%d", &scan) != 1)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ iwl_internal_short_hw_scan(priv);
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
DEBUGFS_READ_FILE_OPS(rx_statistics);
|
||||
DEBUGFS_READ_FILE_OPS(tx_statistics);
|
||||
DEBUGFS_READ_WRITE_FILE_OPS(traffic_log);
|
||||
@@ -1859,6 +1880,7 @@ DEBUGFS_READ_FILE_OPS(tx_power);
|
||||
DEBUGFS_READ_FILE_OPS(power_save_status);
|
||||
DEBUGFS_WRITE_FILE_OPS(clear_ucode_statistics);
|
||||
DEBUGFS_WRITE_FILE_OPS(clear_traffic_statistics);
|
||||
+DEBUGFS_WRITE_FILE_OPS(internal_scan);
|
||||
|
||||
/*
|
||||
* Create the debugfs files and directories
|
||||
@@ -1909,6 +1931,7 @@ int iwl_dbgfs_register(struct iwl_priv *
|
||||
DEBUGFS_ADD_FILE(power_save_status, debug, S_IRUSR);
|
||||
DEBUGFS_ADD_FILE(clear_ucode_statistics, debug, S_IWUSR);
|
||||
DEBUGFS_ADD_FILE(clear_traffic_statistics, debug, S_IWUSR);
|
||||
+ DEBUGFS_ADD_FILE(internal_scan, debug, S_IWUSR);
|
||||
if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) {
|
||||
DEBUGFS_ADD_FILE(ucode_rx_stats, debug, S_IRUSR);
|
||||
DEBUGFS_ADD_FILE(ucode_tx_stats, debug, S_IRUSR);
|
||||
@@ -1966,6 +1989,7 @@ void iwl_dbgfs_unregister(struct iwl_pri
|
||||
file_clear_ucode_statistics);
|
||||
DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.
|
||||
file_clear_traffic_statistics);
|
||||
+ DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_internal_scan);
|
||||
if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) {
|
||||
DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.
|
||||
file_ucode_rx_stats);
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debug.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debug.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debug.h.orig 2010-02-24 13:52:17.000000000 -0500
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-debug.h 2010-04-13 11:54:48.000000000 -0400
|
||||
@@ -109,6 +109,7 @@ struct iwl_debugfs {
|
||||
struct dentry *file_power_save_status;
|
||||
struct dentry *file_clear_ucode_statistics;
|
||||
struct dentry *file_clear_traffic_statistics;
|
||||
+ struct dentry *file_internal_scan;
|
||||
} dbgfs_debug_files;
|
||||
u32 sram_offset;
|
||||
u32 sram_len;
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig 2010-02-24 13:52:17.000000000 -0500
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h 2010-04-13 11:53:36.000000000 -0400
|
||||
@@ -1037,6 +1037,7 @@ struct iwl_priv {
|
||||
void *scan;
|
||||
int scan_bands;
|
||||
struct cfg80211_scan_request *scan_request;
|
||||
+ bool is_internal_short_scan;
|
||||
u8 scan_tx_ant[IEEE80211_NUM_BANDS];
|
||||
u8 mgmt_tx_ant;
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c.orig 2010-02-24 13:52:17.000000000 -0500
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c 2010-04-13 11:53:36.000000000 -0400
|
||||
@@ -314,6 +314,72 @@ u16 iwl_get_passive_dwell_time(struct iw
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_get_passive_dwell_time);
|
||||
|
||||
+static int iwl_get_single_channel_for_scan(struct iwl_priv *priv,
|
||||
+ enum ieee80211_band band,
|
||||
+ struct iwl_scan_channel *scan_ch)
|
||||
+{
|
||||
+ const struct ieee80211_supported_band *sband;
|
||||
+ const struct iwl_channel_info *ch_info;
|
||||
+ u16 passive_dwell = 0;
|
||||
+ u16 active_dwell = 0;
|
||||
+ int i, added = 0;
|
||||
+ u16 channel = 0;
|
||||
+
|
||||
+ sband = iwl_get_hw_mode(priv, band);
|
||||
+ if (!sband) {
|
||||
+ IWL_ERR(priv, "invalid band\n");
|
||||
+ return added;
|
||||
+ }
|
||||
+
|
||||
+ active_dwell = iwl_get_active_dwell_time(priv, band, 0);
|
||||
+ passive_dwell = iwl_get_passive_dwell_time(priv, band);
|
||||
+
|
||||
+ if (passive_dwell <= active_dwell)
|
||||
+ passive_dwell = active_dwell + 1;
|
||||
+
|
||||
+ /* only scan single channel, good enough to reset the RF */
|
||||
+ /* pick the first valid not in-use channel */
|
||||
+ if (band == IEEE80211_BAND_5GHZ) {
|
||||
+ for (i = 14; i < priv->channel_count; i++) {
|
||||
+ if (priv->channel_info[i].channel !=
|
||||
+ le16_to_cpu(priv->staging_rxon.channel)) {
|
||||
+ channel = priv->channel_info[i].channel;
|
||||
+ ch_info = iwl_get_channel_info(priv,
|
||||
+ band, channel);
|
||||
+ if (is_channel_valid(ch_info))
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ } else {
|
||||
+ for (i = 0; i < 14; i++) {
|
||||
+ if (priv->channel_info[i].channel !=
|
||||
+ le16_to_cpu(priv->staging_rxon.channel)) {
|
||||
+ channel =
|
||||
+ priv->channel_info[i].channel;
|
||||
+ ch_info = iwl_get_channel_info(priv,
|
||||
+ band, channel);
|
||||
+ if (is_channel_valid(ch_info))
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ if (channel) {
|
||||
+ scan_ch->channel = cpu_to_le16(channel);
|
||||
+ scan_ch->type = SCAN_CHANNEL_TYPE_PASSIVE;
|
||||
+ scan_ch->active_dwell = cpu_to_le16(active_dwell);
|
||||
+ scan_ch->passive_dwell = cpu_to_le16(passive_dwell);
|
||||
+ /* Set txpower levels to defaults */
|
||||
+ scan_ch->dsp_atten = 110;
|
||||
+ if (band == IEEE80211_BAND_5GHZ)
|
||||
+ scan_ch->tx_gain = ((1 << 5) | (3 << 3)) | 3;
|
||||
+ else
|
||||
+ scan_ch->tx_gain = ((1 << 5) | (5 << 3));
|
||||
+ added++;
|
||||
+ } else
|
||||
+ IWL_ERR(priv, "no valid channel found\n");
|
||||
+ return added;
|
||||
+}
|
||||
+
|
||||
static int iwl_get_channels_for_scan(struct iwl_priv *priv,
|
||||
enum ieee80211_band band,
|
||||
u8 is_active, u8 n_probes,
|
||||
@@ -421,6 +487,7 @@ static int iwl_scan_initiate(struct iwl_
|
||||
|
||||
IWL_DEBUG_INFO(priv, "Starting scan...\n");
|
||||
set_bit(STATUS_SCANNING, &priv->status);
|
||||
+ priv->is_internal_short_scan = false;
|
||||
priv->scan_start = jiffies;
|
||||
priv->scan_pass_start = priv->scan_start;
|
||||
|
||||
@@ -488,6 +555,45 @@ out_unlock:
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_mac_hw_scan);
|
||||
|
||||
+/*
|
||||
+ * internal short scan, this function should only been called while associated.
|
||||
+ * It will reset and tune the radio to prevent possible RF related problem
|
||||
+ */
|
||||
+int iwl_internal_short_hw_scan(struct iwl_priv *priv)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ if (!iwl_is_ready_rf(priv)) {
|
||||
+ ret = -EIO;
|
||||
+ IWL_DEBUG_SCAN(priv, "not ready or exit pending\n");
|
||||
+ goto out;
|
||||
+ }
|
||||
+ if (test_bit(STATUS_SCANNING, &priv->status)) {
|
||||
+ IWL_DEBUG_SCAN(priv, "Scan already in progress.\n");
|
||||
+ ret = -EAGAIN;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) {
|
||||
+ IWL_DEBUG_SCAN(priv, "Scan request while abort pending\n");
|
||||
+ ret = -EAGAIN;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ priv->scan_bands = 0;
|
||||
+ if (priv->band == IEEE80211_BAND_5GHZ)
|
||||
+ priv->scan_bands |= BIT(IEEE80211_BAND_5GHZ);
|
||||
+ else
|
||||
+ priv->scan_bands |= BIT(IEEE80211_BAND_2GHZ);
|
||||
+
|
||||
+ IWL_DEBUG_SCAN(priv, "Start internal short scan...\n");
|
||||
+ set_bit(STATUS_SCANNING, &priv->status);
|
||||
+ priv->is_internal_short_scan = true;
|
||||
+ queue_work(priv->workqueue, &priv->request_scan);
|
||||
+
|
||||
+out:
|
||||
+ return ret;
|
||||
+}
|
||||
+EXPORT_SYMBOL(iwl_internal_short_hw_scan);
|
||||
+
|
||||
#define IWL_SCAN_CHECK_WATCHDOG (7 * HZ)
|
||||
|
||||
void iwl_bg_scan_check(struct work_struct *data)
|
||||
@@ -551,7 +657,8 @@ u16 iwl_fill_probe_req(struct iwl_priv *
|
||||
if (WARN_ON(left < ie_len))
|
||||
return len;
|
||||
|
||||
- memcpy(pos, ies, ie_len);
|
||||
+ if (ies)
|
||||
+ memcpy(pos, ies, ie_len);
|
||||
len += ie_len;
|
||||
left -= ie_len;
|
||||
|
||||
@@ -654,7 +761,6 @@ static void iwl_bg_request_scan(struct w
|
||||
unsigned long flags;
|
||||
|
||||
IWL_DEBUG_INFO(priv, "Scanning while associated...\n");
|
||||
-
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
interval = priv->beacon_int;
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
@@ -672,7 +778,9 @@ static void iwl_bg_request_scan(struct w
|
||||
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++) {
|
||||
@@ -753,24 +861,38 @@ static void iwl_bg_request_scan(struct w
|
||||
rx_chain |= rx_ant << RXON_RX_CHAIN_FORCE_SEL_POS;
|
||||
rx_chain |= 0x1 << RXON_RX_CHAIN_DRIVER_FORCE_POS;
|
||||
scan->rx_chain = cpu_to_le16(rx_chain);
|
||||
- cmd_len = 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));
|
||||
+ if (!priv->is_internal_short_scan) {
|
||||
+ cmd_len = 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 {
|
||||
+ cmd_len = iwl_fill_probe_req(priv,
|
||||
+ (struct ieee80211_mgmt *)scan->data,
|
||||
+ NULL, 0,
|
||||
+ IWL_MAX_SCAN_SIZE - sizeof(*scan));
|
||||
|
||||
+ }
|
||||
scan->tx_cmd.len = cpu_to_le16(cmd_len);
|
||||
-
|
||||
if (iwl_is_monitor_mode(priv))
|
||||
scan->filter_flags = RXON_FILTER_PROMISC_MSK;
|
||||
|
||||
scan->filter_flags |= (RXON_FILTER_ACCEPT_GRP_MSK |
|
||||
RXON_FILTER_BCON_AWARE_MSK);
|
||||
|
||||
- scan->channel_count =
|
||||
- iwl_get_channels_for_scan(priv, band, is_active, n_probes,
|
||||
- (void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)]);
|
||||
-
|
||||
+ if (priv->is_internal_short_scan) {
|
||||
+ scan->channel_count =
|
||||
+ iwl_get_single_channel_for_scan(priv, band,
|
||||
+ (void *)&scan->data[le16_to_cpu(
|
||||
+ scan->tx_cmd.len)]);
|
||||
+ } else {
|
||||
+ scan->channel_count =
|
||||
+ iwl_get_channels_for_scan(priv, band,
|
||||
+ is_active, n_probes,
|
||||
+ (void *)&scan->data[le16_to_cpu(
|
||||
+ scan->tx_cmd.len)]);
|
||||
+ }
|
||||
if (scan->channel_count == 0) {
|
||||
IWL_DEBUG_SCAN(priv, "channel count %d\n", scan->channel_count);
|
||||
goto done;
|
||||
@@ -831,7 +953,12 @@ void iwl_bg_scan_completed(struct work_s
|
||||
|
||||
cancel_delayed_work(&priv->scan_check);
|
||||
|
||||
- ieee80211_scan_completed(priv->hw, false);
|
||||
+ if (!priv->is_internal_short_scan)
|
||||
+ ieee80211_scan_completed(priv->hw, false);
|
||||
+ else {
|
||||
+ priv->is_internal_short_scan = false;
|
||||
+ IWL_DEBUG_SCAN(priv, "internal short scan completed\n");
|
||||
+ }
|
||||
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
return;
|
|
@ -0,0 +1,85 @@
|
|||
commit 4f4d4088b05155d4904e29d5c00316395ce32f27
|
||||
Author: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
Date: Wed Feb 24 08:28:30 2010 -0800
|
||||
|
||||
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>
|
||||
|
||||
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||
index dd33251..252df12 100644
|
||||
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||
@@ -2799,7 +2799,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;
|
||||
@@ -2827,7 +2826,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;
|
||||
}
|
||||
|
||||
@@ -2862,7 +2860,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;
|
||||
}
|
||||
}
|
||||
@@ -2905,7 +2903,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++) {
|
||||
@@ -2952,13 +2952,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);
|
||||
|
||||
@@ -2980,8 +2987,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,
|
|
@ -0,0 +1,254 @@
|
|||
Backport of the following upstream commit...
|
||||
|
||||
commit fa8f130c504223d25c116b3d23787f465dfb1317
|
||||
Author: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
Date: Fri Mar 5 14:22:46 2010 -0800
|
||||
|
||||
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>
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c.orig 2010-04-13 14:57:34.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c 2010-04-13 15:01:00.000000000 -0400
|
||||
@@ -139,7 +139,8 @@ static struct iwl_lib_ops iwl1000_lib =
|
||||
.set_ct_kill = iwl1000_set_ct_threshold,
|
||||
},
|
||||
.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_ops iwl1000_ops = {
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c.orig 2010-04-13 14:57:34.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c 2010-04-13 15:02:23.000000000 -0400
|
||||
@@ -2213,7 +2213,7 @@ static struct iwl_lib_ops iwl4965_lib =
|
||||
.temperature = iwl4965_temperature_calib,
|
||||
.set_ct_kill = iwl4965_set_ct_threshold,
|
||||
},
|
||||
- .recover_from_statistics = iwl_recover_from_statistics,
|
||||
+ .check_plcp_health = iwl_good_plcp_health,
|
||||
};
|
||||
|
||||
static struct iwl_ops iwl4965_ops = {
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c.orig 2010-04-13 14:57:34.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c 2010-04-13 15:01:00.000000000 -0400
|
||||
@@ -1507,7 +1507,8 @@ struct iwl_lib_ops iwl5000_lib = {
|
||||
.set_ct_kill = iwl5000_set_ct_threshold,
|
||||
},
|
||||
.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 = {
|
||||
@@ -1561,7 +1562,8 @@ static struct iwl_lib_ops iwl5150_lib =
|
||||
.set_ct_kill = iwl5150_set_ct_threshold,
|
||||
},
|
||||
.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_ops iwl5000_ops = {
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c.orig 2010-04-13 14:57:34.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c 2010-04-13 15:01:00.000000000 -0400
|
||||
@@ -251,7 +251,8 @@ static struct iwl_lib_ops iwl6000_lib =
|
||||
.set_ct_kill = iwl6000_set_ct_threshold,
|
||||
},
|
||||
.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_ops iwl6000_ops = {
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig 2010-04-13 14:57:34.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h 2010-04-13 15:04:33.000000000 -0400
|
||||
@@ -189,8 +189,11 @@ struct iwl_lib_ops {
|
||||
struct iwl_temp_ops temp_ops;
|
||||
/* 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);
|
||||
};
|
||||
|
||||
@@ -435,7 +438,9 @@ int iwl_tx_queue_reclaim(struct iwl_priv
|
||||
/* Handlers */
|
||||
void iwl_rx_missed_beacon_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 -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig 2010-04-13 14:57:34.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c 2010-04-13 15:01:00.000000000 -0400
|
||||
@@ -598,24 +598,18 @@ static void iwl_accumulative_statistics(
|
||||
#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 =
|
||||
@@ -638,13 +632,27 @@ void iwl_recover_from_statistics(struct
|
||||
|
||||
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
|
||||
@@ -679,7 +687,8 @@ void iwl_recover_from_statistics(struct
|
||||
* 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),
|
||||
@@ -687,15 +696,42 @@ void iwl_recover_from_statistics(struct
|
||||
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)
|
||||
@@ -717,8 +753,7 @@ void iwl_rx_statistics(struct iwl_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));
|
||||
|
|
@ -0,0 +1,140 @@
|
|||
Backport of the following upstream commit...
|
||||
|
||||
commit 872c8ddcbec06995c1c7caa3e41c921290a8b6df
|
||||
Author: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
Date: Tue Mar 16 10:46:31 2010 -0700
|
||||
|
||||
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>
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c.orig 2010-04-13 15:15:47.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c 2010-04-13 15:20:00.000000000 -0400
|
||||
@@ -1316,6 +1316,52 @@ static void iwl_irq_tasklet(struct iwl_p
|
||||
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->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);
|
||||
+
|
||||
+ 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 -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig 2010-04-13 15:15:47.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h 2010-04-13 15:18:13.000000000 -0400
|
||||
@@ -584,6 +584,8 @@ void iwl_disable_ict(struct iwl_priv *pr
|
||||
int iwl_alloc_isr_ict(struct iwl_priv *priv);
|
||||
void iwl_free_isr_ict(struct iwl_priv *priv);
|
||||
irqreturn_t iwl_isr_ict(int irq, void *data);
|
||||
+bool iwl_good_ack_health(struct iwl_priv *priv,
|
||||
+ struct iwl_rx_packet *pkt);
|
||||
|
||||
static inline u16 iwl_pcie_link_ctl(struct iwl_priv *priv)
|
||||
{
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig 2010-04-13 15:15:47.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c 2010-04-13 15:18:52.000000000 -0400
|
||||
@@ -593,53 +593,6 @@ static void iwl_accumulative_statistics(
|
||||
|
||||
#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->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);
|
||||
-
|
||||
- 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.
|
||||
*
|
|
@ -0,0 +1,186 @@
|
|||
Backport of the following upstream commit...
|
||||
|
||||
commit beac5498b792ed8420885ee23e8d4f2885ee2d13
|
||||
Author: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
Date: Thu Mar 4 13:38:58 2010 -0800
|
||||
|
||||
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>
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c.orig 2010-04-13 14:40:14.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c 2010-04-13 14:40:43.000000000 -0400
|
||||
@@ -139,6 +139,7 @@ static struct iwl_lib_ops iwl1000_lib =
|
||||
.set_ct_kill = iwl1000_set_ct_threshold,
|
||||
},
|
||||
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||
};
|
||||
|
||||
static struct iwl_ops iwl1000_ops = {
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c.orig 2010-04-13 14:40:14.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c 2010-04-13 14:41:23.000000000 -0400
|
||||
@@ -2213,6 +2213,7 @@ static struct iwl_lib_ops iwl4965_lib =
|
||||
.temperature = iwl4965_temperature_calib,
|
||||
.set_ct_kill = iwl4965_set_ct_threshold,
|
||||
},
|
||||
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||
};
|
||||
|
||||
static struct iwl_ops iwl4965_ops = {
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c.orig 2010-04-13 14:40:14.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c 2010-04-13 14:40:43.000000000 -0400
|
||||
@@ -1507,6 +1507,7 @@ struct iwl_lib_ops iwl5000_lib = {
|
||||
.set_ct_kill = iwl5000_set_ct_threshold,
|
||||
},
|
||||
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||
};
|
||||
|
||||
static struct iwl_lib_ops iwl5150_lib = {
|
||||
@@ -1560,6 +1561,7 @@ static struct iwl_lib_ops iwl5150_lib =
|
||||
.set_ct_kill = iwl5150_set_ct_threshold,
|
||||
},
|
||||
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||
};
|
||||
|
||||
static struct iwl_ops iwl5000_ops = {
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c.orig 2010-04-13 14:40:14.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c 2010-04-13 14:42:29.000000000 -0400
|
||||
@@ -251,6 +251,7 @@ static struct iwl_lib_ops iwl6000_lib =
|
||||
.set_ct_kill = iwl6000_set_ct_threshold,
|
||||
},
|
||||
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||
};
|
||||
|
||||
static struct iwl_ops iwl6000_ops = {
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig 2010-04-13 14:40:14.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h 2010-04-13 14:43:12.000000000 -0400
|
||||
@@ -189,6 +189,9 @@ struct iwl_lib_ops {
|
||||
struct iwl_temp_ops temp_ops;
|
||||
/* 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 {
|
||||
@@ -432,6 +435,8 @@ int iwl_tx_queue_reclaim(struct iwl_priv
|
||||
/* Handlers */
|
||||
void iwl_rx_missed_beacon_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 -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig 2010-04-13 14:40:14.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c 2010-04-13 14:40:43.000000000 -0400
|
||||
@@ -594,28 +594,18 @@ static void iwl_accumulative_statistics(
|
||||
#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.
|
||||
@@ -636,11 +626,11 @@ void iwl_rx_statistics(struct iwl_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,
|
||||
@@ -655,9 +645,8 @@ void iwl_rx_statistics(struct iwl_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
|
||||
@@ -665,6 +654,31 @@ void iwl_rx_statistics(struct iwl_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));
|
||||
|
|
@ -0,0 +1,172 @@
|
|||
Backport of the following upstream commit...
|
||||
|
||||
commit a93e7973d0983d22fcbe5f691244736211639fe7
|
||||
Author: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
Date: Wed Feb 3 11:47:19 2010 -0800
|
||||
|
||||
iwlwifi: multiple force reset mode
|
||||
|
||||
Provide the function to perform different type of uCode reset/reload operation.
|
||||
When uCode detect error and can not fix itself, this iwl_force_reset()
|
||||
function allow driver to perform the necessary reset/reload functions and help
|
||||
to bring uCode back to normal operation state.
|
||||
|
||||
Currently only 2 type of force reset are available:
|
||||
- reset radio
|
||||
- reload firmware
|
||||
|
||||
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c.orig 2010-04-13 13:36:35.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c 2010-04-13 13:38:40.000000000 -0400
|
||||
@@ -3197,7 +3197,7 @@ void iwl_update_stats(struct iwl_priv *p
|
||||
EXPORT_SYMBOL(iwl_update_stats);
|
||||
#endif
|
||||
|
||||
-void iwl_force_rf_reset(struct iwl_priv *priv)
|
||||
+static void iwl_force_rf_reset(struct iwl_priv *priv)
|
||||
{
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
return;
|
||||
@@ -3219,7 +3219,47 @@ void iwl_force_rf_reset(struct iwl_priv
|
||||
iwl_internal_short_hw_scan(priv);
|
||||
return;
|
||||
}
|
||||
-EXPORT_SYMBOL(iwl_force_rf_reset);
|
||||
+
|
||||
+#define IWL_DELAY_NEXT_FORCE_RESET (HZ*3)
|
||||
+
|
||||
+int iwl_force_reset(struct iwl_priv *priv, int mode)
|
||||
+{
|
||||
+ if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (priv->last_force_reset_jiffies &&
|
||||
+ time_after(priv->last_force_reset_jiffies +
|
||||
+ IWL_DELAY_NEXT_FORCE_RESET, jiffies)) {
|
||||
+ IWL_DEBUG_INFO(priv, "force reset rejected\n");
|
||||
+ return -EAGAIN;
|
||||
+ }
|
||||
+
|
||||
+ IWL_DEBUG_INFO(priv, "perform force reset (%d)\n", mode);
|
||||
+
|
||||
+ switch (mode) {
|
||||
+ case IWL_RF_RESET:
|
||||
+ iwl_force_rf_reset(priv);
|
||||
+ break;
|
||||
+ case IWL_FW_RESET:
|
||||
+ IWL_ERR(priv, "On demand firmware reload\n");
|
||||
+ /* Set the FW error flag -- cleared on iwl_down */
|
||||
+ set_bit(STATUS_FW_ERROR, &priv->status);
|
||||
+ wake_up_interruptible(&priv->wait_command_queue);
|
||||
+ /*
|
||||
+ * Keep the restart process from trying to send host
|
||||
+ * commands by clearing the INIT status bit
|
||||
+ */
|
||||
+ clear_bit(STATUS_READY, &priv->status);
|
||||
+ queue_work(priv->workqueue, &priv->restart);
|
||||
+ break;
|
||||
+ default:
|
||||
+ IWL_DEBUG_INFO(priv, "invalid reset request.\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ priv->last_force_reset_jiffies = jiffies;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig 2010-04-13 13:36:50.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.h 2010-04-13 13:38:40.000000000 -0400
|
||||
@@ -501,7 +501,7 @@ int iwl_scan_cancel(struct iwl_priv *pri
|
||||
int iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms);
|
||||
int iwl_mac_hw_scan(struct ieee80211_hw *hw, struct cfg80211_scan_request *req);
|
||||
int iwl_internal_short_hw_scan(struct iwl_priv *priv);
|
||||
-void iwl_force_rf_reset(struct iwl_priv *priv);
|
||||
+int iwl_force_reset(struct iwl_priv *priv, int mode);
|
||||
u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame,
|
||||
const u8 *ie, int ie_len, int left);
|
||||
void iwl_setup_rx_scan_handlers(struct iwl_priv *priv);
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig 2010-04-13 13:36:50.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h 2010-04-13 13:38:40.000000000 -0400
|
||||
@@ -993,6 +993,11 @@ struct iwl_switch_rxon {
|
||||
#define IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF (100)
|
||||
#define IWL_MAX_PLCP_ERR_THRESHOLD_MAX (255)
|
||||
|
||||
+enum iwl_reset {
|
||||
+ IWL_RF_RESET = 0,
|
||||
+ IWL_FW_RESET,
|
||||
+};
|
||||
+
|
||||
struct iwl_priv {
|
||||
|
||||
/* ieee device used by generic ieee processing code */
|
||||
@@ -1024,6 +1029,9 @@ struct iwl_priv {
|
||||
/* storing the jiffies when the plcp error rate is received */
|
||||
unsigned long plcp_jiffies;
|
||||
|
||||
+ /* force reset */
|
||||
+ unsigned long last_force_reset_jiffies;
|
||||
+
|
||||
/* we allocate array of iwl4965_channel_info for NIC's valid channels.
|
||||
* Access via channel # using indirect index array */
|
||||
struct iwl_channel_info *channel_info; /* channel info array */
|
||||
@@ -1046,7 +1054,6 @@ struct iwl_priv {
|
||||
unsigned long scan_start;
|
||||
unsigned long scan_pass_start;
|
||||
unsigned long scan_start_tsf;
|
||||
- unsigned long last_internal_scan_jiffies;
|
||||
void *scan;
|
||||
int scan_bands;
|
||||
struct cfg80211_scan_request *scan_request;
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig 2010-04-13 13:36:50.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c 2010-04-13 13:38:40.000000000 -0400
|
||||
@@ -662,7 +662,7 @@ void iwl_rx_statistics(struct iwl_priv *
|
||||
* Reset the RF radio due to the high plcp
|
||||
* error rate
|
||||
*/
|
||||
- iwl_force_rf_reset(priv);
|
||||
+ iwl_force_reset(priv, IWL_RF_RESET);
|
||||
}
|
||||
}
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c.orig 2010-04-13 13:36:42.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c 2010-04-13 13:38:40.000000000 -0400
|
||||
@@ -254,8 +254,6 @@ static void iwl_rx_scan_complete_notif(s
|
||||
priv->last_scan_jiffies = jiffies;
|
||||
if (!priv->is_internal_short_scan)
|
||||
priv->next_scan_jiffies = 0;
|
||||
- else
|
||||
- priv->last_internal_scan_jiffies = jiffies;
|
||||
|
||||
IWL_DEBUG_INFO(priv, "Setting scan to off\n");
|
||||
|
||||
@@ -564,8 +562,6 @@ EXPORT_SYMBOL(iwl_mac_hw_scan);
|
||||
* internal short scan, this function should only been called while associated.
|
||||
* It will reset and tune the radio to prevent possible RF related problem
|
||||
*/
|
||||
-#define IWL_DELAY_NEXT_INTERNAL_SCAN (HZ*1)
|
||||
-
|
||||
int iwl_internal_short_hw_scan(struct iwl_priv *priv)
|
||||
{
|
||||
int ret = 0;
|
||||
@@ -585,12 +581,6 @@ int iwl_internal_short_hw_scan(struct iw
|
||||
ret = -EAGAIN;
|
||||
goto out;
|
||||
}
|
||||
- if (priv->last_internal_scan_jiffies &&
|
||||
- time_after(priv->last_internal_scan_jiffies +
|
||||
- IWL_DELAY_NEXT_INTERNAL_SCAN, jiffies)) {
|
||||
- IWL_DEBUG_SCAN(priv, "internal scan rejected\n");
|
||||
- goto out;
|
||||
- }
|
||||
|
||||
priv->scan_bands = 0;
|
||||
if (priv->band == IEEE80211_BAND_5GHZ)
|
|
@ -0,0 +1,122 @@
|
|||
Backport of the following upstream commit...
|
||||
|
||||
commit 8a472da431998b7357e6dc562e79a3061ed56cad
|
||||
Author: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
Date: Thu Feb 18 22:03:06 2010 -0800
|
||||
|
||||
iwlwifi: separated time check for different type of force reset
|
||||
|
||||
Use different timing duration check for different type of force reset,
|
||||
force reset request can come from different source and based on
|
||||
different reason; one type of reset request should not block other type of
|
||||
reset request.
|
||||
|
||||
Adding structure to keep track of different force reset request.
|
||||
|
||||
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||
Signed-off-by: John W. Linville <linville@tuxdriver.com>
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c.orig 2010-04-13 13:44:14.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c 2010-04-13 13:47:34.000000000 -0400
|
||||
@@ -3189,6 +3189,12 @@ static int iwl_init_drv(struct iwl_priv
|
||||
|
||||
priv->iw_mode = NL80211_IFTYPE_STATION;
|
||||
|
||||
+ /* initialize force reset */
|
||||
+ priv->force_reset[IWL_RF_RESET].reset_duration =
|
||||
+ IWL_DELAY_NEXT_FORCE_RF_RESET;
|
||||
+ priv->force_reset[IWL_FW_RESET].reset_duration =
|
||||
+ IWL_DELAY_NEXT_FORCE_FW_RELOAD;
|
||||
+
|
||||
/* Choose which receivers/antennas to use */
|
||||
if (priv->cfg->ops->hcmd->set_rxon_chain)
|
||||
priv->cfg->ops->hcmd->set_rxon_chain(priv);
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c.orig 2010-04-13 13:44:14.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-core.c 2010-04-13 13:47:34.000000000 -0400
|
||||
@@ -3220,22 +3220,30 @@ static void iwl_force_rf_reset(struct iw
|
||||
return;
|
||||
}
|
||||
|
||||
-#define IWL_DELAY_NEXT_FORCE_RESET (HZ*3)
|
||||
|
||||
int iwl_force_reset(struct iwl_priv *priv, int mode)
|
||||
{
|
||||
+ struct iwl_force_reset *force_reset;
|
||||
+
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
return -EINVAL;
|
||||
|
||||
- if (priv->last_force_reset_jiffies &&
|
||||
- time_after(priv->last_force_reset_jiffies +
|
||||
- IWL_DELAY_NEXT_FORCE_RESET, jiffies)) {
|
||||
+ if (mode >= IWL_MAX_FORCE_RESET) {
|
||||
+ IWL_DEBUG_INFO(priv, "invalid reset request.\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ force_reset = &priv->force_reset[mode];
|
||||
+ force_reset->reset_request_count++;
|
||||
+ if (force_reset->last_force_reset_jiffies &&
|
||||
+ time_after(force_reset->last_force_reset_jiffies +
|
||||
+ force_reset->reset_duration, jiffies)) {
|
||||
IWL_DEBUG_INFO(priv, "force reset rejected\n");
|
||||
+ force_reset->reset_reject_count++;
|
||||
return -EAGAIN;
|
||||
}
|
||||
-
|
||||
+ force_reset->reset_success_count++;
|
||||
+ force_reset->last_force_reset_jiffies = jiffies;
|
||||
IWL_DEBUG_INFO(priv, "perform force reset (%d)\n", mode);
|
||||
-
|
||||
switch (mode) {
|
||||
case IWL_RF_RESET:
|
||||
iwl_force_rf_reset(priv);
|
||||
@@ -3252,12 +3260,7 @@ int iwl_force_reset(struct iwl_priv *pri
|
||||
clear_bit(STATUS_READY, &priv->status);
|
||||
queue_work(priv->workqueue, &priv->restart);
|
||||
break;
|
||||
- default:
|
||||
- IWL_DEBUG_INFO(priv, "invalid reset request.\n");
|
||||
- return -EINVAL;
|
||||
}
|
||||
- priv->last_force_reset_jiffies = jiffies;
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff -up linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||
--- linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig 2010-04-13 13:45:06.000000000 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h 2010-04-13 13:47:34.000000000 -0400
|
||||
@@ -994,9 +994,21 @@ struct iwl_switch_rxon {
|
||||
#define IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF (200)
|
||||
#define IWL_MAX_PLCP_ERR_THRESHOLD_MAX (255)
|
||||
|
||||
+#define IWL_DELAY_NEXT_FORCE_RF_RESET (HZ*3)
|
||||
+#define IWL_DELAY_NEXT_FORCE_FW_RELOAD (HZ*5)
|
||||
+
|
||||
enum iwl_reset {
|
||||
IWL_RF_RESET = 0,
|
||||
IWL_FW_RESET,
|
||||
+ IWL_MAX_FORCE_RESET,
|
||||
+};
|
||||
+
|
||||
+struct iwl_force_reset {
|
||||
+ int reset_request_count;
|
||||
+ int reset_success_count;
|
||||
+ int reset_reject_count;
|
||||
+ unsigned long reset_duration;
|
||||
+ unsigned long last_force_reset_jiffies;
|
||||
};
|
||||
|
||||
struct iwl_priv {
|
||||
@@ -1031,7 +1043,7 @@ struct iwl_priv {
|
||||
unsigned long plcp_jiffies;
|
||||
|
||||
/* force reset */
|
||||
- unsigned long last_force_reset_jiffies;
|
||||
+ struct iwl_force_reset force_reset[IWL_MAX_FORCE_RESET];
|
||||
|
||||
/* we allocate array of iwl4965_channel_info for NIC's valid channels.
|
||||
* Access via channel # using indirect index array */
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,52 @@
|
|||
From 567b1bbf982637ce3f0ac8597af91ae8106648c8 Mon Sep 17 00:00:00 2001
|
||||
From: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
|
||||
Date: Wed, 30 Jun 2010 16:02:45 +0800
|
||||
Subject: [PATCH] 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>
|
||||
---
|
||||
arch/x86/kvm/paging_tmpl.h | 1 +
|
||||
1 files changed, 1 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
|
||||
index ede2131..b473c0f 100644
|
||||
--- a/arch/x86/kvm/paging_tmpl.h
|
||||
+++ b/arch/x86/kvm/paging_tmpl.h
|
||||
@@ -336,6 +336,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];
|
||||
--
|
||||
1.7.1
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
commit 0c99c5288eb9b1bbc9684b0ec0fd7efc578749b3
|
||||
Author: Zhang Rui <rui.zhang@intel.com>
|
||||
Date: Thu Dec 17 16:02:08 2009 +0800
|
||||
|
||||
ACPI: Disable explicit power state retrieval on fans
|
||||
|
||||
If the ACPI power state can be got both directly and indirectly,
|
||||
we prefer to get it indirectly.
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=531916 describes a
|
||||
system with a _PSC method for the fan that always returns "on".
|
||||
There's no benefit in us always requesting the state of the fan
|
||||
when performing transitions - we want to do everything we can
|
||||
to ensure that the fan turns on when it should do, not risk
|
||||
hardware damage by believing the hardware when it tells us the
|
||||
fan is already on. Given that the Leading Other OS(tm) works fine
|
||||
on this machine, it seems likely that it behaves in much this way.
|
||||
|
||||
inspired-by: Matthew Garrett <mjg@redhat.com>
|
||||
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
|
||||
Signed-off-by: Len Brown <len.brown@intel.com>
|
||||
|
||||
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
|
||||
index cf761b9..ae9226d 100644
|
||||
--- a/drivers/acpi/bus.c
|
||||
+++ b/drivers/acpi/bus.c
|
||||
@@ -190,16 +190,16 @@ int acpi_bus_get_power(acpi_handle handle, int *state)
|
||||
* Get the device's power state either directly (via _PSC) or
|
||||
* indirectly (via power resources).
|
||||
*/
|
||||
- if (device->power.flags.explicit_get) {
|
||||
+ if (device->power.flags.power_resources) {
|
||||
+ result = acpi_power_get_inferred_state(device);
|
||||
+ if (result)
|
||||
+ return result;
|
||||
+ } else if (device->power.flags.explicit_get) {
|
||||
status = acpi_evaluate_integer(device->handle, "_PSC",
|
||||
NULL, &psc);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
device->power.state = (int)psc;
|
||||
- } else if (device->power.flags.power_resources) {
|
||||
- result = acpi_power_get_inferred_state(device);
|
||||
- if (result)
|
||||
- return result;
|
||||
}
|
||||
|
||||
*state = device->power.state;
|
|
@ -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,184 @@
|
|||
diff -up linux-2.6.33.noarch/drivers/acpi/video.c.orig linux-2.6.33.noarch/drivers/acpi/video.c
|
||||
--- linux-2.6.33.noarch/drivers/acpi/video.c.orig 2010-04-12 13:42:53.637966231 -0400
|
||||
+++ linux-2.6.33.noarch/drivers/acpi/video.c 2010-04-12 13:43:07.290978352 -0400
|
||||
@@ -43,6 +43,7 @@
|
||||
#include <linux/dmi.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
+#include <acpi/video.h>
|
||||
|
||||
#define PREFIX "ACPI: "
|
||||
|
||||
@@ -63,11 +64,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");
|
||||
|
||||
@@ -1731,11 +1727,27 @@ acpi_video_get_device_attr(struct acpi_v
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
@@ -1780,8 +1792,25 @@ acpi_video_bus_get_one_device(struct acp
|
||||
}
|
||||
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);
|
||||
@@ -2015,6 +2044,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 -up linux-2.6.33.noarch/include/acpi/video.h.orig linux-2.6.33.noarch/include/acpi/video.h
|
||||
--- linux-2.6.33.noarch/include/acpi/video.h.orig 2010-04-12 13:42:53.638966251 -0400
|
||||
+++ linux-2.6.33.noarch/include/acpi/video.h 2010-04-12 13:43:07.292841571 -0400
|
||||
@@ -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
|
|
@ -0,0 +1,58 @@
|
|||
--- linux-2.6.20/arch/ia64/kernel/quirks.c 1969-12-31 19:00:00.000000000 -0500
|
||||
+++ linux-2.6.20_fix/arch/ia64/kernel/quirks.c 2007-02-13 13:56:34.000000000 -0500
|
||||
@@ -0,0 +1,45 @@
|
||||
+/*
|
||||
+ * This file contains work-arounds for ia64 platform bugs.
|
||||
+ */
|
||||
+#include <linux/pci.h>
|
||||
+
|
||||
+/*
|
||||
+ * quirk_intel_ide_controller: If an ide/ata controller is
|
||||
+ * at legacy mode, BIOS might initiates BAR(bar 0~3 and 5)
|
||||
+ * with incorrect value. This quirk will reset the incorrect
|
||||
+ * value to 0.
|
||||
+ */
|
||||
+static void __devinit quirk_intel_ide_controller(struct pci_dev *dev)
|
||||
+{
|
||||
+ unsigned int pos;
|
||||
+ struct resource *res;
|
||||
+ int fixed = 0;
|
||||
+ u8 tmp8;
|
||||
+
|
||||
+ if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE)
|
||||
+ return;
|
||||
+
|
||||
+ /* TODO: What if one channel is in native mode ... */
|
||||
+ pci_read_config_byte(dev, PCI_CLASS_PROG, &tmp8);
|
||||
+ if ((tmp8 & 5) == 5)
|
||||
+ return;
|
||||
+
|
||||
+ for( pos = 0; pos < 6; pos ++ ) {
|
||||
+ res = &dev->resource[pos];
|
||||
+ if (!(res->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
|
||||
+ continue;
|
||||
+
|
||||
+ if (!res->start && res->end) {
|
||||
+ res->start = res->end = 0;
|
||||
+ res->flags = 0;
|
||||
+ fixed = 1;
|
||||
+ }
|
||||
+ }
|
||||
+ if (fixed)
|
||||
+ printk(KERN_WARNING
|
||||
+ "PCI device %s: BIOS resource configuration fixed.\n",
|
||||
+ pci_name(dev));
|
||||
+}
|
||||
+
|
||||
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_11, quirk_intel_ide_controller);
|
||||
+
|
||||
--- linux-2.6.21.noarch/arch/ia64/kernel/Makefile~ 2007-05-27 23:23:36.000000000 -0400
|
||||
+++ linux-2.6.21.noarch/arch/ia64/kernel/Makefile 2007-05-27 23:23:48.000000000 -0400
|
||||
@@ -33,6 +33,7 @@ obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
|
||||
obj-$(CONFIG_IA64_UNCACHED_ALLOCATOR) += uncached.o
|
||||
obj-$(CONFIG_AUDIT) += audit.o
|
||||
obj-$(CONFIG_PCI_MSI) += msi_ia64.o
|
||||
+obj-$(CONFIG_PCI) += quirks.o
|
||||
mca_recovery-y += mca_drv.o mca_drv_asm.o
|
||||
obj-$(CONFIG_IA64_MC_ERR_INJECT)+= err_inject.o
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -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,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,98 @@
|
|||
Date: Thu, 4 Mar 2010 03:23:46 -0500
|
||||
From: Amerigo Wang <amwang@redhat.com>
|
||||
To: linux-kernel@vger.kernel.org
|
||||
Cc: Dave Jones <davej@redhat.com>, cpufreq@vger.kernel.org,
|
||||
Amerigo Wang <amwang@redhat.com>,
|
||||
Johannes Berg <johannes@sipsolutions.net>, akpm@linux-foundation.org,
|
||||
Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
|
||||
Subject: [CPUFREQ] fix a lockdep warning
|
||||
|
||||
There is no need to do sysfs_remove_link() or kobject_put() etc.
|
||||
when policy_rwsem_write is held, move them after releasing the lock.
|
||||
|
||||
This fixes the lockdep warning:
|
||||
|
||||
halt/4071 is trying to acquire lock:
|
||||
(s_active){++++.+}, at: [<c0000000001ef868>] .sysfs_addrm_finish+0x58/0xc0
|
||||
|
||||
but task is already holding lock:
|
||||
(&per_cpu(cpu_policy_rwsem, cpu)){+.+.+.}, at: [<c0000000004cd6ac>] .lock_policy_rwsem_write+0x84/0xf4
|
||||
|
||||
Reported-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Signed-off-by: WANG Cong <amwang@redhat.com>
|
||||
Cc: Johannes Berg <johannes@sipsolutions.net>
|
||||
Cc: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
|
||||
Signed-off-by: Dave Jones <davej@redhat.com>
|
||||
|
||||
---
|
||||
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
|
||||
index 67bc2ec..e196084 100644
|
||||
--- a/drivers/cpufreq/cpufreq.c
|
||||
+++ b/drivers/cpufreq/cpufreq.c
|
||||
@@ -1113,6 +1113,8 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)
|
||||
unsigned int cpu = sys_dev->id;
|
||||
unsigned long flags;
|
||||
struct cpufreq_policy *data;
|
||||
+ struct kobject *kobj;
|
||||
+ struct completion *cmp;
|
||||
#ifdef CONFIG_SMP
|
||||
struct sys_device *cpu_sys_dev;
|
||||
unsigned int j;
|
||||
@@ -1141,10 +1143,11 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)
|
||||
dprintk("removing link\n");
|
||||
cpumask_clear_cpu(cpu, data->cpus);
|
||||
spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
||||
- sysfs_remove_link(&sys_dev->kobj, "cpufreq");
|
||||
+ kobj = &sys_dev->kobj;
|
||||
cpufreq_cpu_put(data);
|
||||
cpufreq_debug_enable_ratelimit();
|
||||
unlock_policy_rwsem_write(cpu);
|
||||
+ sysfs_remove_link(kobj, "cpufreq");
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
@@ -1181,7 +1184,10 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)
|
||||
data->governor->name, CPUFREQ_NAME_LEN);
|
||||
#endif
|
||||
cpu_sys_dev = get_cpu_sysdev(j);
|
||||
- sysfs_remove_link(&cpu_sys_dev->kobj, "cpufreq");
|
||||
+ kobj = &cpu_sys_dev->kobj;
|
||||
+ unlock_policy_rwsem_write(cpu);
|
||||
+ sysfs_remove_link(kobj, "cpufreq");
|
||||
+ lock_policy_rwsem_write(cpu);
|
||||
cpufreq_cpu_put(data);
|
||||
}
|
||||
}
|
||||
@@ -1192,19 +1198,22 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)
|
||||
if (cpufreq_driver->target)
|
||||
__cpufreq_governor(data, CPUFREQ_GOV_STOP);
|
||||
|
||||
- kobject_put(&data->kobj);
|
||||
+ kobj = &data->kobj;
|
||||
+ cmp = &data->kobj_unregister;
|
||||
+ unlock_policy_rwsem_write(cpu);
|
||||
+ kobject_put(kobj);
|
||||
|
||||
/* we need to make sure that the underlying kobj is actually
|
||||
* not referenced anymore by anybody before we proceed with
|
||||
* unloading.
|
||||
*/
|
||||
dprintk("waiting for dropping of refcount\n");
|
||||
- wait_for_completion(&data->kobj_unregister);
|
||||
+ wait_for_completion(cmp);
|
||||
dprintk("wait complete\n");
|
||||
|
||||
+ lock_policy_rwsem_write(cpu);
|
||||
if (cpufreq_driver->exit)
|
||||
cpufreq_driver->exit(data);
|
||||
-
|
||||
unlock_policy_rwsem_write(cpu);
|
||||
|
||||
free_cpumask_var(data->related_cpus);
|
||||
|
||||
|
||||
--
|
||||
To unsubscribe from this list: send the line "unsubscribe cpufreq" 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,363 @@
|
|||
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 14d39e3..cf3d040 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 334e63c..8e1ccbc 100644
|
||||
--- a/arch/x86/mm/ioremap.c
|
||||
+++ b/arch/x86/mm/ioremap.c
|
||||
@@ -60,6 +60,7 @@ int page_is_ram(unsigned long pagenr)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(page_is_ram);
|
||||
|
||||
/*
|
||||
* Fix up the linear direct mapping of the kernel to avoid cache attribute
|
||||
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
|
||||
index 08a6f50..8bc5e9a 100644
|
||||
--- a/drivers/char/Kconfig
|
||||
+++ b/drivers/char/Kconfig
|
||||
@@ -484,6 +484,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 19a79dd..0bee860 100644
|
||||
--- a/drivers/char/Makefile
|
||||
+++ b/drivers/char/Makefile
|
||||
@@ -112,6 +112,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");
|
|
@ -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 c2dcc88ee3aca407471246c38c11a100cca39076 Mon Sep 17 00:00:00 2001
|
||||
From: Kyle McMartin <kyle@treachery.i.jkkm.org>
|
||||
Date: Mon, 11 Jan 2010 08:20:51 -0500
|
||||
Subject: linux-2.6-debug-nmi-timeout.patch
|
||||
|
||||
---
|
||||
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 0159a69..2bbca2b 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(per_cpu_var(alert_counter));
|
||||
- if (__this_cpu_read(per_cpu_var(alert_counter)) == 5 * nmi_hz)
|
||||
+ if (__this_cpu_read(per_cpu_var(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 25c3ed5..6d67975 100644
|
||||
--- a/lib/Kconfig.debug
|
||||
+++ b/lib/Kconfig.debug
|
||||
@@ -253,6 +253,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.6.5.2
|
||||
|
|
@ -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/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,12 @@
|
|||
diff -up linux-2.6.30.noarch/drivers/pci/pcie/aspm.c.mjg linux-2.6.30.noarch/drivers/pci/pcie/aspm.c
|
||||
--- linux-2.6.30.noarch/drivers/pci/pcie/aspm.c.mjg 2009-07-16 22:01:11.000000000 +0100
|
||||
+++ linux-2.6.30.noarch/drivers/pci/pcie/aspm.c 2009-07-16 22:01:30.000000000 +0100
|
||||
@@ -65,7 +65,7 @@ static LIST_HEAD(link_list);
|
||||
#define POLICY_DEFAULT 0 /* BIOS default setting */
|
||||
#define POLICY_PERFORMANCE 1 /* high performance */
|
||||
#define POLICY_POWERSAVE 2 /* high power saving */
|
||||
-static int aspm_policy;
|
||||
+static int aspm_policy = POLICY_POWERSAVE;
|
||||
static const char *policy_str[] = {
|
||||
[POLICY_DEFAULT] = "default",
|
||||
[POLICY_PERFORMANCE] = "performance",
|
|
@ -0,0 +1,92 @@
|
|||
--- linux-2.6.30.noarch/Documentation/kernel-parameters.txt~ 2009-06-24 14:25:04.000000000 -0400
|
||||
+++ linux-2.6.30.noarch/Documentation/kernel-parameters.txt 2009-06-24 14:25:32.000000000 -0400
|
||||
@@ -1811,6 +1811,9 @@ and is between 256 and 4096 characters.
|
||||
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 2a4501d..209758c 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_LEGACY
|
||||
bool "Enable deprecated pci_find_* API"
|
||||
depends on PCI
|
||||
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
|
||||
index 896a15d..53df583 100644
|
||||
--- a/drivers/pci/msi.c
|
||||
+++ b/drivers/pci/msi.c
|
||||
@@ -23,7 +23,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 */
|
||||
|
||||
@@ -786,6 +790,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 17bd932..e9bc9fe 100644
|
||||
--- a/drivers/pci/pci.c
|
||||
+++ b/drivers/pci/pci.c
|
||||
@@ -2393,6 +2393,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 26ddf78..85efe81 100644
|
||||
--- a/drivers/pci/pci.h
|
||||
+++ b/drivers/pci/pci.h
|
||||
@@ -111,9 +111,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
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c
|
||||
index e7f3c9e..4f2b037 100644
|
||||
--- a/drivers/pci/hotplug/pciehp_core.c
|
||||
+++ b/drivers/pci/hotplug/pciehp_core.c
|
||||
@@ -41,7 +41,7 @@ int pciehp_debug;
|
||||
int pciehp_poll_mode;
|
||||
int pciehp_poll_time;
|
||||
int pciehp_force;
|
||||
-int pciehp_passive;
|
||||
+int pciehp_passive=1;
|
||||
struct workqueue_struct *pciehp_wq;
|
||||
|
||||
#define DRIVER_VERSION "0.4"
|
|
@ -0,0 +1,319 @@
|
|||
From caca5447fae9bfc87ab7d4af664d8bc95db6904d Mon Sep 17 00:00:00 2001
|
||||
From: Kyle McMartin <kyle@treachery.i.jkkm.org>
|
||||
Date: Mon, 11 Jan 2010 08:08:02 -0500
|
||||
Subject: linux-2.6-dell-laptop-rfkill-fix.patch
|
||||
|
||||
---
|
||||
drivers/input/input.c | 91 ++++++++++++++++++++++++++++-----
|
||||
drivers/platform/x86/dell-laptop.c | 100 ++++++++++++++++++++++++++++++++++++
|
||||
include/linux/input.h | 5 ++
|
||||
3 files changed, 183 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/input/input.c b/drivers/input/input.c
|
||||
index ab06071..1911c3a 100644
|
||||
--- a/drivers/input/input.c
|
||||
+++ b/drivers/input/input.c
|
||||
@@ -90,19 +90,26 @@ static int input_defuzz_abs_event(int value, int old_val, int fuzz)
|
||||
*/
|
||||
static void input_pass_event(struct input_dev *dev,
|
||||
unsigned int type, unsigned int code, int value)
|
||||
-{
|
||||
- struct input_handle *handle;
|
||||
+
|
||||
+{ struct input_handle *handle;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
handle = rcu_dereference(dev->grab);
|
||||
- if (handle)
|
||||
+ if (handle) {
|
||||
handle->handler->event(handle, type, code, value);
|
||||
- else
|
||||
- list_for_each_entry_rcu(handle, &dev->h_list, d_node)
|
||||
- if (handle->open)
|
||||
- handle->handler->event(handle,
|
||||
- type, code, value);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ handle = rcu_dereference(dev->filter);
|
||||
+ if (handle && handle->handler->filter(handle, type, code, value))
|
||||
+ goto out;
|
||||
+
|
||||
+ list_for_each_entry_rcu(handle, &dev->h_list, d_node)
|
||||
+ if (handle->open)
|
||||
+ handle->handler->event(handle,
|
||||
+ type, code, value);
|
||||
+out:
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
@@ -383,12 +390,15 @@ int input_grab_device(struct input_handle *handle)
|
||||
}
|
||||
EXPORT_SYMBOL(input_grab_device);
|
||||
|
||||
-static void __input_release_device(struct input_handle *handle)
|
||||
+static void __input_release_device(struct input_handle *handle, bool filter)
|
||||
{
|
||||
struct input_dev *dev = handle->dev;
|
||||
|
||||
- if (dev->grab == handle) {
|
||||
- rcu_assign_pointer(dev->grab, NULL);
|
||||
+ if (handle == (filter ? dev->filter : dev->grab)) {
|
||||
+ if (filter)
|
||||
+ rcu_assign_pointer(dev->filter, NULL);
|
||||
+ else
|
||||
+ rcu_assign_pointer(dev->grab, NULL);
|
||||
/* Make sure input_pass_event() notices that grab is gone */
|
||||
synchronize_rcu();
|
||||
|
||||
@@ -412,12 +422,65 @@ void input_release_device(struct input_handle *handle)
|
||||
struct input_dev *dev = handle->dev;
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
- __input_release_device(handle);
|
||||
+ __input_release_device(handle, false);
|
||||
mutex_unlock(&dev->mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(input_release_device);
|
||||
|
||||
/**
|
||||
+ * input_filter_device - allow input events to be filtered from higher layers
|
||||
+ * @handle: input handle that wants to filter the device
|
||||
+ *
|
||||
+ * When a device is filtered by an input handle all events generated by
|
||||
+ * the device are to this handle. If the filter function returns true then
|
||||
+ * the event is discarded rather than being passed to any other input handles,
|
||||
+ * otherwise it is passed to them as normal. Grabs will be handled before
|
||||
+ * filters, so a grabbed device will not deliver events to a filter function.
|
||||
+ */
|
||||
+int input_filter_device(struct input_handle *handle)
|
||||
+{
|
||||
+ struct input_dev *dev = handle->dev;
|
||||
+ int retval;
|
||||
+
|
||||
+ retval = mutex_lock_interruptible(&dev->mutex);
|
||||
+ if (retval)
|
||||
+ return retval;
|
||||
+
|
||||
+ if (dev->filter) {
|
||||
+ retval = -EBUSY;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ rcu_assign_pointer(dev->filter, handle);
|
||||
+ synchronize_rcu();
|
||||
+
|
||||
+ out:
|
||||
+ mutex_unlock(&dev->mutex);
|
||||
+ return retval;
|
||||
+}
|
||||
+EXPORT_SYMBOL(input_filter_device);
|
||||
+
|
||||
+/**
|
||||
+ * input_unfilter_device - removes a filter from a device
|
||||
+ * @handle: input handle that owns the device
|
||||
+ *
|
||||
+ * Removes the filter from a device so that other input handles can
|
||||
+ * start receiving unfiltered input events. Upon release all handlers
|
||||
+ * attached to the device have their start() method called so they
|
||||
+ * have a change to synchronize device state with the rest of the
|
||||
+ * system.
|
||||
+ */
|
||||
+void input_unfilter_device(struct input_handle *handle)
|
||||
+{
|
||||
+ struct input_dev *dev = handle->dev;
|
||||
+
|
||||
+ mutex_lock(&dev->mutex);
|
||||
+ __input_release_device(handle, true);
|
||||
+ mutex_unlock(&dev->mutex);
|
||||
+}
|
||||
+EXPORT_SYMBOL(input_unfilter_device);
|
||||
+
|
||||
+/**
|
||||
* input_open_device - open input device
|
||||
* @handle: handle through which device is being accessed
|
||||
*
|
||||
@@ -490,7 +553,9 @@ void input_close_device(struct input_handle *handle)
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
|
||||
- __input_release_device(handle);
|
||||
+ /* Release both grabs and filters */
|
||||
+ __input_release_device(handle, false);
|
||||
+ __input_release_device(handle, true);
|
||||
|
||||
if (!--dev->users && dev->close)
|
||||
dev->close(dev);
|
||||
diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c
|
||||
index 3780994..25247be 100644
|
||||
--- a/drivers/platform/x86/dell-laptop.c
|
||||
+++ b/drivers/platform/x86/dell-laptop.c
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <linux/rfkill.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/acpi.h>
|
||||
+#include <linux/input.h>
|
||||
#include "../../firmware/dcdbas.h"
|
||||
|
||||
#define BRIGHTNESS_TOKEN 0x7d
|
||||
@@ -214,6 +215,16 @@ static const struct rfkill_ops dell_rfkill_ops = {
|
||||
.query = dell_rfkill_query,
|
||||
};
|
||||
|
||||
+static void dell_rfkill_update(void)
|
||||
+{
|
||||
+ if (wifi_rfkill)
|
||||
+ dell_rfkill_query(wifi_rfkill, (void *)1);
|
||||
+ if (bluetooth_rfkill)
|
||||
+ dell_rfkill_query(bluetooth_rfkill, (void *)2);
|
||||
+ if (wwan_rfkill)
|
||||
+ dell_rfkill_query(wwan_rfkill, (void *)3);
|
||||
+}
|
||||
+
|
||||
static int __init dell_setup_rfkill(void)
|
||||
{
|
||||
struct calling_interface_buffer buffer;
|
||||
@@ -338,6 +349,90 @@ static struct backlight_ops dell_ops = {
|
||||
.update_status = dell_send_intensity,
|
||||
};
|
||||
|
||||
+static const struct input_device_id dell_input_ids[] = {
|
||||
+ {
|
||||
+ .bustype = 0x11,
|
||||
+ .vendor = 0x01,
|
||||
+ .product = 0x01,
|
||||
+ .version = 0xab41,
|
||||
+ .flags = INPUT_DEVICE_ID_MATCH_BUS |
|
||||
+ INPUT_DEVICE_ID_MATCH_VENDOR |
|
||||
+ INPUT_DEVICE_ID_MATCH_PRODUCT |
|
||||
+ INPUT_DEVICE_ID_MATCH_VERSION
|
||||
+ },
|
||||
+ { },
|
||||
+};
|
||||
+
|
||||
+static bool dell_input_filter(struct input_handle *handle, unsigned int type,
|
||||
+ unsigned int code, int value)
|
||||
+{
|
||||
+ if (type == EV_KEY && code == KEY_WLAN && value == 1) {
|
||||
+ dell_rfkill_update();
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void dell_input_event(struct input_handle *handle, unsigned int type,
|
||||
+ unsigned int code, int value)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static int dell_input_connect(struct input_handler *handler,
|
||||
+ struct input_dev *dev,
|
||||
+ const struct input_device_id *id)
|
||||
+{
|
||||
+ struct input_handle *handle;
|
||||
+ int error;
|
||||
+
|
||||
+ handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL);
|
||||
+ if (!handle)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ handle->dev = dev;
|
||||
+ handle->handler = handler;
|
||||
+ handle->name = "dell-laptop";
|
||||
+
|
||||
+ error = input_register_handle(handle);
|
||||
+ if (error)
|
||||
+ goto err_free_handle;
|
||||
+
|
||||
+ error = input_open_device(handle);
|
||||
+ if (error)
|
||||
+ goto err_unregister_handle;
|
||||
+
|
||||
+ error = input_filter_device(handle);
|
||||
+ if (error)
|
||||
+ goto err_close_handle;
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+err_close_handle:
|
||||
+ input_close_device(handle);
|
||||
+err_unregister_handle:
|
||||
+ input_unregister_handle(handle);
|
||||
+err_free_handle:
|
||||
+ kfree(handle);
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
+static void dell_input_disconnect(struct input_handle *handle)
|
||||
+{
|
||||
+ input_close_device(handle);
|
||||
+ input_unregister_handle(handle);
|
||||
+ kfree(handle);
|
||||
+}
|
||||
+
|
||||
+static struct input_handler dell_input_handler = {
|
||||
+ .name = "dell-laptop",
|
||||
+ .filter = dell_input_filter,
|
||||
+ .event = dell_input_event,
|
||||
+ .connect = dell_input_connect,
|
||||
+ .disconnect = dell_input_disconnect,
|
||||
+ .id_table = dell_input_ids,
|
||||
+};
|
||||
+
|
||||
static int __init dell_init(void)
|
||||
{
|
||||
struct calling_interface_buffer buffer;
|
||||
@@ -373,6 +468,10 @@ static int __init dell_init(void)
|
||||
goto fail_rfkill;
|
||||
}
|
||||
|
||||
+ if (input_register_handler(&dell_input_handler))
|
||||
+ printk(KERN_INFO
|
||||
+ "dell-laptop: Could not register input filter\n");
|
||||
+
|
||||
#ifdef CONFIG_ACPI
|
||||
/* In the event of an ACPI backlight being available, don't
|
||||
* register the platform controller.
|
||||
@@ -426,6 +525,7 @@ static void __exit dell_exit(void)
|
||||
{
|
||||
backlight_device_unregister(dell_backlight_device);
|
||||
dell_cleanup_rfkill();
|
||||
+ input_unregister_handler(&dell_input_handler);
|
||||
}
|
||||
|
||||
module_init(dell_init);
|
||||
diff --git a/include/linux/input.h b/include/linux/input.h
|
||||
index 7be8a65..7d49094 100644
|
||||
--- a/include/linux/input.h
|
||||
+++ b/include/linux/input.h
|
||||
@@ -1127,6 +1127,7 @@ struct input_dev {
|
||||
int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);
|
||||
|
||||
struct input_handle *grab;
|
||||
+ struct input_handle *filter;
|
||||
|
||||
spinlock_t event_lock;
|
||||
struct mutex mutex;
|
||||
@@ -1227,6 +1228,7 @@ struct input_handler {
|
||||
void *private;
|
||||
|
||||
void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
|
||||
+ bool (*filter)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
|
||||
int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id);
|
||||
void (*disconnect)(struct input_handle *handle);
|
||||
void (*start)(struct input_handle *handle);
|
||||
@@ -1307,6 +1309,9 @@ void input_unregister_handle(struct input_handle *);
|
||||
int input_grab_device(struct input_handle *);
|
||||
void input_release_device(struct input_handle *);
|
||||
|
||||
+int input_filter_device(struct input_handle *);
|
||||
+void input_unfilter_device(struct input_handle *);
|
||||
+
|
||||
int input_open_device(struct input_handle *);
|
||||
void input_close_device(struct input_handle *);
|
||||
|
||||
--
|
||||
1.6.5.2
|
||||
|
|
@ -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
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
commit 8e962bd41a2cbf7f0e55191a757b87f793a725a8
|
||||
Author: Matthew Garrett <mjg@redhat.com>
|
||||
Date: Tue Jun 9 20:47:51 2009 +0100
|
||||
|
||||
btusb: Enable autosuspend by default
|
||||
|
||||
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
|
||||
index 44bc8bb..4c33417 100644
|
||||
--- a/drivers/bluetooth/btusb.c
|
||||
+++ b/drivers/bluetooth/btusb.c
|
||||
@@ -1020,6 +1020,7 @@ static int btusb_probe(struct usb_interface *intf,
|
||||
}
|
||||
|
||||
usb_set_intfdata(intf, data);
|
||||
+ usb_device_autosuspend_enable(data->udev);
|
||||
|
||||
return 0;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue