initial srpm import
This commit is contained in:
parent
64ba2e5ffd
commit
3494df0003
|
@ -0,0 +1,2 @@
|
||||||
|
linux-2.6.34.tar.bz2
|
||||||
|
patch-2.6.34.1.bz2
|
|
@ -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,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,106 @@
|
||||||
|
From: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Date: Thu, 17 Jun 2010 15:40:57 +0000 (+0200)
|
||||||
|
Subject: ACPI / PM: Do not enable GPEs for system wakeup in advance
|
||||||
|
X-Git-Tag: v2.6.35-rc4~72^2^2
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=cb1cb1780f2025a7d612de09131bf6530f80fb1a
|
||||||
|
|
||||||
|
ACPI / PM: Do not enable GPEs for system wakeup in advance
|
||||||
|
|
||||||
|
After commit 9630bdd9b15d2f489c646d8bc04b60e53eb5ec78
|
||||||
|
(ACPI: Use GPE reference counting to support shared GPEs) the wakeup
|
||||||
|
enable mask bits of GPEs are set as soon as the GPEs are enabled to
|
||||||
|
wake up the system. Unfortunately, this leads to a regression
|
||||||
|
reported by Michal Hocko, where a system is woken up from ACPI S5 by
|
||||||
|
a device that is not supposed to do that, because the wakeup enable
|
||||||
|
mask bit of this device's GPE is always set when
|
||||||
|
acpi_enter_sleep_state() calls acpi_hw_enable_all_wakeup_gpes(),
|
||||||
|
although it should only be set if the device is supposed to wake up
|
||||||
|
the system from the target state.
|
||||||
|
|
||||||
|
To work around this issue, rework the ACPI power management code so
|
||||||
|
that GPEs are not enabled to wake up the system upfront, but only
|
||||||
|
during a system state transition when the target state of the system
|
||||||
|
is known. [Of course, this means that the reference counting of
|
||||||
|
"wakeup" GPEs doesn't really make sense and it is sufficient to
|
||||||
|
set/unset the wakeup mask bits for them during system sleep
|
||||||
|
transitions. This will allow us to simplify the GPE handling code
|
||||||
|
quite a bit, but that change is too intrusive for 2.6.35.]
|
||||||
|
|
||||||
|
Fixes https://bugzilla.kernel.org/show_bug.cgi?id=15951
|
||||||
|
|
||||||
|
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Reported-and-tested-by: Michal Hocko <mhocko@suse.cz>
|
||||||
|
Signed-off-by: Len Brown <len.brown@intel.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
|
||||||
|
index fd51c4a..7d857da 100644
|
||||||
|
--- a/drivers/acpi/button.c
|
||||||
|
+++ b/drivers/acpi/button.c
|
||||||
|
@@ -425,7 +425,7 @@ static int acpi_button_add(struct acpi_device *device)
|
||||||
|
/* Button's GPE is run-wake GPE */
|
||||||
|
acpi_enable_gpe(device->wakeup.gpe_device,
|
||||||
|
device->wakeup.gpe_number,
|
||||||
|
- ACPI_GPE_TYPE_WAKE_RUN);
|
||||||
|
+ ACPI_GPE_TYPE_RUNTIME);
|
||||||
|
device->wakeup.run_wake_count++;
|
||||||
|
device->wakeup.state.enabled = 1;
|
||||||
|
}
|
||||||
|
@@ -449,7 +449,7 @@ static int acpi_button_remove(struct acpi_device *device, int type)
|
||||||
|
if (device->wakeup.flags.valid) {
|
||||||
|
acpi_disable_gpe(device->wakeup.gpe_device,
|
||||||
|
device->wakeup.gpe_number,
|
||||||
|
- ACPI_GPE_TYPE_WAKE_RUN);
|
||||||
|
+ ACPI_GPE_TYPE_RUNTIME);
|
||||||
|
device->wakeup.run_wake_count--;
|
||||||
|
device->wakeup.state.enabled = 0;
|
||||||
|
}
|
||||||
|
diff --git a/drivers/acpi/wakeup.c b/drivers/acpi/wakeup.c
|
||||||
|
index 4b9d339..388747a 100644
|
||||||
|
--- a/drivers/acpi/wakeup.c
|
||||||
|
+++ b/drivers/acpi/wakeup.c
|
||||||
|
@@ -64,16 +64,13 @@ void acpi_enable_wakeup_device(u8 sleep_state)
|
||||||
|
struct acpi_device *dev =
|
||||||
|
container_of(node, struct acpi_device, wakeup_list);
|
||||||
|
|
||||||
|
- if (!dev->wakeup.flags.valid)
|
||||||
|
- continue;
|
||||||
|
-
|
||||||
|
- if ((!dev->wakeup.state.enabled && !dev->wakeup.prepare_count)
|
||||||
|
+ if (!dev->wakeup.flags.valid || !dev->wakeup.state.enabled
|
||||||
|
|| sleep_state > (u32) dev->wakeup.sleep_state)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* The wake-up power should have been enabled already. */
|
||||||
|
- acpi_set_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number,
|
||||||
|
- ACPI_GPE_ENABLE);
|
||||||
|
+ acpi_enable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number,
|
||||||
|
+ ACPI_GPE_TYPE_WAKE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -96,6 +93,8 @@ void acpi_disable_wakeup_device(u8 sleep_state)
|
||||||
|
|| (sleep_state > (u32) dev->wakeup.sleep_state))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
+ acpi_disable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number,
|
||||||
|
+ ACPI_GPE_TYPE_WAKE);
|
||||||
|
acpi_disable_wakeup_device_power(dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -109,13 +108,8 @@ int __init acpi_wakeup_device_init(void)
|
||||||
|
struct acpi_device *dev = container_of(node,
|
||||||
|
struct acpi_device,
|
||||||
|
wakeup_list);
|
||||||
|
- /* In case user doesn't load button driver */
|
||||||
|
- if (!dev->wakeup.flags.always_enabled ||
|
||||||
|
- dev->wakeup.state.enabled)
|
||||||
|
- continue;
|
||||||
|
- acpi_enable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number,
|
||||||
|
- ACPI_GPE_TYPE_WAKE);
|
||||||
|
- dev->wakeup.state.enabled = 1;
|
||||||
|
+ if (dev->wakeup.flags.always_enabled)
|
||||||
|
+ dev->wakeup.state.enabled = 1;
|
||||||
|
}
|
||||||
|
mutex_unlock(&acpi_device_lock);
|
||||||
|
return 0;
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,44 @@
|
||||||
|
From: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Date: Fri, 11 Jun 2010 22:05:19 +0000 (+0200)
|
||||||
|
Subject: ACPI / ACPICA: Do not attempt to disable GPE when installing handler
|
||||||
|
X-Git-Tag: v2.6.35-rc4~72^2~6^2~5
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=a997ab332832519c2e292db13f509e4360495a5a
|
||||||
|
|
||||||
|
ACPI / ACPICA: Do not attempt to disable GPE when installing handler
|
||||||
|
|
||||||
|
Commit 0f849d2cc6863c7874889ea60a871fb71399dd3f (ACPICA: Minimize
|
||||||
|
the differences between linux GPE code and ACPICA code base)
|
||||||
|
introduced a change attempting to disable a GPE before installing
|
||||||
|
a handler for it in acpi_install_gpe_handler() which was incorrect.
|
||||||
|
First, the GPE disabled by it is never enabled again (except during
|
||||||
|
resume) which leads to battery insert/remove events not being
|
||||||
|
reported on the Maxim Levitsky's machine. Second, the disabled
|
||||||
|
GPE is still reported as enabled by the sysfs interface that only
|
||||||
|
checks its enable register's enable_for_run mask.
|
||||||
|
|
||||||
|
Revert this change for now, because it causes more damage to happen
|
||||||
|
than the bug it was supposed to fix.
|
||||||
|
|
||||||
|
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Reported-and-tested-by: Maxim Levitsky <maximlevitsky@gmail.com>
|
||||||
|
Signed-off-by: Len Brown <len.brown@intel.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/acpica/evxface.c b/drivers/acpi/acpica/evxface.c
|
||||||
|
index cc82502..4a531cd 100644
|
||||||
|
--- a/drivers/acpi/acpica/evxface.c
|
||||||
|
+++ b/drivers/acpi/acpica/evxface.c
|
||||||
|
@@ -719,13 +719,6 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
|
||||||
|
handler->context = context;
|
||||||
|
handler->method_node = gpe_event_info->dispatch.method_node;
|
||||||
|
|
||||||
|
- /* Disable the GPE before installing the handler */
|
||||||
|
-
|
||||||
|
- status = acpi_ev_disable_gpe(gpe_event_info);
|
||||||
|
- if (ACPI_FAILURE (status)) {
|
||||||
|
- goto unlock_and_exit;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
/* Install the handler */
|
||||||
|
|
||||||
|
flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
|
|
@ -0,0 +1,165 @@
|
||||||
|
From: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Date: Tue, 8 Jun 2010 08:48:26 +0000 (+0200)
|
||||||
|
Subject: ACPI / ACPICA: Use helper function for computing GPE masks
|
||||||
|
X-Git-Tag: v2.6.35-rc4~72^2~6^2~4
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=e4e9a735991c80fb0fc1bd4a13a93681c3c17ce0
|
||||||
|
|
||||||
|
ACPI / ACPICA: Use helper function for computing GPE masks
|
||||||
|
|
||||||
|
In quite a few places ACPICA needs to compute a GPE enable mask with
|
||||||
|
only one bit, corresponding to a given GPE, set. Currently, that
|
||||||
|
computation is always open coded which leads to unnecessary code
|
||||||
|
duplication. Fix this by introducing a helper function for computing
|
||||||
|
one-bit GPE enable masks and using it where appropriate.
|
||||||
|
|
||||||
|
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Signed-off-by: Len Brown <len.brown@intel.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/acpica/achware.h b/drivers/acpi/acpica/achware.h
|
||||||
|
index 5900f13..c46277d 100644
|
||||||
|
--- a/drivers/acpi/acpica/achware.h
|
||||||
|
+++ b/drivers/acpi/acpica/achware.h
|
||||||
|
@@ -90,6 +90,9 @@ acpi_status acpi_hw_write_port(acpi_io_address address, u32 value, u32 width);
|
||||||
|
/*
|
||||||
|
* hwgpe - GPE support
|
||||||
|
*/
|
||||||
|
+u32 acpi_hw_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info,
|
||||||
|
+ struct acpi_gpe_register_info *gpe_register_info);
|
||||||
|
+
|
||||||
|
acpi_status acpi_hw_low_disable_gpe(struct acpi_gpe_event_info *gpe_event_info);
|
||||||
|
|
||||||
|
acpi_status
|
||||||
|
diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c
|
||||||
|
index deb26f4..57eeb3b 100644
|
||||||
|
--- a/drivers/acpi/acpica/evgpe.c
|
||||||
|
+++ b/drivers/acpi/acpica/evgpe.c
|
||||||
|
@@ -69,7 +69,7 @@ acpi_status
|
||||||
|
acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info)
|
||||||
|
{
|
||||||
|
struct acpi_gpe_register_info *gpe_register_info;
|
||||||
|
- u8 register_bit;
|
||||||
|
+ u32 register_bit;
|
||||||
|
|
||||||
|
ACPI_FUNCTION_TRACE(ev_update_gpe_enable_masks);
|
||||||
|
|
||||||
|
@@ -78,9 +78,8 @@ acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info)
|
||||||
|
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||||
|
}
|
||||||
|
|
||||||
|
- register_bit = (u8)
|
||||||
|
- (1 <<
|
||||||
|
- (gpe_event_info->gpe_number - gpe_register_info->base_gpe_number));
|
||||||
|
+ register_bit = acpi_hw_gpe_register_bit(gpe_event_info,
|
||||||
|
+ gpe_register_info);
|
||||||
|
|
||||||
|
/* Clear the wake/run bits up front */
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/acpica/hwgpe.c b/drivers/acpi/acpica/hwgpe.c
|
||||||
|
index bd72319..d989b8e 100644
|
||||||
|
--- a/drivers/acpi/acpica/hwgpe.c
|
||||||
|
+++ b/drivers/acpi/acpica/hwgpe.c
|
||||||
|
@@ -57,6 +57,27 @@ acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
+ * FUNCTION: acpi_hw_gpe_register_bit
|
||||||
|
+ *
|
||||||
|
+ * PARAMETERS: gpe_event_info - Info block for the GPE
|
||||||
|
+ * gpe_register_info - Info block for the GPE register
|
||||||
|
+ *
|
||||||
|
+ * RETURN: Status
|
||||||
|
+ *
|
||||||
|
+ * DESCRIPTION: Compute GPE enable mask with one bit corresponding to the given
|
||||||
|
+ * GPE set.
|
||||||
|
+ *
|
||||||
|
+ ******************************************************************************/
|
||||||
|
+
|
||||||
|
+u32 acpi_hw_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info,
|
||||||
|
+ struct acpi_gpe_register_info *gpe_register_info)
|
||||||
|
+{
|
||||||
|
+ return (u32)1 << (gpe_event_info->gpe_number -
|
||||||
|
+ gpe_register_info->base_gpe_number);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/******************************************************************************
|
||||||
|
+ *
|
||||||
|
* FUNCTION: acpi_hw_low_disable_gpe
|
||||||
|
*
|
||||||
|
* PARAMETERS: gpe_event_info - Info block for the GPE to be disabled
|
||||||
|
@@ -72,6 +93,7 @@ acpi_status acpi_hw_low_disable_gpe(struct acpi_gpe_event_info *gpe_event_info)
|
||||||
|
struct acpi_gpe_register_info *gpe_register_info;
|
||||||
|
acpi_status status;
|
||||||
|
u32 enable_mask;
|
||||||
|
+ u32 register_bit;
|
||||||
|
|
||||||
|
/* Get the info block for the entire GPE register */
|
||||||
|
|
||||||
|
@@ -89,9 +111,9 @@ acpi_status acpi_hw_low_disable_gpe(struct acpi_gpe_event_info *gpe_event_info)
|
||||||
|
|
||||||
|
/* Clear just the bit that corresponds to this GPE */
|
||||||
|
|
||||||
|
- ACPI_CLEAR_BIT(enable_mask, ((u32)1 <<
|
||||||
|
- (gpe_event_info->gpe_number -
|
||||||
|
- gpe_register_info->base_gpe_number)));
|
||||||
|
+ register_bit = acpi_hw_gpe_register_bit(gpe_event_info,
|
||||||
|
+ gpe_register_info);
|
||||||
|
+ ACPI_CLEAR_BIT(enable_mask, register_bit);
|
||||||
|
|
||||||
|
/* Write the updated enable mask */
|
||||||
|
|
||||||
|
@@ -150,21 +172,28 @@ acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info * gpe_event_info)
|
||||||
|
|
||||||
|
acpi_status acpi_hw_clear_gpe(struct acpi_gpe_event_info * gpe_event_info)
|
||||||
|
{
|
||||||
|
+ struct acpi_gpe_register_info *gpe_register_info;
|
||||||
|
acpi_status status;
|
||||||
|
- u8 register_bit;
|
||||||
|
+ u32 register_bit;
|
||||||
|
|
||||||
|
ACPI_FUNCTION_ENTRY();
|
||||||
|
|
||||||
|
- register_bit = (u8)(1 <<
|
||||||
|
- (gpe_event_info->gpe_number -
|
||||||
|
- gpe_event_info->register_info->base_gpe_number));
|
||||||
|
+ /* Get the info block for the entire GPE register */
|
||||||
|
+
|
||||||
|
+ gpe_register_info = gpe_event_info->register_info;
|
||||||
|
+ if (!gpe_register_info) {
|
||||||
|
+ return (AE_NOT_EXIST);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ register_bit = acpi_hw_gpe_register_bit(gpe_event_info,
|
||||||
|
+ gpe_register_info);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write a one to the appropriate bit in the status register to
|
||||||
|
* clear this GPE.
|
||||||
|
*/
|
||||||
|
status = acpi_hw_write(register_bit,
|
||||||
|
- &gpe_event_info->register_info->status_address);
|
||||||
|
+ &gpe_register_info->status_address);
|
||||||
|
|
||||||
|
return (status);
|
||||||
|
}
|
||||||
|
@@ -187,7 +216,7 @@ acpi_hw_get_gpe_status(struct acpi_gpe_event_info * gpe_event_info,
|
||||||
|
acpi_event_status * event_status)
|
||||||
|
{
|
||||||
|
u32 in_byte;
|
||||||
|
- u8 register_bit;
|
||||||
|
+ u32 register_bit;
|
||||||
|
struct acpi_gpe_register_info *gpe_register_info;
|
||||||
|
acpi_status status;
|
||||||
|
acpi_event_status local_event_status = 0;
|
||||||
|
@@ -204,9 +233,8 @@ acpi_hw_get_gpe_status(struct acpi_gpe_event_info * gpe_event_info,
|
||||||
|
|
||||||
|
/* Get the register bitmask for this GPE */
|
||||||
|
|
||||||
|
- register_bit = (u8)(1 <<
|
||||||
|
- (gpe_event_info->gpe_number -
|
||||||
|
- gpe_event_info->register_info->base_gpe_number));
|
||||||
|
+ register_bit = acpi_hw_gpe_register_bit(gpe_event_info,
|
||||||
|
+ gpe_register_info);
|
||||||
|
|
||||||
|
/* GPE currently enabled? (enabled for runtime?) */
|
||||||
|
|
|
@ -0,0 +1,381 @@
|
||||||
|
From: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Date: Tue, 8 Jun 2010 08:49:08 +0000 (+0200)
|
||||||
|
Subject: ACPI / ACPICA: Fix low-level GPE manipulation code
|
||||||
|
X-Git-Tag: v2.6.35-rc4~72^2~6^2~3
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=fd247447c1d94a79d5cfc647430784306b3a8323
|
||||||
|
|
||||||
|
ACPI / ACPICA: Fix low-level GPE manipulation code
|
||||||
|
|
||||||
|
ACPICA uses acpi_ev_enable_gpe() for enabling GPEs at the low level,
|
||||||
|
which is incorrect, because this function only enables the GPE if the
|
||||||
|
corresponding bit in its enable register's enable_for_run mask is set.
|
||||||
|
This causes acpi_set_gpe() to work incorrectly if used for enabling
|
||||||
|
GPEs that were not previously enabled with acpi_enable_gpe(). As a
|
||||||
|
result, among other things, wakeup-only GPEs are never enabled by
|
||||||
|
acpi_enable_wakeup_device(), so the devices that use them are unable
|
||||||
|
to wake up the system.
|
||||||
|
|
||||||
|
To fix this issue remove acpi_ev_enable_gpe() and its counterpart
|
||||||
|
acpi_ev_disable_gpe() and replace acpi_hw_low_disable_gpe() with
|
||||||
|
acpi_hw_low_set_gpe() that will be used instead to manipulate GPE
|
||||||
|
enable bits at the low level. Make the users of acpi_ev_enable_gpe()
|
||||||
|
and acpi_ev_disable_gpe() call acpi_hw_low_set_gpe() instead and
|
||||||
|
make sure that GPE enable masks are only updated by acpi_enable_gpe()
|
||||||
|
and acpi_disable_gpe() when GPE reference counters change from 0
|
||||||
|
to 1 and from 1 to 0, respectively.
|
||||||
|
|
||||||
|
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Signed-off-by: Len Brown <len.brown@intel.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/acpica/acevents.h b/drivers/acpi/acpica/acevents.h
|
||||||
|
index 5e094a2..138bbb5 100644
|
||||||
|
--- a/drivers/acpi/acpica/acevents.h
|
||||||
|
+++ b/drivers/acpi/acpica/acevents.h
|
||||||
|
@@ -78,10 +78,6 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node *node,
|
||||||
|
acpi_status
|
||||||
|
acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info);
|
||||||
|
|
||||||
|
-acpi_status acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info);
|
||||||
|
-
|
||||||
|
-acpi_status acpi_ev_disable_gpe(struct acpi_gpe_event_info *gpe_event_info);
|
||||||
|
-
|
||||||
|
struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device,
|
||||||
|
u32 gpe_number);
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/acpica/achware.h b/drivers/acpi/acpica/achware.h
|
||||||
|
index c46277d..3239158 100644
|
||||||
|
--- a/drivers/acpi/acpica/achware.h
|
||||||
|
+++ b/drivers/acpi/acpica/achware.h
|
||||||
|
@@ -93,7 +93,8 @@ acpi_status acpi_hw_write_port(acpi_io_address address, u32 value, u32 width);
|
||||||
|
u32 acpi_hw_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info,
|
||||||
|
struct acpi_gpe_register_info *gpe_register_info);
|
||||||
|
|
||||||
|
-acpi_status acpi_hw_low_disable_gpe(struct acpi_gpe_event_info *gpe_event_info);
|
||||||
|
+acpi_status
|
||||||
|
+acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 action);
|
||||||
|
|
||||||
|
acpi_status
|
||||||
|
acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info *gpe_event_info);
|
||||||
|
diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c
|
||||||
|
index 57eeb3b..66cd038 100644
|
||||||
|
--- a/drivers/acpi/acpica/evgpe.c
|
||||||
|
+++ b/drivers/acpi/acpica/evgpe.c
|
||||||
|
@@ -99,106 +99,6 @@ acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info)
|
||||||
|
return_ACPI_STATUS(AE_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
-/*******************************************************************************
|
||||||
|
- *
|
||||||
|
- * FUNCTION: acpi_ev_enable_gpe
|
||||||
|
- *
|
||||||
|
- * PARAMETERS: gpe_event_info - GPE to enable
|
||||||
|
- *
|
||||||
|
- * RETURN: Status
|
||||||
|
- *
|
||||||
|
- * DESCRIPTION: Hardware-enable a GPE. Always enables the GPE, regardless
|
||||||
|
- * of type or number of references.
|
||||||
|
- *
|
||||||
|
- * Note: The GPE lock should be already acquired when this function is called.
|
||||||
|
- *
|
||||||
|
- ******************************************************************************/
|
||||||
|
-
|
||||||
|
-acpi_status acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info)
|
||||||
|
-{
|
||||||
|
- acpi_status status;
|
||||||
|
-
|
||||||
|
-
|
||||||
|
- ACPI_FUNCTION_TRACE(ev_enable_gpe);
|
||||||
|
-
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
- * We will only allow a GPE to be enabled if it has either an
|
||||||
|
- * associated method (_Lxx/_Exx) or a handler. Otherwise, the
|
||||||
|
- * GPE will be immediately disabled by acpi_ev_gpe_dispatch the
|
||||||
|
- * first time it fires.
|
||||||
|
- */
|
||||||
|
- if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK)) {
|
||||||
|
- return_ACPI_STATUS(AE_NO_HANDLER);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* Ensure the HW enable masks are current */
|
||||||
|
-
|
||||||
|
- status = acpi_ev_update_gpe_enable_masks(gpe_event_info);
|
||||||
|
- if (ACPI_FAILURE(status)) {
|
||||||
|
- return_ACPI_STATUS(status);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* Clear the GPE (of stale events) */
|
||||||
|
-
|
||||||
|
- status = acpi_hw_clear_gpe(gpe_event_info);
|
||||||
|
- if (ACPI_FAILURE(status)) {
|
||||||
|
- return_ACPI_STATUS(status);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* Enable the requested GPE */
|
||||||
|
-
|
||||||
|
- status = acpi_hw_write_gpe_enable_reg(gpe_event_info);
|
||||||
|
- return_ACPI_STATUS(status);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-/*******************************************************************************
|
||||||
|
- *
|
||||||
|
- * FUNCTION: acpi_ev_disable_gpe
|
||||||
|
- *
|
||||||
|
- * PARAMETERS: gpe_event_info - GPE to disable
|
||||||
|
- *
|
||||||
|
- * RETURN: Status
|
||||||
|
- *
|
||||||
|
- * DESCRIPTION: Hardware-disable a GPE. Always disables the requested GPE,
|
||||||
|
- * regardless of the type or number of references.
|
||||||
|
- *
|
||||||
|
- * Note: The GPE lock should be already acquired when this function is called.
|
||||||
|
- *
|
||||||
|
- ******************************************************************************/
|
||||||
|
-
|
||||||
|
-acpi_status acpi_ev_disable_gpe(struct acpi_gpe_event_info *gpe_event_info)
|
||||||
|
-{
|
||||||
|
- acpi_status status;
|
||||||
|
-
|
||||||
|
- ACPI_FUNCTION_TRACE(ev_disable_gpe);
|
||||||
|
-
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
- * Note: Always disable the GPE, even if we think that that it is already
|
||||||
|
- * disabled. It is possible that the AML or some other code has enabled
|
||||||
|
- * the GPE behind our back.
|
||||||
|
- */
|
||||||
|
-
|
||||||
|
- /* Ensure the HW enable masks are current */
|
||||||
|
-
|
||||||
|
- status = acpi_ev_update_gpe_enable_masks(gpe_event_info);
|
||||||
|
- if (ACPI_FAILURE(status)) {
|
||||||
|
- return_ACPI_STATUS(status);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
- * Always H/W disable this GPE, even if we don't know the GPE type.
|
||||||
|
- * Simply clear the enable bit for this particular GPE, but do not
|
||||||
|
- * write out the current GPE enable mask since this may inadvertently
|
||||||
|
- * enable GPEs too early. An example is a rogue GPE that has arrived
|
||||||
|
- * during ACPICA initialization - possibly because AML or other code
|
||||||
|
- * has enabled the GPE.
|
||||||
|
- */
|
||||||
|
- status = acpi_hw_low_disable_gpe(gpe_event_info);
|
||||||
|
- return_ACPI_STATUS(status);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
*
|
||||||
|
@@ -450,10 +350,6 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)
|
||||||
|
return_VOID;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Update the GPE register masks for return to enabled state */
|
||||||
|
-
|
||||||
|
- (void)acpi_ev_update_gpe_enable_masks(gpe_event_info);
|
||||||
|
-
|
||||||
|
/*
|
||||||
|
* Take a snapshot of the GPE info for this level - we copy the info to
|
||||||
|
* prevent a race condition with remove_handler/remove_block.
|
||||||
|
@@ -606,7 +502,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
|
||||||
|
* Disable the GPE, so it doesn't keep firing before the method has a
|
||||||
|
* chance to run (it runs asynchronously with interrupts enabled).
|
||||||
|
*/
|
||||||
|
- status = acpi_ev_disable_gpe(gpe_event_info);
|
||||||
|
+ status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_DISABLE);
|
||||||
|
if (ACPI_FAILURE(status)) {
|
||||||
|
ACPI_EXCEPTION((AE_INFO, status,
|
||||||
|
"Unable to disable GPE[0x%2X]",
|
||||||
|
@@ -643,7 +539,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
|
||||||
|
* Disable the GPE. The GPE will remain disabled a handler
|
||||||
|
* is installed or ACPICA is restarted.
|
||||||
|
*/
|
||||||
|
- status = acpi_ev_disable_gpe(gpe_event_info);
|
||||||
|
+ status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_DISABLE);
|
||||||
|
if (ACPI_FAILURE(status)) {
|
||||||
|
ACPI_EXCEPTION((AE_INFO, status,
|
||||||
|
"Unable to disable GPE[0x%2X]",
|
||||||
|
diff --git a/drivers/acpi/acpica/evxfevnt.c b/drivers/acpi/acpica/evxfevnt.c
|
||||||
|
index 7c7bbb4..e3d9f5c 100644
|
||||||
|
--- a/drivers/acpi/acpica/evxfevnt.c
|
||||||
|
+++ b/drivers/acpi/acpica/evxfevnt.c
|
||||||
|
@@ -201,6 +201,44 @@ ACPI_EXPORT_SYMBOL(acpi_enable_event)
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
*
|
||||||
|
+ * FUNCTION: acpi_clear_and_enable_gpe
|
||||||
|
+ *
|
||||||
|
+ * PARAMETERS: gpe_event_info - GPE to enable
|
||||||
|
+ *
|
||||||
|
+ * RETURN: Status
|
||||||
|
+ *
|
||||||
|
+ * DESCRIPTION: Clear the given GPE from stale events and enable it.
|
||||||
|
+ *
|
||||||
|
+ ******************************************************************************/
|
||||||
|
+static acpi_status
|
||||||
|
+acpi_clear_and_enable_gpe(struct acpi_gpe_event_info *gpe_event_info)
|
||||||
|
+{
|
||||||
|
+ acpi_status status;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * We will only allow a GPE to be enabled if it has either an
|
||||||
|
+ * associated method (_Lxx/_Exx) or a handler. Otherwise, the
|
||||||
|
+ * GPE will be immediately disabled by acpi_ev_gpe_dispatch the
|
||||||
|
+ * first time it fires.
|
||||||
|
+ */
|
||||||
|
+ if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK)) {
|
||||||
|
+ return_ACPI_STATUS(AE_NO_HANDLER);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Clear the GPE (of stale events) */
|
||||||
|
+ status = acpi_hw_clear_gpe(gpe_event_info);
|
||||||
|
+ if (ACPI_FAILURE(status)) {
|
||||||
|
+ return_ACPI_STATUS(status);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Enable the requested GPE */
|
||||||
|
+ status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_ENABLE);
|
||||||
|
+
|
||||||
|
+ return_ACPI_STATUS(status);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*******************************************************************************
|
||||||
|
+ *
|
||||||
|
* FUNCTION: acpi_set_gpe
|
||||||
|
*
|
||||||
|
* PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1
|
||||||
|
@@ -240,11 +278,11 @@ acpi_status acpi_set_gpe(acpi_handle gpe_device, u32 gpe_number, u8 action)
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
case ACPI_GPE_ENABLE:
|
||||||
|
- status = acpi_ev_enable_gpe(gpe_event_info);
|
||||||
|
+ status = acpi_clear_and_enable_gpe(gpe_event_info);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ACPI_GPE_DISABLE:
|
||||||
|
- status = acpi_ev_disable_gpe(gpe_event_info);
|
||||||
|
+ status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_DISABLE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
@@ -307,7 +345,11 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 gpe_type)
|
||||||
|
|
||||||
|
gpe_event_info->runtime_count++;
|
||||||
|
if (gpe_event_info->runtime_count == 1) {
|
||||||
|
- status = acpi_ev_enable_gpe(gpe_event_info);
|
||||||
|
+ status = acpi_ev_update_gpe_enable_masks(gpe_event_info);
|
||||||
|
+ if (ACPI_SUCCESS(status)) {
|
||||||
|
+ status = acpi_clear_and_enable_gpe(gpe_event_info);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (ACPI_FAILURE(status)) {
|
||||||
|
gpe_event_info->runtime_count--;
|
||||||
|
goto unlock_and_exit;
|
||||||
|
@@ -334,7 +376,7 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 gpe_type)
|
||||||
|
*/
|
||||||
|
gpe_event_info->wakeup_count++;
|
||||||
|
if (gpe_event_info->wakeup_count == 1) {
|
||||||
|
- (void)acpi_ev_update_gpe_enable_masks(gpe_event_info);
|
||||||
|
+ status = acpi_ev_update_gpe_enable_masks(gpe_event_info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -394,7 +436,12 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 gpe_type
|
||||||
|
|
||||||
|
gpe_event_info->runtime_count--;
|
||||||
|
if (!gpe_event_info->runtime_count) {
|
||||||
|
- status = acpi_ev_disable_gpe(gpe_event_info);
|
||||||
|
+ status = acpi_ev_update_gpe_enable_masks(gpe_event_info);
|
||||||
|
+ if (ACPI_SUCCESS(status)) {
|
||||||
|
+ status = acpi_hw_low_set_gpe(gpe_event_info,
|
||||||
|
+ ACPI_GPE_DISABLE);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (ACPI_FAILURE(status)) {
|
||||||
|
gpe_event_info->runtime_count++;
|
||||||
|
goto unlock_and_exit;
|
||||||
|
@@ -415,7 +462,7 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 gpe_type
|
||||||
|
|
||||||
|
gpe_event_info->wakeup_count--;
|
||||||
|
if (!gpe_event_info->wakeup_count) {
|
||||||
|
- (void)acpi_ev_update_gpe_enable_masks(gpe_event_info);
|
||||||
|
+ status = acpi_ev_update_gpe_enable_masks(gpe_event_info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/acpica/hwgpe.c b/drivers/acpi/acpica/hwgpe.c
|
||||||
|
index d989b8e..40388e2 100644
|
||||||
|
--- a/drivers/acpi/acpica/hwgpe.c
|
||||||
|
+++ b/drivers/acpi/acpica/hwgpe.c
|
||||||
|
@@ -78,23 +78,27 @@ u32 acpi_hw_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info,
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
- * FUNCTION: acpi_hw_low_disable_gpe
|
||||||
|
+ * FUNCTION: acpi_hw_low_set_gpe
|
||||||
|
*
|
||||||
|
* PARAMETERS: gpe_event_info - Info block for the GPE to be disabled
|
||||||
|
+ * action - Enable or disable
|
||||||
|
*
|
||||||
|
* RETURN: Status
|
||||||
|
*
|
||||||
|
- * DESCRIPTION: Disable a single GPE in the enable register.
|
||||||
|
+ * DESCRIPTION: Enable or disable a single GPE in its enable register.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
-acpi_status acpi_hw_low_disable_gpe(struct acpi_gpe_event_info *gpe_event_info)
|
||||||
|
+acpi_status
|
||||||
|
+acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 action)
|
||||||
|
{
|
||||||
|
struct acpi_gpe_register_info *gpe_register_info;
|
||||||
|
acpi_status status;
|
||||||
|
u32 enable_mask;
|
||||||
|
u32 register_bit;
|
||||||
|
|
||||||
|
+ ACPI_FUNCTION_ENTRY();
|
||||||
|
+
|
||||||
|
/* Get the info block for the entire GPE register */
|
||||||
|
|
||||||
|
gpe_register_info = gpe_event_info->register_info;
|
||||||
|
@@ -109,11 +113,23 @@ acpi_status acpi_hw_low_disable_gpe(struct acpi_gpe_event_info *gpe_event_info)
|
||||||
|
return (status);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Clear just the bit that corresponds to this GPE */
|
||||||
|
+ /* Set ot clear just the bit that corresponds to this GPE */
|
||||||
|
|
||||||
|
register_bit = acpi_hw_gpe_register_bit(gpe_event_info,
|
||||||
|
gpe_register_info);
|
||||||
|
- ACPI_CLEAR_BIT(enable_mask, register_bit);
|
||||||
|
+ switch (action) {
|
||||||
|
+ case ACPI_GPE_ENABLE:
|
||||||
|
+ ACPI_SET_BIT(enable_mask, register_bit);
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case ACPI_GPE_DISABLE:
|
||||||
|
+ ACPI_CLEAR_BIT(enable_mask, register_bit);
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ default:
|
||||||
|
+ ACPI_ERROR((AE_INFO, "Invalid action\n"));
|
||||||
|
+ return (AE_BAD_PARAMETER);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* Write the updated enable mask */
|
||||||
|
|
||||||
|
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
|
||||||
|
index de5e99a..6881f5b 100644
|
||||||
|
--- a/include/acpi/actypes.h
|
||||||
|
+++ b/include/acpi/actypes.h
|
||||||
|
@@ -663,7 +663,7 @@ typedef u32 acpi_event_status;
|
||||||
|
#define ACPI_GPE_MAX 0xFF
|
||||||
|
#define ACPI_NUM_GPE 256
|
||||||
|
|
||||||
|
-/* Actions for acpi_set_gpe */
|
||||||
|
+/* Actions for acpi_set_gpe and acpi_hw_low_set_gpe */
|
||||||
|
|
||||||
|
#define ACPI_GPE_ENABLE 0
|
||||||
|
#define ACPI_GPE_DISABLE 1
|
|
@ -0,0 +1,77 @@
|
||||||
|
From: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Date: Tue, 8 Jun 2010 08:49:45 +0000 (+0200)
|
||||||
|
Subject: ACPI / ACPICA: Avoid writing full enable masks to GPE registers
|
||||||
|
X-Git-Tag: v2.6.35-rc4~72^2~6^2~2
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=c9a8bbb7704cbf515c0fc68970abbe4e91d68521
|
||||||
|
|
||||||
|
ACPI / ACPICA: Avoid writing full enable masks to GPE registers
|
||||||
|
|
||||||
|
ACPICA uses acpi_hw_write_gpe_enable_reg() to re-enable a GPE after
|
||||||
|
an event signaled by it has been handled. However, this function
|
||||||
|
writes the entire GPE enable mask to the GPE's enable register which
|
||||||
|
may not be correct. Namely, if one of the other GPEs in the same
|
||||||
|
register was previously enabled by acpi_enable_gpe() and subsequently
|
||||||
|
disabled using acpi_set_gpe(), acpi_hw_write_gpe_enable_reg() will
|
||||||
|
re-enable it along with the target GPE.
|
||||||
|
|
||||||
|
To fix this issue rework acpi_hw_write_gpe_enable_reg() so that it
|
||||||
|
calls acpi_hw_low_set_gpe() with a special action value,
|
||||||
|
ACPI_GPE_COND_ENABLE, that will make it only enable the GPE if the
|
||||||
|
corresponding bit in its register's enable_for_run mask is set.
|
||||||
|
|
||||||
|
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Signed-off-by: Len Brown <len.brown@intel.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/acpica/hwgpe.c b/drivers/acpi/acpica/hwgpe.c
|
||||||
|
index 40388e2..3450309 100644
|
||||||
|
--- a/drivers/acpi/acpica/hwgpe.c
|
||||||
|
+++ b/drivers/acpi/acpica/hwgpe.c
|
||||||
|
@@ -118,6 +118,10 @@ acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 action)
|
||||||
|
register_bit = acpi_hw_gpe_register_bit(gpe_event_info,
|
||||||
|
gpe_register_info);
|
||||||
|
switch (action) {
|
||||||
|
+ case ACPI_GPE_COND_ENABLE:
|
||||||
|
+ if (!(register_bit & gpe_register_info->enable_for_run))
|
||||||
|
+ return (AE_BAD_PARAMETER);
|
||||||
|
+
|
||||||
|
case ACPI_GPE_ENABLE:
|
||||||
|
ACPI_SET_BIT(enable_mask, register_bit);
|
||||||
|
break;
|
||||||
|
@@ -154,23 +158,11 @@ acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 action)
|
||||||
|
acpi_status
|
||||||
|
acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info * gpe_event_info)
|
||||||
|
{
|
||||||
|
- struct acpi_gpe_register_info *gpe_register_info;
|
||||||
|
acpi_status status;
|
||||||
|
|
||||||
|
ACPI_FUNCTION_ENTRY();
|
||||||
|
|
||||||
|
- /* Get the info block for the entire GPE register */
|
||||||
|
-
|
||||||
|
- gpe_register_info = gpe_event_info->register_info;
|
||||||
|
- if (!gpe_register_info) {
|
||||||
|
- return (AE_NOT_EXIST);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* Write the entire GPE (runtime) enable register */
|
||||||
|
-
|
||||||
|
- status = acpi_hw_write(gpe_register_info->enable_for_run,
|
||||||
|
- &gpe_register_info->enable_address);
|
||||||
|
-
|
||||||
|
+ status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_COND_ENABLE);
|
||||||
|
return (status);
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
|
||||||
|
index 6881f5b..15a4c68f 100644
|
||||||
|
--- a/include/acpi/actypes.h
|
||||||
|
+++ b/include/acpi/actypes.h
|
||||||
|
@@ -667,6 +667,7 @@ typedef u32 acpi_event_status;
|
||||||
|
|
||||||
|
#define ACPI_GPE_ENABLE 0
|
||||||
|
#define ACPI_GPE_DISABLE 1
|
||||||
|
+#define ACPI_GPE_COND_ENABLE 2
|
||||||
|
|
||||||
|
/* gpe_types for acpi_enable_gpe and acpi_disable_gpe */
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
From: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Date: Tue, 8 Jun 2010 08:50:20 +0000 (+0200)
|
||||||
|
Subject: ACPI / ACPICA: Fix GPE initialization
|
||||||
|
X-Git-Tag: v2.6.35-rc4~72^2~6^2~1
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=ce43ace02320a3fb9614ddb27edc3a8700d68b26
|
||||||
|
|
||||||
|
ACPI / ACPICA: Fix GPE initialization
|
||||||
|
|
||||||
|
While developing the GPE reference counting code we overlooked the
|
||||||
|
fact that acpi_ev_update_gpes() could have enabled GPEs before
|
||||||
|
acpi_ev_initialize_gpe_block() was called. As a result, some GPEs
|
||||||
|
are enabled twice during the initialization.
|
||||||
|
|
||||||
|
To fix this issue avoid calling acpi_enable_gpe() from
|
||||||
|
acpi_ev_initialize_gpe_block() for the GPEs that have nonzero
|
||||||
|
runtime reference counters.
|
||||||
|
|
||||||
|
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Signed-off-by: Len Brown <len.brown@intel.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/acpica/evgpeblk.c b/drivers/acpi/acpica/evgpeblk.c
|
||||||
|
index 85ded1f..79048de 100644
|
||||||
|
--- a/drivers/acpi/acpica/evgpeblk.c
|
||||||
|
+++ b/drivers/acpi/acpica/evgpeblk.c
|
||||||
|
@@ -1024,6 +1024,19 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
|
||||||
|
|
||||||
|
gpe_index = (i * ACPI_GPE_REGISTER_WIDTH) + j;
|
||||||
|
gpe_event_info = &gpe_block->event_info[gpe_index];
|
||||||
|
+ gpe_number = gpe_index + gpe_block->block_base_number;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * If the GPE has already been enabled for runtime
|
||||||
|
+ * signaling, make sure it remains enabled, but do not
|
||||||
|
+ * increment its reference counter.
|
||||||
|
+ */
|
||||||
|
+ if (gpe_event_info->runtime_count) {
|
||||||
|
+ acpi_set_gpe(gpe_device, gpe_number,
|
||||||
|
+ ACPI_GPE_ENABLE);
|
||||||
|
+ gpe_enabled_count++;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (gpe_event_info->flags & ACPI_GPE_CAN_WAKE) {
|
||||||
|
wake_gpe_count++;
|
||||||
|
@@ -1040,7 +1053,6 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
|
||||||
|
|
||||||
|
/* Enable this GPE */
|
||||||
|
|
||||||
|
- gpe_number = gpe_index + gpe_block->block_base_number;
|
||||||
|
status = acpi_enable_gpe(gpe_device, gpe_number,
|
||||||
|
ACPI_GPE_TYPE_RUNTIME);
|
||||||
|
if (ACPI_FAILURE(status)) {
|
|
@ -0,0 +1,43 @@
|
||||||
|
From: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Date: Tue, 8 Jun 2010 08:50:53 +0000 (+0200)
|
||||||
|
Subject: ACPI / ACPICA: Fix sysfs GPE interface
|
||||||
|
X-Git-Tag: v2.6.35-rc4~72^2~6^2
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=9d3c752de65dbfa6e522f1d666deb0ac152ef367
|
||||||
|
|
||||||
|
ACPI / ACPICA: Fix sysfs GPE interface
|
||||||
|
|
||||||
|
The sysfs interface allowing user space to disable/enable GPEs
|
||||||
|
doesn't work correctly, because a GPE disabled this way will be
|
||||||
|
re-enabled shortly by acpi_ev_asynch_enable_gpe() if it was
|
||||||
|
previosuly enabled by acpi_enable_gpe() (in which case the
|
||||||
|
corresponding bit in its enable register's enable_for_run mask is
|
||||||
|
set).
|
||||||
|
|
||||||
|
To address this issue make the sysfs GPE interface use
|
||||||
|
acpi_enable_gpe() and acpi_disable_gpe() instead of acpi_set_gpe()
|
||||||
|
so that GPE reference counters are modified by it along with the
|
||||||
|
values of GPE enable registers.
|
||||||
|
|
||||||
|
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
|
||||||
|
Signed-off-by: Len Brown <len.brown@intel.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c
|
||||||
|
index e35525b..904e8fc 100644
|
||||||
|
--- a/drivers/acpi/system.c
|
||||||
|
+++ b/drivers/acpi/system.c
|
||||||
|
@@ -388,10 +388,12 @@ static ssize_t counter_set(struct kobject *kobj,
|
||||||
|
if (index < num_gpes) {
|
||||||
|
if (!strcmp(buf, "disable\n") &&
|
||||||
|
(status & ACPI_EVENT_FLAG_ENABLED))
|
||||||
|
- result = acpi_set_gpe(handle, index, ACPI_GPE_DISABLE);
|
||||||
|
+ result = acpi_disable_gpe(handle, index,
|
||||||
|
+ ACPI_GPE_TYPE_RUNTIME);
|
||||||
|
else if (!strcmp(buf, "enable\n") &&
|
||||||
|
!(status & ACPI_EVENT_FLAG_ENABLED))
|
||||||
|
- result = acpi_set_gpe(handle, index, ACPI_GPE_ENABLE);
|
||||||
|
+ result = acpi_enable_gpe(handle, index,
|
||||||
|
+ ACPI_GPE_TYPE_RUNTIME);
|
||||||
|
else if (!strcmp(buf, "clear\n") &&
|
||||||
|
(status & ACPI_EVENT_FLAG_SET))
|
||||||
|
result = acpi_clear_gpe(handle, index);
|
|
@ -0,0 +1,666 @@
|
||||||
|
From e2e8fc4ed31157e9e9e9cbc70febf08c77233aea Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@dreadnought.i.jkkm.org>
|
||||||
|
Date: Thu, 20 May 2010 10:17:58 -0400
|
||||||
|
Subject: add-appleir-driver
|
||||||
|
|
||||||
|
---
|
||||||
|
Documentation/input/appleir.txt | 45 ++++
|
||||||
|
drivers/hid/hid-apple.c | 4 -
|
||||||
|
drivers/hid/hid-core.c | 9 +-
|
||||||
|
drivers/hid/hid-ids.h | 1 +
|
||||||
|
drivers/hid/usbhid/hid-core.c | 1 +
|
||||||
|
drivers/input/misc/Kconfig | 13 ++
|
||||||
|
drivers/input/misc/Makefile | 1 +
|
||||||
|
drivers/input/misc/appleir.c | 453 +++++++++++++++++++++++++++++++++++++++
|
||||||
|
include/linux/hid.h | 2 +
|
||||||
|
9 files changed, 522 insertions(+), 7 deletions(-)
|
||||||
|
create mode 100644 Documentation/input/appleir.txt
|
||||||
|
create mode 100644 drivers/input/misc/appleir.c
|
||||||
|
|
||||||
|
diff --git a/Documentation/input/appleir.txt b/Documentation/input/appleir.txt
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..0267a4b
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/input/appleir.txt
|
||||||
|
@@ -0,0 +1,45 @@
|
||||||
|
+Apple IR receiver Driver (appleir)
|
||||||
|
+----------------------------------
|
||||||
|
+ Copyright (C) 2009 Bastien Nocera <hadess@hadess.net>
|
||||||
|
+
|
||||||
|
+The appleir driver is a kernel input driver to handle Apple's IR
|
||||||
|
+receivers (and associated remotes) in the kernel.
|
||||||
|
+
|
||||||
|
+The driver is an input driver which only handles "official" remotes
|
||||||
|
+as built and sold by Apple.
|
||||||
|
+
|
||||||
|
+Authors
|
||||||
|
+-------
|
||||||
|
+
|
||||||
|
+James McKenzie (original driver)
|
||||||
|
+Alex Karpenko (05ac:8242 support)
|
||||||
|
+Greg Kroah-Hartman (cleanups and original submission)
|
||||||
|
+Bastien Nocera (further cleanups and suspend support)
|
||||||
|
+
|
||||||
|
+Supported hardware
|
||||||
|
+------------------
|
||||||
|
+
|
||||||
|
+- All Apple laptops and desktops from 2005 onwards, except:
|
||||||
|
+ - the unibody Macbook (2009)
|
||||||
|
+ - Mac Pro (all versions)
|
||||||
|
+- Apple TV (all revisions)
|
||||||
|
+
|
||||||
|
+The remote will only support the 6 buttons of the original remotes
|
||||||
|
+as sold by Apple. See the next section if you want to use other remotes
|
||||||
|
+or want to use lirc with the device instead of the kernel driver.
|
||||||
|
+
|
||||||
|
+Using lirc (native) instead of the kernel driver
|
||||||
|
+------------------------------------------------
|
||||||
|
+
|
||||||
|
+First, you will need to disable the kernel driver for the receiver.
|
||||||
|
+
|
||||||
|
+This can be achieved by passing quirks to the usbhid driver.
|
||||||
|
+The quirk line would be:
|
||||||
|
+usbhid.quirks=0x05ac:0x8242:0x40000010
|
||||||
|
+
|
||||||
|
+With 0x05ac being the vendor ID (Apple, you shouldn't need to change this)
|
||||||
|
+With 0x8242 being the product ID (check the output of lsusb for your hardware)
|
||||||
|
+And 0x10 being "HID_QUIRK_HIDDEV_FORCE" and 0x40000000 being "HID_QUIRK_NO_IGNORE"
|
||||||
|
+
|
||||||
|
+This should force the creation of a hiddev device for the receiver, and
|
||||||
|
+make it usable under lirc.
|
||||||
|
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c
|
||||||
|
index bba05d0..0059d5a 100644
|
||||||
|
--- a/drivers/hid/hid-apple.c
|
||||||
|
+++ b/drivers/hid/hid-apple.c
|
||||||
|
@@ -361,10 +361,6 @@ static void apple_remove(struct hid_device *hdev)
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct hid_device_id apple_devices[] = {
|
||||||
|
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL),
|
||||||
|
- .driver_data = APPLE_HIDDEV | APPLE_IGNORE_HIDINPUT },
|
||||||
|
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4),
|
||||||
|
- .driver_data = APPLE_HIDDEV | APPLE_IGNORE_HIDINPUT },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE),
|
||||||
|
.driver_data = APPLE_MIGHTYMOUSE | APPLE_INVERT_HWHEEL },
|
||||||
|
|
||||||
|
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
|
||||||
|
index 143e788..387bb59 100644
|
||||||
|
--- a/drivers/hid/hid-core.c
|
||||||
|
+++ b/drivers/hid/hid-core.c
|
||||||
|
@@ -1167,6 +1167,8 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
|
||||||
|
unsigned int i;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
+ if (hdev->quirks & HID_QUIRK_HIDDEV_FORCE)
|
||||||
|
+ connect_mask |= (HID_CONNECT_HIDDEV_FORCE | HID_CONNECT_HIDDEV);
|
||||||
|
if (hdev->bus != BUS_USB)
|
||||||
|
connect_mask &= ~HID_CONNECT_HIDDEV;
|
||||||
|
if (hid_hiddev(hdev))
|
||||||
|
@@ -1248,8 +1250,6 @@ static const struct hid_device_id hid_blacklist[] = {
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
|
||||||
|
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
|
||||||
|
- { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) },
|
||||||
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICMOUSE) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) },
|
||||||
|
@@ -1553,6 +1553,9 @@ static const struct hid_device_id hid_ignore_list[] = {
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_T91MT)},
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_LCM)},
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_LCM2)},
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL) },
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) },
|
||||||
|
@@ -1757,7 +1760,7 @@ int hid_add_device(struct hid_device *hdev)
|
||||||
|
|
||||||
|
/* we need to kill them here, otherwise they will stay allocated to
|
||||||
|
* wait for coming driver */
|
||||||
|
- if (hid_ignore(hdev))
|
||||||
|
+ if (!(hdev->quirks & HID_QUIRK_NO_IGNORE) && hid_ignore(hdev))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
/* XXX hack, any other cleaner solution after the driver core
|
||||||
|
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
||||||
|
index 09d2764..7275a9d 100644
|
||||||
|
--- a/drivers/hid/hid-ids.h
|
||||||
|
+++ b/drivers/hid/hid-ids.h
|
||||||
|
@@ -97,6 +97,7 @@
|
||||||
|
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b
|
||||||
|
#define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a
|
||||||
|
#define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b
|
||||||
|
+#define USB_DEVICE_ID_APPLE_IRCONTROL 0x8240
|
||||||
|
#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241
|
||||||
|
#define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242
|
||||||
|
|
||||||
|
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
|
||||||
|
index 7b85b69..66b512c 100644
|
||||||
|
--- a/drivers/hid/usbhid/hid-core.c
|
||||||
|
+++ b/drivers/hid/usbhid/hid-core.c
|
||||||
|
@@ -1133,6 +1133,7 @@ static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *
|
||||||
|
hid->vendor = le16_to_cpu(dev->descriptor.idVendor);
|
||||||
|
hid->product = le16_to_cpu(dev->descriptor.idProduct);
|
||||||
|
hid->name[0] = 0;
|
||||||
|
+ hid->quirks = usbhid_lookup_quirk(hid->vendor, hid->product);
|
||||||
|
if (intf->cur_altsetting->desc.bInterfaceProtocol ==
|
||||||
|
USB_INTERFACE_PROTOCOL_MOUSE)
|
||||||
|
hid->type = HID_TYPE_USBMOUSE;
|
||||||
|
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
|
||||||
|
index 23140a3..46614b2 100644
|
||||||
|
--- a/drivers/input/misc/Kconfig
|
||||||
|
+++ b/drivers/input/misc/Kconfig
|
||||||
|
@@ -159,6 +159,19 @@ config INPUT_KEYSPAN_REMOTE
|
||||||
|
To compile this driver as a module, choose M here: the module will
|
||||||
|
be called keyspan_remote.
|
||||||
|
|
||||||
|
+config INPUT_APPLEIR
|
||||||
|
+ tristate "Apple infrared receiver (built in)"
|
||||||
|
+ depends on USB_ARCH_HAS_HCD
|
||||||
|
+ select USB
|
||||||
|
+ help
|
||||||
|
+ Say Y here if you want to use a Apple infrared remote control. All
|
||||||
|
+ the Apple computers from 2005 onwards include such a port, except
|
||||||
|
+ the unibody Macbook (2009), and Mac Pros. This receiver is also
|
||||||
|
+ used in the Apple TV set-top box.
|
||||||
|
+
|
||||||
|
+ To compile this driver as a module, choose M here: the module will
|
||||||
|
+ be called appleir.
|
||||||
|
+
|
||||||
|
config INPUT_POWERMATE
|
||||||
|
tristate "Griffin PowerMate and Contour Jog support"
|
||||||
|
depends on USB_ARCH_HAS_HCD
|
||||||
|
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
|
||||||
|
index 7e95a5d..3fa4404 100644
|
||||||
|
--- a/drivers/input/misc/Makefile
|
||||||
|
+++ b/drivers/input/misc/Makefile
|
||||||
|
@@ -6,6 +6,7 @@
|
||||||
|
|
||||||
|
obj-$(CONFIG_INPUT_88PM860X_ONKEY) += 88pm860x_onkey.o
|
||||||
|
obj-$(CONFIG_INPUT_APANEL) += apanel.o
|
||||||
|
+obj-$(CONFIG_INPUT_APPLEIR) += appleir.o
|
||||||
|
obj-$(CONFIG_INPUT_ATI_REMOTE) += ati_remote.o
|
||||||
|
obj-$(CONFIG_INPUT_ATI_REMOTE2) += ati_remote2.o
|
||||||
|
obj-$(CONFIG_INPUT_ATLAS_BTNS) += atlas_btns.o
|
||||||
|
diff --git a/drivers/input/misc/appleir.c b/drivers/input/misc/appleir.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..cff4df6
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/input/misc/appleir.c
|
||||||
|
@@ -0,0 +1,453 @@
|
||||||
|
+/*
|
||||||
|
+ * appleir: USB driver for the apple ir device
|
||||||
|
+ *
|
||||||
|
+ * Original driver written by James McKenzie
|
||||||
|
+ * Ported to recent 2.6 kernel versions by Greg Kroah-Hartman <gregkh@suse.de>
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2006 James McKenzie
|
||||||
|
+ * Copyright (C) 2008 Greg Kroah-Hartman <greg@kroah.com>
|
||||||
|
+ * Copyright (C) 2008 Novell Inc.
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can redistribute it and/or modify it
|
||||||
|
+ * under the terms of the GNU General Public License as published by the Free
|
||||||
|
+ * Software Foundation, version 2.
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/kernel.h>
|
||||||
|
+#include <linux/slab.h>
|
||||||
|
+#include <linux/input.h>
|
||||||
|
+#include <linux/usb/input.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/init.h>
|
||||||
|
+#include <linux/usb.h>
|
||||||
|
+#include <linux/usb/input.h>
|
||||||
|
+#include <asm/unaligned.h>
|
||||||
|
+#include <asm/byteorder.h>
|
||||||
|
+
|
||||||
|
+#define DRIVER_VERSION "v1.2"
|
||||||
|
+#define DRIVER_AUTHOR "James McKenzie"
|
||||||
|
+#define DRIVER_DESC "Apple infrared receiver driver"
|
||||||
|
+#define DRIVER_LICENSE "GPL"
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||||
|
+MODULE_DESCRIPTION(DRIVER_DESC);
|
||||||
|
+MODULE_LICENSE(DRIVER_LICENSE);
|
||||||
|
+
|
||||||
|
+#define USB_VENDOR_ID_APPLE 0x05ac
|
||||||
|
+#define USB_DEVICE_ID_APPLE_IRCONTROL 0x8240
|
||||||
|
+#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241
|
||||||
|
+#define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242
|
||||||
|
+
|
||||||
|
+#define URB_SIZE 32
|
||||||
|
+
|
||||||
|
+#define MAX_KEYS 8
|
||||||
|
+#define MAX_KEYS_MASK (MAX_KEYS - 1)
|
||||||
|
+
|
||||||
|
+#define dbginfo(dev, format, arg...) do { if (debug) dev_info(dev , format , ## arg); } while (0)
|
||||||
|
+
|
||||||
|
+static int debug;
|
||||||
|
+module_param(debug, int, 0644);
|
||||||
|
+MODULE_PARM_DESC(debug, "Enable extra debug messages and information");
|
||||||
|
+
|
||||||
|
+/* I have two devices both of which report the following */
|
||||||
|
+/* 25 87 ee 83 0a + */
|
||||||
|
+/* 25 87 ee 83 0c - */
|
||||||
|
+/* 25 87 ee 83 09 << */
|
||||||
|
+/* 25 87 ee 83 06 >> */
|
||||||
|
+/* 25 87 ee 83 05 >" */
|
||||||
|
+/* 25 87 ee 83 03 menu */
|
||||||
|
+/* 26 00 00 00 00 for key repeat*/
|
||||||
|
+
|
||||||
|
+/* Thomas Glanzmann reports the following responses */
|
||||||
|
+/* 25 87 ee ca 0b + */
|
||||||
|
+/* 25 87 ee ca 0d - */
|
||||||
|
+/* 25 87 ee ca 08 << */
|
||||||
|
+/* 25 87 ee ca 07 >> */
|
||||||
|
+/* 25 87 ee ca 04 >" */
|
||||||
|
+/* 25 87 ee ca 02 menu */
|
||||||
|
+/* 26 00 00 00 00 for key repeat*/
|
||||||
|
+/* He also observes the following event sometimes */
|
||||||
|
+/* sent after a key is release, which I interpret */
|
||||||
|
+/* as a flat battery message */
|
||||||
|
+/* 25 87 e0 ca 06 flat battery */
|
||||||
|
+
|
||||||
|
+/* Alexandre Karpenko reports the following responses for Device ID 0x8242 */
|
||||||
|
+/* 25 87 ee 47 0b + */
|
||||||
|
+/* 25 87 ee 47 0d - */
|
||||||
|
+/* 25 87 ee 47 08 << */
|
||||||
|
+/* 25 87 ee 47 07 >> */
|
||||||
|
+/* 25 87 ee 47 04 >" */
|
||||||
|
+/* 25 87 ee 47 02 menu */
|
||||||
|
+/* 26 87 ee 47 ** for key repeat (** is the code of the key being held) */
|
||||||
|
+
|
||||||
|
+static const unsigned short appleir_key_table[] = {
|
||||||
|
+ KEY_RESERVED,
|
||||||
|
+ KEY_MENU,
|
||||||
|
+ KEY_PLAYPAUSE,
|
||||||
|
+ KEY_FORWARD,
|
||||||
|
+ KEY_BACK,
|
||||||
|
+ KEY_VOLUMEUP,
|
||||||
|
+ KEY_VOLUMEDOWN,
|
||||||
|
+ KEY_RESERVED,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct appleir {
|
||||||
|
+ struct input_dev *input_dev;
|
||||||
|
+ unsigned short keymap[ARRAY_SIZE(appleir_key_table)];
|
||||||
|
+ u8 *data;
|
||||||
|
+ dma_addr_t dma_buf;
|
||||||
|
+ struct usb_device *usbdev;
|
||||||
|
+ unsigned int flags;
|
||||||
|
+ struct urb *urb;
|
||||||
|
+ struct timer_list key_up_timer;
|
||||||
|
+ int current_key;
|
||||||
|
+ char phys[32];
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static DEFINE_MUTEX(appleir_mutex);
|
||||||
|
+
|
||||||
|
+enum {
|
||||||
|
+ APPLEIR_OPENED = 0x1,
|
||||||
|
+ APPLEIR_SUSPENDED = 0x2,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct usb_device_id appleir_ids[] = {
|
||||||
|
+ { USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL) },
|
||||||
|
+ { USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
|
||||||
|
+ { USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
|
||||||
|
+ {}
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(usb, appleir_ids);
|
||||||
|
+
|
||||||
|
+static void dump_packet(struct appleir *appleir, char *msg, u8 *data, int len)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ printk(KERN_ERR "appleir: %s (%d bytes)", msg, len);
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < len; ++i)
|
||||||
|
+ printk(" %02x", data[i]);
|
||||||
|
+ printk("\n");
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void key_up(struct appleir *appleir, int key)
|
||||||
|
+{
|
||||||
|
+ dbginfo(&appleir->input_dev->dev, "key %d up\n", key);
|
||||||
|
+ input_report_key(appleir->input_dev, key, 0);
|
||||||
|
+ input_sync(appleir->input_dev);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void key_down(struct appleir *appleir, int key)
|
||||||
|
+{
|
||||||
|
+ dbginfo(&appleir->input_dev->dev, "key %d down\n", key);
|
||||||
|
+ input_report_key(appleir->input_dev, key, 1);
|
||||||
|
+ input_sync(appleir->input_dev);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void battery_flat(struct appleir *appleir)
|
||||||
|
+{
|
||||||
|
+ dev_err(&appleir->input_dev->dev, "possible flat battery?\n");
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void key_up_tick(unsigned long data)
|
||||||
|
+{
|
||||||
|
+ struct appleir *appleir = (struct appleir *)data;
|
||||||
|
+
|
||||||
|
+ if (appleir->current_key) {
|
||||||
|
+ key_up(appleir, appleir->current_key);
|
||||||
|
+ appleir->current_key = 0;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void new_data(struct appleir *appleir, u8 *data, int len)
|
||||||
|
+{
|
||||||
|
+ static const u8 keydown[] = { 0x25, 0x87, 0xee };
|
||||||
|
+ static const u8 keyrepeat[] = { 0x26, };
|
||||||
|
+ static const u8 flatbattery[] = { 0x25, 0x87, 0xe0 };
|
||||||
|
+
|
||||||
|
+ if (debug)
|
||||||
|
+ dump_packet(appleir, "received", data, len);
|
||||||
|
+
|
||||||
|
+ if (len != 5)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (!memcmp(data, keydown, sizeof(keydown))) {
|
||||||
|
+ /* If we already have a key down, take it up before marking
|
||||||
|
+ this one down */
|
||||||
|
+ if (appleir->current_key)
|
||||||
|
+ key_up(appleir, appleir->current_key);
|
||||||
|
+ appleir->current_key = appleir->keymap[(data[4] >> 1) & MAX_KEYS_MASK];
|
||||||
|
+
|
||||||
|
+ key_down(appleir, appleir->current_key);
|
||||||
|
+ /* Remote doesn't do key up, either pull them up, in the test
|
||||||
|
+ above, or here set a timer which pulls them up after 1/8 s */
|
||||||
|
+ mod_timer(&appleir->key_up_timer, jiffies + HZ / 8);
|
||||||
|
+
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!memcmp(data, keyrepeat, sizeof(keyrepeat))) {
|
||||||
|
+ key_down(appleir, appleir->current_key);
|
||||||
|
+ /* Remote doesn't do key up, either pull them up, in the test
|
||||||
|
+ above, or here set a timer which pulls them up after 1/8 s */
|
||||||
|
+ mod_timer(&appleir->key_up_timer, jiffies + HZ / 8);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!memcmp(data, flatbattery, sizeof(flatbattery))) {
|
||||||
|
+ battery_flat(appleir);
|
||||||
|
+ /* Fall through */
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ dump_packet(appleir, "unknown packet", data, len);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void appleir_urb(struct urb *urb)
|
||||||
|
+{
|
||||||
|
+ struct appleir *appleir = urb->context;
|
||||||
|
+ int status = urb->status;
|
||||||
|
+ int retval;
|
||||||
|
+
|
||||||
|
+ switch (status) {
|
||||||
|
+ case 0:
|
||||||
|
+ new_data(appleir, urb->transfer_buffer, urb->actual_length);
|
||||||
|
+ break;
|
||||||
|
+ case -ECONNRESET:
|
||||||
|
+ case -ENOENT:
|
||||||
|
+ case -ESHUTDOWN:
|
||||||
|
+ /* This urb is terminated, clean up */
|
||||||
|
+ dbginfo(&appleir->input_dev->dev, "%s - urb shutting down with status: %d", __func__,
|
||||||
|
+ urb->status);
|
||||||
|
+ return;
|
||||||
|
+ default:
|
||||||
|
+ dbginfo(&appleir->input_dev->dev, "%s - nonzero urb status received: %d", __func__,
|
||||||
|
+ urb->status);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ retval = usb_submit_urb(urb, GFP_ATOMIC);
|
||||||
|
+ if (retval)
|
||||||
|
+ err("%s - usb_submit_urb failed with result %d", __func__,
|
||||||
|
+ retval);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int appleir_open(struct input_dev *dev)
|
||||||
|
+{
|
||||||
|
+ struct appleir *appleir = input_get_drvdata(dev);
|
||||||
|
+ struct usb_interface *intf = usb_ifnum_to_if(appleir->usbdev, 0);
|
||||||
|
+ int r;
|
||||||
|
+
|
||||||
|
+ r = usb_autopm_get_interface(intf);
|
||||||
|
+ if (r) {
|
||||||
|
+ dev_err(&intf->dev,
|
||||||
|
+ "%s(): usb_autopm_get_interface() = %d\n", __func__, r);
|
||||||
|
+ return r;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ mutex_lock(&appleir_mutex);
|
||||||
|
+
|
||||||
|
+ if (usb_submit_urb(appleir->urb, GFP_ATOMIC)) {
|
||||||
|
+ r = -EIO;
|
||||||
|
+ goto fail;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ appleir->flags |= APPLEIR_OPENED;
|
||||||
|
+
|
||||||
|
+ mutex_unlock(&appleir_mutex);
|
||||||
|
+
|
||||||
|
+ usb_autopm_put_interface(intf);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+fail:
|
||||||
|
+ mutex_unlock(&appleir_mutex);
|
||||||
|
+ usb_autopm_put_interface(intf);
|
||||||
|
+ return r;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void appleir_close(struct input_dev *dev)
|
||||||
|
+{
|
||||||
|
+ struct appleir *appleir = input_get_drvdata(dev);
|
||||||
|
+
|
||||||
|
+ mutex_lock(&appleir_mutex);
|
||||||
|
+
|
||||||
|
+ if (!(appleir->flags & APPLEIR_SUSPENDED)) {
|
||||||
|
+ usb_kill_urb(appleir->urb);
|
||||||
|
+ del_timer_sync(&appleir->key_up_timer);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ appleir->flags &= ~APPLEIR_OPENED;
|
||||||
|
+
|
||||||
|
+ mutex_unlock(&appleir_mutex);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int appleir_probe(struct usb_interface *intf,
|
||||||
|
+ const struct usb_device_id *id)
|
||||||
|
+{
|
||||||
|
+ struct usb_device *dev = interface_to_usbdev(intf);
|
||||||
|
+ struct usb_endpoint_descriptor *endpoint;
|
||||||
|
+ struct appleir *appleir = NULL;
|
||||||
|
+ struct input_dev *input_dev;
|
||||||
|
+ int retval = -ENOMEM;
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ appleir = kzalloc(sizeof(struct appleir), GFP_KERNEL);
|
||||||
|
+ if (!appleir)
|
||||||
|
+ goto allocfail;
|
||||||
|
+
|
||||||
|
+ appleir->data = usb_buffer_alloc(dev, URB_SIZE, GFP_KERNEL,
|
||||||
|
+ &appleir->dma_buf);
|
||||||
|
+ if (!appleir->data)
|
||||||
|
+ goto usbfail;
|
||||||
|
+
|
||||||
|
+ appleir->urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||||
|
+ if (!appleir->urb)
|
||||||
|
+ goto urbfail;
|
||||||
|
+
|
||||||
|
+ appleir->usbdev = dev;
|
||||||
|
+
|
||||||
|
+ input_dev = input_allocate_device();
|
||||||
|
+ if (!input_dev)
|
||||||
|
+ goto inputfail;
|
||||||
|
+
|
||||||
|
+ appleir->input_dev = input_dev;
|
||||||
|
+
|
||||||
|
+ usb_make_path(dev, appleir->phys, sizeof(appleir->phys));
|
||||||
|
+ strlcpy(appleir->phys, "/input0", sizeof(appleir->phys));
|
||||||
|
+
|
||||||
|
+ input_dev->name = "Apple Infrared Remote Controller";
|
||||||
|
+ input_dev->phys = appleir->phys;
|
||||||
|
+ usb_to_input_id(dev, &input_dev->id);
|
||||||
|
+ input_dev->dev.parent = &intf->dev;
|
||||||
|
+ input_dev->keycode = appleir->keymap;
|
||||||
|
+ input_dev->keycodesize = sizeof(unsigned short);
|
||||||
|
+ input_dev->keycodemax = ARRAY_SIZE(appleir->keymap);
|
||||||
|
+
|
||||||
|
+ input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
|
||||||
|
+
|
||||||
|
+ memcpy(appleir->keymap, appleir_key_table, sizeof(appleir->keymap));
|
||||||
|
+ for (i = 0; i < ARRAY_SIZE(appleir_key_table); i++)
|
||||||
|
+ set_bit(appleir->keymap[i], input_dev->keybit);
|
||||||
|
+ clear_bit(KEY_RESERVED, input_dev->keybit);
|
||||||
|
+
|
||||||
|
+ input_set_drvdata(input_dev, appleir);
|
||||||
|
+ input_dev->open = appleir_open;
|
||||||
|
+ input_dev->close = appleir_close;
|
||||||
|
+
|
||||||
|
+ endpoint = &intf->cur_altsetting->endpoint[0].desc;
|
||||||
|
+
|
||||||
|
+ usb_fill_int_urb(appleir->urb, dev,
|
||||||
|
+ usb_rcvintpipe(dev, endpoint->bEndpointAddress),
|
||||||
|
+ appleir->data, 8,
|
||||||
|
+ appleir_urb, appleir, endpoint->bInterval);
|
||||||
|
+
|
||||||
|
+ appleir->urb->transfer_dma = appleir->dma_buf;
|
||||||
|
+ appleir->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||||
|
+
|
||||||
|
+ setup_timer(&appleir->key_up_timer,
|
||||||
|
+ key_up_tick, (unsigned long) appleir);
|
||||||
|
+
|
||||||
|
+ retval = input_register_device(appleir->input_dev);
|
||||||
|
+ if (retval)
|
||||||
|
+ goto inputfail;
|
||||||
|
+
|
||||||
|
+ usb_set_intfdata(intf, appleir);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+inputfail:
|
||||||
|
+ input_free_device(appleir->input_dev);
|
||||||
|
+
|
||||||
|
+urbfail:
|
||||||
|
+ usb_free_urb(appleir->urb);
|
||||||
|
+
|
||||||
|
+usbfail:
|
||||||
|
+ usb_buffer_free(dev, URB_SIZE, appleir->data,
|
||||||
|
+ appleir->dma_buf);
|
||||||
|
+
|
||||||
|
+allocfail:
|
||||||
|
+ kfree(appleir);
|
||||||
|
+
|
||||||
|
+ return retval;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void appleir_disconnect(struct usb_interface *intf)
|
||||||
|
+{
|
||||||
|
+ struct appleir *appleir = usb_get_intfdata(intf);
|
||||||
|
+
|
||||||
|
+ usb_set_intfdata(intf, NULL);
|
||||||
|
+ input_unregister_device(appleir->input_dev);
|
||||||
|
+ usb_free_urb(appleir->urb);
|
||||||
|
+ usb_buffer_free(interface_to_usbdev(intf), URB_SIZE,
|
||||||
|
+ appleir->data, appleir->dma_buf);
|
||||||
|
+ kfree(appleir);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int appleir_suspend(struct usb_interface *interface,
|
||||||
|
+ pm_message_t message)
|
||||||
|
+{
|
||||||
|
+ struct appleir *appleir = usb_get_intfdata(interface);
|
||||||
|
+
|
||||||
|
+ mutex_lock(&appleir_mutex);
|
||||||
|
+ if (appleir->flags & APPLEIR_OPENED)
|
||||||
|
+ usb_kill_urb(appleir->urb);
|
||||||
|
+
|
||||||
|
+ appleir->flags |= APPLEIR_SUSPENDED;
|
||||||
|
+
|
||||||
|
+ mutex_unlock(&appleir_mutex);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int appleir_resume(struct usb_interface *interface)
|
||||||
|
+{
|
||||||
|
+ struct appleir *appleir;
|
||||||
|
+ int r = 0;
|
||||||
|
+
|
||||||
|
+ appleir = usb_get_intfdata(interface);
|
||||||
|
+
|
||||||
|
+ mutex_lock(&appleir_mutex);
|
||||||
|
+ if (appleir->flags & APPLEIR_OPENED) {
|
||||||
|
+ struct usb_endpoint_descriptor *endpoint;
|
||||||
|
+
|
||||||
|
+ endpoint = &interface->cur_altsetting->endpoint[0].desc;
|
||||||
|
+ usb_fill_int_urb(appleir->urb, appleir->usbdev,
|
||||||
|
+ usb_rcvintpipe(appleir->usbdev, endpoint->bEndpointAddress),
|
||||||
|
+ appleir->data, 8,
|
||||||
|
+ appleir_urb, appleir, endpoint->bInterval);
|
||||||
|
+ appleir->urb->transfer_dma = appleir->dma_buf;
|
||||||
|
+ appleir->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||||
|
+
|
||||||
|
+ /* And reset the USB device */
|
||||||
|
+ if (usb_submit_urb(appleir->urb, GFP_ATOMIC))
|
||||||
|
+ r = -EIO;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ appleir->flags &= ~APPLEIR_SUSPENDED;
|
||||||
|
+
|
||||||
|
+ mutex_unlock(&appleir_mutex);
|
||||||
|
+
|
||||||
|
+ return r;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct usb_driver appleir_driver = {
|
||||||
|
+ .name = "appleir",
|
||||||
|
+ .probe = appleir_probe,
|
||||||
|
+ .disconnect = appleir_disconnect,
|
||||||
|
+ .suspend = appleir_suspend,
|
||||||
|
+ .resume = appleir_resume,
|
||||||
|
+ .reset_resume = appleir_resume,
|
||||||
|
+ .id_table = appleir_ids,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int __init appleir_init(void)
|
||||||
|
+{
|
||||||
|
+ return usb_register(&appleir_driver);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void __exit appleir_exit(void)
|
||||||
|
+{
|
||||||
|
+ usb_deregister(&appleir_driver);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+module_init(appleir_init);
|
||||||
|
+module_exit(appleir_exit);
|
||||||
|
diff --git a/include/linux/hid.h b/include/linux/hid.h
|
||||||
|
index b1344ec..f1f2b6f 100644
|
||||||
|
--- a/include/linux/hid.h
|
||||||
|
+++ b/include/linux/hid.h
|
||||||
|
@@ -308,11 +308,13 @@ struct hid_item {
|
||||||
|
#define HID_QUIRK_NOTOUCH 0x00000002
|
||||||
|
#define HID_QUIRK_IGNORE 0x00000004
|
||||||
|
#define HID_QUIRK_NOGET 0x00000008
|
||||||
|
+#define HID_QUIRK_HIDDEV_FORCE 0x00000010
|
||||||
|
#define HID_QUIRK_BADPAD 0x00000020
|
||||||
|
#define HID_QUIRK_MULTI_INPUT 0x00000040
|
||||||
|
#define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000
|
||||||
|
#define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000
|
||||||
|
#define HID_QUIRK_NO_INIT_REPORTS 0x20000000
|
||||||
|
+#define HID_QUIRK_NO_IGNORE 0x40000000
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the global environment of the parser. This information is
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
From: Tejun Heo <tj@kernel.org>
|
||||||
|
Date: Thu, 17 Jun 2010 09:42:22 +0000 (+0200)
|
||||||
|
Subject: ahci,ata_generic: let ata_generic handle new MBP w/ MCP89
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=c6353b4520788e34098bbf61c73fb9618ca7fdd6
|
||||||
|
|
||||||
|
ahci,ata_generic: let ata_generic handle new MBP w/ MCP89
|
||||||
|
|
||||||
|
For yet unknown reason, MCP89 on MBP 7,1 doesn't work w/ ahci under
|
||||||
|
linux but the controller doesn't require explicit mode setting and
|
||||||
|
works fine with ata_generic. Make ahci ignore the controller on MBP
|
||||||
|
7,1 and let ata_generic take it for now.
|
||||||
|
|
||||||
|
Reported in bko#15923.
|
||||||
|
|
||||||
|
https://bugzilla.kernel.org/show_bug.cgi?id=15923
|
||||||
|
|
||||||
|
NVIDIA is investigating why ahci mode doesn't work.
|
||||||
|
|
||||||
|
Signed-off-by: Tejun Heo <tj@kernel.org>
|
||||||
|
Cc: Peer Chen <pchen@nvidia.com>
|
||||||
|
Cc: stable@kernel.org
|
||||||
|
Reported-by: Anders Østhus <grapz666@gmail.com>
|
||||||
|
Reported-by: Andreas Graf <andreas_graf@csgraf.de>
|
||||||
|
Reported-by: Benoit Gschwind <gschwind@gnu-log.net>
|
||||||
|
Reported-by: Damien Cassou <damien.cassou@gmail.com>
|
||||||
|
Reported-by: tixetsal@juno.com
|
||||||
|
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
|
||||||
|
index 8ca16f5..f252253 100644
|
||||||
|
--- a/drivers/ata/ahci.c
|
||||||
|
+++ b/drivers/ata/ahci.c
|
||||||
|
@@ -1053,6 +1053,16 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
|
if (pdev->vendor == PCI_VENDOR_ID_MARVELL && !marvell_enable)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * For some reason, MCP89 on MacBook 7,1 doesn't work with
|
||||||
|
+ * ahci, use ata_generic instead.
|
||||||
|
+ */
|
||||||
|
+ if (pdev->vendor == PCI_VENDOR_ID_NVIDIA &&
|
||||||
|
+ pdev->device == PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA &&
|
||||||
|
+ pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE &&
|
||||||
|
+ pdev->subsystem_device == 0xcb89)
|
||||||
|
+ return -ENODEV;
|
||||||
|
+
|
||||||
|
/* Promise's PDC42819 is a SAS/SATA controller that has an AHCI mode.
|
||||||
|
* At the moment, we can only use the AHCI mode. Let the users know
|
||||||
|
* that for SAS drives they're out of luck.
|
||||||
|
diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c
|
||||||
|
index 573158a..d4ccf74 100644
|
||||||
|
--- a/drivers/ata/ata_generic.c
|
||||||
|
+++ b/drivers/ata/ata_generic.c
|
||||||
|
@@ -168,6 +168,12 @@ static struct pci_device_id ata_generic[] = {
|
||||||
|
{ PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C561), },
|
||||||
|
{ PCI_DEVICE(PCI_VENDOR_ID_OPTI, PCI_DEVICE_ID_OPTI_82C558), },
|
||||||
|
{ PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE), },
|
||||||
|
+ /*
|
||||||
|
+ * For some reason, MCP89 on MacBook 7,1 doesn't work with
|
||||||
|
+ * ahci, use ata_generic instead.
|
||||||
|
+ */
|
||||||
|
+ { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA,
|
||||||
|
+ PCI_VENDOR_ID_APPLE, 0xcb89, },
|
||||||
|
#if !defined(CONFIG_PATA_TOSHIBA) && !defined(CONFIG_PATA_TOSHIBA_MODULE)
|
||||||
|
{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1), },
|
||||||
|
{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2), },
|
||||||
|
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
|
||||||
|
index 4eb4679..3bedcc1 100644
|
||||||
|
--- a/include/linux/pci_ids.h
|
||||||
|
+++ b/include/linux/pci_ids.h
|
||||||
|
@@ -1261,6 +1261,7 @@
|
||||||
|
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759
|
||||||
|
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_SMBUS 0x07D8
|
||||||
|
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP79_SMBUS 0x0AA2
|
||||||
|
+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA 0x0D85
|
||||||
|
|
||||||
|
#define PCI_VENDOR_ID_IMS 0x10e0
|
||||||
|
#define PCI_DEVICE_ID_IMS_TT128 0x9128
|
|
@ -0,0 +1,114 @@
|
||||||
|
From: Tejun Heo <tj@kernel.org>
|
||||||
|
Date: Tue, 22 Jun 2010 10:27:26 +0000 (+0200)
|
||||||
|
Subject: ata_generic: implement ATA_GEN_* flags and force enable DMA on MBP 7,1
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=1529c69adce1e95f7ae72f0441590c226bbac7fc
|
||||||
|
|
||||||
|
ata_generic: implement ATA_GEN_* flags and force enable DMA on MBP 7,1
|
||||||
|
|
||||||
|
[[ cebbert@redhat.com : backport to 2.6.34 ]]
|
||||||
|
|
||||||
|
IDE mode of MCP89 on MBP 7,1 doesn't set DMA enable bits in the BMDMA
|
||||||
|
status register. Make the following changes to work around the problem.
|
||||||
|
|
||||||
|
* Instead of using hard coded 1 in id->driver_data as class code
|
||||||
|
match, use ATA_GEN_CLASS_MATCH and carry the matched id in
|
||||||
|
host->private_data.
|
||||||
|
|
||||||
|
* Instead of matching PCI_VENDOR_ID_CENATEK, use ATA_GEN_FORCE_DMA
|
||||||
|
flag in id instead.
|
||||||
|
|
||||||
|
* Add ATA_GEN_FORCE_DMA to the id entry of MBP 7,1.
|
||||||
|
|
||||||
|
Signed-off-by: Tejun Heo <tj@kernel.org>
|
||||||
|
Cc: Peer Chen <pchen@nvidia.com>
|
||||||
|
Cc: stable@kernel.org
|
||||||
|
Reported-by: Anders Østhus <grapz666@gmail.com>
|
||||||
|
Reported-by: Andreas Graf <andreas_graf@csgraf.de>
|
||||||
|
Reported-by: Benoit Gschwind <gschwind@gnu-log.net>
|
||||||
|
Reported-by: Damien Cassou <damien.cassou@gmail.com>
|
||||||
|
Reported-by: tixetsal@juno.com
|
||||||
|
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c
|
||||||
|
index d4ccf74..7107a69 100644
|
||||||
|
--- a/drivers/ata/ata_generic.c
|
||||||
|
+++ b/drivers/ata/ata_generic.c
|
||||||
|
@@ -32,6 +32,11 @@
|
||||||
|
* A generic parallel ATA driver using libata
|
||||||
|
*/
|
||||||
|
|
||||||
|
+enum {
|
||||||
|
+ ATA_GEN_CLASS_MATCH = (1 << 0),
|
||||||
|
+ ATA_GEN_FORCE_DMA = (1 << 1),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* generic_set_mode - mode setting
|
||||||
|
* @link: link to set up
|
||||||
|
@@ -46,13 +51,17 @@
|
||||||
|
static int generic_set_mode(struct ata_link *link, struct ata_device **unused)
|
||||||
|
{
|
||||||
|
struct ata_port *ap = link->ap;
|
||||||
|
+ const struct pci_device_id *id = ap->host->private_data;
|
||||||
|
int dma_enabled = 0;
|
||||||
|
struct ata_device *dev;
|
||||||
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||||
|
|
||||||
|
- /* Bits 5 and 6 indicate if DMA is active on master/slave */
|
||||||
|
- if (ap->ioaddr.bmdma_addr)
|
||||||
|
+ if (id->driver_data & ATA_GEN_FORCE_DMA) {
|
||||||
|
+ dma_enabled = 0xff;
|
||||||
|
+ } else if (ap->ioaddr.bmdma_addr) {
|
||||||
|
+ /* Bits 5 and 6 indicate if DMA is active on master/slave */
|
||||||
|
dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (pdev->vendor == PCI_VENDOR_ID_CENATEK)
|
||||||
|
dma_enabled = 0xFF;
|
||||||
|
@@ -126,7 +135,7 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id
|
||||||
|
const struct ata_port_info *ppi[] = { &info, NULL };
|
||||||
|
|
||||||
|
/* Don't use the generic entry unless instructed to do so */
|
||||||
|
- if (id->driver_data == 1 && all_generic_ide == 0)
|
||||||
|
+ if ((id->driver_data & ATA_GEN_CLASS_MATCH) && all_generic_ide == 0)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
/* Devices that need care */
|
||||||
|
@@ -155,7 +164,7 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id
|
||||||
|
return rc;
|
||||||
|
pcim_pin_device(dev);
|
||||||
|
}
|
||||||
|
- return ata_pci_sff_init_one(dev, ppi, &generic_sht, NULL, 0);
|
||||||
|
+ return ata_pci_sff_init_one(dev, ppi, &generic_sht, (void *)id, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct pci_device_id ata_generic[] = {
|
||||||
|
@@ -167,13 +176,15 @@ static struct pci_device_id ata_generic[] = {
|
||||||
|
{ PCI_DEVICE(PCI_VENDOR_ID_HINT, PCI_DEVICE_ID_HINT_VXPROII_IDE), },
|
||||||
|
{ PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C561), },
|
||||||
|
{ PCI_DEVICE(PCI_VENDOR_ID_OPTI, PCI_DEVICE_ID_OPTI_82C558), },
|
||||||
|
- { PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE), },
|
||||||
|
+ { PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE),
|
||||||
|
+ .driver_data = ATA_GEN_FORCE_DMA },
|
||||||
|
/*
|
||||||
|
* For some reason, MCP89 on MacBook 7,1 doesn't work with
|
||||||
|
* ahci, use ata_generic instead.
|
||||||
|
*/
|
||||||
|
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA,
|
||||||
|
- PCI_VENDOR_ID_APPLE, 0xcb89, },
|
||||||
|
+ PCI_VENDOR_ID_APPLE, 0xcb89,
|
||||||
|
+ .driver_data = ATA_GEN_FORCE_DMA },
|
||||||
|
#if !defined(CONFIG_PATA_TOSHIBA) && !defined(CONFIG_PATA_TOSHIBA_MODULE)
|
||||||
|
{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1), },
|
||||||
|
{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2), },
|
||||||
|
@@ -181,7 +192,8 @@ static struct pci_device_id ata_generic[] = {
|
||||||
|
{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_5), },
|
||||||
|
#endif
|
||||||
|
/* Must come last. If you add entries adjust this table appropriately */
|
||||||
|
- { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL, 1},
|
||||||
|
+ { PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL),
|
||||||
|
+ .driver_data = ATA_GEN_CLASS_MATCH },
|
||||||
|
{ 0, },
|
||||||
|
};
|
||||||
|
|
|
@ -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,200 @@
|
||||||
|
From: David Howells <dhowells@redhat.com>
|
||||||
|
Date: Thu, 22 Jul 2010 11:53:18 +0000 (+0100)
|
||||||
|
Subject: CIFS: Fix a malicious redirect problem in the DNS lookup code
|
||||||
|
X-Git-Tag: v2.6.35-rc6~6
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=4c0c03ca54f72fdd5912516ad0a23ec5cf01bda7
|
||||||
|
|
||||||
|
CIFS: Fix a malicious redirect problem in the DNS lookup code
|
||||||
|
|
||||||
|
Fix the security problem in the CIFS filesystem DNS lookup code in which a
|
||||||
|
malicious redirect could be installed by a random user by simply adding a
|
||||||
|
result record into one of their keyrings with add_key() and then invoking a
|
||||||
|
CIFS CFS lookup [CVE-2010-2524].
|
||||||
|
|
||||||
|
This is done by creating an internal keyring specifically for the caching of
|
||||||
|
DNS lookups. To enforce the use of this keyring, the module init routine
|
||||||
|
creates a set of override credentials with the keyring installed as the thread
|
||||||
|
keyring and instructs request_key() to only install lookup result keys in that
|
||||||
|
keyring.
|
||||||
|
|
||||||
|
The override is then applied around the call to request_key().
|
||||||
|
|
||||||
|
This has some additional benefits when a kernel service uses this module to
|
||||||
|
request a key:
|
||||||
|
|
||||||
|
(1) The result keys are owned by root, not the user that caused the lookup.
|
||||||
|
|
||||||
|
(2) The result keys don't pop up in the user's keyrings.
|
||||||
|
|
||||||
|
(3) The result keys don't come out of the quota of the user that caused the
|
||||||
|
lookup.
|
||||||
|
|
||||||
|
The keyring can be viewed as root by doing cat /proc/keys:
|
||||||
|
|
||||||
|
2a0ca6c3 I----- 1 perm 1f030000 0 0 keyring .dns_resolver: 1/4
|
||||||
|
|
||||||
|
It can then be listed with 'keyctl list' by root.
|
||||||
|
|
||||||
|
# keyctl list 0x2a0ca6c3
|
||||||
|
1 key in keyring:
|
||||||
|
726766307: --alswrv 0 0 dns_resolver: foo.bar.com
|
||||||
|
|
||||||
|
Signed-off-by: David Howells <dhowells@redhat.com>
|
||||||
|
Reviewed-and-Tested-by: Jeff Layton <jlayton@redhat.com>
|
||||||
|
Acked-by: Steve French <smfrench@gmail.com>
|
||||||
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
|
||||||
|
index 484e52b..2cb1a70 100644
|
||||||
|
--- a/fs/cifs/cifsfs.c
|
||||||
|
+++ b/fs/cifs/cifsfs.c
|
||||||
|
@@ -923,7 +923,7 @@ init_cifs(void)
|
||||||
|
goto out_unregister_filesystem;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||||
|
- rc = register_key_type(&key_type_dns_resolver);
|
||||||
|
+ rc = cifs_init_dns_resolver();
|
||||||
|
if (rc)
|
||||||
|
goto out_unregister_key_type;
|
||||||
|
#endif
|
||||||
|
@@ -935,7 +935,7 @@ init_cifs(void)
|
||||||
|
|
||||||
|
out_unregister_resolver_key:
|
||||||
|
#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||||
|
- unregister_key_type(&key_type_dns_resolver);
|
||||||
|
+ cifs_exit_dns_resolver();
|
||||||
|
out_unregister_key_type:
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_CIFS_UPCALL
|
||||||
|
@@ -961,7 +961,7 @@ exit_cifs(void)
|
||||||
|
cifs_proc_clean();
|
||||||
|
#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||||
|
cifs_dfs_release_automount_timer();
|
||||||
|
- unregister_key_type(&key_type_dns_resolver);
|
||||||
|
+ cifs_exit_dns_resolver();
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_CIFS_UPCALL
|
||||||
|
unregister_key_type(&cifs_spnego_key_type);
|
||||||
|
diff --git a/fs/cifs/dns_resolve.c b/fs/cifs/dns_resolve.c
|
||||||
|
index 4db2c5e..49315cb 100644
|
||||||
|
--- a/fs/cifs/dns_resolve.c
|
||||||
|
+++ b/fs/cifs/dns_resolve.c
|
||||||
|
@@ -24,12 +24,16 @@
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/slab.h>
|
||||||
|
+#include <linux/keyctl.h>
|
||||||
|
+#include <linux/key-type.h>
|
||||||
|
#include <keys/user-type.h>
|
||||||
|
#include "dns_resolve.h"
|
||||||
|
#include "cifsglob.h"
|
||||||
|
#include "cifsproto.h"
|
||||||
|
#include "cifs_debug.h"
|
||||||
|
|
||||||
|
+static const struct cred *dns_resolver_cache;
|
||||||
|
+
|
||||||
|
/* Checks if supplied name is IP address
|
||||||
|
* returns:
|
||||||
|
* 1 - name is IP
|
||||||
|
@@ -94,6 +98,7 @@ struct key_type key_type_dns_resolver = {
|
||||||
|
int
|
||||||
|
dns_resolve_server_name_to_ip(const char *unc, char **ip_addr)
|
||||||
|
{
|
||||||
|
+ const struct cred *saved_cred;
|
||||||
|
int rc = -EAGAIN;
|
||||||
|
struct key *rkey = ERR_PTR(-EAGAIN);
|
||||||
|
char *name;
|
||||||
|
@@ -133,8 +138,15 @@ dns_resolve_server_name_to_ip(const char *unc, char **ip_addr)
|
||||||
|
goto skip_upcall;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ saved_cred = override_creds(dns_resolver_cache);
|
||||||
|
rkey = request_key(&key_type_dns_resolver, name, "");
|
||||||
|
+ revert_creds(saved_cred);
|
||||||
|
if (!IS_ERR(rkey)) {
|
||||||
|
+ if (!(rkey->perm & KEY_USR_VIEW)) {
|
||||||
|
+ down_read(&rkey->sem);
|
||||||
|
+ rkey->perm |= KEY_USR_VIEW;
|
||||||
|
+ up_read(&rkey->sem);
|
||||||
|
+ }
|
||||||
|
len = rkey->type_data.x[0];
|
||||||
|
data = rkey->payload.data;
|
||||||
|
} else {
|
||||||
|
@@ -165,4 +177,61 @@ out:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int __init cifs_init_dns_resolver(void)
|
||||||
|
+{
|
||||||
|
+ struct cred *cred;
|
||||||
|
+ struct key *keyring;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ printk(KERN_NOTICE "Registering the %s key type\n",
|
||||||
|
+ key_type_dns_resolver.name);
|
||||||
|
+
|
||||||
|
+ /* create an override credential set with a special thread keyring in
|
||||||
|
+ * which DNS requests are cached
|
||||||
|
+ *
|
||||||
|
+ * this is used to prevent malicious redirections from being installed
|
||||||
|
+ * with add_key().
|
||||||
|
+ */
|
||||||
|
+ cred = prepare_kernel_cred(NULL);
|
||||||
|
+ if (!cred)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ keyring = key_alloc(&key_type_keyring, ".dns_resolver", 0, 0, cred,
|
||||||
|
+ (KEY_POS_ALL & ~KEY_POS_SETATTR) |
|
||||||
|
+ KEY_USR_VIEW | KEY_USR_READ,
|
||||||
|
+ KEY_ALLOC_NOT_IN_QUOTA);
|
||||||
|
+ if (IS_ERR(keyring)) {
|
||||||
|
+ ret = PTR_ERR(keyring);
|
||||||
|
+ goto failed_put_cred;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = key_instantiate_and_link(keyring, NULL, 0, NULL, NULL);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ goto failed_put_key;
|
||||||
|
+
|
||||||
|
+ ret = register_key_type(&key_type_dns_resolver);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ goto failed_put_key;
|
||||||
|
+
|
||||||
|
+ /* instruct request_key() to use this special keyring as a cache for
|
||||||
|
+ * the results it looks up */
|
||||||
|
+ cred->thread_keyring = keyring;
|
||||||
|
+ cred->jit_keyring = KEY_REQKEY_DEFL_THREAD_KEYRING;
|
||||||
|
+ dns_resolver_cache = cred;
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+failed_put_key:
|
||||||
|
+ key_put(keyring);
|
||||||
|
+failed_put_cred:
|
||||||
|
+ put_cred(cred);
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
|
||||||
|
+void __exit cifs_exit_dns_resolver(void)
|
||||||
|
+{
|
||||||
|
+ key_revoke(dns_resolver_cache->thread_keyring);
|
||||||
|
+ unregister_key_type(&key_type_dns_resolver);
|
||||||
|
+ put_cred(dns_resolver_cache);
|
||||||
|
+ printk(KERN_NOTICE "Unregistered %s key type\n",
|
||||||
|
+ key_type_dns_resolver.name);
|
||||||
|
+}
|
||||||
|
diff --git a/fs/cifs/dns_resolve.h b/fs/cifs/dns_resolve.h
|
||||||
|
index 966e928..26b9eaa 100644
|
||||||
|
--- a/fs/cifs/dns_resolve.h
|
||||||
|
+++ b/fs/cifs/dns_resolve.h
|
||||||
|
@@ -24,8 +24,8 @@
|
||||||
|
#define _DNS_RESOLVE_H
|
||||||
|
|
||||||
|
#ifdef __KERNEL__
|
||||||
|
-#include <linux/key-type.h>
|
||||||
|
-extern struct key_type key_type_dns_resolver;
|
||||||
|
+extern int __init cifs_init_dns_resolver(void);
|
||||||
|
+extern void __exit cifs_exit_dns_resolver(void);
|
||||||
|
extern int dns_resolve_server_name_to_ip(const char *unc, char **ip_addr);
|
||||||
|
#endif /* KERNEL */
|
||||||
|
|
|
@ -0,0 +1,110 @@
|
||||||
|
CONFIG_ARM=y
|
||||||
|
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||||
|
# CONFIG_SMP is not set
|
||||||
|
|
||||||
|
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||||
|
|
||||||
|
CONFIG_ARCH_VERSATILE=y
|
||||||
|
CONFIG_ARCH_VERSATILE_PB=y
|
||||||
|
CONFIG_MACH_VERSATILE_AB=y
|
||||||
|
|
||||||
|
CONFIG_HIGHMEM=y
|
||||||
|
# CONFIG_HIGHPTE is not set
|
||||||
|
|
||||||
|
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||||
|
# CONFIG_CPU_DCACHE_DISABLE is not set
|
||||||
|
# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
|
||||||
|
# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
|
||||||
|
|
||||||
|
CONFIG_ZBOOT_ROM_TEXT=0
|
||||||
|
CONFIG_ZBOOT_ROM_BSS=0
|
||||||
|
|
||||||
|
# CONFIG_XIP_KERNEL is not set
|
||||||
|
|
||||||
|
CONFIG_ATAGS_PROC=y
|
||||||
|
|
||||||
|
# CONFIG_FPE_NWFPE is not set
|
||||||
|
CONFIG_FPE_FASTFPE=y
|
||||||
|
CONFIG_VFP=y
|
||||||
|
|
||||||
|
CONFIG_PM=y
|
||||||
|
# CONFIG_PM_DEBUG is not set
|
||||||
|
# CONFIG_PM_TRACE is not set
|
||||||
|
CONFIG_SUSPEND=y
|
||||||
|
# CONFIG_PM_TEST_SUSPEND is not set
|
||||||
|
CONFIG_APM_EMULATION=y
|
||||||
|
|
||||||
|
CONFIG_ARM_THUMB=y
|
||||||
|
|
||||||
|
CONFIG_AEABI=y
|
||||||
|
CONFIG_OABI_COMPAT=y
|
||||||
|
|
||||||
|
# CONFIG_UACCESS_WITH_MEMCPY is not set
|
||||||
|
|
||||||
|
CONFIG_CMDLINE="console=ttyAM0,115200 root=/dev/sda1 rootdelay=20"
|
||||||
|
|
||||||
|
CONFIG_NO_HZ=y
|
||||||
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
|
||||||
|
# CONFIG_CPU_IDLE is not set
|
||||||
|
|
||||||
|
CONFIG_LEDS=y
|
||||||
|
CONFIG_LEDS_CPU=y
|
||||||
|
|
||||||
|
CONFIG_MTD_AFS_PARTS=y
|
||||||
|
CONFIG_MTD_ARM_INTEGRATOR=y
|
||||||
|
CONFIG_MTD_IMPA7=y
|
||||||
|
|
||||||
|
CONFIG_AX88796=m
|
||||||
|
CONFIG_AX88796_93CX6=y
|
||||||
|
CONFIG_SMC91X=m
|
||||||
|
CONFIG_DM9000=m
|
||||||
|
CONFIG_DM9000_DEBUGLEVEL=4
|
||||||
|
# CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL is not set
|
||||||
|
CONFIG_SMC911X=m
|
||||||
|
CONFIG_SMSC911X=m
|
||||||
|
|
||||||
|
CONFIG_SERIO_AMBAKMI=m
|
||||||
|
|
||||||
|
CONFIG_SERIAL_AMBA_PL011=y
|
||||||
|
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||||
|
|
||||||
|
CONFIG_I2C_VERSATILE=y
|
||||||
|
|
||||||
|
CONFIG_THERMAL=y
|
||||||
|
|
||||||
|
# CONFIG_MFD_T7L66XB is not set
|
||||||
|
# CONFIG_MFD_TC6387XB is not set
|
||||||
|
|
||||||
|
CONFIG_FB_ARMCLCD=m
|
||||||
|
|
||||||
|
CONFIG_SND_ARM=y
|
||||||
|
CONFIG_SND_ARMAACI=m
|
||||||
|
|
||||||
|
CONFIG_USB_MUSB_HDRC=m
|
||||||
|
# CONFIG_MUSB_PIO_ONLY is not set
|
||||||
|
CONFIG_USB_TUSB6010=y
|
||||||
|
# CONFIG_USB_MUSB_DEBUG is not set
|
||||||
|
|
||||||
|
CONFIG_MMC_ARMMMCI=m
|
||||||
|
|
||||||
|
CONFIG_RTC_DRV_PL030=m
|
||||||
|
CONFIG_RTC_DRV_PL031=m
|
||||||
|
|
||||||
|
# CONFIG_SGI_IOC4 is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_USER is not set
|
||||||
|
# CONFIG_DEBUG_ERRORS is not set
|
||||||
|
# CONFIG_DEBUG_LL is not set
|
||||||
|
|
||||||
|
CONFIG_ARM_UNWIND=y
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=32
|
||||||
|
|
||||||
|
# CONFIG_USB_ULPI is not set
|
||||||
|
# CONFIG_OC_ETM is not set
|
||||||
|
|
||||||
|
# CONFIG_MTD_PISMO is not set
|
||||||
|
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
|
CONFIG_PERF_COUNTERS=y
|
|
@ -0,0 +1,83 @@
|
||||||
|
CONFIG_SND_VERBOSE_PRINTK=y
|
||||||
|
CONFIG_SND_DEBUG=y
|
||||||
|
CONFIG_SND_PCM_XRUN_DEBUG=y
|
||||||
|
|
||||||
|
CONFIG_DEBUG_MUTEXES=y
|
||||||
|
CONFIG_DEBUG_RT_MUTEXES=y
|
||||||
|
CONFIG_DEBUG_LOCK_ALLOC=y
|
||||||
|
CONFIG_PROVE_LOCKING=y
|
||||||
|
CONFIG_DEBUG_VM=y
|
||||||
|
CONFIG_DEBUG_SPINLOCK=y
|
||||||
|
CONFIG_PROVE_RCU=y
|
||||||
|
|
||||||
|
CONFIG_FAULT_INJECTION=y
|
||||||
|
CONFIG_FAILSLAB=y
|
||||||
|
CONFIG_FAIL_PAGE_ALLOC=y
|
||||||
|
CONFIG_FAIL_MAKE_REQUEST=y
|
||||||
|
CONFIG_FAULT_INJECTION_DEBUG_FS=y
|
||||||
|
CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y
|
||||||
|
CONFIG_FAIL_IO_TIMEOUT=y
|
||||||
|
|
||||||
|
CONFIG_SLUB_DEBUG_ON=y
|
||||||
|
|
||||||
|
CONFIG_LOCK_STAT=y
|
||||||
|
|
||||||
|
CONFIG_DEBUG_STACK_USAGE=y
|
||||||
|
|
||||||
|
CONFIG_ACPI_DEBUG=y
|
||||||
|
# CONFIG_ACPI_DEBUG_FUNC_TRACE is not set
|
||||||
|
|
||||||
|
CONFIG_DEBUG_SG=y
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_PAGEALLOC is not set
|
||||||
|
|
||||||
|
CONFIG_DEBUG_WRITECOUNT=y
|
||||||
|
CONFIG_DEBUG_OBJECTS=y
|
||||||
|
# CONFIG_DEBUG_OBJECTS_SELFTEST is not set
|
||||||
|
CONFIG_DEBUG_OBJECTS_FREE=y
|
||||||
|
CONFIG_DEBUG_OBJECTS_TIMERS=y
|
||||||
|
CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
|
||||||
|
|
||||||
|
CONFIG_X86_PTDUMP=y
|
||||||
|
|
||||||
|
CONFIG_CAN_DEBUG_DEVICES=y
|
||||||
|
|
||||||
|
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||||
|
|
||||||
|
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||||
|
|
||||||
|
CONFIG_DEBUG_NOTIFIERS=y
|
||||||
|
|
||||||
|
CONFIG_DMA_API_DEBUG=y
|
||||||
|
|
||||||
|
CONFIG_MMIOTRACE=y
|
||||||
|
|
||||||
|
CONFIG_DEBUG_CREDENTIALS=y
|
||||||
|
|
||||||
|
CONFIG_EXT4_DEBUG=y
|
||||||
|
|
||||||
|
CONFIG_DEBUG_PERF_USE_VMALLOC=y
|
||||||
|
|
||||||
|
# off in both production debug and nodebug builds,
|
||||||
|
# on in rawhide nodebug builds
|
||||||
|
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
|
||||||
|
|
||||||
|
CONFIG_JBD2_DEBUG=y
|
||||||
|
|
||||||
|
CONFIG_DEBUG_CFQ_IOSCHED=y
|
||||||
|
|
||||||
|
CONFIG_DRBD_FAULT_INJECTION=y
|
||||||
|
|
||||||
|
CONFIG_ATH_DEBUG=y
|
||||||
|
CONFIG_IWLWIFI_DEVICE_TRACING=y
|
||||||
|
|
||||||
|
CONFIG_DEBUG_OBJECTS_WORK=y
|
||||||
|
# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
|
||||||
|
|
||||||
|
CONFIG_DMADEVICES_DEBUG=y
|
||||||
|
CONFIG_DMADEVICES_VDEBUG=y
|
||||||
|
|
||||||
|
CONFIG_PM_ADVANCED_DEBUG=y
|
||||||
|
|
||||||
|
CONFIG_CEPH_FS_PRETTYDEBUG=y
|
||||||
|
CONFIG_QUOTA_DEBUG=y
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,5 @@
|
||||||
|
# CONFIG_HIGHMEM4G is not set
|
||||||
|
CONFIG_HIGHMEM64G=y
|
||||||
|
|
||||||
|
CONFIG_XEN_DEV_EVTCHN=m
|
||||||
|
CONFIG_XEN_SYS_HYPERVISOR=y
|
|
@ -0,0 +1,205 @@
|
||||||
|
#
|
||||||
|
# Automatically generated make config: don't edit
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Processor type and features
|
||||||
|
#
|
||||||
|
CONFIG_IA64=y
|
||||||
|
CONFIG_64BIT=y
|
||||||
|
# CONFIG_XEN is not set
|
||||||
|
CONFIG_MMU=y
|
||||||
|
CONFIG_EFI=y
|
||||||
|
# CONFIG_ITANIUM is not set
|
||||||
|
CONFIG_MCKINLEY=y
|
||||||
|
CONFIG_IA64_GENERIC=y
|
||||||
|
# CONFIG_IA64_DIG is not set
|
||||||
|
# CONFIG_IA64_HP_ZX1 is not set
|
||||||
|
# CONFIG_IA64_SGI_SN2 is not set
|
||||||
|
CONFIG_IA64_ESI=y
|
||||||
|
CONFIG_IA64_HP_AML_NFW=y
|
||||||
|
CONFIG_MSPEC=y
|
||||||
|
# CONFIG_IA64_HP_SIM is not set
|
||||||
|
# CONFIG_IA64_PAGE_SIZE_4KB is not set
|
||||||
|
# CONFIG_IA64_PAGE_SIZE_8KB is not set
|
||||||
|
CONFIG_IA64_PAGE_SIZE_16KB=y
|
||||||
|
# CONFIG_IA64_PAGE_SIZE_64KB is not set
|
||||||
|
CONFIG_IA64_L1_CACHE_SHIFT=7
|
||||||
|
CONFIG_NUMA=y
|
||||||
|
# CONFIG_VIRTUAL_MEM_MAP is not set
|
||||||
|
CONFIG_SPARSEMEM_MANUAL=y
|
||||||
|
CONFIG_SPARSEMEM=y
|
||||||
|
CONFIG_MEMORY_HOTPLUG=y
|
||||||
|
CONFIG_MEMORY_HOTREMOVE=y
|
||||||
|
CONFIG_IA64_MCA_RECOVERY=m
|
||||||
|
CONFIG_IA64_CYCLONE=y
|
||||||
|
CONFIG_MMTIMER=y
|
||||||
|
CONFIG_IOSAPIC=y
|
||||||
|
CONFIG_FORCE_MAX_ZONEORDER=18
|
||||||
|
CONFIG_NR_CPUS=1024
|
||||||
|
# CONFIG_IA32_SUPPORT is not set
|
||||||
|
# CONFIG_COMPAT is not set
|
||||||
|
CONFIG_PERFMON=y
|
||||||
|
CONFIG_IA64_PALINFO=y
|
||||||
|
CONFIG_EFI_VARS=y
|
||||||
|
CONFIG_SERIAL_8250_RUNTIME_UARTS=16
|
||||||
|
CONFIG_EFI_PCDP=y
|
||||||
|
#
|
||||||
|
# Block devices
|
||||||
|
#
|
||||||
|
# CONFIG_BLK_DEV_FD is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# IDE chipset support/bugfixes
|
||||||
|
#
|
||||||
|
CONFIG_BLK_DEV_SGIIOC4=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Character devices
|
||||||
|
#
|
||||||
|
CONFIG_TCG_INFINEON=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# Watchdog Cards
|
||||||
|
#
|
||||||
|
# CONFIG_HW_RANDOM is not set
|
||||||
|
# CONFIG_GEN_RTC is not set
|
||||||
|
CONFIG_EFI_RTC=y
|
||||||
|
CONFIG_RTC_DRV_EFI=y
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# AGP
|
||||||
|
#
|
||||||
|
CONFIG_AGP_I460=y
|
||||||
|
CONFIG_AGP_HP_ZX1=y
|
||||||
|
CONFIG_AGP_SGI_TIOCA=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# HP Simulator drivers
|
||||||
|
#
|
||||||
|
# CONFIG_HP_SIMETH is not set
|
||||||
|
# CONFIG_HP_SIMSERIAL is not set
|
||||||
|
# CONFIG_HP_SIMSCSI is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Kernel hacking
|
||||||
|
#
|
||||||
|
# CONFIG_IA64_PRINT_HAZARDS is not set
|
||||||
|
# CONFIG_DISABLE_VHPT is not set
|
||||||
|
# CONFIG_IA64_DEBUG_CMPXCHG is not set
|
||||||
|
# CONFIG_IA64_DEBUG_IRQ is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Memory Technology Devices (MTD)
|
||||||
|
#
|
||||||
|
# CONFIG_MTD is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# SGI
|
||||||
|
#
|
||||||
|
CONFIG_SGI_SNSC=y
|
||||||
|
CONFIG_SGI_TIOCX=y
|
||||||
|
CONFIG_SGI_MBCS=m
|
||||||
|
CONFIG_SGI_IOC3=m
|
||||||
|
CONFIG_SGI_IOC4=y
|
||||||
|
CONFIG_SGI_XP=m
|
||||||
|
CONFIG_SGI_GRU=m
|
||||||
|
# CONFIG_SGI_GRU_DEBUG is not set
|
||||||
|
CONFIG_SERIAL_SGI_L1_CONSOLE=y
|
||||||
|
CONFIG_SERIAL_SGI_IOC3=m
|
||||||
|
CONFIG_SERIAL_SGI_IOC4=m
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# SCSI low-level drivers
|
||||||
|
#
|
||||||
|
# CONFIG_SCSI_BUSLOGIC is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
CONFIG_ACPI=y
|
||||||
|
CONFIG_ACPI_AC=y
|
||||||
|
# CONFIG_ACPI_ASUS is not set
|
||||||
|
CONFIG_ACPI_PROCFS_POWER=y
|
||||||
|
CONFIG_ACPI_SYSFS_POWER=y
|
||||||
|
# CONFIG_ACPI_BATTERY is not set
|
||||||
|
CONFIG_ACPI_BLACKLIST_YEAR=0
|
||||||
|
CONFIG_ACPI_BUTTON=y
|
||||||
|
# CONFIG_ACPI_DOCK is not set
|
||||||
|
CONFIG_ACPI_FAN=y
|
||||||
|
CONFIG_ACPI_HOTPLUG_MEMORY=y
|
||||||
|
CONFIG_ACPI_NUMA=y
|
||||||
|
CONFIG_ACPI_POWER=y
|
||||||
|
CONFIG_ACPI_PROCESSOR=y
|
||||||
|
CONFIG_ACPI_PROCFS=y
|
||||||
|
CONFIG_ACPI_SLEEP=y
|
||||||
|
CONFIG_ACPI_THERMAL=y
|
||||||
|
# CONFIG_ACPI_TOSHIBA is not set
|
||||||
|
CONFIG_ACPI_VIDEO=m
|
||||||
|
# CONFIG_ACPI_PROC_EVENT is not set
|
||||||
|
|
||||||
|
CONFIG_PM=y
|
||||||
|
CONFIG_HOTPLUG_PCI=y
|
||||||
|
# CONFIG_HPET is not set
|
||||||
|
# CONFIG_HOTPLUG_PCI_CPCI is not set
|
||||||
|
CONFIG_HOTPLUG_PCI_SHPC=m
|
||||||
|
CONFIG_HOTPLUG_PCI_SGI=m
|
||||||
|
CONFIG_PNPACPI=y
|
||||||
|
|
||||||
|
CONFIG_SCHED_SMT=y
|
||||||
|
|
||||||
|
CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
|
||||||
|
|
||||||
|
CONFIG_CPU_FREQ=y
|
||||||
|
CONFIG_CPU_FREQ_DEBUG=y
|
||||||
|
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_USERSPACE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_ONDEMAND=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
|
||||||
|
CONFIG_CPU_FREQ_STAT=m
|
||||||
|
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||||
|
|
||||||
|
CONFIG_IA64_ACPI_CPUFREQ=m
|
||||||
|
|
||||||
|
# CONFIG_PERMIT_BSP_REMOVE is not set
|
||||||
|
# CONFIG_FORCE_CPEI_RETARGET is not set
|
||||||
|
|
||||||
|
CONFIG_NODES_SHIFT=10
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_HW_RANDOM_INTEL=m
|
||||||
|
|
||||||
|
CONFIG_CRASH_DUMP=y
|
||||||
|
CONFIG_PROC_VMCORE=y
|
||||||
|
|
||||||
|
# drivers/media/video/usbvision/usbvision-i2c.c:64:39: error: macro "outb" passed 4 arguments, but takes just 2
|
||||||
|
# CONFIG_VIDEO_USBVISION is not set
|
||||||
|
|
||||||
|
# CONFIG_IA64_MC_ERR_INJECT is not set
|
||||||
|
|
||||||
|
CONFIG_DMIID=y
|
||||||
|
|
||||||
|
CONFIG_SENSORS_I5K_AMB=m
|
||||||
|
|
||||||
|
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||||
|
|
||||||
|
CONFIG_FRAME_WARN=2048
|
||||||
|
|
||||||
|
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||||
|
CONFIG_VIRTUALIZATION=y
|
||||||
|
CONFIG_KVM=m
|
||||||
|
CONFIG_KVM_INTEL=m
|
||||||
|
|
||||||
|
CONFIG_HP_ILO=m
|
||||||
|
|
||||||
|
CONFIG_PARAVIRT_GUEST=y
|
||||||
|
CONFIG_PARAVIRT=y
|
||||||
|
|
||||||
|
CONFIG_DMAR_DEFAULT_ON=y
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=64
|
||||||
|
|
||||||
|
CONFIG_ACPI_POWER_METER=m
|
||||||
|
CONFIG_I2C_SCMI=m
|
|
@ -0,0 +1,83 @@
|
||||||
|
CONFIG_SND_VERBOSE_PRINTK=y
|
||||||
|
CONFIG_SND_DEBUG=y
|
||||||
|
CONFIG_SND_PCM_XRUN_DEBUG=y
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_MUTEXES is not set
|
||||||
|
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||||
|
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||||
|
# CONFIG_PROVE_LOCKING is not set
|
||||||
|
# CONFIG_DEBUG_VM is not set
|
||||||
|
# CONFIG_DEBUG_SPINLOCK is not set
|
||||||
|
# CONFIG_PROVE_RCU is not set
|
||||||
|
|
||||||
|
# CONFIG_FAULT_INJECTION is not set
|
||||||
|
# CONFIG_FAILSLAB is not set
|
||||||
|
# CONFIG_FAIL_PAGE_ALLOC is not set
|
||||||
|
# CONFIG_FAIL_MAKE_REQUEST is not set
|
||||||
|
# CONFIG_FAULT_INJECTION_DEBUG_FS is not set
|
||||||
|
# CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set
|
||||||
|
# CONFIG_FAIL_IO_TIMEOUT is not set
|
||||||
|
|
||||||
|
# CONFIG_SLUB_DEBUG_ON is not set
|
||||||
|
|
||||||
|
# CONFIG_LOCK_STAT is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||||
|
|
||||||
|
# CONFIG_ACPI_DEBUG is not set
|
||||||
|
# CONFIG_ACPI_DEBUG_FUNC_TRACE is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_SG is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_PAGEALLOC is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_WRITECOUNT is not set
|
||||||
|
# CONFIG_DEBUG_OBJECTS is not set
|
||||||
|
# CONFIG_DEBUG_OBJECTS_SELFTEST is not set
|
||||||
|
# CONFIG_DEBUG_OBJECTS_FREE is not set
|
||||||
|
# CONFIG_DEBUG_OBJECTS_TIMERS is not set
|
||||||
|
CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
|
||||||
|
|
||||||
|
# CONFIG_X86_PTDUMP is not set
|
||||||
|
|
||||||
|
# CONFIG_CAN_DEBUG_DEVICES is not set
|
||||||
|
|
||||||
|
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||||
|
|
||||||
|
# CONFIG_SYSCTL_SYSCALL_CHECK is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_NOTIFIERS is not set
|
||||||
|
|
||||||
|
# CONFIG_DMA_API_DEBUG is not set
|
||||||
|
|
||||||
|
# CONFIG_MMIOTRACE is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_CREDENTIALS is not set
|
||||||
|
|
||||||
|
# off in both production debug and nodebug builds,
|
||||||
|
# on in rawhide nodebug builds
|
||||||
|
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
|
||||||
|
|
||||||
|
# CONFIG_EXT4_DEBUG is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
|
||||||
|
|
||||||
|
# CONFIG_JBD2_DEBUG is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_CFQ_IOSCHED is not set
|
||||||
|
|
||||||
|
# CONFIG_DRBD_FAULT_INJECTION is not set
|
||||||
|
|
||||||
|
# CONFIG_ATH_DEBUG is not set
|
||||||
|
# CONFIG_IWLWIFI_DEVICE_TRACING is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_OBJECTS_WORK is not set
|
||||||
|
# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
|
||||||
|
|
||||||
|
# CONFIG_DMADEVICES_DEBUG is not set
|
||||||
|
# CONFIG_DMADEVICES_VDEBUG is not set
|
||||||
|
|
||||||
|
CONFIG_PM_ADVANCED_DEBUG=y
|
||||||
|
|
||||||
|
# CONFIG_CEPH_FS_PRETTYDEBUG is not set
|
||||||
|
# CONFIG_QUOTA_DEBUG is not set
|
|
@ -0,0 +1,331 @@
|
||||||
|
# Most PowerPC kernels we build are SMP
|
||||||
|
CONFIG_SMP=y
|
||||||
|
CONFIG_IRQ_ALL_CPUS=y
|
||||||
|
CONFIG_PPC=y
|
||||||
|
CONFIG_WATCHDOG_RTAS=m
|
||||||
|
CONFIG_DEBUGGER=y
|
||||||
|
CONFIG_GENERIC_NVRAM=y
|
||||||
|
CONFIG_ALTIVEC=y
|
||||||
|
|
||||||
|
CONFIG_TAU=y
|
||||||
|
# CONFIG_TAU_INT is not set
|
||||||
|
CONFIG_TAU_AVERAGE=y
|
||||||
|
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
|
|
||||||
|
CONFIG_CPU_FREQ=y
|
||||||
|
CONFIG_CPU_FREQ_DEBUG=y
|
||||||
|
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
|
||||||
|
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_USERSPACE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_ONDEMAND=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
|
||||||
|
CONFIG_CPU_FREQ_TABLE=y
|
||||||
|
CONFIG_CPU_FREQ_STAT=m
|
||||||
|
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||||
|
|
||||||
|
CONFIG_PM=y
|
||||||
|
|
||||||
|
CONFIG_PM_STD_PARTITION=""
|
||||||
|
|
||||||
|
CONFIG_SUSPEND=y
|
||||||
|
CONFIG_HIBERNATION=y
|
||||||
|
# CONFIG_RTC is not set
|
||||||
|
# CONFIG_GEN_RTC is not set
|
||||||
|
# CONFIG_GEN_RTC_X is not set
|
||||||
|
CONFIG_RTC_DRV_GENERIC=y
|
||||||
|
CONFIG_PROC_DEVICETREE=y
|
||||||
|
# CONFIG_CMDLINE_BOOL is not set
|
||||||
|
|
||||||
|
CONFIG_ADB=y
|
||||||
|
CONFIG_ADB_PMU=y
|
||||||
|
CONFIG_WINDFARM=y
|
||||||
|
CONFIG_WINDFARM_PM112=y
|
||||||
|
CONFIG_I2C_POWERMAC=y
|
||||||
|
CONFIG_APPLE_AIRPORT=m
|
||||||
|
CONFIG_SERIAL_PMACZILOG=m
|
||||||
|
# CONFIG_SERIAL_PMACZILOG_TTYS is not set
|
||||||
|
CONFIG_AGP_UNINORTH=y
|
||||||
|
CONFIG_FB_OF=y
|
||||||
|
# CONFIG_FB_CONTROL is not set
|
||||||
|
CONFIG_FB_IBM_GXT4500=y
|
||||||
|
CONFIG_FB_RADEON=y
|
||||||
|
CONFIG_FB_MATROX=y
|
||||||
|
CONFIG_FB_NVIDIA=m
|
||||||
|
# CONFIG_FB_VGA16 is not set
|
||||||
|
CONFIG_FB_ATY128_BACKLIGHT=y
|
||||||
|
CONFIG_FB_ATY_BACKLIGHT=y
|
||||||
|
CONFIG_FB_RADEON_BACKLIGHT=y
|
||||||
|
CONFIG_FB_RIVA_BACKLIGHT=y
|
||||||
|
CONFIG_FB_NVIDIA_BACKLIGHT=y
|
||||||
|
|
||||||
|
CONFIG_SND_POWERMAC=m
|
||||||
|
CONFIG_SND_POWERMAC_AUTO_DRC=y
|
||||||
|
CONFIG_SND_AOA=m
|
||||||
|
CONFIG_SND_AOA_SOUNDBUS=m
|
||||||
|
CONFIG_SND_AOA_FABRIC_LAYOUT=m
|
||||||
|
CONFIG_SND_AOA_ONYX=m
|
||||||
|
CONFIG_SND_AOA_TAS=m
|
||||||
|
CONFIG_SND_AOA_TOONIE=m
|
||||||
|
CONFIG_SND_AOA_SOUNDBUS_I2S=m
|
||||||
|
|
||||||
|
CONFIG_XMON=y
|
||||||
|
# CONFIG_XMON_DEFAULT is not set
|
||||||
|
CONFIG_XMON_DISASSEMBLY=y
|
||||||
|
|
||||||
|
CONFIG_BOOTX_TEXT=y
|
||||||
|
CONFIG_MAC_EMUMOUSEBTN=y
|
||||||
|
CONFIG_CAPI_EICON=y
|
||||||
|
|
||||||
|
CONFIG_NVRAM=y
|
||||||
|
|
||||||
|
# CONFIG_PCMCIA_M8XX is not set
|
||||||
|
# CONFIG_SCSI_AHA1542 is not set
|
||||||
|
# CONFIG_SCSI_IN2000 is not set
|
||||||
|
# CONFIG_SCSI_IPS is not set
|
||||||
|
# CONFIG_NI52 is not set
|
||||||
|
# CONFIG_NI65 is not set
|
||||||
|
# CONFIG_LANCE is not set
|
||||||
|
# CONFIG_3C515 is not set
|
||||||
|
# CONFIG_ELPLUS is not set
|
||||||
|
|
||||||
|
CONFIG_MEMORY_HOTPLUG=y
|
||||||
|
|
||||||
|
# Stuff which wants bus_to_virt() or virt_to_bus()
|
||||||
|
# CONFIG_BLK_CPQ_DA is not set
|
||||||
|
# CONFIG_VIDEO_STRADIS is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN is not set
|
||||||
|
# CONFIG_ATM_HORIZON is not set
|
||||||
|
# CONFIG_ATM_FIRESTREAM is not set
|
||||||
|
# CONFIG_ATM_AMBASSADOR is not set
|
||||||
|
# CONFIG_SCSI_DC390T is not set
|
||||||
|
# CONFIG_SCSI_BUSLOGIC is not set
|
||||||
|
|
||||||
|
|
||||||
|
# CONFIG_PPC_EARLY_DEBUG is not set
|
||||||
|
|
||||||
|
# CONFIG_PMAC_BACKLIGHT_LEGACY is not set
|
||||||
|
CONFIG_LEDS_TRIGGER_TIMER=m
|
||||||
|
CONFIG_LEDS_TRIGGER_HEARTBEAT=m
|
||||||
|
CONFIG_LEDS_TRIGGER_GPIO=m
|
||||||
|
|
||||||
|
# FIXME: Should depend on IA64/x86
|
||||||
|
# CONFIG_SGI_IOC4 is not set
|
||||||
|
|
||||||
|
CONFIG_PPC_EFIKA=y
|
||||||
|
CONFIG_PPC_MEDIA5200=y
|
||||||
|
|
||||||
|
# CONFIG_PPC_LITE5200 is not set
|
||||||
|
CONFIG_PPC_BESTCOMM=y
|
||||||
|
CONFIG_PMAC_RACKMETER=m
|
||||||
|
CONFIG_USB_OHCI_HCD_PPC_SOC=y
|
||||||
|
CONFIG_USB_OHCI_HCD_PCI=y
|
||||||
|
CONFIG_USB_OHCI_HCD_PPC_OF=y
|
||||||
|
CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
|
||||||
|
CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
|
||||||
|
|
||||||
|
CONFIG_SERIAL_UARTLITE=m
|
||||||
|
CONFIG_SERIAL_UARTLITE_CONSOLE=y
|
||||||
|
|
||||||
|
CONFIG_SENSORS_AMS=m
|
||||||
|
CONFIG_SENSORS_AMS_PMU=y
|
||||||
|
CONFIG_SENSORS_AMS_I2C=y
|
||||||
|
|
||||||
|
CONFIG_IDE=y
|
||||||
|
CONFIG_BLK_DEV_IDE=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Please see Documentation/ide.txt for help/info on IDE drives
|
||||||
|
#
|
||||||
|
# CONFIG_BLK_DEV_IDE_SATA is not set
|
||||||
|
# CONFIG_BLK_DEV_IDECS is not set
|
||||||
|
CONFIG_BLK_DEV_IDECD=m
|
||||||
|
# CONFIG_BLK_DEV_IDETAPE is not set
|
||||||
|
CONFIG_IDE_TASK_IOCTL=y
|
||||||
|
#
|
||||||
|
# IDE chipset support/bugfixes
|
||||||
|
#
|
||||||
|
# CONFIG_IDE_GENERIC is not set
|
||||||
|
# CONFIG_BLK_DEV_IDEPNP is not set
|
||||||
|
# CONFIG_BLK_DEV_IDEPCI is not set
|
||||||
|
# CONFIG_BLK_DEV_AEC62XX is not set
|
||||||
|
# CONFIG_BLK_DEV_ALI15X3 is not set
|
||||||
|
# CONFIG_BLK_DEV_AMD74XX is not set
|
||||||
|
# CONFIG_BLK_DEV_CMD64X is not set
|
||||||
|
# CONFIG_BLK_DEV_TRIFLEX is not set
|
||||||
|
# CONFIG_BLK_DEV_CY82C693 is not set
|
||||||
|
# CONFIG_BLK_DEV_CS5520 is not set
|
||||||
|
# CONFIG_BLK_DEV_CS5530 is not set
|
||||||
|
# CONFIG_BLK_DEV_HPT366 is not set
|
||||||
|
# CONFIG_BLK_DEV_JMICRON is not set
|
||||||
|
# CONFIG_BLK_DEV_SC1200 is not set
|
||||||
|
# CONFIG_BLK_DEV_PIIX is not set
|
||||||
|
# CONFIG_BLK_DEV_IT821X is not set
|
||||||
|
# CONFIG_BLK_DEV_NS87415 is not set
|
||||||
|
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
|
||||||
|
# CONFIG_BLK_DEV_PDC202XX_NEW is not set
|
||||||
|
# CONFIG_BLK_DEV_SVWKS is not set
|
||||||
|
# CONFIG_BLK_DEV_SIIMAGE is not set
|
||||||
|
# CONFIG_BLK_DEV_SL82C105 is not set
|
||||||
|
# CONFIG_BLK_DEV_SLC90E66 is not set
|
||||||
|
# CONFIG_BLK_DEV_TRM290 is not set
|
||||||
|
# CONFIG_BLK_DEV_VIA82CXXX is not set
|
||||||
|
CONFIG_BLK_DEV_IDE_PMAC=y
|
||||||
|
CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y
|
||||||
|
CONFIG_BLK_DEV_IDEDMA=y
|
||||||
|
# CONFIG_BLK_DEV_HD is not set
|
||||||
|
# CONFIG_USB_STORAGE_ISD200 is not set
|
||||||
|
CONFIG_MTD_PHYSMAP_OF=m
|
||||||
|
CONFIG_IDE_PROC_FS=y
|
||||||
|
CONFIG_MACINTOSH_DRIVERS=y
|
||||||
|
|
||||||
|
CONFIG_PPC_PASEMI_MDIO=m
|
||||||
|
CONFIG_SPU_FS_64K_LS=y
|
||||||
|
CONFIG_PPC_PASEMI_CPUFREQ=y
|
||||||
|
CONFIG_PMAC_APM_EMU=m
|
||||||
|
CONFIG_HW_RANDOM_PASEMI=m
|
||||||
|
|
||||||
|
CONFIG_EDAC=y
|
||||||
|
# CONFIG_EDAC_DEBUG is not set
|
||||||
|
CONFIG_EDAC_MM_EDAC=m
|
||||||
|
CONFIG_EDAC_PASEMI=m
|
||||||
|
CONFIG_EDAC_AMD8131=m
|
||||||
|
CONFIG_EDAC_AMD8111=m
|
||||||
|
|
||||||
|
CONFIG_AXON_RAM=m
|
||||||
|
CONFIG_OPROFILE_CELL=y
|
||||||
|
|
||||||
|
CONFIG_SUSPEND_FREEZER=y
|
||||||
|
# CONFIG_IDEPCI_PCIBUS_ORDER is not set
|
||||||
|
CONFIG_PATA_PLATFORM=m
|
||||||
|
CONFIG_PATA_OF_PLATFORM=m
|
||||||
|
CONFIG_USB_EHCI_HCD_PPC_OF=y
|
||||||
|
|
||||||
|
# CONFIG_MPC5121_ADS is not set
|
||||||
|
# CONFIG_MPC5121_GENERIC is not set
|
||||||
|
CONFIG_MTD_OF_PARTS=m
|
||||||
|
# CONFIG_MTD_NAND_FSL_ELBC is not set
|
||||||
|
CONFIG_THERMAL=y
|
||||||
|
|
||||||
|
# CONFIG_MEMORY_HOTREMOVE is not set
|
||||||
|
|
||||||
|
CONFIG_DMADEVICES=y
|
||||||
|
# CONFIG_FSL_DMA is not set
|
||||||
|
|
||||||
|
CONFIG_SND_PPC=y
|
||||||
|
|
||||||
|
CONFIG_PPC_82xx=y
|
||||||
|
CONFIG_PPC_83xx=y
|
||||||
|
CONFIG_PPC_86xx=y
|
||||||
|
CONFIG_EXTRA_TARGETS=""
|
||||||
|
# CONFIG_CODE_PATCHING_SELFTEST is not set
|
||||||
|
# CONFIG_FTR_FIXUP_SELFTEST is not set
|
||||||
|
|
||||||
|
# CONFIG_MATH_EMULATION is not set
|
||||||
|
# CONFIG_RAPIDIO is not set
|
||||||
|
# CONFIG_FS_ENET is not set
|
||||||
|
# CONFIG_UCC_GETH is not set
|
||||||
|
# CONFIG_KEYBOARD_MATRIX is not set
|
||||||
|
# CONFIG_SERIAL_CPM is not set
|
||||||
|
# CONFIG_SERIAL_QE is not set
|
||||||
|
# CONFIG_I2C_CPM is not set
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_SERIO_XILINX_XPS_PS2=m
|
||||||
|
|
||||||
|
# CONFIG_PPC_SMLPAR is not set
|
||||||
|
|
||||||
|
CONFIG_MGCOGE=y
|
||||||
|
CONFIG_GEF_SBC610=y
|
||||||
|
CONFIG_GEF_PPC9A=y
|
||||||
|
CONFIG_GEF_SBC310=y
|
||||||
|
|
||||||
|
CONFIG_QUICC_ENGINE=y
|
||||||
|
CONFIG_QE_GPIO=y
|
||||||
|
CONFIG_MPC8xxx_GPIO=y
|
||||||
|
|
||||||
|
CONFIG_IDE_GD=y
|
||||||
|
CONFIG_IDE_GD_ATA=y
|
||||||
|
CONFIG_IDE_GD_ATAPI=y
|
||||||
|
|
||||||
|
CONFIG_MCU_MPC8349EMITX=m
|
||||||
|
|
||||||
|
CONFIG_GPIO_XILINX=y
|
||||||
|
|
||||||
|
CONFIG_PMIC_DA903X=y
|
||||||
|
CONFIG_BACKLIGHT_DA903X=m
|
||||||
|
CONFIG_LEDS_DA903X=m
|
||||||
|
|
||||||
|
CONFIG_MSI_BITMAP_SELFTEST=y
|
||||||
|
|
||||||
|
CONFIG_RELOCATABLE=y
|
||||||
|
|
||||||
|
# CONFIG_HVC_UDBG is not set
|
||||||
|
CONFIG_PRINT_STACK_DEPTH=64
|
||||||
|
|
||||||
|
CONFIG_BATTERY_DA9030=m
|
||||||
|
# CONFIG_TWL4030_CORE is not set
|
||||||
|
|
||||||
|
CONFIG_BLK_DEV_IT8172=m
|
||||||
|
CONFIG_TOUCHSCREEN_DA9034=m
|
||||||
|
|
||||||
|
CONFIG_SIMPLE_GPIO=y
|
||||||
|
|
||||||
|
CONFIG_FSL_PQ_MDIO=m
|
||||||
|
|
||||||
|
CONFIG_PS3_VRAM=m
|
||||||
|
CONFIG_MDIO_GPIO=m
|
||||||
|
CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL=m
|
||||||
|
# CONFIG_DEBUG_GPIO is not set
|
||||||
|
CONFIG_GPIO_PCA953X=m
|
||||||
|
CONFIG_GPIO_PCF857X=m
|
||||||
|
|
||||||
|
# CONFIG_USB_FHCI_HCD is not set
|
||||||
|
# CONFIG_FHCI_DEBUG is not set
|
||||||
|
|
||||||
|
# CONFIG_DRM_RADEON_KMS is not set
|
||||||
|
|
||||||
|
# CONFIG_AMIGAONE is not set
|
||||||
|
|
||||||
|
CONFIG_PPC_OF_BOOT_TRAMPOLINE=y
|
||||||
|
|
||||||
|
CONFIG_DTL=y
|
||||||
|
|
||||||
|
CONFIG_MMC_SDHCI_OF=m
|
||||||
|
|
||||||
|
# CONFIG_CONSISTENT_SIZE_BOOL is not set
|
||||||
|
|
||||||
|
CONFIG_CAN_SJA1000_OF_PLATFORM=m
|
||||||
|
|
||||||
|
CONFIG_PPC_EMULATED_STATS=y
|
||||||
|
|
||||||
|
CONFIG_SWIOTLB=y
|
||||||
|
|
||||||
|
# CONFIG_RDS is not set
|
||||||
|
|
||||||
|
CONFIG_PPC_DISABLE_WERROR=y
|
||||||
|
|
||||||
|
CONFIG_XILINX_EMACLITE=m
|
||||||
|
|
||||||
|
CONFIG_GPIO_WM831X=m
|
||||||
|
# CONFIG_GPIO_LANGWELL is not set
|
||||||
|
# CONFIG_GPIO_UCB1400 is not set
|
||||||
|
CONFIG_EDAC_MPC85XX=m
|
||||||
|
|
||||||
|
CONFIG_NR_IRQS=512
|
||||||
|
CONFIG_SPARSE_IRQ=y
|
||||||
|
|
||||||
|
CONFIG_PPC_MPC5200_LPBFIFO=m
|
||||||
|
CONFIG_CAN_MSCAN=m
|
||||||
|
CONFIG_CAN_MPC5XXX=m
|
||||||
|
CONFIG_PATA_MACIO=m
|
||||||
|
CONFIG_SERIAL_GRLIB_GAISLER_APBUART=m
|
||||||
|
# CONFIG_PMIC_ADP5520 is not set
|
||||||
|
# CONFIG_MFD_88PM8607 is not set
|
||||||
|
# CONFIG_XPS_USB_HCD_XILINX is not set
|
||||||
|
# CONFIG_MMC_SDHCI_OF_ESDHC is not set
|
||||||
|
# CONFIG_MMC_SDHCI_OF_HLWD is not set
|
||||||
|
|
||||||
|
# CONFIG_GPIO_SCH is not set
|
|
@ -0,0 +1,182 @@
|
||||||
|
# CONFIG_SMP is not set
|
||||||
|
CONFIG_PPC32=y
|
||||||
|
# CONFIG_PPC64 is not set
|
||||||
|
# CONFIG_RTAS_PROC is not set
|
||||||
|
# CONFIG_PCMCIA_M8XX is not set
|
||||||
|
# CONFIG_HOTPLUG_PCI is not set
|
||||||
|
CONFIG_CPU_FREQ_PMAC=y
|
||||||
|
CONFIG_PPC_CHRP=y
|
||||||
|
CONFIG_PPC_PMAC=y
|
||||||
|
CONFIG_PPC_MPC52xx=y
|
||||||
|
CONFIG_PPC_PREP=y
|
||||||
|
|
||||||
|
# CONFIG_PPC_MPC5200_SIMPLE is not set
|
||||||
|
CONFIG_SATA_FSL=m
|
||||||
|
# CONFIG_SATA_NV is not set
|
||||||
|
|
||||||
|
# busted in .28git1
|
||||||
|
# ERROR: "cacheable_memzero" [drivers/net/gianfar_driver.ko] undefined!
|
||||||
|
# CONFIG_GIANFAR is not set
|
||||||
|
CONFIG_USB_EHCI_FSL=y
|
||||||
|
|
||||||
|
CONFIG_PMAC_APM_EMU=y
|
||||||
|
CONFIG_PMAC_BACKLIGHT=y
|
||||||
|
|
||||||
|
CONFIG_HIGHMEM=y
|
||||||
|
# CONFIG_HIGHMEM_START_BOOL is not set
|
||||||
|
# CONFIG_LOWMEM_SIZE_BOOL is not set
|
||||||
|
# CONFIG_TASK_SIZE_BOOL is not set
|
||||||
|
# CONFIG_KERNEL_START_BOOL is not set
|
||||||
|
# CONFIG_PPC601_SYNC_FIX is not set
|
||||||
|
CONFIG_ADVANCED_OPTIONS=y
|
||||||
|
CONFIG_SCSI_MESH=m
|
||||||
|
CONFIG_SCSI_MESH_SYNC_RATE=5
|
||||||
|
CONFIG_SCSI_MESH_RESET_DELAY_MS=4000
|
||||||
|
|
||||||
|
CONFIG_SCSI_MAC53C94=m
|
||||||
|
CONFIG_ADB_CUDA=y
|
||||||
|
CONFIG_ADB_MACIO=y
|
||||||
|
CONFIG_INPUT_ADBHID=y
|
||||||
|
CONFIG_ADB_PMU_LED=y
|
||||||
|
CONFIG_ADB_PMU_LED_IDE=y
|
||||||
|
|
||||||
|
CONFIG_PMAC_MEDIABAY=y
|
||||||
|
CONFIG_BMAC=m
|
||||||
|
CONFIG_MACE=m
|
||||||
|
# CONFIG_MACE_AAUI_PORT is not set
|
||||||
|
CONFIG_MV643XX_ETH=m
|
||||||
|
CONFIG_I2C_HYDRA=m
|
||||||
|
CONFIG_I2C_MPC=m
|
||||||
|
CONFIG_THERM_WINDTUNNEL=m
|
||||||
|
CONFIG_THERM_ADT746X=m
|
||||||
|
# CONFIG_ANSLCD is not set
|
||||||
|
|
||||||
|
CONFIG_FB_PLATINUM=y
|
||||||
|
CONFIG_FB_VALKYRIE=y
|
||||||
|
CONFIG_FB_CT65550=y
|
||||||
|
# CONFIG_BDI_SWITCH is not set
|
||||||
|
|
||||||
|
CONFIG_MAC_FLOPPY=m
|
||||||
|
# CONFIG_BLK_DEV_FD is not set
|
||||||
|
|
||||||
|
CONFIG_FB_ATY128=y
|
||||||
|
CONFIG_FB_ATY=y
|
||||||
|
CONFIG_FB_MATROX=y
|
||||||
|
# CONFIG_KEXEC is not set
|
||||||
|
|
||||||
|
# CONFIG_HVC_RTAS is not set
|
||||||
|
|
||||||
|
# CONFIG_UDBG_RTAS_CONSOLE is not set
|
||||||
|
CONFIG_BRIQ_PANEL=m
|
||||||
|
|
||||||
|
# CONFIG_ATA_PIIX is not set
|
||||||
|
# CONFIG_PATA_AMD is not set
|
||||||
|
# CONFIG_PATA_ATIIXP is not set
|
||||||
|
CONFIG_PATA_MPC52xx=m
|
||||||
|
# CONFIG_PATA_MPIIX is not set
|
||||||
|
# CONFIG_PATA_OLDPIIX is not set
|
||||||
|
# CONFIG_PATA_OPTI is not set
|
||||||
|
# CONFIG_PATA_SERVERWORKS is not set
|
||||||
|
|
||||||
|
CONFIG_SERIAL_MPC52xx=y
|
||||||
|
CONFIG_SERIAL_MPC52xx_CONSOLE=y
|
||||||
|
CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=115200
|
||||||
|
# CONFIG_MPC5200_WDT is not set
|
||||||
|
CONFIG_8xxx_WDT=m
|
||||||
|
CONFIG_GEF_WDT=m
|
||||||
|
|
||||||
|
CONFIG_PPC_MPC5200_BUGFIX=y
|
||||||
|
CONFIG_FEC_MPC52xx=m
|
||||||
|
#CHECK: This may later become a tristate.
|
||||||
|
CONFIG_FEC_MPC52xx_MDIO=y
|
||||||
|
CONFIG_PPC_MPC5200_GPIO=y
|
||||||
|
CONFIG_MDIO_GPIO=m
|
||||||
|
|
||||||
|
CONFIG_SERIAL_OF_PLATFORM=y
|
||||||
|
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||||
|
|
||||||
|
# CONFIG_EMBEDDED6xx is not set
|
||||||
|
CONFIG_NO_HZ=y
|
||||||
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
|
||||||
|
# CONFIG_BLK_DEV_PLATFORM is not set
|
||||||
|
# CONFIG_BLK_DEV_4DRIVES is not set
|
||||||
|
# CONFIG_BLK_DEV_ALI14XX is not set
|
||||||
|
# CONFIG_BLK_DEV_DTC2278 is not set
|
||||||
|
# CONFIG_BLK_DEV_HT6560B is not set
|
||||||
|
# CONFIG_BLK_DEV_QD65XX is not set
|
||||||
|
# CONFIG_BLK_DEV_UMC8672 is not set
|
||||||
|
|
||||||
|
# CONFIG_VIRQ_DEBUG is not set
|
||||||
|
|
||||||
|
CONFIG_PPC_BESTCOMM_ATA=m
|
||||||
|
CONFIG_PPC_BESTCOMM_FEC=m
|
||||||
|
CONFIG_PPC_BESTCOMM_GEN_BD=m
|
||||||
|
|
||||||
|
CONFIG_FORCE_MAX_ZONEORDER=11
|
||||||
|
# CONFIG_PAGE_OFFSET_BOOL is not set
|
||||||
|
# CONFIG_FB_FSL_DIU is not set
|
||||||
|
CONFIG_IRQSTACKS=y
|
||||||
|
CONFIG_VIRTUALIZATION=y
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_GPIO is not set
|
||||||
|
# CONFIG_GPIO_PCA953X is not set
|
||||||
|
# CONFIG_GPIO_PCF857X is not set
|
||||||
|
# CONFIG_HTC_EGPIO is not set
|
||||||
|
|
||||||
|
# CONFIG_TIFM_CORE is not set
|
||||||
|
|
||||||
|
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||||
|
# CONFIG_CISS_SCSI_TAPE is not set
|
||||||
|
|
||||||
|
# CONFIG_I2C_NFORCE2 is not set
|
||||||
|
|
||||||
|
# CONFIG_SND_INTEL8X0 is not set
|
||||||
|
# CONFIG_SND_INTEL8X0M is not set
|
||||||
|
|
||||||
|
# CONFIG_MEMSTICK is not set
|
||||||
|
|
||||||
|
# CONFIG_IPMI_HANDLER is not set
|
||||||
|
# CONFIG_TCG_TPM is not set
|
||||||
|
|
||||||
|
# PPC gets sad with debug alloc (bz 448598)
|
||||||
|
# CONFIG_DEBUG_PAGEALLOC is not set
|
||||||
|
|
||||||
|
CONFIG_SND_ISA=y
|
||||||
|
CONFIG_CRYPTO_DEV_TALITOS=m
|
||||||
|
|
||||||
|
CONFIG_FSL_EMB_PERFMON=y
|
||||||
|
CONFIG_MPC8272_ADS=y
|
||||||
|
CONFIG_PQ2FADS=y
|
||||||
|
CONFIG_EP8248E=y
|
||||||
|
CONFIG_MPC831x_RDB=y
|
||||||
|
CONFIG_MPC832x_MDS=y
|
||||||
|
CONFIG_MPC832x_RDB=y
|
||||||
|
CONFIG_MPC834x_MDS=y
|
||||||
|
CONFIG_MPC834x_ITX=y
|
||||||
|
CONFIG_MPC836x_MDS=y
|
||||||
|
CONFIG_MPC836x_RDK=y
|
||||||
|
CONFIG_MPC837x_MDS=y
|
||||||
|
CONFIG_MPC837x_RDB=y
|
||||||
|
CONFIG_SBC834x=y
|
||||||
|
CONFIG_ASP834x=y
|
||||||
|
CONFIG_KMETER1=y
|
||||||
|
CONFIG_MPC8641_HPCN=y
|
||||||
|
CONFIG_SBC8641D=y
|
||||||
|
CONFIG_MPC8610_HPCD=y
|
||||||
|
|
||||||
|
# CONFIG_USB_MUSB_HDRC is not set
|
||||||
|
|
||||||
|
# busted in 2.6.27
|
||||||
|
# drivers/mtd/maps/sbc8240.c: In function 'init_sbc8240_mtd':
|
||||||
|
# drivers/mtd/maps/sbc8240.c:172: warning: passing argument 1 of 'simple_map_init' from incompatible pointer type
|
||||||
|
# drivers/mtd/maps/sbc8240.c:177: error: 'struct mtd_info' has no member named 'module'
|
||||||
|
|
||||||
|
CONFIG_MTD_NAND_FSL_UPM=m
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=32
|
||||||
|
|
||||||
|
CONFIG_PERF_COUNTERS=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
|
CONFIG_EVENT_PROFILE=y
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
CONFIG_SMP=y
|
||||||
|
# CONFIG_HOTPLUG_CPU is not set
|
||||||
|
CONFIG_NR_CPUS=4
|
||||||
|
# CONFIG_BATTERY_PMU is not set
|
|
@ -0,0 +1,184 @@
|
||||||
|
CONFIG_WINDFARM_PM81=y
|
||||||
|
CONFIG_WINDFARM_PM91=y
|
||||||
|
CONFIG_WINDFARM_PM121=y
|
||||||
|
CONFIG_PPC_PMAC64=y
|
||||||
|
CONFIG_PPC_MAPLE=y
|
||||||
|
CONFIG_PPC_CELL=y
|
||||||
|
CONFIG_PPC_IBM_CELL_BLADE=y
|
||||||
|
CONFIG_PPC_ISERIES=y
|
||||||
|
CONFIG_PPC_PSERIES=y
|
||||||
|
CONFIG_PPC_PMAC=y
|
||||||
|
CONFIG_PPC_PASEMI=y
|
||||||
|
# CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE is not set
|
||||||
|
CONFIG_PPC_PS3=y
|
||||||
|
CONFIG_PPC_CELLEB=y
|
||||||
|
CONFIG_PPC_CELL_QPACE=y
|
||||||
|
CONFIG_PS3_HTAB_SIZE=20
|
||||||
|
# CONFIG_PS3_DYNAMIC_DMA is not set
|
||||||
|
CONFIG_PS3_ADVANCED=y
|
||||||
|
CONFIG_PS3_HTAB_SIZE=20
|
||||||
|
# CONFIG_PS3_DYNAMIC_DMA is not set
|
||||||
|
CONFIG_PS3_VUART=y
|
||||||
|
CONFIG_PS3_PS3AV=y
|
||||||
|
CONFIG_PS3_STORAGE=m
|
||||||
|
CONFIG_PS3_DISK=m
|
||||||
|
CONFIG_PS3_ROM=m
|
||||||
|
CONFIG_PS3_FLASH=m
|
||||||
|
CONFIG_PS3_LPM=y
|
||||||
|
CONFIG_SND_PS3=m
|
||||||
|
CONFIG_SND_PS3_DEFAULT_START_DELAY=1000
|
||||||
|
CONFIG_GELIC_NET=m
|
||||||
|
CONFIG_GELIC_WIRELESS=y
|
||||||
|
CONFIG_GELIC_WIRELESS_OLD_PSK_INTERFACE=y
|
||||||
|
CONFIG_CBE_THERM=m
|
||||||
|
CONFIG_CBE_CPUFREQ=m
|
||||||
|
CONFIG_CBE_CPUFREQ_PMI=m
|
||||||
|
CONFIG_CBE_CPUFREQ_PMI_ENABLE=y
|
||||||
|
CONFIG_PMAC_RACKMETER=m
|
||||||
|
CONFIG_IBMEBUS=y
|
||||||
|
CONFIG_SPU_FS=m
|
||||||
|
CONFIG_RTAS_FLASH=y
|
||||||
|
CONFIG_PPC_SPLPAR=y
|
||||||
|
CONFIG_SCANLOG=y
|
||||||
|
CONFIG_LPARCFG=y
|
||||||
|
CONFIG_SERIAL_ICOM=m
|
||||||
|
CONFIG_HVCS=m
|
||||||
|
CONFIG_HVC_CONSOLE=y
|
||||||
|
CONFIG_HOTPLUG_PCI=y
|
||||||
|
CONFIG_THERM_PM72=y
|
||||||
|
CONFIG_IBMVETH=m
|
||||||
|
CONFIG_SCSI_IBMVSCSI=m
|
||||||
|
# CONFIG_HOTPLUG_PCI_CPCI is not set
|
||||||
|
CONFIG_HOTPLUG_PCI_SHPC=m
|
||||||
|
CONFIG_HOTPLUG_PCI_RPA=m
|
||||||
|
CONFIG_HOTPLUG_PCI_RPA_DLPAR=y
|
||||||
|
CONFIG_ADB_PMU_LED=y
|
||||||
|
CONFIG_ADB_PMU_LED_IDE=y
|
||||||
|
CONFIG_PMAC_SMU=y
|
||||||
|
CONFIG_CPU_FREQ_PMAC64=y
|
||||||
|
CONFIG_SCSI_IPR=m
|
||||||
|
CONFIG_SCSI_IPR_TRACE=y
|
||||||
|
CONFIG_SCSI_IPR_DUMP=y
|
||||||
|
CONFIG_SPIDER_NET=m
|
||||||
|
CONFIG_HVC_RTAS=y
|
||||||
|
CONFIG_HVC_ISERIES=y
|
||||||
|
CONFIG_CBE_RAS=y
|
||||||
|
|
||||||
|
# iSeries device drivers
|
||||||
|
#
|
||||||
|
CONFIG_ISERIES_VETH=m
|
||||||
|
CONFIG_VIODASD=m
|
||||||
|
CONFIG_VIOCD=m
|
||||||
|
CONFIG_VIOTAPE=m
|
||||||
|
|
||||||
|
CONFIG_PASEMI_MAC=m
|
||||||
|
CONFIG_SERIAL_OF_PLATFORM=m
|
||||||
|
|
||||||
|
CONFIG_PPC_PASEMI_IOMMU=y
|
||||||
|
CONFIG_SERIAL_TXX9=y
|
||||||
|
CONFIG_SERIAL_TXX9_NR_UARTS=6
|
||||||
|
CONFIG_SERIAL_TXX9_CONSOLE=y
|
||||||
|
|
||||||
|
CONFIG_HVC_BEAT=y
|
||||||
|
|
||||||
|
CONFIG_FB_PS3=y
|
||||||
|
CONFIG_FB_PS3_DEFAULT_SIZE_M=18
|
||||||
|
|
||||||
|
CONFIG_PPC_PMI=m
|
||||||
|
CONFIG_PS3_SYS_MANAGER=y
|
||||||
|
# CONFIG_BLK_DEV_CELLEB is not set
|
||||||
|
|
||||||
|
CONFIG_PATA_SCC=m
|
||||||
|
|
||||||
|
CONFIG_APM_EMULATION=m
|
||||||
|
|
||||||
|
CONFIG_PPC64=y
|
||||||
|
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||||
|
CONFIG_NR_CPUS=128
|
||||||
|
# CONFIG_FB_PLATINUM is not set
|
||||||
|
# CONFIG_FB_VALKYRIE is not set
|
||||||
|
# CONFIG_FB_CT65550 is not set
|
||||||
|
# CONFIG_FB_VGA16 is not set
|
||||||
|
# CONFIG_FB_ATY128 is not set
|
||||||
|
# CONFIG_FB_ATY is not set
|
||||||
|
|
||||||
|
# CONFIG_POWER4_ONLY is not set
|
||||||
|
|
||||||
|
CONFIG_RTAS_PROC=y
|
||||||
|
CONFIG_IOMMU_VMERGE=y
|
||||||
|
CONFIG_NUMA=y
|
||||||
|
# CONFIG_PPC_64K_PAGES is not set
|
||||||
|
CONFIG_SCHED_SMT=y
|
||||||
|
|
||||||
|
# CONFIG_MV643XX_ETH is not set
|
||||||
|
CONFIG_IRQSTACKS=y
|
||||||
|
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||||
|
# CONFIG_INPUT_PCSPKR is not set
|
||||||
|
|
||||||
|
CONFIG_EHEA=m
|
||||||
|
CONFIG_INFINIBAND_EHCA=m
|
||||||
|
|
||||||
|
CONFIG_HCALL_STATS=y
|
||||||
|
|
||||||
|
CONFIG_XMON_DISASSEMBLY=y
|
||||||
|
|
||||||
|
CONFIG_SCSI_IBMVSCSIS=m
|
||||||
|
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
|
|
||||||
|
CONFIG_TUNE_CELL=y
|
||||||
|
CONFIG_NO_HZ=y
|
||||||
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
# CONFIG_BLK_DEV_PLATFORM is not set
|
||||||
|
CONFIG_IBM_NEW_EMAC=m
|
||||||
|
CONFIG_IBM_NEW_EMAC_RXB=128
|
||||||
|
CONFIG_IBM_NEW_EMAC_TXB=64
|
||||||
|
CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
|
||||||
|
CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
|
||||||
|
CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
|
||||||
|
# CONFIG_IBM_NEW_EMAC_DEBUG is not set
|
||||||
|
|
||||||
|
# CONFIG_VIRQ_DEBUG is not set
|
||||||
|
CONFIG_ELECTRA_CF=m
|
||||||
|
|
||||||
|
CONFIG_MTD_NAND_PASEMI=m
|
||||||
|
CONFIG_EDAC_CELL=m
|
||||||
|
CONFIG_EDAC_CPC925=m
|
||||||
|
CONFIG_FRAME_WARN=2048
|
||||||
|
|
||||||
|
CONFIG_PHYP_DUMP=y
|
||||||
|
CONFIG_FORCE_MAX_ZONEORDER=13
|
||||||
|
CONFIG_VIRTUALIZATION=y
|
||||||
|
|
||||||
|
CONFIG_VSX=y
|
||||||
|
|
||||||
|
CONFIG_SCSI_IBMVFC=m
|
||||||
|
# CONFIG_SCSI_IBMVFC_TRACE is not set
|
||||||
|
CONFIG_IBM_BSR=m
|
||||||
|
|
||||||
|
CONFIG_SERIO_XILINX_XPS_PS2=m
|
||||||
|
|
||||||
|
CONFIG_PPC_IBM_CELL_RESETBUTTON=y
|
||||||
|
CONFIG_PPC_IBM_CELL_POWERBUTTON=m
|
||||||
|
CONFIG_CBE_CPUFREQ_SPU_GOVERNOR=m
|
||||||
|
|
||||||
|
CONFIG_RTC_DRV_PS3=y
|
||||||
|
|
||||||
|
CONFIG_CRASH_DUMP=y
|
||||||
|
CONFIG_RELOCATABLE=y
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=64
|
||||||
|
|
||||||
|
CONFIG_PERF_COUNTERS=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
|
CONFIG_EVENT_PROFILE=y
|
||||||
|
|
||||||
|
CONFIG_KVM_BOOK3S_64=m
|
||||||
|
# CONFIG_KVM_EXIT_TIMING is not set
|
||||||
|
|
||||||
|
#-- bz#607175
|
||||||
|
#-- active memory sharing
|
||||||
|
CONFIG_PPC_SMLPAR=y
|
||||||
|
CONFIG_CMM=y
|
||||||
|
#-- DLPAR memory remove
|
||||||
|
# CONFIG_SPARSEMEM_VMEMMAP is not set
|
|
@ -0,0 +1,205 @@
|
||||||
|
# CONFIG_ISA is not set
|
||||||
|
# CONFIG_ISAPNP is not set
|
||||||
|
# CONFIG_I2C_PCA_ISA is not set
|
||||||
|
|
||||||
|
# CONFIG_SCSI_BUSLOGIC is not set
|
||||||
|
# CONFIG_SCSI_INIA100 is not set
|
||||||
|
# CONFIG_SCSI_ADVANSYS is not set
|
||||||
|
# CONFIG_SCSI_AHA1542 is not set
|
||||||
|
# CONFIG_SCSI_FUTURE_DOMAIN is not set
|
||||||
|
# CONFIG_SCSI_IN2000 is not set
|
||||||
|
# CONFIG_SCSI_QLOGIC_FAS is not set
|
||||||
|
# CONFIG_SCSI_DC390T is not set
|
||||||
|
|
||||||
|
# CONFIG_ATALK is not set
|
||||||
|
# CONFIG_DEV_APPLETALK is not set
|
||||||
|
# CONFIG_LTPC is not set
|
||||||
|
# CONFIG_COPS is not set
|
||||||
|
# CONFIG_IPX is not set
|
||||||
|
# CONFIG_IPDDP is not set
|
||||||
|
# CONFIG_DECNET is not set
|
||||||
|
# CONFIG_PLIP is not set
|
||||||
|
|
||||||
|
# CONFIG_PCMCIA_AHA152X is not set
|
||||||
|
# CONFIG_PCMCIA_NINJA_SCSI is not set
|
||||||
|
# CONFIG_PCMCIA_QLOGIC is not set
|
||||||
|
# CONFIG_PCMCIA_SYM53C500 is not set
|
||||||
|
|
||||||
|
# CONFIG_EL2 is not set
|
||||||
|
# CONFIG_ELPLUS is not set
|
||||||
|
# CONFIG_WD80x3 is not set
|
||||||
|
# CONFIG_I82092 is not set
|
||||||
|
# CONFIG_YELLOWFIN is not set
|
||||||
|
# CONFIG_SUNDANCE is not set
|
||||||
|
# CONFIG_ULTRA is not set
|
||||||
|
# CONFIG_SKFP is not set
|
||||||
|
# CONFIG_DE600 is not set
|
||||||
|
# CONFIG_DE620 is not set
|
||||||
|
# CONFIG_CS89x0 is not set
|
||||||
|
# CONFIG_AC3200 is not set
|
||||||
|
# CONFIG_NI52 is not set
|
||||||
|
# CONFIG_NI65 is not set
|
||||||
|
# CONFIG_LANCE is not set
|
||||||
|
# CONFIG_EL16 is not set
|
||||||
|
# CONFIG_EL3 is not set
|
||||||
|
# CONFIG_3C515 is not set
|
||||||
|
# CONFIG_HAMACHI is not set
|
||||||
|
# CONFIG_HP100 is not set
|
||||||
|
# CONFIG_EQUALIZER is not set
|
||||||
|
# CONFIG_NET_SB1000 is not set
|
||||||
|
# CONFIG_DEPCA is not set
|
||||||
|
# CONFIG_ATP is not set
|
||||||
|
|
||||||
|
# CONFIG_TR is not set
|
||||||
|
|
||||||
|
# CONFIG_GAMEPORT is not set
|
||||||
|
|
||||||
|
# CONFIG_SND_AD1816A is not set
|
||||||
|
# CONFIG_SND_AD1848 is not set
|
||||||
|
# CONFIG_SND_CS4231 is not set
|
||||||
|
# CONFIG_SND_CS4236 is not set
|
||||||
|
# CONFIG_SND_ES968 is not set
|
||||||
|
# CONFIG_SND_ES1688 is not set
|
||||||
|
# CONFIG_SND_ES18XX is not set
|
||||||
|
# CONFIG_SND_GUSCLASSIC is not set
|
||||||
|
# CONFIG_SND_GUSEXTREME is not set
|
||||||
|
# CONFIG_SND_GUSMAX is not set
|
||||||
|
# CONFIG_SND_INTERWAVE is not set
|
||||||
|
# CONFIG_SND_INTERWAVE_STB is not set
|
||||||
|
# CONFIG_SND_OPTI92X_AD1848 is not set
|
||||||
|
# CONFIG_SND_OPTI92X_CS4231 is not set
|
||||||
|
# CONFIG_SND_OPTI93X is not set
|
||||||
|
# CONFIG_SND_MIRO is not set
|
||||||
|
# CONFIG_SND_SB8 is not set
|
||||||
|
# CONFIG_SND_SB16 is not set
|
||||||
|
# CONFIG_SND_SBAWE is not set
|
||||||
|
# CONFIG_SND_SB16_CSP is not set
|
||||||
|
# CONFIG_SND_WAVEFRONT is not set
|
||||||
|
# CONFIG_SND_ALS100 is not set
|
||||||
|
# CONFIG_SND_AZT2320 is not set
|
||||||
|
# CONFIG_SND_CMI8330 is not set
|
||||||
|
# CONFIG_SND_DT019X is not set
|
||||||
|
# CONFIG_SND_OPL3SA2 is not set
|
||||||
|
# CONFIG_SND_SGALAXY is not set
|
||||||
|
# CONFIG_SND_SSCAPE is not set
|
||||||
|
|
||||||
|
# CONFIG_WAN_ROUTER is not set
|
||||||
|
|
||||||
|
# CONFIG_BINFMT_AOUT is not set
|
||||||
|
|
||||||
|
# CONFIG_DRM_TDFX is not set
|
||||||
|
# CONFIG_DRM_SIS is not set
|
||||||
|
|
||||||
|
# CONFIG_BLK_DEV_UMEM is not set
|
||||||
|
# CONFIG_BLK_DEV_NBD is not set
|
||||||
|
# CONFIG_BLK_DEV_DAC960 is not set
|
||||||
|
|
||||||
|
# CONFIG_PARIDE is not set
|
||||||
|
|
||||||
|
# CONFIG_I2O is not set
|
||||||
|
|
||||||
|
# CONFIG_MWAVE is not set
|
||||||
|
|
||||||
|
# CONFIG_ROCKETPORT is not set
|
||||||
|
# CONFIG_R3964 is not set
|
||||||
|
|
||||||
|
# CONFIG_JOYSTICK_ANALOG is not set
|
||||||
|
# CONFIG_JOYSTICK_A3D is not set
|
||||||
|
# CONFIG_JOYSTICK_ADI is not set
|
||||||
|
# CONFIG_JOYSTICK_COBRA is not set
|
||||||
|
# CONFIG_JOYSTICK_GF2K is not set
|
||||||
|
# CONFIG_JOYSTICK_GRIP is not set
|
||||||
|
# CONFIG_JOYSTICK_GRIP_MP is not set
|
||||||
|
# CONFIG_JOYSTICK_GUILLEMOT is not set
|
||||||
|
# CONFIG_JOYSTICK_INTERACT is not set
|
||||||
|
# CONFIG_JOYSTICK_SIDEWINDER is not set
|
||||||
|
# CONFIG_JOYSTICK_TMDC is not set
|
||||||
|
# CONFIG_JOYSTICK_IFORCE is not set
|
||||||
|
# CONFIG_JOYSTICK_WARRIOR is not set
|
||||||
|
# CONFIG_JOYSTICK_MAGELLAN is not set
|
||||||
|
# CONFIG_JOYSTICK_SPACEORB is not set
|
||||||
|
# CONFIG_JOYSTICK_SPACEBALL is not set
|
||||||
|
# CONFIG_JOYSTICK_STINGER is not set
|
||||||
|
# CONFIG_JOYSTICK_DB9 is not set
|
||||||
|
# CONFIG_JOYSTICK_GAMECON is not set
|
||||||
|
# CONFIG_JOYSTICK_TURBOGRAFX is not set
|
||||||
|
|
||||||
|
# CONFIG_RADIO_CADET is not set
|
||||||
|
# CONFIG_RADIO_RTRACK is not set
|
||||||
|
# CONFIG_RADIO_RTRACK2 is not set
|
||||||
|
# CONFIG_RADIO_AZTECH is not set
|
||||||
|
# CONFIG_RADIO_GEMTEK is not set
|
||||||
|
# CONFIG_RADIO_GEMTEK_PCI is not set
|
||||||
|
# CONFIG_RADIO_MAXIRADIO is not set
|
||||||
|
# CONFIG_RADIO_MAESTRO is not set
|
||||||
|
# CONFIG_RADIO_MIROPCM20 is not set
|
||||||
|
# CONFIG_RADIO_SF16FMI is not set
|
||||||
|
# CONFIG_RADIO_SF16FMR2 is not set
|
||||||
|
# CONFIG_RADIO_TERRATEC is not set
|
||||||
|
# CONFIG_RADIO_TRUST is not set
|
||||||
|
# CONFIG_RADIO_TYPHOON is not set
|
||||||
|
# CONFIG_RADIO_ZOLTRIX is not set
|
||||||
|
|
||||||
|
|
||||||
|
# CONFIG_VIDEO_PMS is not set
|
||||||
|
# CONFIG_VIDEO_BWQCAM is not set
|
||||||
|
# CONFIG_VIDEO_CQCAM is not set
|
||||||
|
# CONFIG_VIDEO_W9966 is not set
|
||||||
|
# CONFIG_VIDEO_CPIA is not set
|
||||||
|
# CONFIG_VIDEO_CPIA_PP is not set
|
||||||
|
# CONFIG_VIDEO_CPIA_USB is not set
|
||||||
|
# CONFIG_VIDEO_SAA5249 is not set
|
||||||
|
# CONFIG_VIDEO_STRADIS is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN_BUZ is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN_DC10 is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN_DC30 is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN_LML33 is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN_LML33R10 is not set
|
||||||
|
# CONFIG_VIDEO_MEYE is not set
|
||||||
|
# CONFIG_VIDEO_SAA7134 is not set
|
||||||
|
# CONFIG_VIDEO_MXB is not set
|
||||||
|
# CONFIG_VIDEO_HEXIUM_ORION is not set
|
||||||
|
# CONFIG_VIDEO_HEXIUM_GEMINI is not set
|
||||||
|
# CONFIG_VIDEO_CX88 is not set
|
||||||
|
# CONFIG_VIDEO_SAA5246A is not set
|
||||||
|
|
||||||
|
# CONFIG_INFTL is not set
|
||||||
|
# CONFIG_MTD_DOC2000 is not set
|
||||||
|
# CONFIG_MTD_DOC2001PLUS is not set
|
||||||
|
# CONFIG_MTD_PMC551 is not set
|
||||||
|
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
|
||||||
|
# CONFIG_MTD_PCI is not set
|
||||||
|
|
||||||
|
# CONFIG_FB_MATROX is not set
|
||||||
|
# CONFIG_FB_3DFX is not set
|
||||||
|
# CONFIG_FB_HGA is not set
|
||||||
|
# CONFIG_FB_ATY is not set
|
||||||
|
# CONFIG_FB_TRIDENT is not set
|
||||||
|
# CONFIG_FB_VOODOO1 is not set
|
||||||
|
# CONFIG_FB_ATY128 is not set
|
||||||
|
# CONFIG_FB_RADEON is not set
|
||||||
|
# CONFIG_FB_NEOMAGIC is not set
|
||||||
|
# CONFIG_FB_ASILIANT is not set
|
||||||
|
# CONFIG_FB_HGA_ACCEL is not set
|
||||||
|
# CONFIG_FB_3DFX_ACCEL is not set
|
||||||
|
|
||||||
|
# CONFIG_JFS_FS is not set
|
||||||
|
# CONFIG_NCP_FS is not set
|
||||||
|
# CONFIG_CODA_FS is not set
|
||||||
|
# CONFIG_REISERFS_FS is not set
|
||||||
|
# CONFIG_XFS_FS is not set
|
||||||
|
# CONFIG_AFFS_FS is not set
|
||||||
|
# CONFIG_BEFS_FS is not set
|
||||||
|
# CONFIG_EFS_FS is not set
|
||||||
|
# CONFIG_BFS_FS is not set
|
||||||
|
# CONFIG_QNX4FS_FS is not set
|
||||||
|
# CONFIG_SYSV_FS is not set
|
||||||
|
# CONFIG_UFS_FS is not set
|
||||||
|
# CONFIG_ROMFS_FS is not set
|
||||||
|
# CONFIG_MINIX_FS is not set
|
||||||
|
# CONFIG_9P_FS is not set
|
||||||
|
# CONFIG_OCFS2_FS is not set
|
||||||
|
# CONFIG_HFS_FS is not set
|
||||||
|
# CONFIG_HFSPLUS_FS is not set
|
||||||
|
|
|
@ -0,0 +1,227 @@
|
||||||
|
CONFIG_64BIT=y
|
||||||
|
# CONFIG_MARCH_G5 is not set
|
||||||
|
# CONFIG_MARCH_Z900 is not set
|
||||||
|
CONFIG_MARCH_Z9_109=y
|
||||||
|
# CONFIG_MARCH_Z990 is not set
|
||||||
|
|
||||||
|
CONFIG_NR_CPUS=64
|
||||||
|
CONFIG_COMPAT=y
|
||||||
|
|
||||||
|
# See bug 496596
|
||||||
|
CONFIG_HZ_100=y
|
||||||
|
# See bug 496605
|
||||||
|
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||||
|
|
||||||
|
CONFIG_MMU=y
|
||||||
|
|
||||||
|
CONFIG_LOG_BUF_SHIFT=16
|
||||||
|
CONFIG_NO_IDLE_HZ=y
|
||||||
|
|
||||||
|
CONFIG_SMP=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# I/O subsystem configuration
|
||||||
|
#
|
||||||
|
CONFIG_QDIO=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# Misc
|
||||||
|
#
|
||||||
|
CONFIG_IPL=y
|
||||||
|
# CONFIG_IPL_TAPE is not set
|
||||||
|
CONFIG_IPL_VM=y
|
||||||
|
# CONFIG_PROCESS_DEBUG is not set
|
||||||
|
CONFIG_PFAULT=y
|
||||||
|
CONFIG_SHARED_KERNEL=y
|
||||||
|
CONFIG_CMM=m
|
||||||
|
CONFIG_CMM_PROC=y
|
||||||
|
# CONFIG_NETIUCV is not set
|
||||||
|
CONFIG_SMSGIUCV=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# SCSI low-level drivers
|
||||||
|
#
|
||||||
|
CONFIG_ZFCP=m
|
||||||
|
CONFIG_ZFCPDUMP=y
|
||||||
|
CONFIG_CCW=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# S/390 block device drivers
|
||||||
|
#
|
||||||
|
CONFIG_DCSSBLK=m
|
||||||
|
CONFIG_BLK_DEV_XPRAM=m
|
||||||
|
CONFIG_DASD=m
|
||||||
|
CONFIG_DASD_PROFILE=y
|
||||||
|
CONFIG_DASD_ECKD=m
|
||||||
|
CONFIG_DASD_FBA=m
|
||||||
|
CONFIG_DASD_DIAG=m
|
||||||
|
CONFIG_DASD_EER=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# S/390 character device drivers
|
||||||
|
#
|
||||||
|
CONFIG_TN3270=y
|
||||||
|
CONFIG_TN3270_CONSOLE=y
|
||||||
|
CONFIG_TN3215=y
|
||||||
|
CONFIG_TN3215_CONSOLE=y
|
||||||
|
CONFIG_CCW_CONSOLE=y
|
||||||
|
CONFIG_SCLP_TTY=y
|
||||||
|
CONFIG_SCLP_CONSOLE=y
|
||||||
|
CONFIG_SCLP_VT220_TTY=y
|
||||||
|
CONFIG_SCLP_VT220_CONSOLE=y
|
||||||
|
CONFIG_SCLP_CPI=m
|
||||||
|
CONFIG_SCLP_ASYNC=m
|
||||||
|
CONFIG_S390_TAPE=m
|
||||||
|
CONFIG_S390_TAPE_3590=m
|
||||||
|
|
||||||
|
CONFIG_APPLDATA_BASE=y
|
||||||
|
CONFIG_APPLDATA_MEM=m
|
||||||
|
CONFIG_APPLDATA_OS=m
|
||||||
|
CONFIG_APPLDATA_NET_SUM=m
|
||||||
|
CONFIG_TN3270_TTY=y
|
||||||
|
CONFIG_TN3270_FS=m
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# S/390 tape interface support
|
||||||
|
#
|
||||||
|
CONFIG_S390_TAPE_BLOCK=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# S/390 tape hardware support
|
||||||
|
#
|
||||||
|
CONFIG_S390_TAPE_34XX=m
|
||||||
|
|
||||||
|
# CONFIG_PPP is not set
|
||||||
|
# CONFIG_SLIP is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Token Ring devices
|
||||||
|
#
|
||||||
|
CONFIG_TR=y
|
||||||
|
CONFIG_NETCONSOLE=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# Wan interfaces
|
||||||
|
#
|
||||||
|
# CONFIG_WAN is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# S/390 network device drivers
|
||||||
|
#
|
||||||
|
CONFIG_LCS=m
|
||||||
|
CONFIG_CTC=m
|
||||||
|
CONFIG_IUCV=m
|
||||||
|
CONFIG_QETH=m
|
||||||
|
CONFIG_QETH_IPV6=y
|
||||||
|
CONFIG_CCWGROUP=m
|
||||||
|
|
||||||
|
# CONFIG_IRDA is not set
|
||||||
|
# CONFIG_BT is not set
|
||||||
|
# CONFIG_WIRELESS_EXT is not set
|
||||||
|
# CONFIG_MAC80211 is not set
|
||||||
|
# CONFIG_B44 is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Partition Types
|
||||||
|
#
|
||||||
|
CONFIG_PARTITION_ADVANCED=y
|
||||||
|
# CONFIG_OSF_PARTITION is not set
|
||||||
|
CONFIG_IBM_PARTITION=y
|
||||||
|
# CONFIG_MAC_PARTITION is not set
|
||||||
|
CONFIG_MSDOS_PARTITION=y
|
||||||
|
# CONFIG_SGI_PARTITION is not set
|
||||||
|
# CONFIG_SUN_PARTITION is not set
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# S390 crypto hw
|
||||||
|
#
|
||||||
|
CONFIG_CRYPTO_SHA1_S390=m
|
||||||
|
CONFIG_CRYPTO_SHA256_S390=m
|
||||||
|
CONFIG_CRYPTO_DES_S390=m
|
||||||
|
CONFIG_CRYPTO_AES_S390=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# Kernel hacking
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# S390 specific stack options; needs gcc 3.5 so off for now
|
||||||
|
#
|
||||||
|
CONFIG_PACK_STACK=y
|
||||||
|
CONFIG_CHECK_STACK=y
|
||||||
|
# CONFIG_WARN_STACK is not set
|
||||||
|
# CONFIG_SMALL_STACK is not set
|
||||||
|
|
||||||
|
CONFIG_ZVM_WATCHDOG=m
|
||||||
|
CONFIG_VMLOGRDR=m
|
||||||
|
CONFIG_MONREADER=m
|
||||||
|
|
||||||
|
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||||
|
|
||||||
|
# CONFIG_CLAW is not set
|
||||||
|
|
||||||
|
CONFIG_VMCP=m
|
||||||
|
|
||||||
|
# CONFIG_ATMEL is not set
|
||||||
|
|
||||||
|
# CONFIG_CDROM_PKTCDVD is not set
|
||||||
|
# CONFIG_ATA_OVER_ETH is not set
|
||||||
|
# CONFIG_MII is not set
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_STACK_GUARD=256
|
||||||
|
CONFIG_CMM_IUCV=y
|
||||||
|
|
||||||
|
# CONFIG_DETECT_SOFTLOCKUP is not set
|
||||||
|
|
||||||
|
CONFIG_S390_HYPFS_FS=y
|
||||||
|
|
||||||
|
CONFIG_MONWRITER=m
|
||||||
|
CONFIG_ZCRYPT=m
|
||||||
|
CONFIG_ZCRYPT_MONOLITHIC=y
|
||||||
|
|
||||||
|
CONFIG_S390_EXEC_PROTECT=y
|
||||||
|
CONFIG_AFIUCV=m
|
||||||
|
CONFIG_S390_PRNG=m
|
||||||
|
|
||||||
|
CONFIG_S390_VMUR=m
|
||||||
|
|
||||||
|
# CONFIG_THERMAL is not set
|
||||||
|
|
||||||
|
CONFIG_NO_HZ=y
|
||||||
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
CONFIG_CTCM=m
|
||||||
|
CONFIG_QETH_L2=m
|
||||||
|
CONFIG_QETH_L3=m
|
||||||
|
CONFIG_CRYPTO_SHA512_S390=m
|
||||||
|
CONFIG_VIRTUALIZATION=y
|
||||||
|
CONFIG_KVM=m
|
||||||
|
CONFIG_S390_GUEST=y
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_MEMORY_HOTPLUG=y
|
||||||
|
CONFIG_MEMORY_HOTREMOVE=y
|
||||||
|
CONFIG_CHSC_SCH=m
|
||||||
|
|
||||||
|
# drivers/isdn/hardware/mISDN/hfcmulti.c:5255:2: error: #error "not running on big endian machines now"
|
||||||
|
# CONFIG_MISDN_HFCMULTI is not set
|
||||||
|
|
||||||
|
CONFIG_HVC_IUCV=y
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=64
|
||||||
|
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
|
|
||||||
|
CONFIG_PM=y
|
||||||
|
CONFIG_HIBERNATION=y
|
||||||
|
CONFIG_PM_STD_PARTITION="/dev/jokes"
|
||||||
|
|
||||||
|
CONFIG_PERF_COUNTERS=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
|
CONFIG_EVENT_PROFILE=y
|
||||||
|
|
||||||
|
CONFIG_SMSGIUCV_EVENT=m
|
||||||
|
|
||||||
|
# CONFIG_PREEMPT_TRACER is not set
|
|
@ -0,0 +1,201 @@
|
||||||
|
CONFIG_SMP=y
|
||||||
|
CONFIG_SPARC=y
|
||||||
|
CONFIG_SPARC64=y
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
|
CONFIG_HZ_100=y
|
||||||
|
# CONFIG_HZ_1000 is not set
|
||||||
|
CONFIG_HZ=100
|
||||||
|
|
||||||
|
CONFIG_NO_HZ=y
|
||||||
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
CONFIG_CPU_FREQ=y
|
||||||
|
CONFIG_CPU_FREQ_TABLE=m
|
||||||
|
CONFIG_CPU_FREQ_DEBUG=y
|
||||||
|
# CONFIG_CPU_FREQ_STAT is not set
|
||||||
|
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
|
||||||
|
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
|
||||||
|
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
|
||||||
|
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_USERSPACE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_ONDEMAND=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
|
||||||
|
CONFIG_US3_FREQ=m
|
||||||
|
CONFIG_US2E_FREQ=m
|
||||||
|
|
||||||
|
CONFIG_SUN_LDOMS=y
|
||||||
|
CONFIG_SCHED_SMT=y
|
||||||
|
CONFIG_SCHED_MC=y
|
||||||
|
CONFIG_64BIT=y
|
||||||
|
# CONFIG_BBC_I2C is not set
|
||||||
|
CONFIG_HUGETLB_PAGE_SIZE_4MB=y
|
||||||
|
# CONFIG_HUGETLB_PAGE_SIZE_512K is not set
|
||||||
|
# CONFIG_HUGETLB_PAGE_SIZE_64K is not set
|
||||||
|
CONFIG_NR_CPUS=256
|
||||||
|
CONFIG_US3_FREQ=m
|
||||||
|
CONFIG_US2E_FREQ=m
|
||||||
|
CONFIG_SUN_OPENPROMFS=m
|
||||||
|
CONFIG_COMPAT=y
|
||||||
|
CONFIG_UID16=y
|
||||||
|
CONFIG_BINFMT_ELF32=y
|
||||||
|
CONFIG_ENVCTRL=m
|
||||||
|
CONFIG_DISPLAY7SEG=m
|
||||||
|
CONFIG_WATCHDOG_CP1XXX=m
|
||||||
|
CONFIG_WATCHDOG_RIO=m
|
||||||
|
# CONFIG_CMDLINE_BOOL is not set
|
||||||
|
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
||||||
|
# CONFIG_PARPORT is not set
|
||||||
|
# CONFIG_BLK_DEV_FD is not set
|
||||||
|
# CONFIG_LIRC_PARALLEL is not set
|
||||||
|
# CONFIG_I2C_NFORCE2 is not set
|
||||||
|
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||||
|
# CONFIG_I2C_SIMTEC is not set
|
||||||
|
CONFIG_I2C_ALI1535=m
|
||||||
|
# CONFIG_VGASTATE is not set
|
||||||
|
# CONFIG_FB_DDC is not set
|
||||||
|
# CONFIG_FB_BW2 is not set
|
||||||
|
CONFIG_FB_CG3=y
|
||||||
|
CONFIG_FB_CG6=y
|
||||||
|
# CONFIG_FB_RIVA is not set
|
||||||
|
# CONFIG_FB_MATROX is not set
|
||||||
|
# CONFIG_FB_RADEON is not set
|
||||||
|
CONFIG_FB_ATY=y
|
||||||
|
# CONFIG_FB_S3 is not set
|
||||||
|
# CONFIG_FB_SAVAGE is not set
|
||||||
|
# CONFIG_FB_SIS is not set
|
||||||
|
# CONFIG_FB_NEOMAGIC is not set
|
||||||
|
# CONFIG_FB_3DFX is not set
|
||||||
|
# CONFIG_FB_VOODOO1 is not set
|
||||||
|
# CONFIG_FB_TRIDENT is not set
|
||||||
|
CONFIG_FB_SBUS=y
|
||||||
|
CONFIG_FB_FFB=y
|
||||||
|
# CONFIG_FB_TCX is not set
|
||||||
|
# CONFIG_FB_CG14 is not set
|
||||||
|
CONFIG_FB_PM2=y
|
||||||
|
CONFIG_FB_P9100=y
|
||||||
|
# CONFIG_FB_LEO is not set
|
||||||
|
CONFIG_FB_XVR500=y
|
||||||
|
CONFIG_FB_XVR2500=y
|
||||||
|
# CONFIG_VGASTATE is not set
|
||||||
|
# CONFIG_FB_DDC is not set
|
||||||
|
# CONFIG_FB_CIRRUS is not set
|
||||||
|
# CONFIG_FB_ATY128 is not set
|
||||||
|
# CONFIG_FB_KYRO is not set
|
||||||
|
# CONFIG_AGP is not set
|
||||||
|
# CONFIG_DRM_NOUVEAU is not set
|
||||||
|
# CONFIG_MDA_CONSOLE is not set
|
||||||
|
CONFIG_FONTS=y
|
||||||
|
# CONFIG_FONT_8x8 is not set
|
||||||
|
# CONFIG_FONT_8x16 is not set
|
||||||
|
# CONFIG_FONT_7x14 is not set
|
||||||
|
# CONFIG_FONT_10x18 is not set
|
||||||
|
# CONFIG_FONT_6x11 is not set
|
||||||
|
# CONFIG_FONT_SUN12x22 is not set
|
||||||
|
# CONFIG_FONT_PEARL_8x8 is not set
|
||||||
|
# CONFIG_FONT_ACORN_8x8 is not set
|
||||||
|
CONFIG_FONT_SUN8x16=y
|
||||||
|
CONFIG_FONT_SUN12x22=y
|
||||||
|
# CONFIG_LOGO_LINUX_CLUT224 is not set
|
||||||
|
# CONFIG_SERIAL_8250 is not set
|
||||||
|
CONFIG_SERIAL_SUNZILOG=y
|
||||||
|
CONFIG_SERIAL_SUNZILOG_CONSOLE=y
|
||||||
|
CONFIG_SERIAL_SUNSU=y
|
||||||
|
CONFIG_SERIAL_SUNSU_CONSOLE=y
|
||||||
|
CONFIG_SERIAL_SUNSAB=y
|
||||||
|
CONFIG_SERIAL_SUNSAB_CONSOLE=y
|
||||||
|
CONFIG_SERIAL_SUNHV=y
|
||||||
|
CONFIG_SUN_OPENPROMIO=y
|
||||||
|
CONFIG_OBP_FLASH=m
|
||||||
|
# CONFIG_SERIO_SERPORT is not set
|
||||||
|
CONFIG_BLK_DEV_FD=y
|
||||||
|
CONFIG_SUNVDC=m
|
||||||
|
CONFIG_SUNVNET=m
|
||||||
|
# CONFIG_BLK_DEV_AEC62XX is not set
|
||||||
|
# CONFIG_BLK_DEV_HPT366 is not set
|
||||||
|
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
|
||||||
|
# CONFIG_BLK_DEV_PDC202XX_NEW is not set
|
||||||
|
# CONFIG_BLK_DEV_SIIMAGE is not set
|
||||||
|
# CONFIG_BLK_DEV_SLC90E66 is not set
|
||||||
|
# CONFIG_BLK_DEV_VIA82CXXX is not set
|
||||||
|
# CONFIG_SCSI_ADVANSYS is not set
|
||||||
|
# CONFIG_SCSI_BUSLOGIC is not set
|
||||||
|
# CONFIG_SCSI_EATA is not set
|
||||||
|
# CONFIG_SCSI_GDTH is not set
|
||||||
|
# CONFIG_SCSI_AIC7XXX is not set
|
||||||
|
# CONFIG_SCSI_AIC79XX is not set
|
||||||
|
# CONFIG_SCSI_FUTURE_DOMAIN is not set
|
||||||
|
CONFIG_SCSI_QLOGICPTI=m
|
||||||
|
CONFIG_SCSI_SUNESP=m
|
||||||
|
CONFIG_SUNLANCE=m
|
||||||
|
CONFIG_SUNBMAC=m
|
||||||
|
CONFIG_SUNQE=m
|
||||||
|
# CONFIG_DM9102 is not set
|
||||||
|
# CONFIG_HAMACHI is not set
|
||||||
|
# CONFIG_R8169 is not set
|
||||||
|
CONFIG_ATM_FORE200E_USE_TASKLET=y
|
||||||
|
CONFIG_ATM_FORE200E_DEBUG=0
|
||||||
|
CONFIG_ATM_FORE200E_TX_RETRY=16
|
||||||
|
# CONFIG_DRM_TDFX is not set
|
||||||
|
CONFIG_KEYBOARD_ATKBD=y
|
||||||
|
CONFIG_KEYBOARD_SUNKBD=y
|
||||||
|
# CONFIG_INPUT_PCSPKR is not set
|
||||||
|
CONFIG_INPUT_SPARCSPKR=m
|
||||||
|
# CONFIG_SOUND_PRIME is not set
|
||||||
|
# CONFIG_SND_SUN_AMD7930 is not set
|
||||||
|
CONFIG_SND_SUN_CS4231=m
|
||||||
|
# CONFIG_SND_SUN_DBRI is not set
|
||||||
|
CONFIG_PARPORT_SUNBPP=m
|
||||||
|
CONFIG_LOGO_SUN_CLUT224=y
|
||||||
|
CONFIG_MTD_SUN_UFLASH=m
|
||||||
|
CONFIG_MYRI_SBUS=m
|
||||||
|
# CONFIG_SGI_IOC4 is not set
|
||||||
|
# CONFIG_VIDEO_ZORAN is not set
|
||||||
|
# CONFIG_VIDEO_STRADIS is not set
|
||||||
|
# CONFIG_IEEE1394_SBP2 is not set
|
||||||
|
# CONFIG_USB_NET2280 is not set
|
||||||
|
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||||
|
# CONFIG_DEBUG_DCFLUSH is not set
|
||||||
|
# CONFIG_DEBUG_BOOTMEM is not set
|
||||||
|
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||||
|
# CONFIG_PROVE_LOCKING is not set
|
||||||
|
# CONFIG_LOCK_STAT is not set
|
||||||
|
# CONFIG_LOCKDEP is not set
|
||||||
|
# CONFIG_STACK_DEBUG is not set
|
||||||
|
|
||||||
|
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||||
|
|
||||||
|
# CONFIG_THERMAL is not set
|
||||||
|
|
||||||
|
CONFIG_FRAME_WARN=2048
|
||||||
|
|
||||||
|
CONFIG_NUMA=y
|
||||||
|
|
||||||
|
CONFIG_SND_SPARC=y
|
||||||
|
|
||||||
|
CONFIG_HW_RANDOM_N2RNG=m
|
||||||
|
|
||||||
|
# drivers/isdn/hardware/mISDN/hfcmulti.c:5255:2: error: #error "not running on big endian machines now"
|
||||||
|
# CONFIG_MISDN_HFCMULTI is not set
|
||||||
|
|
||||||
|
CONFIG_US3_MC=y
|
||||||
|
CONFIG_SENSORS_ULTRA45=m
|
||||||
|
CONFIG_LEDS_SUNFIRE=m
|
||||||
|
CONFIG_TADPOLE_TS102_UCTRL=m
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=64
|
||||||
|
|
||||||
|
CONFIG_LIRC_ENE0100=m
|
||||||
|
# CONFIG_BATTERY_DS2782 is not set
|
||||||
|
CONFIG_USB_GSPCA_SN9C20X=m
|
||||||
|
CONFIG_USB_GSPCA_SN9C20X_EVDEV=y
|
||||||
|
CONFIG_LSM_MMAP_MIN_ADDR=65536
|
||||||
|
|
||||||
|
CONFIG_PERF_COUNTERS=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
|
CONFIG_EVENT_PROFILE=y
|
||||||
|
|
||||||
|
CONFIG_EARLYFB=y
|
||||||
|
CONFIG_SERIAL_GRLIB_GAISLER_APBUART=m
|
||||||
|
|
||||||
|
CONFIG_GRETH=m
|
||||||
|
CONFIG_FB_XVR1000=y
|
|
@ -0,0 +1,473 @@
|
||||||
|
CONFIG_UID16=y
|
||||||
|
# CONFIG_64BIT is not set
|
||||||
|
# CONFIG_KERNEL_LZMA is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Processor type and features
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Enable summit and co via the generic arch
|
||||||
|
#
|
||||||
|
CONFIG_X86_EXTENDED_PLATFORM=y
|
||||||
|
CONFIG_X86_32_NON_STANDARD=y
|
||||||
|
|
||||||
|
# CONFIG_X86_ELAN is not set
|
||||||
|
# CONFIG_X86_NUMAQ is not set
|
||||||
|
# CONFIG_X86_SUMMIT is not set
|
||||||
|
CONFIG_X86_BIGSMP=y
|
||||||
|
# CONFIG_X86_VISWS is not set
|
||||||
|
# CONFIG_X86_RDC321X is not set
|
||||||
|
# CONFIG_X86_ES7000 is not set
|
||||||
|
# CONFIG_M386 is not set
|
||||||
|
# CONFIG_M486 is not set
|
||||||
|
# CONFIG_M586 is not set
|
||||||
|
# CONFIG_M586TSC is not set
|
||||||
|
# CONFIG_M586MMX is not set
|
||||||
|
CONFIG_M686=y
|
||||||
|
# CONFIG_MPENTIUMII is not set
|
||||||
|
# CONFIG_MPENTIUMIII is not set
|
||||||
|
# CONFIG_MPENTIUMM is not set
|
||||||
|
# CONFIG_MPENTIUM4 is not set
|
||||||
|
# CONFIG_MK6 is not set
|
||||||
|
# CONFIG_MK7 is not set
|
||||||
|
# CONFIG_MK8 is not set
|
||||||
|
# CONFIG_MCRUSOE is not set
|
||||||
|
# CONFIG_MWINCHIPC6 is not set
|
||||||
|
# CONFIG_MWINCHIP3D is not set
|
||||||
|
# CONFIG_MCYRIXIII is not set
|
||||||
|
# CONFIG_MVIAC3_2 is not set
|
||||||
|
CONFIG_SMP=y
|
||||||
|
CONFIG_NR_CPUS=32
|
||||||
|
CONFIG_X86_GENERIC=y
|
||||||
|
# CONFIG_X86_PPRO_FENCE is not set
|
||||||
|
CONFIG_HPET=y
|
||||||
|
CONFIG_HPET_TIMER=y
|
||||||
|
# CONFIG_HPET_MMAP is not set
|
||||||
|
CONFIG_X86_MCE=y
|
||||||
|
CONFIG_TOSHIBA=m
|
||||||
|
CONFIG_I8K=m
|
||||||
|
CONFIG_SONYPI=m
|
||||||
|
CONFIG_SONYPI_COMPAT=y
|
||||||
|
CONFIG_MICROCODE=m
|
||||||
|
CONFIG_X86_MSR=y
|
||||||
|
CONFIG_X86_CPUID=y
|
||||||
|
CONFIG_EDD=m
|
||||||
|
# CONFIG_EDD_OFF is not set
|
||||||
|
# CONFIG_NUMA is not set
|
||||||
|
|
||||||
|
# CONFIG_NOHIGHMEM is not set
|
||||||
|
CONFIG_HIGHMEM4G=y
|
||||||
|
# CONFIG_HIGHMEM64G is not set
|
||||||
|
CONFIG_HIGHMEM=y
|
||||||
|
CONFIG_HIGHPTE=y
|
||||||
|
|
||||||
|
# CONFIG_MATH_EMULATION is not set
|
||||||
|
CONFIG_MTRR=y
|
||||||
|
CONFIG_X86_PAT=y
|
||||||
|
CONFIG_X86_PM_TIMER=y
|
||||||
|
|
||||||
|
CONFIG_EFI=y
|
||||||
|
CONFIG_EFI_VARS=y
|
||||||
|
CONFIG_EFI_PCDP=y
|
||||||
|
CONFIG_FB_EFI=y
|
||||||
|
# CONFIG_FB_N411 is not set
|
||||||
|
|
||||||
|
CONFIG_DMAR=y
|
||||||
|
CONFIG_DMAR_BROKEN_GFX_WA=y
|
||||||
|
CONFIG_DMAR_FLOPPY_WA=y
|
||||||
|
CONFIG_DMAR_DEFAULT_ON=y
|
||||||
|
|
||||||
|
CONFIG_FB_GEODE=y
|
||||||
|
CONFIG_FB_GEODE_LX=y
|
||||||
|
CONFIG_FB_GEODE_GX=y
|
||||||
|
# CONFIG_FB_GEODE_GX1 is not set
|
||||||
|
|
||||||
|
# CONFIG_PCI_GOBIOS is not set
|
||||||
|
# CONFIG_PCI_GODIRECT is not set
|
||||||
|
# CONFIG_PCI_GOMMCONFIG is not set
|
||||||
|
CONFIG_PCI_GOANY=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# x86 specific drivers
|
||||||
|
#
|
||||||
|
CONFIG_PCMCIA_FDOMAIN=m
|
||||||
|
CONFIG_SCSI_FUTURE_DOMAIN=m
|
||||||
|
CONFIG_SCSI_ADVANSYS=m
|
||||||
|
|
||||||
|
CONFIG_CC_STACKPROTECTOR=y
|
||||||
|
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
|
|
||||||
|
CONFIG_CAPI_EICON=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# APM (Advanced Power Management) BIOS Support
|
||||||
|
#
|
||||||
|
CONFIG_APM=y
|
||||||
|
# CONFIG_APM_IGNORE_USER_SUSPEND is not set
|
||||||
|
# CONFIG_APM_DO_ENABLE is not set
|
||||||
|
CONFIG_APM_CPU_IDLE=y
|
||||||
|
# CONFIG_APM_DISPLAY_BLANK is not set
|
||||||
|
# CONFIG_APM_ALLOW_INTS is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Kernel debugging
|
||||||
|
#
|
||||||
|
CONFIG_X86_MPPARSE=y
|
||||||
|
|
||||||
|
CONFIG_ACPI=y
|
||||||
|
CONFIG_ACPI_AC=y
|
||||||
|
# CONFIG_ACPI_ASUS is not set
|
||||||
|
CONFIG_ACPI_PROCFS_POWER=y
|
||||||
|
CONFIG_ACPI_SYSFS_POWER=y
|
||||||
|
CONFIG_ACPI_BATTERY=y
|
||||||
|
CONFIG_ACPI_BLACKLIST_YEAR=1999
|
||||||
|
CONFIG_ACPI_BUTTON=y
|
||||||
|
CONFIG_ACPI_CONTAINER=m
|
||||||
|
CONFIG_ACPI_DOCK=y
|
||||||
|
CONFIG_ACPI_FAN=y
|
||||||
|
CONFIG_ACPI_NUMA=y
|
||||||
|
CONFIG_ACPI_PROCESSOR=y
|
||||||
|
CONFIG_ACPI_POWER=y
|
||||||
|
CONFIG_ACPI_PROCFS=y
|
||||||
|
CONFIG_ACPI_SBS=m
|
||||||
|
CONFIG_ACPI_SLEEP=y
|
||||||
|
CONFIG_ACPI_THERMAL=y
|
||||||
|
CONFIG_TOPSTAR_LAPTOP=m
|
||||||
|
CONFIG_ACPI_TOSHIBA=m
|
||||||
|
CONFIG_ACPI_VIDEO=m
|
||||||
|
# Disable in F9.
|
||||||
|
CONFIG_ACPI_PROC_EVENT=y
|
||||||
|
CONFIG_PNPACPI=y
|
||||||
|
CONFIG_ACPI_POWER_METER=m
|
||||||
|
CONFIG_ACPI_PROCESSOR_AGGREGATOR=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# CPUFreq processor drivers
|
||||||
|
#
|
||||||
|
CONFIG_CPU_FREQ=y
|
||||||
|
CONFIG_CPU_FREQ_DEBUG=y
|
||||||
|
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
|
||||||
|
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_USERSPACE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_ONDEMAND=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
|
||||||
|
CONFIG_CPU_FREQ_TABLE=y
|
||||||
|
CONFIG_CPU_FREQ_STAT=m
|
||||||
|
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||||
|
|
||||||
|
CONFIG_X86_ACPI_CPUFREQ=m
|
||||||
|
CONFIG_X86_PCC_CPUFREQ=m
|
||||||
|
# CONFIG_X86_POWERNOW_K6 is not set
|
||||||
|
CONFIG_X86_POWERNOW_K7=y
|
||||||
|
CONFIG_X86_POWERNOW_K8=m
|
||||||
|
# CONFIG_X86_GX_SUSPMOD is not set
|
||||||
|
# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
|
||||||
|
CONFIG_X86_SPEEDSTEP_ICH=y
|
||||||
|
CONFIG_X86_SPEEDSTEP_SMI=y
|
||||||
|
CONFIG_X86_SPEEDSTEP_LIB=y
|
||||||
|
# CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK is not set
|
||||||
|
CONFIG_X86_P4_CLOCKMOD=m
|
||||||
|
CONFIG_X86_LONGRUN=y
|
||||||
|
# CONFIG_X86_LONGHAUL is not set
|
||||||
|
# CONFIG_X86_CPUFREQ_NFORCE2 is not set
|
||||||
|
# e_powersaver is dangerous
|
||||||
|
# CONFIG_X86_E_POWERSAVER is not set
|
||||||
|
|
||||||
|
CONFIG_X86_HT=y
|
||||||
|
CONFIG_X86_TRAMPOLINE=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# various x86 specific drivers
|
||||||
|
#
|
||||||
|
CONFIG_NVRAM=y
|
||||||
|
CONFIG_IBM_ASM=m
|
||||||
|
CONFIG_CRYPTO_AES_586=m
|
||||||
|
CONFIG_CRYPTO_TWOFISH_586=m
|
||||||
|
CONFIG_CRYPTO_DEV_PADLOCK=m
|
||||||
|
CONFIG_CRYPTO_DEV_PADLOCK_AES=m
|
||||||
|
CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
|
||||||
|
|
||||||
|
CONFIG_GENERIC_ISA_DMA=y
|
||||||
|
CONFIG_SCHED_SMT=y
|
||||||
|
CONFIG_SUSPEND=y
|
||||||
|
CONFIG_HIBERNATION=y
|
||||||
|
CONFIG_PM_STD_PARTITION=""
|
||||||
|
|
||||||
|
CONFIG_DEBUG_RODATA=y
|
||||||
|
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||||
|
# CONFIG_4KSTACKS is not set
|
||||||
|
CONFIG_DEBUG_NMI_TIMEOUT=5
|
||||||
|
|
||||||
|
CONFIG_PCI_DIRECT=y
|
||||||
|
CONFIG_PCI_MMCONFIG=y
|
||||||
|
CONFIG_PCI_BIOS=y
|
||||||
|
|
||||||
|
CONFIG_HOTPLUG_PCI=y
|
||||||
|
CONFIG_HOTPLUG_PCI_COMPAQ=m
|
||||||
|
# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set
|
||||||
|
CONFIG_HOTPLUG_PCI_IBM=m
|
||||||
|
# CONFIG_HOTPLUG_PCI_CPCI is not set
|
||||||
|
# SHPC has half-arsed PCI probing, which makes it load on too many systems
|
||||||
|
# CONFIG_HOTPLUG_PCI_SHPC is not set
|
||||||
|
CONFIG_PM=y
|
||||||
|
|
||||||
|
CONFIG_IPW2100=m
|
||||||
|
CONFIG_IPW2100_MONITOR=y
|
||||||
|
CONFIG_IPW2200=m
|
||||||
|
CONFIG_IPW2200_MONITOR=y
|
||||||
|
CONFIG_IPW2200_RADIOTAP=y
|
||||||
|
CONFIG_IPW2200_PROMISCUOUS=y
|
||||||
|
CONFIG_IPW2200_QOS=y
|
||||||
|
|
||||||
|
CONFIG_BLK_DEV_AMD74XX=y
|
||||||
|
|
||||||
|
CONFIG_I2C_ALI1535=m
|
||||||
|
CONFIG_I2C_ALI15X3=m
|
||||||
|
CONFIG_I2C_ALI1563=m
|
||||||
|
CONFIG_I2C_AMD756=m
|
||||||
|
CONFIG_I2C_AMD756_S4882=m
|
||||||
|
CONFIG_I2C_AMD8111=m
|
||||||
|
CONFIG_I2C_I801=m
|
||||||
|
CONFIG_I2C_ISCH=m
|
||||||
|
CONFIG_I2C_NFORCE2=m
|
||||||
|
CONFIG_I2C_NFORCE2_S4985=m
|
||||||
|
CONFIG_I2C_PIIX4=m
|
||||||
|
CONFIG_I2C_SIS5595=m
|
||||||
|
CONFIG_I2C_SIS630=m
|
||||||
|
CONFIG_I2C_SIS96X=m
|
||||||
|
|
||||||
|
CONFIG_I2C_VIA=m
|
||||||
|
CONFIG_I2C_VIAPRO=m
|
||||||
|
|
||||||
|
CONFIG_SCx200_ACB=m
|
||||||
|
|
||||||
|
# CONFIG_X86_REBOOTFIXUPS is not set
|
||||||
|
|
||||||
|
CONFIG_DELL_RBU=m
|
||||||
|
CONFIG_DCDBAS=m
|
||||||
|
|
||||||
|
CONFIG_GPIO_SCH=m
|
||||||
|
CONFIG_PC8736x_GPIO=m
|
||||||
|
# CONFIG_NSC_GPIO is not set
|
||||||
|
CONFIG_CS5535_GPIO=m
|
||||||
|
|
||||||
|
CONFIG_EDAC=y
|
||||||
|
# CONFIG_EDAC_DEBUG is not set
|
||||||
|
CONFIG_EDAC_MM_EDAC=m
|
||||||
|
CONFIG_EDAC_AMD76X=m
|
||||||
|
CONFIG_EDAC_E7XXX=m
|
||||||
|
CONFIG_EDAC_E752X=m
|
||||||
|
CONFIG_EDAC_I82860=m
|
||||||
|
CONFIG_EDAC_I82875P=m
|
||||||
|
CONFIG_EDAC_I82975X=m
|
||||||
|
CONFIG_EDAC_I3000=m
|
||||||
|
CONFIG_EDAC_I5000=m
|
||||||
|
CONFIG_EDAC_I5100=m
|
||||||
|
CONFIG_EDAC_I5400=m
|
||||||
|
CONFIG_EDAC_R82600=m
|
||||||
|
CONFIG_EDAC_AMD8131=m
|
||||||
|
CONFIG_EDAC_AMD8111=m
|
||||||
|
|
||||||
|
CONFIG_SCHED_MC=y
|
||||||
|
|
||||||
|
CONFIG_SND_ISA=y
|
||||||
|
CONFIG_SND_ES18XX=m
|
||||||
|
|
||||||
|
CONFIG_TCG_INFINEON=m
|
||||||
|
|
||||||
|
CONFIG_HW_RANDOM_INTEL=m
|
||||||
|
CONFIG_HW_RANDOM_AMD=m
|
||||||
|
CONFIG_HW_RANDOM_GEODE=m
|
||||||
|
CONFIG_HW_RANDOM_VIA=m
|
||||||
|
|
||||||
|
|
||||||
|
# CONFIG_COMPAT_VDSO is not set
|
||||||
|
|
||||||
|
# CONFIG_SGI_IOC4 is not set
|
||||||
|
|
||||||
|
CONFIG_X86_PLATFORM_DEVICES=y
|
||||||
|
CONFIG_ASUS_LAPTOP=m
|
||||||
|
CONFIG_COMPAL_LAPTOP=m
|
||||||
|
CONFIG_EEEPC_LAPTOP=m
|
||||||
|
CONFIG_EEEPC_WMI=m
|
||||||
|
CONFIG_FUJITSU_LAPTOP=m
|
||||||
|
# CONFIG_FUJITSU_LAPTOP_DEBUG is not set
|
||||||
|
CONFIG_MSI_LAPTOP=m
|
||||||
|
CONFIG_SONY_LAPTOP=m
|
||||||
|
CONFIG_DELL_LAPTOP=m
|
||||||
|
CONFIG_ACPI_WMI=m
|
||||||
|
CONFIG_ACER_WMI=m
|
||||||
|
CONFIG_ACERHDF=m
|
||||||
|
CONFIG_TC1100_WMI=m
|
||||||
|
CONFIG_HP_WMI=m
|
||||||
|
CONFIG_DELL_WMI=m
|
||||||
|
|
||||||
|
# CONFIG_SMSC37B787_WDT is not set
|
||||||
|
CONFIG_W83697HF_WDT=m
|
||||||
|
CONFIG_IB700_WDT=m
|
||||||
|
|
||||||
|
CONFIG_RELOCATABLE=y
|
||||||
|
CONFIG_PHYSICAL_ALIGN=0x400000
|
||||||
|
CONFIG_PHYSICAL_START=0x400000
|
||||||
|
CONFIG_CRASH_DUMP=y
|
||||||
|
# CONFIG_KEXEC_JUMP is not set
|
||||||
|
CONFIG_PROC_VMCORE=y
|
||||||
|
CONFIG_CRASH=m
|
||||||
|
|
||||||
|
CONFIG_CRYPTO_DEV_GEODE=m
|
||||||
|
|
||||||
|
CONFIG_VIDEO_CAFE_CCIC=m
|
||||||
|
|
||||||
|
CONFIG_VIRTUALIZATION=y
|
||||||
|
CONFIG_KVM=m
|
||||||
|
CONFIG_KVM_INTEL=m
|
||||||
|
CONFIG_KVM_AMD=m
|
||||||
|
CONFIG_LGUEST=m
|
||||||
|
|
||||||
|
CONFIG_PARAVIRT_GUEST=y
|
||||||
|
CONFIG_PARAVIRT=y
|
||||||
|
# CONFIG_PARAVIRT_DEBUG is not set
|
||||||
|
|
||||||
|
# PARAVIRT_SPINLOCKS has a 5% perf hit
|
||||||
|
# CONFIG_PARAVIRT_SPINLOCKS is not set
|
||||||
|
CONFIG_KVM_CLOCK=y
|
||||||
|
CONFIG_KVM_GUEST=y
|
||||||
|
CONFIG_LGUEST_GUEST=y
|
||||||
|
CONFIG_VMI=y
|
||||||
|
|
||||||
|
CONFIG_XEN=y
|
||||||
|
CONFIG_XEN_MAX_DOMAIN_MEMORY=8
|
||||||
|
CONFIG_XEN_BALLOON=y
|
||||||
|
CONFIG_XEN_SCRUB_PAGES=y
|
||||||
|
CONFIG_XEN_SAVE_RESTORE=y
|
||||||
|
CONFIG_HVC_XEN=y
|
||||||
|
CONFIG_XEN_FBDEV_FRONTEND=y
|
||||||
|
CONFIG_XEN_KBDDEV_FRONTEND=y
|
||||||
|
CONFIG_XEN_BLKDEV_FRONTEND=m
|
||||||
|
CONFIG_XEN_NETDEV_FRONTEND=m
|
||||||
|
CONFIG_XENFS=m
|
||||||
|
CONFIG_XEN_COMPAT_XENFS=y
|
||||||
|
|
||||||
|
CONFIG_MTD_ESB2ROM=m
|
||||||
|
CONFIG_MTD_CK804XROM=m
|
||||||
|
CONFIG_MTD_NAND_CAFE=m
|
||||||
|
|
||||||
|
CONFIG_NO_HZ=y
|
||||||
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
CONFIG_CPU_IDLE=y
|
||||||
|
# CONFIG_CPU_IDLE_GOV_LADDER is not set
|
||||||
|
CONFIG_CPU_IDLE_GOV_MENU=y
|
||||||
|
|
||||||
|
CONFIG_THINKPAD_ACPI=m
|
||||||
|
# CONFIG_THINKPAD_ACPI_DEBUG is not set
|
||||||
|
# CONFIG_THINKPAD_ACPI_DEBUGFACILITIES is not set
|
||||||
|
CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y
|
||||||
|
CONFIG_THINKPAD_ACPI_VIDEO=y
|
||||||
|
CONFIG_THINKPAD_ACPI_ALSA_SUPPORT=y
|
||||||
|
# CONFIG_THINKPAD_ACPI_UNSAFE_LEDS is not set
|
||||||
|
|
||||||
|
CONFIG_MACINTOSH_DRIVERS=y
|
||||||
|
|
||||||
|
CONFIG_DMIID=y
|
||||||
|
CONFIG_ISCSI_IBFT_FIND=y
|
||||||
|
CONFIG_ISCSI_IBFT=m
|
||||||
|
|
||||||
|
CONFIG_DMADEVICES=y
|
||||||
|
CONFIG_INTEL_IOATDMA=m
|
||||||
|
|
||||||
|
CONFIG_SENSORS_I5K_AMB=m
|
||||||
|
|
||||||
|
# CONFIG_CPA_DEBUG is not set
|
||||||
|
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
|
||||||
|
|
||||||
|
CONFIG_HP_WATCHDOG=m
|
||||||
|
|
||||||
|
CONFIG_OLPC=y
|
||||||
|
CONFIG_BATTERY_OLPC=y
|
||||||
|
CONFIG_MOUSE_PS2_OLPC=y
|
||||||
|
|
||||||
|
CONFIG_STRICT_DEVMEM=y
|
||||||
|
|
||||||
|
# CONFIG_NO_BOOTMEM is not set
|
||||||
|
|
||||||
|
# CONFIG_MEMTEST is not set
|
||||||
|
# CONFIG_MAXSMP is not set
|
||||||
|
CONFIG_MTRR_SANITIZER=y
|
||||||
|
CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=1
|
||||||
|
CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
|
||||||
|
CONFIG_SYSPROF_TRACER=y
|
||||||
|
|
||||||
|
# CONFIG_X86_VERBOSE_BOOTUP is not set
|
||||||
|
# CONFIG_MMIOTRACE_TEST is not set
|
||||||
|
|
||||||
|
# CONFIG_DEBUG_PER_CPU_MAPS is not set
|
||||||
|
|
||||||
|
CONFIG_HP_ILO=m
|
||||||
|
|
||||||
|
CONFIG_BACKLIGHT_MBP_NVIDIA=m
|
||||||
|
|
||||||
|
CONFIG_OPROFILE_IBS=y
|
||||||
|
CONFIG_MICROCODE_INTEL=y
|
||||||
|
CONFIG_MICROCODE_AMD=y
|
||||||
|
|
||||||
|
# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set
|
||||||
|
CONFIG_X86_RESERVE_LOW_64K=y
|
||||||
|
|
||||||
|
# CONFIG_CMDLINE_BOOL is not set
|
||||||
|
|
||||||
|
CONFIG_PANASONIC_LAPTOP=m
|
||||||
|
|
||||||
|
CONFIG_XEN_DEBUG_FS=y
|
||||||
|
CONFIG_X86_PTRACE_BTS=y
|
||||||
|
|
||||||
|
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
|
||||||
|
|
||||||
|
CONFIG_POWER_TRACER=y
|
||||||
|
CONFIG_HW_BRANCH_TRACER=y
|
||||||
|
|
||||||
|
# CONFIG_SPARSE_IRQ is not set
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=32
|
||||||
|
|
||||||
|
# CONFIG_IOMMU_STRESS is not set
|
||||||
|
|
||||||
|
CONFIG_PERF_COUNTERS=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
|
CONFIG_EVENT_PROFILE=y
|
||||||
|
|
||||||
|
CONFIG_X86_MCE_INTEL=y
|
||||||
|
CONFIG_X86_MCE_AMD=y
|
||||||
|
# CONFIG_X86_ANCIENT_MCE is not set
|
||||||
|
# CONFIG_X86_MCE_INJECT is not set
|
||||||
|
|
||||||
|
# CONFIG_X86_MRST is not set
|
||||||
|
CONFIG_SFI=y
|
||||||
|
|
||||||
|
CONFIG_INPUT_WINBOND_CIR=m
|
||||||
|
CONFIG_I2C_SCMI=m
|
||||||
|
CONFIG_SBC_FITPC2_WATCHDOG=m
|
||||||
|
CONFIG_EDAC_I3200=m
|
||||||
|
CONFIG_EDAC_DECODE_MCE=m
|
||||||
|
|
||||||
|
CONFIG_GPIO_LANGWELL=y
|
||||||
|
|
||||||
|
# CONFIG_INTEL_TXT is not set
|
||||||
|
|
||||||
|
CONFIG_CS5535_MFGPT=m
|
||||||
|
CONFIG_GEODE_WDT=m
|
||||||
|
CONFIG_CS5535_CLOCK_EVENT_SRC=m
|
||||||
|
|
||||||
|
CONFIG_LEDS_INTEL_SS4200=m
|
||||||
|
|
||||||
|
CONFIG_X86_DECODER_SELFTEST=y
|
||||||
|
|
||||||
|
CONFIG_ACPI_CMPC=m
|
||||||
|
CONFIG_MSI_WMI=m
|
||||||
|
CONFIG_TOSHIBA_BT_RFKILL=m
|
||||||
|
# CONFIG_SAMSUNG_LAPTOP is not set
|
||||||
|
|
||||||
|
CONFIG_VGA_SWITCHEROO=y
|
||||||
|
CONFIG_LPC_SCH=m
|
|
@ -0,0 +1,397 @@
|
||||||
|
CONFIG_64BIT=y
|
||||||
|
CONFIG_UID16=y
|
||||||
|
# CONFIG_KERNEL_LZMA is not set
|
||||||
|
|
||||||
|
# CONFIG_MK8 is not set
|
||||||
|
# CONFIG_MPSC is not set
|
||||||
|
CONFIG_GENERIC_CPU=y
|
||||||
|
CONFIG_X86_EXTENDED_PLATFORM=y
|
||||||
|
# CONFIG_X86_VSMP is not set
|
||||||
|
# CONFIG_X86_UV is not set
|
||||||
|
CONFIG_X86_MSR=y
|
||||||
|
CONFIG_X86_CPUID=y
|
||||||
|
CONFIG_MTRR=y
|
||||||
|
CONFIG_NUMA=y
|
||||||
|
CONFIG_K8_NUMA=y
|
||||||
|
CONFIG_X86_64_ACPI_NUMA=y
|
||||||
|
# CONFIG_NUMA_EMU is not set
|
||||||
|
CONFIG_NR_CPUS=256
|
||||||
|
CONFIG_X86_POWERNOW_K8=m
|
||||||
|
CONFIG_X86_P4_CLOCKMOD=m
|
||||||
|
CONFIG_IA32_EMULATION=y
|
||||||
|
# CONFIG_IA32_AOUT is not set
|
||||||
|
# CONFIG_IOMMU_DEBUG is not set
|
||||||
|
CONFIG_DEBUG_RODATA=y
|
||||||
|
CONFIG_MICROCODE=m
|
||||||
|
CONFIG_SWIOTLB=y
|
||||||
|
CONFIG_CALGARY_IOMMU=y
|
||||||
|
CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT=y
|
||||||
|
CONFIG_X86_PM_TIMER=y
|
||||||
|
CONFIG_EDD=m
|
||||||
|
# CONFIG_EDD_OFF is not set
|
||||||
|
CONFIG_PCI_BIOS=y
|
||||||
|
CONFIG_PCI_MMCONFIG=y
|
||||||
|
CONFIG_DMAR=y
|
||||||
|
CONFIG_DMAR_BROKEN_GFX_WA=y
|
||||||
|
CONFIG_DMAR_FLOPPY_WA=y
|
||||||
|
CONFIG_DMAR_DEFAULT_ON=y
|
||||||
|
|
||||||
|
CONFIG_KEXEC_JUMP=y
|
||||||
|
|
||||||
|
CONFIG_EFI=y
|
||||||
|
CONFIG_EFI_VARS=y
|
||||||
|
CONFIG_EFI_PCDP=y
|
||||||
|
CONFIG_FB_EFI=y
|
||||||
|
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
|
|
||||||
|
CONFIG_CAPI_EICON=y
|
||||||
|
|
||||||
|
CONFIG_GENERIC_ISA_DMA=y
|
||||||
|
CONFIG_SCHED_SMT=y
|
||||||
|
CONFIG_SUSPEND=y
|
||||||
|
CONFIG_HIBERNATION=y
|
||||||
|
CONFIG_PM_STD_PARTITION=""
|
||||||
|
|
||||||
|
CONFIG_CPU_FREQ=y
|
||||||
|
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
|
||||||
|
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||||
|
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_USERSPACE=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_ONDEMAND=m
|
||||||
|
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
|
||||||
|
CONFIG_CPU_FREQ_TABLE=y
|
||||||
|
CONFIG_CPU_FREQ_DEBUG=y
|
||||||
|
# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
|
||||||
|
CONFIG_X86_PCC_CPUFREQ=m
|
||||||
|
CONFIG_X86_ACPI_CPUFREQ=m
|
||||||
|
CONFIG_CPU_FREQ_STAT=m
|
||||||
|
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||||
|
|
||||||
|
CONFIG_ACPI=y
|
||||||
|
CONFIG_ACPI_AC=y
|
||||||
|
# CONFIG_ACPI_ASUS is not set
|
||||||
|
CONFIG_ACPI_PROCFS_POWER=y
|
||||||
|
CONFIG_ACPI_SYSFS_POWER=y
|
||||||
|
CONFIG_ACPI_BATTERY=y
|
||||||
|
CONFIG_ACPI_BLACKLIST_YEAR=0
|
||||||
|
CONFIG_ACPI_BUTTON=y
|
||||||
|
CONFIG_ACPI_CONTAINER=m
|
||||||
|
CONFIG_ACPI_DOCK=y
|
||||||
|
CONFIG_ACPI_FAN=y
|
||||||
|
CONFIG_ACPI_HOTPLUG_MEMORY=m
|
||||||
|
CONFIG_ACPI_NUMA=y
|
||||||
|
CONFIG_ACPI_PROCESSOR=y
|
||||||
|
CONFIG_ACPI_PROCFS=y
|
||||||
|
CONFIG_ACPI_SBS=m
|
||||||
|
CONFIG_ACPI_SLEEP=y
|
||||||
|
CONFIG_ACPI_THERMAL=y
|
||||||
|
CONFIG_ACPI_TOSHIBA=m
|
||||||
|
CONFIG_ACPI_POWER=y
|
||||||
|
CONFIG_ACPI_VIDEO=m
|
||||||
|
# Disable in F9.
|
||||||
|
CONFIG_ACPI_PROC_EVENT=y
|
||||||
|
CONFIG_ACPI_POWER_METER=m
|
||||||
|
CONFIG_ACPI_PROCESSOR_AGGREGATOR=m
|
||||||
|
|
||||||
|
CONFIG_X86_PLATFORM_DEVICES=y
|
||||||
|
CONFIG_ASUS_LAPTOP=m
|
||||||
|
CONFIG_COMPAL_LAPTOP=m
|
||||||
|
CONFIG_FUJITSU_LAPTOP=m
|
||||||
|
# CONFIG_FUJITSU_LAPTOP_DEBUG is not set
|
||||||
|
CONFIG_MSI_LAPTOP=m
|
||||||
|
CONFIG_SONY_LAPTOP=m
|
||||||
|
CONFIG_SONYPI_COMPAT=y
|
||||||
|
CONFIG_EEEPC_LAPTOP=m
|
||||||
|
CONFIG_EEEPC_WMI=m
|
||||||
|
CONFIG_DELL_LAPTOP=m
|
||||||
|
CONFIG_ACPI_WMI=m
|
||||||
|
CONFIG_ACER_WMI=m
|
||||||
|
CONFIG_ACERHDF=m
|
||||||
|
CONFIG_HP_WMI=m
|
||||||
|
CONFIG_DELL_WMI=m
|
||||||
|
|
||||||
|
CONFIG_THINKPAD_ACPI=m
|
||||||
|
# CONFIG_THINKPAD_ACPI_DEBUG is not set
|
||||||
|
# CONFIG_THINKPAD_ACPI_DEBUGFACILITIES is not set
|
||||||
|
CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y
|
||||||
|
CONFIG_THINKPAD_ACPI_VIDEO=y
|
||||||
|
CONFIG_THINKPAD_ACPI_ALSA_SUPPORT=y
|
||||||
|
# CONFIG_THINKPAD_ACPI_UNSAFE_LEDS is not set
|
||||||
|
|
||||||
|
CONFIG_HOTPLUG_PCI=y
|
||||||
|
CONFIG_HOTPLUG_PCI_COMPAQ=m
|
||||||
|
# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set
|
||||||
|
CONFIG_HOTPLUG_PCI_IBM=m
|
||||||
|
# CONFIG_HOTPLUG_PCI_CPCI is not set
|
||||||
|
# SHPC has half-arsed PCI probing, which makes it load on too many systems
|
||||||
|
CONFIG_HOTPLUG_PCI_SHPC=m
|
||||||
|
|
||||||
|
CONFIG_HPET=y
|
||||||
|
# CONFIG_HPET_MMAP is not set
|
||||||
|
CONFIG_PM=y
|
||||||
|
|
||||||
|
CONFIG_IPW2100=m
|
||||||
|
CONFIG_IPW2100_MONITOR=y
|
||||||
|
CONFIG_IPW2200=m
|
||||||
|
CONFIG_IPW2200_MONITOR=y
|
||||||
|
CONFIG_IPW2200_RADIOTAP=y
|
||||||
|
CONFIG_IPW2200_PROMISCUOUS=y
|
||||||
|
CONFIG_IPW2200_QOS=y
|
||||||
|
|
||||||
|
CONFIG_PNP=y
|
||||||
|
CONFIG_PNPACPI=y
|
||||||
|
|
||||||
|
CONFIG_BLK_DEV_AMD74XX=y
|
||||||
|
CONFIG_CRYPTO_DEV_PADLOCK=m
|
||||||
|
CONFIG_CRYPTO_DEV_PADLOCK_AES=m
|
||||||
|
CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
|
||||||
|
# CONFIG_CRYPTO_AES is not set
|
||||||
|
CONFIG_CRYPTO_AES_X86_64=m
|
||||||
|
# CONFIG_CRYPTO_TWOFISH is not set
|
||||||
|
CONFIG_CRYPTO_TWOFISH_X86_64=m
|
||||||
|
# CONFIG_CRYPTO_SALSA20 is not set
|
||||||
|
CONFIG_CRYPTO_SALSA20_X86_64=m
|
||||||
|
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_NFORCE2_S4985=m
|
||||||
|
CONFIG_I2C_PIIX4=m
|
||||||
|
# CONFIG_I2C_SIS5595 is not set
|
||||||
|
# CONFIG_I2C_SIS630 is not set
|
||||||
|
|
||||||
|
CONFIG_I2C_SIS96X=m
|
||||||
|
CONFIG_I2C_VIA=m
|
||||||
|
CONFIG_I2C_VIAPRO=m
|
||||||
|
|
||||||
|
CONFIG_DELL_RBU=m
|
||||||
|
CONFIG_DCDBAS=m
|
||||||
|
|
||||||
|
CONFIG_NVRAM=y
|
||||||
|
|
||||||
|
CONFIG_EDAC=y
|
||||||
|
# CONFIG_EDAC_DEBUG is not set
|
||||||
|
CONFIG_EDAC_MM_EDAC=m
|
||||||
|
CONFIG_EDAC_AMD76X=m
|
||||||
|
CONFIG_EDAC_E7XXX=m
|
||||||
|
CONFIG_EDAC_E752X=m
|
||||||
|
CONFIG_EDAC_I5000=m
|
||||||
|
CONFIG_EDAC_I5100=m
|
||||||
|
CONFIG_EDAC_I5400=m
|
||||||
|
CONFIG_EDAC_I82875P=m
|
||||||
|
CONFIG_EDAC_I82860=m
|
||||||
|
CONFIG_EDAC_I82975X=m
|
||||||
|
CONFIG_EDAC_R82600=m
|
||||||
|
CONFIG_EDAC_AMD8131=m
|
||||||
|
CONFIG_EDAC_AMD8111=m
|
||||||
|
CONFIG_EDAC_AMD64=m
|
||||||
|
# CONFIG_EDAC_AMD64_ERROR_INJECTION is not set
|
||||||
|
CONFIG_EDAC_DECODE_MCE=m
|
||||||
|
|
||||||
|
CONFIG_SCHED_MC=y
|
||||||
|
|
||||||
|
CONFIG_TCG_INFINEON=m
|
||||||
|
|
||||||
|
CONFIG_HW_RANDOM_INTEL=m
|
||||||
|
CONFIG_HW_RANDOM_AMD=m
|
||||||
|
CONFIG_HW_RANDOM_VIA=m
|
||||||
|
|
||||||
|
# CONFIG_HW_RANDOM_GEODE is not set
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||||
|
CONFIG_DEBUG_NMI_TIMEOUT=5
|
||||||
|
|
||||||
|
CONFIG_GPIO_SCH=m
|
||||||
|
# CONFIG_PC8736x_GPIO is not set
|
||||||
|
|
||||||
|
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||||
|
CONFIG_SPARSEMEM_MANUAL=y
|
||||||
|
CONFIG_SPARSEMEM=y
|
||||||
|
CONFIG_HAVE_MEMORY_PRESENT=y
|
||||||
|
CONFIG_SPARSEMEM_EXTREME=y
|
||||||
|
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||||
|
CONFIG_MEMORY_HOTPLUG=y
|
||||||
|
CONFIG_MEMORY_HOTREMOVE=y
|
||||||
|
|
||||||
|
# CONFIG_BLK_DEV_CMD640 is not set
|
||||||
|
# CONFIG_BLK_DEV_RZ1000 is not set
|
||||||
|
# CONFIG_BLK_DEV_TRIFLEX is not set
|
||||||
|
# CONFIG_BLK_DEV_CS5520 is not set
|
||||||
|
# CONFIG_BLK_DEV_CS5530 is not set
|
||||||
|
# CONFIG_BLK_DEV_CS5535 is not set
|
||||||
|
|
||||||
|
CONFIG_CC_STACKPROTECTOR=y
|
||||||
|
|
||||||
|
CONFIG_SGI_IOC4=m
|
||||||
|
CONFIG_SGI_XP=m
|
||||||
|
CONFIG_SGI_GRU=m
|
||||||
|
# CONFIG_SGI_GRU_DEBUG is not set
|
||||||
|
|
||||||
|
# CONFIG_SMSC37B787_WDT is not set
|
||||||
|
CONFIG_W83697HF_WDT=m
|
||||||
|
|
||||||
|
# CONFIG_VIDEO_CAFE_CCIC is not set
|
||||||
|
|
||||||
|
CONFIG_MTD_ESB2ROM=m
|
||||||
|
CONFIG_MTD_CK804XROM=m
|
||||||
|
|
||||||
|
CONFIG_RELOCATABLE=y
|
||||||
|
CONFIG_MACINTOSH_DRIVERS=y
|
||||||
|
|
||||||
|
CONFIG_CRASH_DUMP=y
|
||||||
|
CONFIG_PHYSICAL_START=0x1000000
|
||||||
|
CONFIG_PROC_VMCORE=y
|
||||||
|
CONFIG_CRASH=m
|
||||||
|
|
||||||
|
CONFIG_DMIID=y
|
||||||
|
CONFIG_ISCSI_IBFT_FIND=y
|
||||||
|
CONFIG_ISCSI_IBFT=m
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_NO_HZ=y
|
||||||
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
CONFIG_CPU_IDLE=y
|
||||||
|
# CONFIG_CPU_IDLE_GOV_LADDER is not set
|
||||||
|
CONFIG_CPU_IDLE_GOV_MENU=y
|
||||||
|
|
||||||
|
CONFIG_VIRTUALIZATION=y
|
||||||
|
CONFIG_KVM=m
|
||||||
|
CONFIG_KVM_INTEL=m
|
||||||
|
CONFIG_KVM_AMD=m
|
||||||
|
|
||||||
|
CONFIG_PARAVIRT_GUEST=y
|
||||||
|
CONFIG_PARAVIRT=y
|
||||||
|
# CONFIG_PARAVIRT_DEBUG is not set
|
||||||
|
# PARAVIRT_SPINLOCKS has a 5% perf hit
|
||||||
|
# CONFIG_PARAVIRT_SPINLOCKS is not set
|
||||||
|
CONFIG_KVM_CLOCK=y
|
||||||
|
CONFIG_KVM_GUEST=y
|
||||||
|
|
||||||
|
CONFIG_XEN=y
|
||||||
|
CONFIG_XEN_MAX_DOMAIN_MEMORY=32
|
||||||
|
CONFIG_XEN_BALLOON=y
|
||||||
|
CONFIG_XEN_SCRUB_PAGES=y
|
||||||
|
CONFIG_XEN_SAVE_RESTORE=y
|
||||||
|
CONFIG_HVC_XEN=y
|
||||||
|
CONFIG_XEN_FBDEV_FRONTEND=y
|
||||||
|
CONFIG_XEN_KBDDEV_FRONTEND=y
|
||||||
|
CONFIG_XEN_BLKDEV_FRONTEND=m
|
||||||
|
CONFIG_XEN_NETDEV_FRONTEND=m
|
||||||
|
CONFIG_XENFS=m
|
||||||
|
CONFIG_XEN_COMPAT_XENFS=y
|
||||||
|
CONFIG_XEN_DEV_EVTCHN=m
|
||||||
|
CONFIG_XEN_SYS_HYPERVISOR=y
|
||||||
|
|
||||||
|
CONFIG_DMADEVICES=y
|
||||||
|
CONFIG_INTEL_IOATDMA=m
|
||||||
|
|
||||||
|
CONFIG_SENSORS_I5K_AMB=m
|
||||||
|
|
||||||
|
# CONFIG_COMPAT_VDSO is not set
|
||||||
|
CONFIG_PROVIDE_OHCI1394_DMA_INIT=y
|
||||||
|
# CONFIG_DEBUG_PER_CPU_MAPS is not set
|
||||||
|
# CONFIG_CPA_DEBUG is not set
|
||||||
|
|
||||||
|
CONFIG_HP_WATCHDOG=m
|
||||||
|
|
||||||
|
CONFIG_FRAME_WARN=2048
|
||||||
|
|
||||||
|
CONFIG_NODES_SHIFT=9
|
||||||
|
CONFIG_X86_PAT=y
|
||||||
|
# FIXME: These should be 32bit only
|
||||||
|
# CONFIG_FB_N411 is not set
|
||||||
|
CONFIG_STRICT_DEVMEM=y
|
||||||
|
|
||||||
|
CONFIG_DIRECT_GBPAGES=y
|
||||||
|
|
||||||
|
# CONFIG_NO_BOOTMEM is not set
|
||||||
|
|
||||||
|
# CONFIG_MEMTEST is not set
|
||||||
|
CONFIG_AMD_IOMMU=y
|
||||||
|
CONFIG_AMD_IOMMU_STATS=y
|
||||||
|
# CONFIG_MAXSMP is not set
|
||||||
|
CONFIG_MTRR_SANITIZER=y
|
||||||
|
CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=1
|
||||||
|
CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
|
||||||
|
CONFIG_SYSPROF_TRACER=y
|
||||||
|
# CONFIG_X86_VERBOSE_BOOTUP is not set
|
||||||
|
# CONFIG_MMIOTRACE_TEST is not set
|
||||||
|
|
||||||
|
CONFIG_X86_MPPARSE=y
|
||||||
|
|
||||||
|
CONFIG_BACKLIGHT_MBP_NVIDIA=m
|
||||||
|
|
||||||
|
CONFIG_OPROFILE_IBS=y
|
||||||
|
CONFIG_MICROCODE_INTEL=y
|
||||||
|
CONFIG_MICROCODE_AMD=y
|
||||||
|
|
||||||
|
# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set
|
||||||
|
CONFIG_X86_RESERVE_LOW_64K=y
|
||||||
|
|
||||||
|
# CONFIG_CMDLINE_BOOL is not set
|
||||||
|
|
||||||
|
CONFIG_PANASONIC_LAPTOP=m
|
||||||
|
|
||||||
|
CONFIG_XEN_DEBUG_FS=y
|
||||||
|
CONFIG_X86_PTRACE_BTS=y
|
||||||
|
|
||||||
|
CONFIG_I7300_IDLE=m
|
||||||
|
CONFIG_INTR_REMAP=y
|
||||||
|
|
||||||
|
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
|
||||||
|
|
||||||
|
CONFIG_POWER_TRACER=y
|
||||||
|
CONFIG_HW_BRANCH_TRACER=y
|
||||||
|
|
||||||
|
CONFIG_X86_X2APIC=y
|
||||||
|
CONFIG_SPARSE_IRQ=y
|
||||||
|
|
||||||
|
CONFIG_RCU_FANOUT=64
|
||||||
|
|
||||||
|
# CONFIG_IOMMU_STRESS is not set
|
||||||
|
|
||||||
|
CONFIG_PERF_COUNTERS=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
|
CONFIG_EVENT_PROFILE=y
|
||||||
|
|
||||||
|
# CONFIG_X86_MCE_INJECT is not set
|
||||||
|
|
||||||
|
CONFIG_SFI=y
|
||||||
|
CONFIG_INPUT_WINBOND_CIR=m
|
||||||
|
CONFIG_I2C_SCMI=m
|
||||||
|
CONFIG_SBC_FITPC2_WATCHDOG=m
|
||||||
|
CONFIG_EDAC_I3200=m
|
||||||
|
CONFIG_TOPSTAR_LAPTOP=m
|
||||||
|
CONFIG_INTEL_TXT=y
|
||||||
|
CONFIG_GPIO_LANGWELL=y
|
||||||
|
|
||||||
|
CONFIG_FUNCTION_GRAPH_TRACER=y
|
||||||
|
|
||||||
|
CONFIG_ACPI_CMPC=m
|
||||||
|
CONFIG_MSI_WMI=m
|
||||||
|
CONFIG_TOSHIBA_BT_RFKILL=m
|
||||||
|
# CONFIG_SAMSUNG_LAPTOP is not set
|
||||||
|
|
||||||
|
CONFIG_CS5535_MFGPT=m
|
||||||
|
CONFIG_GEODE_WDT=m
|
||||||
|
CONFIG_CS5535_CLOCK_EVENT_SRC=m
|
||||||
|
|
||||||
|
CONFIG_X86_DECODER_SELFTEST=y
|
||||||
|
|
||||||
|
CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m
|
||||||
|
|
||||||
|
CONFIG_VGA_SWITCHEROO=y
|
||||||
|
CONFIG_LPC_SCH=m
|
|
@ -0,0 +1,14 @@
|
||||||
|
diff -up linux-2.6.32.noarch/fs/exec.c.orig linux-2.6.32.noarch/fs/exec.c
|
||||||
|
--- linux-2.6.32.noarch/fs/exec.c.orig 2010-02-22 12:40:06.000000000 -0500
|
||||||
|
+++ linux-2.6.32.noarch/fs/exec.c 2010-02-22 12:48:34.000000000 -0500
|
||||||
|
@@ -1973,8 +1973,9 @@ void do_coredump(long signr, int exit_co
|
||||||
|
/*
|
||||||
|
* Dont allow local users get cute and trick others to coredump
|
||||||
|
* into their pre-created files:
|
||||||
|
+ * Note this isn't relevant to pipes
|
||||||
|
*/
|
||||||
|
- if (inode->i_uid != current_fsuid())
|
||||||
|
+ if (!ispipe && (inode->i_uid != current_fsuid()))
|
||||||
|
goto close_fail;
|
||||||
|
if (!cprm.file->f_op)
|
||||||
|
goto close_fail;
|
|
@ -0,0 +1,111 @@
|
||||||
|
From e45009229be6a7fae49bdfa3459905668c0b0fb1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: David S. Miller <davem@davemloft.net>
|
||||||
|
Date: Wed, 19 May 2010 14:12:03 +1000
|
||||||
|
Subject: crypto: testmgr - Add testing for async hashing and update/final
|
||||||
|
|
||||||
|
Extend testmgr such that it tests async hash algorithms,
|
||||||
|
and that for both sync and async hashes it tests both
|
||||||
|
->digest() and ->update()/->final() sequences.
|
||||||
|
|
||||||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||||
|
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||||
|
---
|
||||||
|
crypto/testmgr.c | 66 +++++++++++++++++++++++++++++++++++++++--------------
|
||||||
|
1 files changed, 48 insertions(+), 18 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/crypto/testmgr.c b/crypto/testmgr.c
|
||||||
|
index c494d76..5c8aaa0 100644
|
||||||
|
--- a/crypto/testmgr.c
|
||||||
|
+++ b/crypto/testmgr.c
|
||||||
|
@@ -153,8 +153,21 @@ static void testmgr_free_buf(char *buf[XBUFSIZE])
|
||||||
|
free_page((unsigned long)buf[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int do_one_async_hash_op(struct ahash_request *req,
|
||||||
|
+ struct tcrypt_result *tr,
|
||||||
|
+ int ret)
|
||||||
|
+{
|
||||||
|
+ if (ret == -EINPROGRESS || ret == -EBUSY) {
|
||||||
|
+ ret = wait_for_completion_interruptible(&tr->completion);
|
||||||
|
+ if (!ret)
|
||||||
|
+ ret = tr->err;
|
||||||
|
+ INIT_COMPLETION(tr->completion);
|
||||||
|
+ }
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
|
||||||
|
- unsigned int tcount)
|
||||||
|
+ unsigned int tcount, bool use_digest)
|
||||||
|
{
|
||||||
|
const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
|
||||||
|
unsigned int i, j, k, temp;
|
||||||
|
@@ -206,23 +219,36 @@ static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
|
||||||
|
}
|
||||||
|
|
||||||
|
ahash_request_set_crypt(req, sg, result, template[i].psize);
|
||||||
|
- ret = crypto_ahash_digest(req);
|
||||||
|
- switch (ret) {
|
||||||
|
- case 0:
|
||||||
|
- break;
|
||||||
|
- case -EINPROGRESS:
|
||||||
|
- case -EBUSY:
|
||||||
|
- ret = wait_for_completion_interruptible(
|
||||||
|
- &tresult.completion);
|
||||||
|
- if (!ret && !(ret = tresult.err)) {
|
||||||
|
- INIT_COMPLETION(tresult.completion);
|
||||||
|
- break;
|
||||||
|
+ if (use_digest) {
|
||||||
|
+ ret = do_one_async_hash_op(req, &tresult,
|
||||||
|
+ crypto_ahash_digest(req));
|
||||||
|
+ if (ret) {
|
||||||
|
+ pr_err("alg: hash: digest failed on test %d "
|
||||||
|
+ "for %s: ret=%d\n", j, algo, -ret);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ ret = do_one_async_hash_op(req, &tresult,
|
||||||
|
+ crypto_ahash_init(req));
|
||||||
|
+ if (ret) {
|
||||||
|
+ pr_err("alt: hash: init failed on test %d "
|
||||||
|
+ "for %s: ret=%d\n", j, algo, -ret);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ ret = do_one_async_hash_op(req, &tresult,
|
||||||
|
+ crypto_ahash_update(req));
|
||||||
|
+ if (ret) {
|
||||||
|
+ pr_err("alt: hash: update failed on test %d "
|
||||||
|
+ "for %s: ret=%d\n", j, algo, -ret);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ ret = do_one_async_hash_op(req, &tresult,
|
||||||
|
+ crypto_ahash_final(req));
|
||||||
|
+ if (ret) {
|
||||||
|
+ pr_err("alt: hash: final failed on test %d "
|
||||||
|
+ "for %s: ret=%d\n", j, algo, -ret);
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
- /* fall through */
|
||||||
|
- default:
|
||||||
|
- printk(KERN_ERR "alg: hash: digest failed on test %d "
|
||||||
|
- "for %s: ret=%d\n", j, algo, -ret);
|
||||||
|
- goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (memcmp(result, template[i].digest,
|
||||||
|
@@ -1402,7 +1428,11 @@ static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
|
||||||
|
return PTR_ERR(tfm);
|
||||||
|
}
|
||||||
|
|
||||||
|
- err = test_hash(tfm, desc->suite.hash.vecs, desc->suite.hash.count);
|
||||||
|
+ err = test_hash(tfm, desc->suite.hash.vecs,
|
||||||
|
+ desc->suite.hash.count, true);
|
||||||
|
+ if (!err)
|
||||||
|
+ err = test_hash(tfm, desc->suite.hash.vecs,
|
||||||
|
+ desc->suite.hash.count, false);
|
||||||
|
|
||||||
|
crypto_free_ahash(tfm);
|
||||||
|
return err;
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
From 4ff58b642f80dedb20533978123d89b5ac9b1ed5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Tue, 30 Mar 2010 00:04:29 -0400
|
||||||
|
Subject: die-floppy-die
|
||||||
|
|
||||||
|
Kill the floppy.ko pnp modalias. We were surviving just fine without
|
||||||
|
autoloading floppy drivers, tyvm.
|
||||||
|
|
||||||
|
Please feel free to register all complaints in the wastepaper bin.
|
||||||
|
---
|
||||||
|
drivers/block/floppy.c | 3 +--
|
||||||
|
1 files changed, 1 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
|
||||||
|
index 90c4038..f4a0b90 100644
|
||||||
|
--- a/drivers/block/floppy.c
|
||||||
|
+++ b/drivers/block/floppy.c
|
||||||
|
@@ -4619,8 +4619,7 @@ static const struct pnp_device_id floppy_pnpids[] = {
|
||||||
|
{"PNP0700", 0},
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
-
|
||||||
|
-MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
|
||||||
|
+/* MODULE_DEVICE_TABLE(pnp, floppy_pnpids); */
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
From 2a79554c864ac58fa2ad982f0fcee2cc2aa33eb5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Bastien Nocera <hadess@hadess.net>
|
||||||
|
Date: Thu, 20 May 2010 10:30:31 -0400
|
||||||
|
Subject: Disable i8042 checks on Intel Apple Macs
|
||||||
|
|
||||||
|
As those computers never had any i8042 controllers, and the
|
||||||
|
current lookup code could potentially lock up/hang/wait for
|
||||||
|
timeout for long periods of time.
|
||||||
|
|
||||||
|
Fixes intermittent hangs on boot on a MacbookAir1,1
|
||||||
|
|
||||||
|
Signed-off-by: Bastien Nocera <hadess@hadess.net>
|
||||||
|
---
|
||||||
|
drivers/input/serio/i8042.c | 22 ++++++++++++++++++++++
|
||||||
|
1 files changed, 22 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
|
||||||
|
index 6440a8f..4d7cf98 100644
|
||||||
|
--- a/drivers/input/serio/i8042.c
|
||||||
|
+++ b/drivers/input/serio/i8042.c
|
||||||
|
@@ -1451,6 +1451,22 @@ static struct platform_driver i8042_driver = {
|
||||||
|
.shutdown = i8042_shutdown,
|
||||||
|
};
|
||||||
|
|
||||||
|
+#ifdef CONFIG_DMI
|
||||||
|
+static struct dmi_system_id __initdata dmi_system_table[] = {
|
||||||
|
+ {
|
||||||
|
+ .matches = {
|
||||||
|
+ DMI_MATCH(DMI_BIOS_VENDOR, "Apple Computer, Inc.")
|
||||||
|
+ },
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .matches = {
|
||||||
|
+ DMI_MATCH(DMI_BIOS_VENDOR, "Apple Inc.")
|
||||||
|
+ },
|
||||||
|
+ },
|
||||||
|
+ {}
|
||||||
|
+};
|
||||||
|
+#endif /*CONFIG_DMI*/
|
||||||
|
+
|
||||||
|
static int __init i8042_init(void)
|
||||||
|
{
|
||||||
|
struct platform_device *pdev;
|
||||||
|
@@ -1458,6 +1474,12 @@ static int __init i8042_init(void)
|
||||||
|
|
||||||
|
dbg_init();
|
||||||
|
|
||||||
|
+#ifdef CONFIG_DMI
|
||||||
|
+ /* Intel Apple Macs never have an i8042 controller */
|
||||||
|
+ if (dmi_check_system(dmi_system_table) > 0)
|
||||||
|
+ return -ENODEV;
|
||||||
|
+#endif /*CONFIG_DMI*/
|
||||||
|
+
|
||||||
|
err = i8042_platform_init();
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
From 0b91f360956aa7a5aa8900d358d1bff3020182e0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
Date: Thu, 1 Jul 2010 12:34:56 +1000
|
||||||
|
Subject: [PATCH 1/2] drm: disable encoder rather than dpms off in drm_crtc_prepare_encoders()
|
||||||
|
|
||||||
|
Original behaviour will be preserved for drivers that don't implement
|
||||||
|
disable() hooks for an encoder.
|
||||||
|
|
||||||
|
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/drm_crtc_helper.c | 22 ++++++++++++++--------
|
||||||
|
1 files changed, 14 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
|
||||||
|
index b142ac2..32dae0e 100644
|
||||||
|
--- a/drivers/gpu/drm/drm_crtc_helper.c
|
||||||
|
+++ b/drivers/gpu/drm/drm_crtc_helper.c
|
||||||
|
@@ -201,6 +201,17 @@ bool drm_helper_crtc_in_use(struct drm_crtc *crtc)
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_helper_crtc_in_use);
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+drm_encoder_disable(struct drm_encoder *encoder)
|
||||||
|
+{
|
||||||
|
+ struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
|
||||||
|
+
|
||||||
|
+ if (encoder_funcs->disable)
|
||||||
|
+ (*encoder_funcs->disable)(encoder);
|
||||||
|
+ else
|
||||||
|
+ (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* drm_helper_disable_unused_functions - disable unused objects
|
||||||
|
* @dev: DRM device
|
||||||
|
@@ -215,7 +226,6 @@ void drm_helper_disable_unused_functions(struct drm_device *dev)
|
||||||
|
{
|
||||||
|
struct drm_encoder *encoder;
|
||||||
|
struct drm_connector *connector;
|
||||||
|
- struct drm_encoder_helper_funcs *encoder_funcs;
|
||||||
|
struct drm_crtc *crtc;
|
||||||
|
|
||||||
|
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||||
|
@@ -226,12 +236,8 @@ void drm_helper_disable_unused_functions(struct drm_device *dev)
|
||||||
|
}
|
||||||
|
|
||||||
|
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
||||||
|
- encoder_funcs = encoder->helper_private;
|
||||||
|
if (!drm_helper_encoder_in_use(encoder)) {
|
||||||
|
- if (encoder_funcs->disable)
|
||||||
|
- (*encoder_funcs->disable)(encoder);
|
||||||
|
- else
|
||||||
|
- (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
|
||||||
|
+ drm_encoder_disable(encoder);
|
||||||
|
/* disconnector encoder from any connector */
|
||||||
|
encoder->crtc = NULL;
|
||||||
|
}
|
||||||
|
@@ -292,11 +298,11 @@ drm_crtc_prepare_encoders(struct drm_device *dev)
|
||||||
|
encoder_funcs = encoder->helper_private;
|
||||||
|
/* Disable unused encoders */
|
||||||
|
if (encoder->crtc == NULL)
|
||||||
|
- (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
|
||||||
|
+ drm_encoder_disable(encoder);
|
||||||
|
/* Disable encoders whose CRTC is about to change */
|
||||||
|
if (encoder_funcs->get_crtc &&
|
||||||
|
encoder->crtc != (*encoder_funcs->get_crtc)(encoder))
|
||||||
|
- (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
|
||||||
|
+ drm_encoder_disable(encoder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.1.1
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
From: Linus Torvalds <torvalds@linux-foundation.org>
|
||||||
|
Date: Sun, 18 Jul 2010 16:44:37 +0000 (-0700)
|
||||||
|
Subject: drm/i915: add 'reclaimable' to i915 self-reclaimable page allocations
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=cd9f040df6ce46573760a507cb88192d05d27d86
|
||||||
|
|
||||||
|
drm/i915: add 'reclaimable' to i915 self-reclaimable page allocations
|
||||||
|
|
||||||
|
The hibernate issues that got fixed in commit 985b823b9192 ("drm/i915:
|
||||||
|
fix hibernation since i915 self-reclaim fixes") turn out to have been
|
||||||
|
incomplete. Vefa Bicakci tested lots of hibernate cycles, and without
|
||||||
|
the __GFP_RECLAIMABLE flag the system eventually fails to resume.
|
||||||
|
|
||||||
|
With the flag added, Vefa can apparently hibernate forever (or until he
|
||||||
|
gets bored running his automated scripts, whichever comes first).
|
||||||
|
|
||||||
|
The reclaimable flag was there originally, and was one of the flags that
|
||||||
|
were dropped (unintentionally) by commit 4bdadb978569 ("drm/i915:
|
||||||
|
Selectively enable self-reclaim") that introduced all these problems,
|
||||||
|
but I didn't want to just blindly add back all the flags in commit
|
||||||
|
985b823b9192, and it looked like __GFP_RECLAIM wasn't necessary. It
|
||||||
|
clearly was.
|
||||||
|
|
||||||
|
I still suspect that there is some subtle reason we're missing that
|
||||||
|
causes the problems, but __GFP_RECLAIMABLE is certainly not wrong to use
|
||||||
|
in this context, and is what the code historically used. And we have no
|
||||||
|
idea what the causes the corruption without it.
|
||||||
|
|
||||||
|
Reported-and-tested-by: M. Vefa Bicakci <bicave@superonline.com>
|
||||||
|
Cc: Dave Airlie <airlied@gmail.com>
|
||||||
|
Cc: Chris Wilson <chris@chris-wilson.co.uk>
|
||||||
|
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
|
||||||
|
Cc: Hugh Dickins <hugh.dickins@tiscali.co.uk>
|
||||||
|
Cc: stable@kernel.org
|
||||||
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
index 0743858..8757ecf 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
@@ -2241,6 +2241,7 @@ i915_gem_object_get_pages(struct drm_gem_object *obj,
|
||||||
|
page = read_cache_page_gfp(mapping, i,
|
||||||
|
GFP_HIGHUSER |
|
||||||
|
__GFP_COLD |
|
||||||
|
+ __GFP_RECLAIMABLE |
|
||||||
|
gfpmask);
|
||||||
|
if (IS_ERR(page))
|
||||||
|
goto err_pages;
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff -up linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_dp.c.dave linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_dp.c
|
||||||
|
--- linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_dp.c.dave 2010-06-25 16:30:13.000000000 +1000
|
||||||
|
+++ linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_dp.c 2010-06-25 16:30:23.000000000 +1000
|
||||||
|
@@ -129,7 +129,7 @@ intel_dp_link_required(struct drm_device
|
||||||
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
|
|
||||||
|
if (IS_eDP(intel_encoder))
|
||||||
|
- return (pixel_clock * dev_priv->edp_bpp) / 8;
|
||||||
|
+ return (pixel_clock * ALIGN(dev_priv->edp_bpp, 8)) / 8;
|
||||||
|
else
|
||||||
|
return pixel_clock * 3;
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
From: Linus Torvalds <torvalds@linux-foundation.org>
|
||||||
|
Date: Fri, 2 Jul 2010 00:04:42 +0000 (+1000)
|
||||||
|
Subject: drm/i915: fix hibernation since i915 self-reclaim fixes
|
||||||
|
X-Git-Tag: v2.6.35-rc4~13
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=985b823b919273fe1327d56d2196b4f92e5d0fae
|
||||||
|
|
||||||
|
drm/i915: fix hibernation since i915 self-reclaim fixes
|
||||||
|
|
||||||
|
Since commit 4bdadb9785696439c6e2b3efe34aa76df1149c83 ("drm/i915:
|
||||||
|
Selectively enable self-reclaim"), we've been passing GFP_MOVABLE to the
|
||||||
|
i915 page allocator where we weren't before due to some over-eager
|
||||||
|
removal of the page mapping gfp_flags games the code used to play.
|
||||||
|
|
||||||
|
This caused hibernate on Intel hardware to result in a lot of memory
|
||||||
|
corruptions on resume. See for example
|
||||||
|
|
||||||
|
http://bugzilla.kernel.org/show_bug.cgi?id=13811
|
||||||
|
|
||||||
|
Reported-by: Evengi Golov (in bugzilla)
|
||||||
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
||||||
|
Tested-by: M. Vefa Bicakci <bicave@superonline.com>
|
||||||
|
Cc: stable@kernel.org
|
||||||
|
Cc: Chris Wilson <chris@chris-wilson.co.uk>
|
||||||
|
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
|
||||||
|
Cc: Hugh Dickins <hugh.dickins@tiscali.co.uk>
|
||||||
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
index 9ded3da..0743858 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
@@ -2239,7 +2239,7 @@ i915_gem_object_get_pages(struct drm_gem_object *obj,
|
||||||
|
mapping = inode->i_mapping;
|
||||||
|
for (i = 0; i < page_count; i++) {
|
||||||
|
page = read_cache_page_gfp(mapping, i,
|
||||||
|
- mapping_gfp_mask (mapping) |
|
||||||
|
+ GFP_HIGHUSER |
|
||||||
|
__GFP_COLD |
|
||||||
|
gfpmask);
|
||||||
|
if (IS_ERR(page))
|
|
@ -0,0 +1,51 @@
|
||||||
|
drm/i915: Make G4X-style PLL search more permissive
|
||||||
|
|
||||||
|
Fixes an Ironlake laptop with a 68.940MHz 1280x800 panel and 120MHz SSC
|
||||||
|
reference clock.
|
||||||
|
|
||||||
|
More generally, the 0.488% tolerance used before is just too tight to
|
||||||
|
reliably find a PLL setting. I extracted the search algorithm and
|
||||||
|
modified it to find the dot clocks with maximum error over the valid
|
||||||
|
range for the given output type:
|
||||||
|
|
||||||
|
http://people.freedesktop.org/~ajax/intel_g4x_find_best_pll.c
|
||||||
|
|
||||||
|
This gave:
|
||||||
|
|
||||||
|
Worst dotclock for Ironlake DAC refclk is 350000kHz (error 0.00571)
|
||||||
|
Worst dotclock for Ironlake SL-LVDS refclk is 102321kHz (error 0.00524)
|
||||||
|
Worst dotclock for Ironlake DL-LVDS refclk is 219642kHz (error 0.00488)
|
||||||
|
Worst dotclock for Ironlake SL-LVDS SSC refclk is 84374kHz (error 0.00529)
|
||||||
|
Worst dotclock for Ironlake DL-LVDS SSC refclk is 183035kHz (error 0.00488)
|
||||||
|
Worst dotclock for G4X SDVO refclk is 50000kHz (error 0.17332)
|
||||||
|
Worst dotclock for G4X HDMI refclk is 334400kHz (error 0.00478)
|
||||||
|
Worst dotclock for G4X SL-LVDS refclk is 95571kHz (error 0.00449)
|
||||||
|
Worst dotclock for G4X DL-LVDS refclk is 224000kHz (error 0.00510)
|
||||||
|
|
||||||
|
The SDVO number looks a bit suspicious, which I haven't tracked down
|
||||||
|
yet. But it's clear that the old threshold is too tight.
|
||||||
|
|
||||||
|
Signed-off-by: Adam Jackson <ajax at redhat.com>
|
||||||
|
[ RHBZ #572799 ]
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/i915/intel_display.c | 4 ++--
|
||||||
|
1 files changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
|
||||||
|
index a8d65b7..4b17722 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_display.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_display.c
|
||||||
|
@@ -862,8 +862,8 @@ intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
|
||||||
|
intel_clock_t clock;
|
||||||
|
int max_n;
|
||||||
|
bool found;
|
||||||
|
- /* approximately equals target * 0.00488 */
|
||||||
|
- int err_most = (target >> 8) + (target >> 10);
|
||||||
|
+ /* approximately equals target * 0.00585 */
|
||||||
|
+ int err_most = (target >> 8) + (target >> 9);
|
||||||
|
found = false;
|
||||||
|
|
||||||
|
if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
|
||||||
|
--
|
||||||
|
1.7.1
|
||||||
|
|
|
@ -0,0 +1,102 @@
|
||||||
|
upstream commit 944001201ca0196bcdb088129e5866a9f379d08c
|
||||||
|
(plus some defines)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
index 0d05c6f..b87f65d 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_gem.c
|
||||||
|
@@ -4967,6 +4967,16 @@ i915_gem_load(struct drm_device *dev)
|
||||||
|
list_add(&dev_priv->mm.shrink_list, &shrink_list);
|
||||||
|
spin_unlock(&shrink_list_lock);
|
||||||
|
|
||||||
|
+ /* On GEN3 we really need to make sure the ARB C3 LP bit is set */
|
||||||
|
+ if (IS_GEN3(dev)) {
|
||||||
|
+ u32 tmp = I915_READ(MI_ARB_STATE);
|
||||||
|
+ if (!(tmp & MI_ARB_C3_LP_WRITE_ENABLE)) {
|
||||||
|
+ /* arb state is a masked write, so set bit + bit in mask */
|
||||||
|
+ tmp = MI_ARB_C3_LP_WRITE_ENABLE | (MI_ARB_C3_LP_WRITE_ENABLE << MI_ARB_MASK_SHIFT);
|
||||||
|
+ I915_WRITE(MI_ARB_STATE, tmp);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Old X drivers will take 0-2 for front, back, depth buffers */
|
||||||
|
if (!drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
dev_priv->fence_reg_start = 3;
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
|
||||||
|
index 4cbc521..4543975 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_reg.h
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_reg.h
|
||||||
|
@@ -357,6 +357,70 @@
|
||||||
|
#define LM_BURST_LENGTH 0x00000700
|
||||||
|
#define LM_FIFO_WATERMARK 0x0000001F
|
||||||
|
#define MI_ARB_STATE 0x020e4 /* 915+ only */
|
||||||
|
+#define MI_ARB_MASK_SHIFT 16 /* shift for enable bits */
|
||||||
|
+
|
||||||
|
+/* Make render/texture TLB fetches lower priorty than associated data
|
||||||
|
+ * fetches. This is not turned on by default
|
||||||
|
+ */
|
||||||
|
+#define MI_ARB_RENDER_TLB_LOW_PRIORITY (1 << 15)
|
||||||
|
+
|
||||||
|
+/* Isoch request wait on GTT enable (Display A/B/C streams).
|
||||||
|
+ * Make isoch requests stall on the TLB update. May cause
|
||||||
|
+ * display underruns (test mode only)
|
||||||
|
+ */
|
||||||
|
+#define MI_ARB_ISOCH_WAIT_GTT (1 << 14)
|
||||||
|
+
|
||||||
|
+/* Block grant count for isoch requests when block count is
|
||||||
|
+ * set to a finite value.
|
||||||
|
+ */
|
||||||
|
+#define MI_ARB_BLOCK_GRANT_MASK (3 << 12)
|
||||||
|
+#define MI_ARB_BLOCK_GRANT_8 (0 << 12) /* for 3 display planes */
|
||||||
|
+#define MI_ARB_BLOCK_GRANT_4 (1 << 12) /* for 2 display planes */
|
||||||
|
+#define MI_ARB_BLOCK_GRANT_2 (2 << 12) /* for 1 display plane */
|
||||||
|
+#define MI_ARB_BLOCK_GRANT_0 (3 << 12) /* don't use */
|
||||||
|
+
|
||||||
|
+/* Enable render writes to complete in C2/C3/C4 power states.
|
||||||
|
+ * If this isn't enabled, render writes are prevented in low
|
||||||
|
+ * power states. That seems bad to me.
|
||||||
|
+ */
|
||||||
|
+#define MI_ARB_C3_LP_WRITE_ENABLE (1 << 11)
|
||||||
|
+
|
||||||
|
+/* This acknowledges an async flip immediately instead
|
||||||
|
+ * of waiting for 2TLB fetches.
|
||||||
|
+ */
|
||||||
|
+#define MI_ARB_ASYNC_FLIP_ACK_IMMEDIATE (1 << 10)
|
||||||
|
+
|
||||||
|
+/* Enables non-sequential data reads through arbiter
|
||||||
|
+ */
|
||||||
|
+#define MI_ARB_DUAL_DATA_PHASE_DISABLE (1 << 9)
|
||||||
|
+
|
||||||
|
+/* Disable FSB snooping of cacheable write cycles from binner/render
|
||||||
|
+ * command stream
|
||||||
|
+ */
|
||||||
|
+#define MI_ARB_CACHE_SNOOP_DISABLE (1 << 8)
|
||||||
|
+
|
||||||
|
+/* Arbiter time slice for non-isoch streams */
|
||||||
|
+#define MI_ARB_TIME_SLICE_MASK (7 << 5)
|
||||||
|
+#define MI_ARB_TIME_SLICE_1 (0 << 5)
|
||||||
|
+#define MI_ARB_TIME_SLICE_2 (1 << 5)
|
||||||
|
+#define MI_ARB_TIME_SLICE_4 (2 << 5)
|
||||||
|
+#define MI_ARB_TIME_SLICE_6 (3 << 5)
|
||||||
|
+#define MI_ARB_TIME_SLICE_8 (4 << 5)
|
||||||
|
+#define MI_ARB_TIME_SLICE_10 (5 << 5)
|
||||||
|
+#define MI_ARB_TIME_SLICE_14 (6 << 5)
|
||||||
|
+#define MI_ARB_TIME_SLICE_16 (7 << 5)
|
||||||
|
+
|
||||||
|
+/* Low priority grace period page size */
|
||||||
|
+#define MI_ARB_LOW_PRIORITY_GRACE_4KB (0 << 4) /* default */
|
||||||
|
+#define MI_ARB_LOW_PRIORITY_GRACE_8KB (1 << 4)
|
||||||
|
+
|
||||||
|
+/* Disable display A/B trickle feed */
|
||||||
|
+#define MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE (1 << 2)
|
||||||
|
+
|
||||||
|
+/* Set display plane priority */
|
||||||
|
+#define MI_ARB_DISPLAY_PRIORITY_A_B (0 << 0) /* display A > display B */
|
||||||
|
+#define MI_ARB_DISPLAY_PRIORITY_B_A (1 << 0) /* display B > display A */
|
||||||
|
+
|
||||||
|
#define CACHE_MODE_0 0x02120 /* 915+ only */
|
||||||
|
#define CM0_MASK_SHIFT 16
|
||||||
|
#define CM0_IZ_OPT_DISABLE (1<<6)
|
||||||
|
--
|
||||||
|
1.7.1
|
||||||
|
|
|
@ -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,19 @@
|
||||||
|
diff -up linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_display.c.orig linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_display.c
|
||||||
|
--- linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_display.c.orig 2010-03-31 16:59:39.901995671 -0400
|
||||||
|
+++ linux-2.6.33.noarch/drivers/gpu/drm/i915/intel_display.c 2010-03-31 17:01:05.416996744 -0400
|
||||||
|
@@ -3757,7 +3757,6 @@ struct drm_crtc *intel_get_load_detect_p
|
||||||
|
void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder, int dpms_mode)
|
||||||
|
{
|
||||||
|
struct drm_encoder *encoder = &intel_encoder->enc;
|
||||||
|
- struct drm_device *dev = encoder->dev;
|
||||||
|
struct drm_crtc *crtc = encoder->crtc;
|
||||||
|
struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
|
||||||
|
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
|
||||||
|
@@ -3767,7 +3766,6 @@ void intel_release_load_detect_pipe(stru
|
||||||
|
intel_encoder->base.encoder = NULL;
|
||||||
|
intel_encoder->load_detect_temp = false;
|
||||||
|
crtc->enabled = drm_helper_crtc_in_use(crtc);
|
||||||
|
- drm_helper_disable_unused_functions(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Switch crtc and output back off if necessary */
|
|
@ -0,0 +1 @@
|
||||||
|
empty
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,36 @@
|
||||||
|
From 557b452536c9390105539a264d342d963d71b087 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Alex Deucher <alexdeucher@gmail.com>
|
||||||
|
Date: Mon, 21 Jun 2010 12:07:52 -0400
|
||||||
|
Subject: [PATCH] drm/radeon/kms: fix shared ddc handling
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Connectors with a shared ddc line can be connected to different
|
||||||
|
encoders.
|
||||||
|
|
||||||
|
Reported by Pasi Kärkkäinen <pasik@iki.fi> on dri-devel
|
||||||
|
|
||||||
|
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/radeon/radeon_connectors.c | 4 +++-
|
||||||
|
1 files changed, 3 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||||
|
index 0c7ccc6..f58f8bd 100644
|
||||||
|
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||||
|
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||||
|
@@ -785,7 +785,9 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect
|
||||||
|
if (connector == list_connector)
|
||||||
|
continue;
|
||||||
|
list_radeon_connector = to_radeon_connector(list_connector);
|
||||||
|
- if (radeon_connector->devices == list_radeon_connector->devices) {
|
||||||
|
+ if (list_radeon_connector->shared_ddc &&
|
||||||
|
+ (list_radeon_connector->ddc_bus->rec.i2c_id ==
|
||||||
|
+ radeon_connector->ddc_bus->rec.i2c_id)) {
|
||||||
|
if (drm_detect_hdmi_monitor(radeon_connector->edid)) {
|
||||||
|
if (connector->connector_type == DRM_MODE_CONNECTOR_DVID) {
|
||||||
|
kfree(radeon_connector->edid);
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,958 @@
|
||||||
|
From 5b904034b0ab5195d971b139d0c0b67ab21b063c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@dreadnought.i.jkkm.org>
|
||||||
|
Date: Mon, 21 Jun 2010 20:33:16 +0100
|
||||||
|
Subject: Revert "drm/fbdev: rework output polling to be back in the core. (v4)"
|
||||||
|
|
||||||
|
This reverts commit eb1f8e4f3be898df808e2dfc131099f5831d491d.
|
||||||
|
|
||||||
|
Conflicts:
|
||||||
|
|
||||||
|
drivers/gpu/drm/drm_crtc_helper.c
|
||||||
|
drivers/gpu/drm/i915/i915_dma.c
|
||||||
|
drivers/gpu/drm/i915/intel_fb.c
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_fbcon.c
|
||||||
|
drivers/gpu/drm/radeon/radeon_fb.c
|
||||||
|
include/drm/drm_crtc_helper.h
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/Kconfig | 2 +-
|
||||||
|
drivers/gpu/drm/drm_crtc_helper.c | 111 ------------------------
|
||||||
|
drivers/gpu/drm/drm_fb_helper.c | 123 +++++++++++++++++++++++----
|
||||||
|
drivers/gpu/drm/i915/i915_dma.c | 1 -
|
||||||
|
drivers/gpu/drm/i915/i915_irq.c | 3 +-
|
||||||
|
drivers/gpu/drm/i915/intel_crt.c | 5 -
|
||||||
|
drivers/gpu/drm/i915/intel_display.c | 2 -
|
||||||
|
drivers/gpu/drm/i915/intel_dp.c | 2 -
|
||||||
|
drivers/gpu/drm/i915/intel_drv.h | 2 +-
|
||||||
|
drivers/gpu/drm/i915/intel_fb.c | 14 ++--
|
||||||
|
drivers/gpu/drm/i915/intel_hdmi.c | 1 -
|
||||||
|
drivers/gpu/drm/i915/intel_sdvo.c | 2 -
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_connector.c | 12 ---
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_display.c | 1 -
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_fbcon.c | 13 ++-
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_fbcon.h | 2 +-
|
||||||
|
drivers/gpu/drm/nouveau/nouveau_state.c | 5 +-
|
||||||
|
drivers/gpu/drm/nouveau/nv50_display.c | 2 +-
|
||||||
|
drivers/gpu/drm/radeon/radeon_connectors.c | 13 ---
|
||||||
|
drivers/gpu/drm/radeon/radeon_display.c | 10 --
|
||||||
|
drivers/gpu/drm/radeon/radeon_fb.c | 15 +++-
|
||||||
|
drivers/gpu/drm/radeon/radeon_irq_kms.c | 5 +-
|
||||||
|
drivers/gpu/drm/radeon/radeon_mode.h | 3 +-
|
||||||
|
include/drm/drm_crtc.h | 17 ----
|
||||||
|
include/drm/drm_crtc_helper.h | 6 --
|
||||||
|
include/drm/drm_fb_helper.h | 13 +++-
|
||||||
|
26 files changed, 155 insertions(+), 230 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
|
||||||
|
index c2711c6..a51a1e4 100644
|
||||||
|
--- a/drivers/gpu/drm/Kconfig
|
||||||
|
+++ b/drivers/gpu/drm/Kconfig
|
||||||
|
@@ -9,7 +9,6 @@ menuconfig DRM
|
||||||
|
depends on (AGP || AGP=n) && PCI && !EMULATED_CMPXCHG && MMU
|
||||||
|
select I2C
|
||||||
|
select I2C_ALGOBIT
|
||||||
|
- select SLOW_WORK
|
||||||
|
help
|
||||||
|
Kernel-level support for the Direct Rendering Infrastructure (DRI)
|
||||||
|
introduced in XFree86 4.0. If you say Y here, you need to select
|
||||||
|
@@ -24,6 +23,7 @@ config DRM_KMS_HELPER
|
||||||
|
depends on DRM
|
||||||
|
select FB
|
||||||
|
select FRAMEBUFFER_CONSOLE if !EMBEDDED
|
||||||
|
+ select SLOW_WORK
|
||||||
|
help
|
||||||
|
FB and CRTC helpers for KMS drivers.
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
|
||||||
|
index 9b2a541..b142ac2 100644
|
||||||
|
--- a/drivers/gpu/drm/drm_crtc_helper.c
|
||||||
|
+++ b/drivers/gpu/drm/drm_crtc_helper.c
|
||||||
|
@@ -807,114 +807,3 @@ int drm_helper_resume_force_mode(struct drm_device *dev)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_helper_resume_force_mode);
|
||||||
|
-
|
||||||
|
-static struct slow_work_ops output_poll_ops;
|
||||||
|
-
|
||||||
|
-#define DRM_OUTPUT_POLL_PERIOD (10*HZ)
|
||||||
|
-static void output_poll_execute(struct slow_work *work)
|
||||||
|
-{
|
||||||
|
- struct delayed_slow_work *delayed_work = container_of(work, struct delayed_slow_work, work);
|
||||||
|
- struct drm_device *dev = container_of(delayed_work, struct drm_device, mode_config.output_poll_slow_work);
|
||||||
|
- struct drm_connector *connector;
|
||||||
|
- enum drm_connector_status old_status, status;
|
||||||
|
- bool repoll = false, changed = false;
|
||||||
|
- int ret;
|
||||||
|
-
|
||||||
|
- mutex_lock(&dev->mode_config.mutex);
|
||||||
|
- list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||||
|
-
|
||||||
|
- /* if this is HPD or polled don't check it -
|
||||||
|
- TV out for instance */
|
||||||
|
- if (!connector->polled)
|
||||||
|
- continue;
|
||||||
|
-
|
||||||
|
- else if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT))
|
||||||
|
- repoll = true;
|
||||||
|
-
|
||||||
|
- old_status = connector->status;
|
||||||
|
- /* if we are connected and don't want to poll for disconnect
|
||||||
|
- skip it */
|
||||||
|
- if (old_status == connector_status_connected &&
|
||||||
|
- !(connector->polled & DRM_CONNECTOR_POLL_DISCONNECT) &&
|
||||||
|
- !(connector->polled & DRM_CONNECTOR_POLL_HPD))
|
||||||
|
- continue;
|
||||||
|
-
|
||||||
|
- status = connector->funcs->detect(connector);
|
||||||
|
- if (old_status != status)
|
||||||
|
- changed = true;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- mutex_unlock(&dev->mode_config.mutex);
|
||||||
|
-
|
||||||
|
- if (changed) {
|
||||||
|
- /* send a uevent + call fbdev */
|
||||||
|
- drm_sysfs_hotplug_event(dev);
|
||||||
|
- if (dev->mode_config.funcs->output_poll_changed)
|
||||||
|
- dev->mode_config.funcs->output_poll_changed(dev);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (repoll) {
|
||||||
|
- ret = delayed_slow_work_enqueue(delayed_work, DRM_OUTPUT_POLL_PERIOD);
|
||||||
|
- if (ret)
|
||||||
|
- DRM_ERROR("delayed enqueue failed %d\n", ret);
|
||||||
|
- }
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-void drm_kms_helper_poll_disable(struct drm_device *dev)
|
||||||
|
-{
|
||||||
|
- if (!dev->mode_config.poll_enabled)
|
||||||
|
- return;
|
||||||
|
- delayed_slow_work_cancel(&dev->mode_config.output_poll_slow_work);
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(drm_kms_helper_poll_disable);
|
||||||
|
-
|
||||||
|
-void drm_kms_helper_poll_enable(struct drm_device *dev)
|
||||||
|
-{
|
||||||
|
- bool poll = false;
|
||||||
|
- struct drm_connector *connector;
|
||||||
|
- int ret;
|
||||||
|
-
|
||||||
|
- list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||||
|
- if (connector->polled)
|
||||||
|
- poll = true;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (poll) {
|
||||||
|
- ret = delayed_slow_work_enqueue(&dev->mode_config.output_poll_slow_work, DRM_OUTPUT_POLL_PERIOD);
|
||||||
|
- if (ret)
|
||||||
|
- DRM_ERROR("delayed enqueue failed %d\n", ret);
|
||||||
|
- }
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(drm_kms_helper_poll_enable);
|
||||||
|
-
|
||||||
|
-void drm_kms_helper_poll_init(struct drm_device *dev)
|
||||||
|
-{
|
||||||
|
- slow_work_register_user(THIS_MODULE);
|
||||||
|
- delayed_slow_work_init(&dev->mode_config.output_poll_slow_work,
|
||||||
|
- &output_poll_ops);
|
||||||
|
- dev->mode_config.poll_enabled = true;
|
||||||
|
-
|
||||||
|
- drm_kms_helper_poll_enable(dev);
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(drm_kms_helper_poll_init);
|
||||||
|
-
|
||||||
|
-void drm_kms_helper_poll_fini(struct drm_device *dev)
|
||||||
|
-{
|
||||||
|
- drm_kms_helper_poll_disable(dev);
|
||||||
|
- slow_work_unregister_user(THIS_MODULE);
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(drm_kms_helper_poll_fini);
|
||||||
|
-
|
||||||
|
-void drm_helper_hpd_irq_event(struct drm_device *dev)
|
||||||
|
-{
|
||||||
|
- if (!dev->mode_config.poll_enabled)
|
||||||
|
- return;
|
||||||
|
- delayed_slow_work_cancel(&dev->mode_config.output_poll_slow_work);
|
||||||
|
- /* schedule a slow work asap */
|
||||||
|
- delayed_slow_work_enqueue(&dev->mode_config.output_poll_slow_work, 0);
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(drm_helper_hpd_irq_event);
|
||||||
|
-
|
||||||
|
-static struct slow_work_ops output_poll_ops = {
|
||||||
|
- .execute = output_poll_execute,
|
||||||
|
-};
|
||||||
|
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
|
||||||
|
index 08c4c92..dcc6601 100644
|
||||||
|
--- a/drivers/gpu/drm/drm_fb_helper.c
|
||||||
|
+++ b/drivers/gpu/drm/drm_fb_helper.c
|
||||||
|
@@ -42,6 +42,8 @@ MODULE_LICENSE("GPL and additional rights");
|
||||||
|
|
||||||
|
static LIST_HEAD(kernel_fb_helper_list);
|
||||||
|
|
||||||
|
+static struct slow_work_ops output_status_change_ops;
|
||||||
|
+
|
||||||
|
/* simple single crtc case helper function */
|
||||||
|
int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper)
|
||||||
|
{
|
||||||
|
@@ -423,13 +425,19 @@ static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper)
|
||||||
|
|
||||||
|
int drm_fb_helper_init(struct drm_device *dev,
|
||||||
|
struct drm_fb_helper *fb_helper,
|
||||||
|
- int crtc_count, int max_conn_count)
|
||||||
|
+ int crtc_count, int max_conn_count,
|
||||||
|
+ bool polled)
|
||||||
|
{
|
||||||
|
struct drm_crtc *crtc;
|
||||||
|
int ret = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
fb_helper->dev = dev;
|
||||||
|
+ fb_helper->poll_enabled = polled;
|
||||||
|
+
|
||||||
|
+ slow_work_register_user(THIS_MODULE);
|
||||||
|
+ delayed_slow_work_init(&fb_helper->output_status_change_slow_work,
|
||||||
|
+ &output_status_change_ops);
|
||||||
|
|
||||||
|
INIT_LIST_HEAD(&fb_helper->kernel_fb_list);
|
||||||
|
|
||||||
|
@@ -486,6 +494,8 @@ void drm_fb_helper_fini(struct drm_fb_helper *fb_helper)
|
||||||
|
|
||||||
|
drm_fb_helper_crtc_free(fb_helper);
|
||||||
|
|
||||||
|
+ delayed_slow_work_cancel(&fb_helper->output_status_change_slow_work);
|
||||||
|
+ slow_work_unregister_user(THIS_MODULE);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_fb_helper_fini);
|
||||||
|
|
||||||
|
@@ -703,7 +713,7 @@ int drm_fb_helper_set_par(struct fb_info *info)
|
||||||
|
|
||||||
|
if (fb_helper->delayed_hotplug) {
|
||||||
|
fb_helper->delayed_hotplug = false;
|
||||||
|
- drm_fb_helper_hotplug_event(fb_helper);
|
||||||
|
+ delayed_slow_work_enqueue(&fb_helper->output_status_change_slow_work, 0);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -816,7 +826,7 @@ int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper,
|
||||||
|
if (crtc_count == 0 || sizes.fb_width == -1 || sizes.fb_height == -1) {
|
||||||
|
/* hmm everyone went away - assume VGA cable just fell out
|
||||||
|
and will come back later. */
|
||||||
|
- DRM_INFO("Cannot find any crtc or sizes - going 1024x768\n");
|
||||||
|
+ DRM_ERROR("Cannot find any crtc or sizes - going 1024x768\n");
|
||||||
|
sizes.fb_width = sizes.surface_width = 1024;
|
||||||
|
sizes.fb_height = sizes.surface_height = 768;
|
||||||
|
}
|
||||||
|
@@ -1362,7 +1372,12 @@ bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
|
||||||
|
* we shouldn't end up with no modes here.
|
||||||
|
*/
|
||||||
|
if (count == 0) {
|
||||||
|
- printk(KERN_INFO "No connectors reported connected with modes\n");
|
||||||
|
+ if (fb_helper->poll_enabled) {
|
||||||
|
+ delayed_slow_work_enqueue(&fb_helper->output_status_change_slow_work,
|
||||||
|
+ 5*HZ);
|
||||||
|
+ printk(KERN_INFO "No connectors reported connected with modes - started polling\n");
|
||||||
|
+ } else
|
||||||
|
+ printk(KERN_INFO "No connectors reported connected with modes\n");
|
||||||
|
}
|
||||||
|
drm_setup_crtcs(fb_helper);
|
||||||
|
|
||||||
|
@@ -1370,16 +1385,71 @@ bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_fb_helper_initial_config);
|
||||||
|
|
||||||
|
-bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
|
||||||
|
+/* we got a hotplug irq - need to update fbcon */
|
||||||
|
+void drm_helper_fb_hpd_irq_event(struct drm_fb_helper *fb_helper)
|
||||||
|
+{
|
||||||
|
+ /* if we don't have the fbdev registered yet do nothing */
|
||||||
|
+ if (!fb_helper->fbdev)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ /* schedule a slow work asap */
|
||||||
|
+ delayed_slow_work_enqueue(&fb_helper->output_status_change_slow_work, 0);
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL(drm_helper_fb_hpd_irq_event);
|
||||||
|
+
|
||||||
|
+bool drm_helper_fb_hotplug_event(struct drm_fb_helper *fb_helper, bool polled)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
+ int ret;
|
||||||
|
u32 max_width, max_height, bpp_sel;
|
||||||
|
- bool bound = false, crtcs_bound = false;
|
||||||
|
- struct drm_crtc *crtc;
|
||||||
|
|
||||||
|
if (!fb_helper->fb)
|
||||||
|
return false;
|
||||||
|
+ DRM_DEBUG_KMS("\n");
|
||||||
|
+
|
||||||
|
+ max_width = fb_helper->fb->width;
|
||||||
|
+ max_height = fb_helper->fb->height;
|
||||||
|
+ bpp_sel = fb_helper->fb->bits_per_pixel;
|
||||||
|
+
|
||||||
|
+ count = drm_fb_helper_probe_connector_modes(fb_helper, max_width,
|
||||||
|
+ max_height);
|
||||||
|
+ if (fb_helper->poll_enabled && !polled) {
|
||||||
|
+ if (count) {
|
||||||
|
+ delayed_slow_work_cancel(&fb_helper->output_status_change_slow_work);
|
||||||
|
+ } else {
|
||||||
|
+ ret = delayed_slow_work_enqueue(&fb_helper->output_status_change_slow_work, 5*HZ);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ drm_setup_crtcs(fb_helper);
|
||||||
|
+
|
||||||
|
+ return drm_fb_helper_single_fb_probe(fb_helper, bpp_sel);
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL(drm_helper_fb_hotplug_event);
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * delayed work queue execution function
|
||||||
|
+ * - check if fbdev is actually in use on the gpu
|
||||||
|
+ * - if not set delayed flag and repoll if necessary
|
||||||
|
+ * - check for connector status change
|
||||||
|
+ * - repoll if 0 modes found
|
||||||
|
+ *- call driver output status changed notifier
|
||||||
|
+ */
|
||||||
|
+static void output_status_change_execute(struct slow_work *work)
|
||||||
|
+{
|
||||||
|
+ struct delayed_slow_work *delayed_work = container_of(work, struct delayed_slow_work, work);
|
||||||
|
+ struct drm_fb_helper *fb_helper = container_of(delayed_work, struct drm_fb_helper, output_status_change_slow_work);
|
||||||
|
+ struct drm_connector *connector;
|
||||||
|
+ enum drm_connector_status old_status, status;
|
||||||
|
+ bool repoll, changed = false;
|
||||||
|
+ int ret;
|
||||||
|
+ int i;
|
||||||
|
+ bool bound = false, crtcs_bound = false;
|
||||||
|
+ struct drm_crtc *crtc;
|
||||||
|
|
||||||
|
+ repoll = fb_helper->poll_enabled;
|
||||||
|
+
|
||||||
|
+ /* first of all check the fbcon framebuffer is actually bound to any crtc */
|
||||||
|
+ /* take into account that no crtc at all maybe bound */
|
||||||
|
list_for_each_entry(crtc, &fb_helper->dev->mode_config.crtc_list, head) {
|
||||||
|
if (crtc->fb)
|
||||||
|
crtcs_bound = true;
|
||||||
|
@@ -1387,21 +1457,38 @@ bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
|
||||||
|
bound = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!bound && crtcs_bound) {
|
||||||
|
+ if (bound == false && crtcs_bound) {
|
||||||
|
fb_helper->delayed_hotplug = true;
|
||||||
|
- return false;
|
||||||
|
+ goto requeue;
|
||||||
|
}
|
||||||
|
- DRM_DEBUG_KMS("\n");
|
||||||
|
|
||||||
|
- max_width = fb_helper->fb->width;
|
||||||
|
- max_height = fb_helper->fb->height;
|
||||||
|
- bpp_sel = fb_helper->fb->bits_per_pixel;
|
||||||
|
+ for (i = 0; i < fb_helper->connector_count; i++) {
|
||||||
|
+ connector = fb_helper->connector_info[i]->connector;
|
||||||
|
+ old_status = connector->status;
|
||||||
|
+ status = connector->funcs->detect(connector);
|
||||||
|
+ if (old_status != status) {
|
||||||
|
+ changed = true;
|
||||||
|
+ }
|
||||||
|
+ if (status == connector_status_connected && repoll) {
|
||||||
|
+ DRM_DEBUG("%s is connected - stop polling\n", drm_get_connector_name(connector));
|
||||||
|
+ repoll = false;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- count = drm_fb_helper_probe_connector_modes(fb_helper, max_width,
|
||||||
|
- max_height);
|
||||||
|
- drm_setup_crtcs(fb_helper);
|
||||||
|
+ if (changed) {
|
||||||
|
+ if (fb_helper->funcs->fb_output_status_changed)
|
||||||
|
+ fb_helper->funcs->fb_output_status_changed(fb_helper);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- return drm_fb_helper_single_fb_probe(fb_helper, bpp_sel);
|
||||||
|
+requeue:
|
||||||
|
+ if (repoll) {
|
||||||
|
+ ret = delayed_slow_work_enqueue(delayed_work, 5*HZ);
|
||||||
|
+ if (ret)
|
||||||
|
+ DRM_ERROR("delayed enqueue failed %d\n", ret);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
-EXPORT_SYMBOL(drm_fb_helper_hotplug_event);
|
||||||
|
+
|
||||||
|
+static struct slow_work_ops output_status_change_ops = {
|
||||||
|
+ .execute = output_status_change_execute,
|
||||||
|
+};
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
|
||||||
|
index 59a2bf8..76ace2d 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_dma.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_dma.c
|
||||||
|
@@ -1430,7 +1430,6 @@ static int i915_load_modeset_init(struct drm_device *dev,
|
||||||
|
if (ret)
|
||||||
|
goto cleanup_irq;
|
||||||
|
|
||||||
|
- drm_kms_helper_poll_init(dev);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
cleanup_irq:
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
|
||||||
|
index 2479be0..6350bd3 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_irq.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_irq.c
|
||||||
|
@@ -271,7 +271,8 @@ static void i915_hotplug_work_func(struct work_struct *work)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Just fire off a uevent and let userspace tell us what to do */
|
||||||
|
- drm_helper_hpd_irq_event(dev);
|
||||||
|
+ intelfb_hotplug(dev, false);
|
||||||
|
+ drm_sysfs_hotplug_event(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void i915_handle_rps_change(struct drm_device *dev)
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
|
||||||
|
index 22ff384..125eded 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_crt.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_crt.c
|
||||||
|
@@ -584,10 +584,5 @@ void intel_crt_init(struct drm_device *dev)
|
||||||
|
|
||||||
|
drm_sysfs_connector_add(connector);
|
||||||
|
|
||||||
|
- if (I915_HAS_HOTPLUG(dev))
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||||
|
- else
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
-
|
||||||
|
dev_priv->hotplug_supported_mask |= CRT_HOTPLUG_INT_STATUS;
|
||||||
|
}
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
|
||||||
|
index d753257..70537cf 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_display.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_display.c
|
||||||
|
@@ -5036,7 +5036,6 @@ intel_user_framebuffer_create(struct drm_device *dev,
|
||||||
|
|
||||||
|
static const struct drm_mode_config_funcs intel_mode_funcs = {
|
||||||
|
.fb_create = intel_user_framebuffer_create,
|
||||||
|
- .output_poll_changed = intel_fb_output_poll_changed,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct drm_gem_object *
|
||||||
|
@@ -5538,7 +5537,6 @@ void intel_modeset_cleanup(struct drm_device *dev)
|
||||||
|
|
||||||
|
mutex_lock(&dev->struct_mutex);
|
||||||
|
|
||||||
|
- drm_kms_helper_poll_fini(dev);
|
||||||
|
intel_fbdev_fini(dev);
|
||||||
|
|
||||||
|
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
|
||||||
|
index 49b54f0..1815df5 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_dp.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_dp.c
|
||||||
|
@@ -1393,8 +1393,6 @@ intel_dp_init(struct drm_device *dev, int output_reg)
|
||||||
|
DRM_MODE_CONNECTOR_DisplayPort);
|
||||||
|
drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs);
|
||||||
|
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||||
|
-
|
||||||
|
if (output_reg == DP_A)
|
||||||
|
intel_encoder->type = INTEL_OUTPUT_EDP;
|
||||||
|
else
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
|
||||||
|
index df931f7..3230e8d 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_drv.h
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_drv.h
|
||||||
|
@@ -235,5 +235,5 @@ extern int intel_overlay_put_image(struct drm_device *dev, void *data,
|
||||||
|
extern int intel_overlay_attrs(struct drm_device *dev, void *data,
|
||||||
|
struct drm_file *file_priv);
|
||||||
|
|
||||||
|
-extern void intel_fb_output_poll_changed(struct drm_device *dev);
|
||||||
|
+void intelfb_hotplug(struct drm_device *dev, bool polled);
|
||||||
|
#endif /* __INTEL_DRV_H__ */
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c
|
||||||
|
index c3c5052..79098b3 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_fb.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_fb.c
|
||||||
|
@@ -211,6 +211,12 @@ static int intel_fb_find_or_create_single(struct drm_fb_helper *helper,
|
||||||
|
return new_fb;
|
||||||
|
}
|
||||||
|
|
||||||
|
+void intelfb_hotplug(struct drm_device *dev, bool polled)
|
||||||
|
+{
|
||||||
|
+ drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
|
+ drm_helper_fb_hpd_irq_event(&dev_priv->fbdev->helper);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static struct drm_fb_helper_funcs intel_fb_helper_funcs = {
|
||||||
|
.gamma_set = intel_crtc_fb_gamma_set,
|
||||||
|
.gamma_get = intel_crtc_fb_gamma_get,
|
||||||
|
@@ -256,7 +262,7 @@ int intel_fbdev_init(struct drm_device *dev)
|
||||||
|
|
||||||
|
ret = drm_fb_helper_init(dev, &ifbdev->helper,
|
||||||
|
dev_priv->num_pipe,
|
||||||
|
- INTELFB_CONN_LIMIT);
|
||||||
|
+ INTELFB_CONN_LIMIT, false);
|
||||||
|
if (ret) {
|
||||||
|
kfree(ifbdev);
|
||||||
|
return ret;
|
||||||
|
@@ -278,9 +284,3 @@ void intel_fbdev_fini(struct drm_device *dev)
|
||||||
|
dev_priv->fbdev = NULL;
|
||||||
|
}
|
||||||
|
MODULE_LICENSE("GPL and additional rights");
|
||||||
|
-
|
||||||
|
-void intel_fb_output_poll_changed(struct drm_device *dev)
|
||||||
|
-{
|
||||||
|
- drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
|
- drm_fb_helper_hotplug_event(&dev_priv->fbdev->helper);
|
||||||
|
-}
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
|
||||||
|
index 83bd764..acaca07 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_hdmi.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
|
||||||
|
@@ -240,7 +240,6 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
|
||||||
|
|
||||||
|
intel_encoder->type = INTEL_OUTPUT_HDMI;
|
||||||
|
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||||
|
connector->interlace_allowed = 0;
|
||||||
|
connector->doublescan_allowed = 0;
|
||||||
|
intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
|
||||||
|
index 76993ac..1c716b5 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_sdvo.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
|
||||||
|
@@ -2218,7 +2218,6 @@ intel_sdvo_dvi_init(struct intel_encoder *intel_encoder, int device)
|
||||||
|
}
|
||||||
|
|
||||||
|
connector = &intel_connector->base;
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT;
|
||||||
|
encoder->encoder_type = DRM_MODE_ENCODER_TMDS;
|
||||||
|
connector->connector_type = DRM_MODE_CONNECTOR_DVID;
|
||||||
|
|
||||||
|
@@ -2285,7 +2284,6 @@ intel_sdvo_analog_init(struct intel_encoder *intel_encoder, int device)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
connector = &intel_connector->base;
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
encoder->encoder_type = DRM_MODE_ENCODER_DAC;
|
||||||
|
connector->connector_type = DRM_MODE_CONNECTOR_VGA;
|
||||||
|
sdvo_connector = intel_connector->dev_priv;
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
|
||||||
|
index 149ed22..9a61f3c 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
|
||||||
|
@@ -846,7 +846,6 @@ nouveau_connector_create(struct drm_device *dev,
|
||||||
|
|
||||||
|
switch (dcb->type) {
|
||||||
|
case DCB_CONNECTOR_VGA:
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
if (dev_priv->card_type >= NV_50) {
|
||||||
|
drm_connector_attach_property(connector,
|
||||||
|
dev->mode_config.scaling_mode_property,
|
||||||
|
@@ -858,17 +857,6 @@ nouveau_connector_create(struct drm_device *dev,
|
||||||
|
case DCB_CONNECTOR_TV_3:
|
||||||
|
nv_connector->scaling_mode = DRM_MODE_SCALE_NONE;
|
||||||
|
break;
|
||||||
|
- case DCB_CONNECTOR_DP:
|
||||||
|
- case DCB_CONNECTOR_eDP:
|
||||||
|
- case DCB_CONNECTOR_HDMI_0:
|
||||||
|
- case DCB_CONNECTOR_HDMI_1:
|
||||||
|
- case DCB_CONNECTOR_DVI_I:
|
||||||
|
- case DCB_CONNECTOR_DVI_D:
|
||||||
|
- if (dev_priv->card_type >= NV_50)
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||||
|
- else
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
- /* fall-through */
|
||||||
|
default:
|
||||||
|
nv_connector->scaling_mode = DRM_MODE_SCALE_FULLSCREEN;
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
|
||||||
|
index 74e6b4e..9d7928f 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_display.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
|
||||||
|
@@ -101,6 +101,5 @@ nouveau_user_framebuffer_create(struct drm_device *dev,
|
||||||
|
|
||||||
|
const struct drm_mode_config_funcs nouveau_mode_config_funcs = {
|
||||||
|
.fb_create = nouveau_user_framebuffer_create,
|
||||||
|
- .output_poll_changed = nouveau_fbcon_output_poll_changed,
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
|
||||||
|
index c9a4a0d..0a59f96 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
|
||||||
|
@@ -326,11 +326,15 @@ nouveau_fbcon_find_or_create_single(struct drm_fb_helper *helper,
|
||||||
|
return new_fb;
|
||||||
|
}
|
||||||
|
|
||||||
|
-void
|
||||||
|
-nouveau_fbcon_output_poll_changed(struct drm_device *dev)
|
||||||
|
+void nouveau_fbcon_hotplug(struct drm_device *dev)
|
||||||
|
{
|
||||||
|
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||||
|
- drm_fb_helper_hotplug_event(&dev_priv->nfbdev->helper);
|
||||||
|
+ drm_helper_fb_hpd_irq_event(&dev_priv->nfbdev->helper);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void nouveau_fbcon_output_status_changed(struct drm_fb_helper *fb_helper)
|
||||||
|
+{
|
||||||
|
+ drm_helper_fb_hotplug_event(fb_helper, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
@@ -370,6 +374,7 @@ static struct drm_fb_helper_funcs nouveau_fbcon_helper_funcs = {
|
||||||
|
.gamma_set = nouveau_fbcon_gamma_set,
|
||||||
|
.gamma_get = nouveau_fbcon_gamma_get,
|
||||||
|
.fb_probe = nouveau_fbcon_find_or_create_single,
|
||||||
|
+ .fb_output_status_changed = nouveau_fbcon_output_status_changed,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -387,7 +392,7 @@ int nouveau_fbcon_init(struct drm_device *dev)
|
||||||
|
dev_priv->nfbdev = nfbdev;
|
||||||
|
nfbdev->helper.funcs = &nouveau_fbcon_helper_funcs;
|
||||||
|
|
||||||
|
- ret = drm_fb_helper_init(dev, &nfbdev->helper, 2, 4);
|
||||||
|
+ ret = drm_fb_helper_init(dev, &nfbdev->helper, 2, 4, true);
|
||||||
|
if (ret) {
|
||||||
|
kfree(nfbdev);
|
||||||
|
return ret;
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.h b/drivers/gpu/drm/nouveau/nouveau_fbcon.h
|
||||||
|
index e7e1268..bf8e00d 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_fbcon.h
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.h
|
||||||
|
@@ -58,6 +58,6 @@ void nouveau_fbcon_zfill_all(struct drm_device *dev);
|
||||||
|
void nouveau_fbcon_save_disable_accel(struct drm_device *dev);
|
||||||
|
void nouveau_fbcon_restore_accel(struct drm_device *dev);
|
||||||
|
|
||||||
|
-void nouveau_fbcon_output_poll_changed(struct drm_device *dev);
|
||||||
|
+void nouveau_fbcon_hotplug(struct drm_device *dev);
|
||||||
|
#endif /* __NV50_FBCON_H__ */
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
|
||||||
|
index b02a231..4dcb976 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nouveau_state.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
|
||||||
|
@@ -519,10 +519,8 @@ nouveau_card_init(struct drm_device *dev)
|
||||||
|
|
||||||
|
dev_priv->init_state = NOUVEAU_CARD_INIT_DONE;
|
||||||
|
|
||||||
|
- if (drm_core_check_feature(dev, DRIVER_MODESET)) {
|
||||||
|
+ if (drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
nouveau_fbcon_init(dev);
|
||||||
|
- drm_kms_helper_poll_init(dev);
|
||||||
|
- }
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
@@ -844,7 +842,6 @@ int nouveau_unload(struct drm_device *dev)
|
||||||
|
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||||
|
|
||||||
|
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
|
||||||
|
- drm_kms_helper_poll_fini(dev);
|
||||||
|
nouveau_fbcon_fini(dev);
|
||||||
|
if (dev_priv->card_type >= NV_50)
|
||||||
|
nv50_display_destroy(dev);
|
||||||
|
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c
|
||||||
|
index 580a5d1..e6a44af 100644
|
||||||
|
--- a/drivers/gpu/drm/nouveau/nv50_display.c
|
||||||
|
+++ b/drivers/gpu/drm/nouveau/nv50_display.c
|
||||||
|
@@ -980,7 +980,7 @@ nv50_display_irq_hotplug_bh(struct work_struct *work)
|
||||||
|
if (dev_priv->chipset >= 0x90)
|
||||||
|
nv_wr32(dev, 0xe074, nv_rd32(dev, 0xe074));
|
||||||
|
|
||||||
|
- drm_helper_hpd_irq_event(dev);
|
||||||
|
+ nouveau_fbcon_hotplug(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||||
|
index 0c7ccc6..40a24c9 100644
|
||||||
|
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||||
|
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||||
|
@@ -1085,7 +1085,6 @@ radeon_add_atom_connector(struct drm_device *dev,
|
||||||
|
drm_connector_attach_property(&radeon_connector->base,
|
||||||
|
rdev->mode_info.load_detect_property,
|
||||||
|
1);
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
break;
|
||||||
|
case DRM_MODE_CONNECTOR_DVIA:
|
||||||
|
drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
|
||||||
|
@@ -1212,12 +1211,6 @@ radeon_add_atom_connector(struct drm_device *dev,
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (hpd->hpd == RADEON_HPD_NONE) {
|
||||||
|
- if (i2c_bus->valid)
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
- } else
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||||
|
-
|
||||||
|
connector->display_info.subpixel_order = subpixel_order;
|
||||||
|
drm_sysfs_connector_add(connector);
|
||||||
|
return;
|
||||||
|
@@ -1279,7 +1272,6 @@ radeon_add_legacy_connector(struct drm_device *dev,
|
||||||
|
drm_connector_attach_property(&radeon_connector->base,
|
||||||
|
rdev->mode_info.load_detect_property,
|
||||||
|
1);
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
break;
|
||||||
|
case DRM_MODE_CONNECTOR_DVIA:
|
||||||
|
drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
|
||||||
|
@@ -1348,11 +1340,6 @@ radeon_add_legacy_connector(struct drm_device *dev,
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (hpd->hpd == RADEON_HPD_NONE) {
|
||||||
|
- if (i2c_bus->valid)
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||||
|
- } else
|
||||||
|
- connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||||
|
connector->display_info.subpixel_order = subpixel_order;
|
||||||
|
drm_sysfs_connector_add(connector);
|
||||||
|
return;
|
||||||
|
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
|
||||||
|
index c73444a..ed756be 100644
|
||||||
|
--- a/drivers/gpu/drm/radeon/radeon_display.c
|
||||||
|
+++ b/drivers/gpu/drm/radeon/radeon_display.c
|
||||||
|
@@ -887,15 +887,8 @@ radeon_user_framebuffer_create(struct drm_device *dev,
|
||||||
|
return &radeon_fb->base;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void radeon_output_poll_changed(struct drm_device *dev)
|
||||||
|
-{
|
||||||
|
- struct radeon_device *rdev = dev->dev_private;
|
||||||
|
- radeon_fb_output_poll_changed(rdev);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static const struct drm_mode_config_funcs radeon_mode_funcs = {
|
||||||
|
.fb_create = radeon_user_framebuffer_create,
|
||||||
|
- .output_poll_changed = radeon_output_poll_changed
|
||||||
|
};
|
||||||
|
|
||||||
|
struct drm_prop_enum_list {
|
||||||
|
@@ -1044,8 +1037,6 @@ int radeon_modeset_init(struct radeon_device *rdev)
|
||||||
|
radeon_pm_init(rdev);
|
||||||
|
|
||||||
|
radeon_fbdev_init(rdev);
|
||||||
|
- drm_kms_helper_poll_init(rdev->ddev);
|
||||||
|
-
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1058,7 +1049,6 @@ void radeon_modeset_fini(struct radeon_device *rdev)
|
||||||
|
radeon_pm_fini(rdev);
|
||||||
|
|
||||||
|
if (rdev->mode_info.mode_config_initialized) {
|
||||||
|
- drm_kms_helper_poll_fini(rdev->ddev);
|
||||||
|
radeon_hpd_fini(rdev);
|
||||||
|
drm_mode_config_cleanup(rdev->ddev);
|
||||||
|
rdev->mode_info.mode_config_initialized = false;
|
||||||
|
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c
|
||||||
|
index dc1634b..7dc38f6 100644
|
||||||
|
--- a/drivers/gpu/drm/radeon/radeon_fb.c
|
||||||
|
+++ b/drivers/gpu/drm/radeon/radeon_fb.c
|
||||||
|
@@ -316,9 +316,16 @@ int radeon_parse_options(char *options)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-void radeon_fb_output_poll_changed(struct radeon_device *rdev)
|
||||||
|
+void radeonfb_hotplug(struct drm_device *dev, bool polled)
|
||||||
|
{
|
||||||
|
- drm_fb_helper_hotplug_event(&rdev->mode_info.rfbdev->helper);
|
||||||
|
+ struct radeon_device *rdev = dev->dev_private;
|
||||||
|
+
|
||||||
|
+ drm_helper_fb_hpd_irq_event(&rdev->mode_info.rfbdev->helper);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void radeon_fb_output_status_changed(struct drm_fb_helper *fb_helper)
|
||||||
|
+{
|
||||||
|
+ drm_helper_fb_hotplug_event(fb_helper, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int radeon_fbdev_destroy(struct drm_device *dev, struct radeon_fbdev *rfbdev)
|
||||||
|
@@ -357,6 +364,7 @@ static struct drm_fb_helper_funcs radeon_fb_helper_funcs = {
|
||||||
|
.gamma_set = radeon_crtc_fb_gamma_set,
|
||||||
|
.gamma_get = radeon_crtc_fb_gamma_get,
|
||||||
|
.fb_probe = radeon_fb_find_or_create_single,
|
||||||
|
+ .fb_output_status_changed = radeon_fb_output_status_changed,
|
||||||
|
};
|
||||||
|
|
||||||
|
int radeon_fbdev_init(struct radeon_device *rdev)
|
||||||
|
@@ -379,7 +387,7 @@ int radeon_fbdev_init(struct radeon_device *rdev)
|
||||||
|
|
||||||
|
ret = drm_fb_helper_init(rdev->ddev, &rfbdev->helper,
|
||||||
|
rdev->num_crtc,
|
||||||
|
- RADEONFB_CONN_LIMIT);
|
||||||
|
+ RADEONFB_CONN_LIMIT, true);
|
||||||
|
if (ret) {
|
||||||
|
kfree(rfbdev);
|
||||||
|
return ret;
|
||||||
|
@@ -388,6 +396,7 @@ int radeon_fbdev_init(struct radeon_device *rdev)
|
||||||
|
drm_fb_helper_single_add_all_connectors(&rfbdev->helper);
|
||||||
|
drm_fb_helper_initial_config(&rfbdev->helper, bpp_sel);
|
||||||
|
return 0;
|
||||||
|
+
|
||||||
|
}
|
||||||
|
|
||||||
|
void radeon_fbdev_fini(struct radeon_device *rdev)
|
||||||
|
diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c
|
||||||
|
index 059bfa4..b0178de 100644
|
||||||
|
--- a/drivers/gpu/drm/radeon/radeon_irq_kms.c
|
||||||
|
+++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c
|
||||||
|
@@ -26,7 +26,6 @@
|
||||||
|
* Jerome Glisse
|
||||||
|
*/
|
||||||
|
#include "drmP.h"
|
||||||
|
-#include "drm_crtc_helper.h"
|
||||||
|
#include "radeon_drm.h"
|
||||||
|
#include "radeon_reg.h"
|
||||||
|
#include "radeon.h"
|
||||||
|
@@ -56,7 +55,9 @@ static void radeon_hotplug_work_func(struct work_struct *work)
|
||||||
|
radeon_connector_hotplug(connector);
|
||||||
|
}
|
||||||
|
/* Just fire off a uevent and let userspace tell us what to do */
|
||||||
|
- drm_helper_hpd_irq_event(dev);
|
||||||
|
+ radeonfb_hotplug(dev, false);
|
||||||
|
+
|
||||||
|
+ drm_sysfs_hotplug_event(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void radeon_driver_irq_preinstall_kms(struct drm_device *dev)
|
||||||
|
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
|
||||||
|
index 67358ba..fdd1611 100644
|
||||||
|
--- a/drivers/gpu/drm/radeon/radeon_mode.h
|
||||||
|
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
|
||||||
|
@@ -588,6 +588,5 @@ void radeon_fbdev_fini(struct radeon_device *rdev);
|
||||||
|
void radeon_fbdev_set_suspend(struct radeon_device *rdev, int state);
|
||||||
|
int radeon_fbdev_total_size(struct radeon_device *rdev);
|
||||||
|
bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj);
|
||||||
|
-
|
||||||
|
-void radeon_fb_output_poll_changed(struct radeon_device *rdev);
|
||||||
|
+void radeonfb_hotplug(struct drm_device *dev, bool polled);
|
||||||
|
#endif
|
||||||
|
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
|
||||||
|
index 93a1a31..a7148d2 100644
|
||||||
|
--- a/include/drm/drm_crtc.h
|
||||||
|
+++ b/include/drm/drm_crtc.h
|
||||||
|
@@ -31,7 +31,6 @@
|
||||||
|
#include <linux/idr.h>
|
||||||
|
|
||||||
|
#include <linux/fb.h>
|
||||||
|
-#include <linux/slow-work.h>
|
||||||
|
|
||||||
|
struct drm_device;
|
||||||
|
struct drm_mode_set;
|
||||||
|
@@ -461,15 +460,6 @@ enum drm_connector_force {
|
||||||
|
DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */
|
||||||
|
};
|
||||||
|
|
||||||
|
-/* should we poll this connector for connects and disconnects */
|
||||||
|
-/* hot plug detectable */
|
||||||
|
-#define DRM_CONNECTOR_POLL_HPD (1 << 0)
|
||||||
|
-/* poll for connections */
|
||||||
|
-#define DRM_CONNECTOR_POLL_CONNECT (1 << 1)
|
||||||
|
-/* can cleanly poll for disconnections without flickering the screen */
|
||||||
|
-/* DACs should rarely do this without a lot of testing */
|
||||||
|
-#define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2)
|
||||||
|
-
|
||||||
|
/**
|
||||||
|
* drm_connector - central DRM connector control structure
|
||||||
|
* @crtc: CRTC this connector is currently connected to, NULL if none
|
||||||
|
@@ -514,8 +504,6 @@ struct drm_connector {
|
||||||
|
u32 property_ids[DRM_CONNECTOR_MAX_PROPERTY];
|
||||||
|
uint64_t property_values[DRM_CONNECTOR_MAX_PROPERTY];
|
||||||
|
|
||||||
|
- uint8_t polled; /* DRM_CONNECTOR_POLL_* */
|
||||||
|
-
|
||||||
|
/* requested DPMS state */
|
||||||
|
int dpms;
|
||||||
|
|
||||||
|
@@ -555,7 +543,6 @@ struct drm_mode_set {
|
||||||
|
*/
|
||||||
|
struct drm_mode_config_funcs {
|
||||||
|
struct drm_framebuffer *(*fb_create)(struct drm_device *dev, struct drm_file *file_priv, struct drm_mode_fb_cmd *mode_cmd);
|
||||||
|
- void (*output_poll_changed)(struct drm_device *dev);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct drm_mode_group {
|
||||||
|
@@ -593,10 +580,6 @@ struct drm_mode_config {
|
||||||
|
struct drm_mode_config_funcs *funcs;
|
||||||
|
resource_size_t fb_base;
|
||||||
|
|
||||||
|
- /* output poll support */
|
||||||
|
- bool poll_enabled;
|
||||||
|
- struct delayed_slow_work output_poll_slow_work;
|
||||||
|
-
|
||||||
|
/* pointers to standard properties */
|
||||||
|
struct list_head property_blob_list;
|
||||||
|
struct drm_property *edid_property;
|
||||||
|
diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h
|
||||||
|
index 1121f77..b1fa0f8 100644
|
||||||
|
--- a/include/drm/drm_crtc_helper.h
|
||||||
|
+++ b/include/drm/drm_crtc_helper.h
|
||||||
|
@@ -127,10 +127,4 @@ static inline void drm_connector_helper_add(struct drm_connector *connector,
|
||||||
|
}
|
||||||
|
|
||||||
|
extern int drm_helper_resume_force_mode(struct drm_device *dev);
|
||||||
|
-extern void drm_kms_helper_poll_init(struct drm_device *dev);
|
||||||
|
-extern void drm_kms_helper_poll_fini(struct drm_device *dev);
|
||||||
|
-extern void drm_helper_hpd_irq_event(struct drm_device *dev);
|
||||||
|
-
|
||||||
|
-extern void drm_kms_helper_poll_disable(struct drm_device *dev);
|
||||||
|
-extern void drm_kms_helper_poll_enable(struct drm_device *dev);
|
||||||
|
#endif
|
||||||
|
diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
|
||||||
|
index f0a6afc..9b55a94 100644
|
||||||
|
--- a/include/drm/drm_fb_helper.h
|
||||||
|
+++ b/include/drm/drm_fb_helper.h
|
||||||
|
@@ -30,6 +30,8 @@
|
||||||
|
#ifndef DRM_FB_HELPER_H
|
||||||
|
#define DRM_FB_HELPER_H
|
||||||
|
|
||||||
|
+#include <linux/slow-work.h>
|
||||||
|
+
|
||||||
|
struct drm_fb_helper;
|
||||||
|
|
||||||
|
struct drm_fb_helper_crtc {
|
||||||
|
@@ -69,6 +71,9 @@ struct drm_fb_helper_funcs {
|
||||||
|
|
||||||
|
int (*fb_probe)(struct drm_fb_helper *helper,
|
||||||
|
struct drm_fb_helper_surface_size *sizes);
|
||||||
|
+
|
||||||
|
+ void (*fb_output_status_changed)(struct drm_fb_helper *helper);
|
||||||
|
+
|
||||||
|
};
|
||||||
|
|
||||||
|
struct drm_fb_helper_connector {
|
||||||
|
@@ -90,6 +95,8 @@ struct drm_fb_helper {
|
||||||
|
u32 pseudo_palette[17];
|
||||||
|
struct list_head kernel_fb_list;
|
||||||
|
|
||||||
|
+ struct delayed_slow_work output_status_change_slow_work;
|
||||||
|
+ bool poll_enabled;
|
||||||
|
/* we got a hotplug but fbdev wasn't running the console
|
||||||
|
delay until next set_par */
|
||||||
|
bool delayed_hotplug;
|
||||||
|
@@ -100,7 +107,7 @@ int drm_fb_helper_single_fb_probe(struct drm_fb_helper *helper,
|
||||||
|
|
||||||
|
int drm_fb_helper_init(struct drm_device *dev,
|
||||||
|
struct drm_fb_helper *helper, int crtc_count,
|
||||||
|
- int max_conn);
|
||||||
|
+ int max_conn, bool polled);
|
||||||
|
void drm_fb_helper_fini(struct drm_fb_helper *helper);
|
||||||
|
int drm_fb_helper_blank(int blank, struct fb_info *info);
|
||||||
|
int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
|
||||||
|
@@ -123,8 +130,10 @@ void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
|
||||||
|
|
||||||
|
int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info);
|
||||||
|
|
||||||
|
-bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper);
|
||||||
|
+bool drm_helper_fb_hotplug_event(struct drm_fb_helper *fb_helper,
|
||||||
|
+ bool polled);
|
||||||
|
bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel);
|
||||||
|
int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper);
|
||||||
|
|
||||||
|
+void drm_helper_fb_hpd_irq_event(struct drm_fb_helper *fb_helper);
|
||||||
|
#endif
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
From: Ben Hutchings <bhutchings@solarflare.com>
|
||||||
|
Date: Mon, 28 Jun 2010 08:44:07 +0000 (+0000)
|
||||||
|
Subject: ethtool: Fix potential kernel buffer overflow in ETHTOOL_GRXCLSRLALL
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdavem%2Fnet-2.6.git;a=commitdiff_plain;h=db048b69037e7fa6a7d9e95a1271a50dc08ae233
|
||||||
|
|
||||||
|
ethtool: Fix potential kernel buffer overflow in ETHTOOL_GRXCLSRLALL
|
||||||
|
|
||||||
|
On a 32-bit machine, info.rule_cnt >= 0x40000000 leads to integer
|
||||||
|
overflow and the buffer may be smaller than needed. Since
|
||||||
|
ETHTOOL_GRXCLSRLALL is unprivileged, this can presumably be used for at
|
||||||
|
least denial of service.
|
||||||
|
|
||||||
|
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
|
||||||
|
Cc: stable@kernel.org
|
||||||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
|
||||||
|
index a0f4964..a3a7e9a 100644
|
||||||
|
--- a/net/core/ethtool.c
|
||||||
|
+++ b/net/core/ethtool.c
|
||||||
|
@@ -347,8 +347,9 @@ static noinline_for_stack int ethtool_get_rxnfc(struct net_device *dev,
|
||||||
|
|
||||||
|
if (info.cmd == ETHTOOL_GRXCLSRLALL) {
|
||||||
|
if (info.rule_cnt > 0) {
|
||||||
|
- rule_buf = kmalloc(info.rule_cnt * sizeof(u32),
|
||||||
|
- GFP_USER);
|
||||||
|
+ if (info.rule_cnt <= KMALLOC_MAX_SIZE / sizeof(u32))
|
||||||
|
+ rule_buf = kmalloc(info.rule_cnt * sizeof(u32),
|
||||||
|
+ GFP_USER);
|
||||||
|
if (!rule_buf)
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
#
|
||||||
|
# find-provides: munge the provides dependencies from the kabideps file
|
||||||
|
#
|
||||||
|
# This software may be freely redistributed under the terms of the GNU
|
||||||
|
# General Public License (GPL).
|
||||||
|
#
|
||||||
|
# Takes a directory prefix, then outputs the kabideps file contents.
|
||||||
|
|
||||||
|
__author__ = "Jon Masters <jcm@redhat.com>"
|
||||||
|
__version__ = "1.0"
|
||||||
|
__date__ = "Tue 25 Jul 2006 04:00 GMT"
|
||||||
|
__copyright__ = "Copyright (C) 2006 Red Hat, Inc"
|
||||||
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import string
|
||||||
|
import sys
|
||||||
|
|
||||||
|
false = 0
|
||||||
|
true = 1
|
||||||
|
|
||||||
|
kabideps=""
|
||||||
|
|
||||||
|
p = re.compile('^(.*)/symvers-(.*).gz$')
|
||||||
|
while true:
|
||||||
|
foo = sys.stdin.readline()
|
||||||
|
if foo == "":
|
||||||
|
break
|
||||||
|
string.split(foo)
|
||||||
|
m = p.match(foo)
|
||||||
|
if m:
|
||||||
|
kabideps=sys.argv[1] + "/kernel-" + m.group(2) + "-kabideps"
|
||||||
|
|
||||||
|
if kabideps == "":
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
if not (os.path.isfile(kabideps)):
|
||||||
|
sys.stderr.write(sys.argv[0] + ": cannot locate kabideps file: " + kabideps + "\n")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
sys.stderr.write(sys.argv[0] + ": processing kABI: " + kabideps)
|
||||||
|
os.system("cat " + kabideps)
|
|
@ -0,0 +1,34 @@
|
||||||
|
|
||||||
|
Legacy hypervisors (RHEL 5.0 and RHEL 5.1) do not handle guest writes to
|
||||||
|
cr4 gracefully. If a guest attempts to write a bit of cr4 that is
|
||||||
|
unsupported, then the HV is so offended it crashes the domain. While
|
||||||
|
later guest kernels (such as RHEL6) don't assume the HV supports all
|
||||||
|
features, they do expect nicer responses. That assumption introduced
|
||||||
|
code that probes whether or not xsave is supported early in the boot. So
|
||||||
|
now when attempting to boot a RHEL6 guest on RHEL5.0 or RHEL5.1 an early
|
||||||
|
crash will occur.
|
||||||
|
|
||||||
|
This patch is quite obviously an undesirable hack. The real fix for this
|
||||||
|
problem should be in the HV, and is, in later HVs. However, to support
|
||||||
|
running on old HVs, RHEL6 can take this small change. No impact will
|
||||||
|
occur for running on any RHEL HV (not even RHEL 5.5 supports xsave).
|
||||||
|
There is only potential for guest performance loss on upstream Xen.
|
||||||
|
|
||||||
|
---
|
||||||
|
arch/x86/xen/enlighten.c | 1 +
|
||||||
|
1 files changed, 1 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
|
||||||
|
index 52f8e19..6db3d67 100644
|
||||||
|
--- a/arch/x86/xen/enlighten.c
|
||||||
|
+++ b/arch/x86/xen/enlighten.c
|
||||||
|
@@ -802,6 +802,7 @@ static void xen_write_cr4(unsigned long cr4)
|
||||||
|
{
|
||||||
|
cr4 &= ~X86_CR4_PGE;
|
||||||
|
cr4 &= ~X86_CR4_PSE;
|
||||||
|
+ cr4 &= ~X86_CR4_OSXSAVE;
|
||||||
|
|
||||||
|
native_write_cr4(cr4);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.6.6.1
|
|
@ -0,0 +1,7 @@
|
||||||
|
%pubring kernel.pub
|
||||||
|
%secring kernel.sec
|
||||||
|
Key-Type: DSA
|
||||||
|
Key-Length: 512
|
||||||
|
Name-Real: Red Hat, Inc.
|
||||||
|
Name-Comment: Kernel Module GPG key
|
||||||
|
%commit
|
|
@ -0,0 +1,47 @@
|
||||||
|
From c69fcbd1f60b0842f7c1ad2c95692ffd19c4932b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Mon, 29 Mar 2010 23:56:08 -0400
|
||||||
|
Subject: hda_intel-prealloc-4mb-dmabuffer
|
||||||
|
|
||||||
|
---
|
||||||
|
sound/pci/hda/hda_intel.c | 14 +++++++++++++-
|
||||||
|
1 files changed, 13 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
|
||||||
|
index 4bb9067..37db515 100644
|
||||||
|
--- a/sound/pci/hda/hda_intel.c
|
||||||
|
+++ b/sound/pci/hda/hda_intel.c
|
||||||
|
@@ -1986,6 +1986,7 @@ azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
|
||||||
|
struct azx_pcm *apcm;
|
||||||
|
int pcm_dev = cpcm->device;
|
||||||
|
int s, err;
|
||||||
|
+ size_t prealloc_min = 64*1024; /* 64KB */
|
||||||
|
|
||||||
|
if (pcm_dev >= HDA_MAX_PCMS) {
|
||||||
|
snd_printk(KERN_ERR SFX "Invalid PCM device number %d\n",
|
||||||
|
@@ -2019,10 +2020,21 @@ azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
|
||||||
|
if (cpcm->stream[s].substreams)
|
||||||
|
snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
/* buffer pre-allocation */
|
||||||
|
+
|
||||||
|
+ /* subtle, don't allocate a big buffer for modems...
|
||||||
|
+ * also, don't just test 32BIT_MASK, since azx supports
|
||||||
|
+ * 64-bit DMA in some cases.
|
||||||
|
+ */
|
||||||
|
+ /* lennart wants a 2.2MB buffer for 2sec of 48khz */
|
||||||
|
+ if (pcm->dev_class == SNDRV_PCM_CLASS_GENERIC &&
|
||||||
|
+ chip->pci->dma_mask >= DMA_32BIT_MASK)
|
||||||
|
+ prealloc_min = 4 * 1024 * 1024; /* 4MB */
|
||||||
|
+
|
||||||
|
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
|
||||||
|
snd_dma_pci_data(chip->pci),
|
||||||
|
- 1024 * 64, 32 * 1024 * 1024);
|
||||||
|
+ prealloc_min, 32 * 1024 * 1024);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,216 @@
|
||||||
|
drivers/media/video/hdpvr/Makefile | 4 +-
|
||||||
|
drivers/media/video/hdpvr/hdpvr-core.c | 12 ++---
|
||||||
|
drivers/media/video/hdpvr/hdpvr-i2c.c | 83 ++++++++++++++++++++++----------
|
||||||
|
drivers/media/video/hdpvr/hdpvr.h | 2 +-
|
||||||
|
4 files changed, 64 insertions(+), 37 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/media/video/hdpvr/Makefile b/drivers/media/video/hdpvr/Makefile
|
||||||
|
index e0230fc..a0b9a43 100644
|
||||||
|
--- a/drivers/media/video/hdpvr/Makefile
|
||||||
|
+++ b/drivers/media/video/hdpvr/Makefile
|
||||||
|
@@ -1,6 +1,4 @@
|
||||||
|
-hdpvr-objs := hdpvr-control.o hdpvr-core.o hdpvr-video.o
|
||||||
|
-
|
||||||
|
-hdpvr-$(CONFIG_I2C) += hdpvr-i2c.o
|
||||||
|
+hdpvr-objs := hdpvr-control.o hdpvr-i2c.o hdpvr-core.o hdpvr-video.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_VIDEO_HDPVR) += hdpvr.o
|
||||||
|
|
||||||
|
diff --git a/drivers/media/video/hdpvr/hdpvr-core.c b/drivers/media/video/hdpvr/hdpvr-core.c
|
||||||
|
index 2fc9865..c72793a 100644
|
||||||
|
--- a/drivers/media/video/hdpvr/hdpvr-core.c
|
||||||
|
+++ b/drivers/media/video/hdpvr/hdpvr-core.c
|
||||||
|
@@ -364,9 +364,8 @@ static int hdpvr_probe(struct usb_interface *interface,
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
-#ifdef CONFIG_I2C
|
||||||
|
- /* until i2c is working properly */
|
||||||
|
- retval = 0; /* hdpvr_register_i2c_adapter(dev); */
|
||||||
|
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
|
||||||
|
+ retval = hdpvr_register_i2c_adapter(dev);
|
||||||
|
if (retval < 0) {
|
||||||
|
v4l2_err(&dev->v4l2_dev, "registering i2c adapter failed\n");
|
||||||
|
goto error;
|
||||||
|
@@ -412,12 +411,9 @@ static void hdpvr_disconnect(struct usb_interface *interface)
|
||||||
|
mutex_unlock(&dev->io_mutex);
|
||||||
|
|
||||||
|
/* deregister I2C adapter */
|
||||||
|
-#ifdef CONFIG_I2C
|
||||||
|
+#if defined(CONFIG_I2C) || (CONFIG_I2C_MODULE)
|
||||||
|
mutex_lock(&dev->i2c_mutex);
|
||||||
|
- if (dev->i2c_adapter)
|
||||||
|
- i2c_del_adapter(dev->i2c_adapter);
|
||||||
|
- kfree(dev->i2c_adapter);
|
||||||
|
- dev->i2c_adapter = NULL;
|
||||||
|
+ i2c_del_adapter(&dev->i2c_adapter);
|
||||||
|
mutex_unlock(&dev->i2c_mutex);
|
||||||
|
#endif /* CONFIG_I2C */
|
||||||
|
|
||||||
|
diff --git a/drivers/media/video/hdpvr/hdpvr-i2c.c b/drivers/media/video/hdpvr/hdpvr-i2c.c
|
||||||
|
index 463b81b..a0557e4 100644
|
||||||
|
--- a/drivers/media/video/hdpvr/hdpvr-i2c.c
|
||||||
|
+++ b/drivers/media/video/hdpvr/hdpvr-i2c.c
|
||||||
|
@@ -10,6 +10,8 @@
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
|
||||||
|
+
|
||||||
|
#include <linux/i2c.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
|
||||||
|
@@ -22,8 +24,11 @@
|
||||||
|
#define REQTYPE_I2C_WRITE 0xb0
|
||||||
|
#define REQTYPE_I2C_WRITE_STATT 0xd0
|
||||||
|
|
||||||
|
-static int hdpvr_i2c_read(struct hdpvr_device *dev, unsigned char addr,
|
||||||
|
- char *data, int len)
|
||||||
|
+#define HDPVR_HW_Z8F0811_IR_TX_I2C_ADDR 0x70
|
||||||
|
+#define HDPVR_HW_Z8F0811_IR_RX_I2C_ADDR 0x71
|
||||||
|
+
|
||||||
|
+static int hdpvr_i2c_read(struct hdpvr_device *dev, int bus,
|
||||||
|
+ unsigned char addr, char *data, int len)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char *buf = kmalloc(len, GFP_KERNEL);
|
||||||
|
@@ -33,7 +38,7 @@ static int hdpvr_i2c_read(struct hdpvr_device *dev, unsigned char addr,
|
||||||
|
ret = usb_control_msg(dev->udev,
|
||||||
|
usb_rcvctrlpipe(dev->udev, 0),
|
||||||
|
REQTYPE_I2C_READ, CTRL_READ_REQUEST,
|
||||||
|
- 0x100|addr, 0, buf, len, 1000);
|
||||||
|
+ (bus << 8) | addr, 0, buf, len, 1000);
|
||||||
|
|
||||||
|
if (ret == len) {
|
||||||
|
memcpy(data, buf, len);
|
||||||
|
@@ -46,8 +51,8 @@ static int hdpvr_i2c_read(struct hdpvr_device *dev, unsigned char addr,
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int hdpvr_i2c_write(struct hdpvr_device *dev, unsigned char addr,
|
||||||
|
- char *data, int len)
|
||||||
|
+static int hdpvr_i2c_write(struct hdpvr_device *dev, int bus,
|
||||||
|
+ unsigned char addr, char *data, int len)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char *buf = kmalloc(len, GFP_KERNEL);
|
||||||
|
@@ -58,7 +63,7 @@ static int hdpvr_i2c_write(struct hdpvr_device *dev, unsigned char addr,
|
||||||
|
ret = usb_control_msg(dev->udev,
|
||||||
|
usb_sndctrlpipe(dev->udev, 0),
|
||||||
|
REQTYPE_I2C_WRITE, CTRL_WRITE_REQUEST,
|
||||||
|
- 0x100|addr, 0, buf, len, 1000);
|
||||||
|
+ (bus << 8) | addr, 0, buf, len, 1000);
|
||||||
|
|
||||||
|
if (ret < 0)
|
||||||
|
goto error;
|
||||||
|
@@ -68,7 +73,7 @@ static int hdpvr_i2c_write(struct hdpvr_device *dev, unsigned char addr,
|
||||||
|
REQTYPE_I2C_WRITE_STATT, CTRL_READ_REQUEST,
|
||||||
|
0, 0, buf, 2, 1000);
|
||||||
|
|
||||||
|
- if (ret == 2)
|
||||||
|
+ if ((ret == 2) && (buf[1] == (len - 1)))
|
||||||
|
ret = 0;
|
||||||
|
else if (ret >= 0)
|
||||||
|
ret = -EIO;
|
||||||
|
@@ -93,10 +98,10 @@ static int hdpvr_transfer(struct i2c_adapter *i2c_adapter, struct i2c_msg *msgs,
|
||||||
|
addr = msgs[i].addr << 1;
|
||||||
|
|
||||||
|
if (msgs[i].flags & I2C_M_RD)
|
||||||
|
- retval = hdpvr_i2c_read(dev, addr, msgs[i].buf,
|
||||||
|
+ retval = hdpvr_i2c_read(dev, 1, addr, msgs[i].buf,
|
||||||
|
msgs[i].len);
|
||||||
|
else
|
||||||
|
- retval = hdpvr_i2c_write(dev, addr, msgs[i].buf,
|
||||||
|
+ retval = hdpvr_i2c_write(dev, 1, addr, msgs[i].buf,
|
||||||
|
msgs[i].len);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -115,31 +120,59 @@ static struct i2c_algorithm hdpvr_algo = {
|
||||||
|
.functionality = hdpvr_functionality,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static struct i2c_adapter hdpvr_i2c_adapter_template = {
|
||||||
|
+ .name = "Hauppage HD PVR I2C",
|
||||||
|
+ .owner = THIS_MODULE,
|
||||||
|
+ .id = I2C_HW_B_HDPVR,
|
||||||
|
+ .algo = &hdpvr_algo,
|
||||||
|
+ .class = I2C_CLASS_TV_ANALOG,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct i2c_board_info hdpvr_i2c_board_info = {
|
||||||
|
+ I2C_BOARD_INFO("ir_tx_z8f0811_haup", HDPVR_HW_Z8F0811_IR_TX_I2C_ADDR),
|
||||||
|
+ I2C_BOARD_INFO("ir_rx_z8f0811_haup", HDPVR_HW_Z8F0811_IR_RX_I2C_ADDR),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int hdpvr_activate_ir(struct hdpvr_device *dev)
|
||||||
|
+{
|
||||||
|
+ char buffer[8];
|
||||||
|
+
|
||||||
|
+ mutex_lock(&dev->i2c_mutex);
|
||||||
|
+
|
||||||
|
+ hdpvr_i2c_read(dev, 0, 0x54, buffer, 1);
|
||||||
|
+
|
||||||
|
+ buffer[0] = 0;
|
||||||
|
+ buffer[1] = 0x8;
|
||||||
|
+ hdpvr_i2c_write(dev, 1, 0x54, buffer, 2);
|
||||||
|
+
|
||||||
|
+ buffer[1] = 0x18;
|
||||||
|
+ hdpvr_i2c_write(dev, 1, 0x54, buffer, 2);
|
||||||
|
+
|
||||||
|
+ mutex_unlock(&dev->i2c_mutex);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int hdpvr_register_i2c_adapter(struct hdpvr_device *dev)
|
||||||
|
{
|
||||||
|
- struct i2c_adapter *i2c_adap;
|
||||||
|
int retval = -ENOMEM;
|
||||||
|
|
||||||
|
- i2c_adap = kzalloc(sizeof(struct i2c_adapter), GFP_KERNEL);
|
||||||
|
- if (i2c_adap == NULL)
|
||||||
|
- goto error;
|
||||||
|
+ hdpvr_activate_ir(dev);
|
||||||
|
|
||||||
|
- strlcpy(i2c_adap->name, "Hauppauge HD PVR I2C",
|
||||||
|
- sizeof(i2c_adap->name));
|
||||||
|
- i2c_adap->algo = &hdpvr_algo;
|
||||||
|
- i2c_adap->class = I2C_CLASS_TV_ANALOG;
|
||||||
|
- i2c_adap->owner = THIS_MODULE;
|
||||||
|
- i2c_adap->dev.parent = &dev->udev->dev;
|
||||||
|
+ memcpy(&dev->i2c_adapter, &hdpvr_i2c_adapter_template,
|
||||||
|
+ sizeof(struct i2c_adapter));
|
||||||
|
+ dev->i2c_adapter.dev.parent = &dev->udev->dev;
|
||||||
|
|
||||||
|
- i2c_set_adapdata(i2c_adap, dev);
|
||||||
|
+ i2c_set_adapdata(&dev->i2c_adapter, dev);
|
||||||
|
|
||||||
|
- retval = i2c_add_adapter(i2c_adap);
|
||||||
|
+ retval = i2c_add_adapter(&dev->i2c_adapter);
|
||||||
|
+ if (retval)
|
||||||
|
+ goto error;
|
||||||
|
|
||||||
|
- if (!retval)
|
||||||
|
- dev->i2c_adapter = i2c_adap;
|
||||||
|
- else
|
||||||
|
- kfree(i2c_adap);
|
||||||
|
+ i2c_new_device(&dev->i2c_adapter, &hdpvr_i2c_board_info);
|
||||||
|
|
||||||
|
error:
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+#endif /* CONFIG_I2C */
|
||||||
|
diff --git a/drivers/media/video/hdpvr/hdpvr.h b/drivers/media/video/hdpvr/hdpvr.h
|
||||||
|
index 49ae25d..8a5729a 100644
|
||||||
|
--- a/drivers/media/video/hdpvr/hdpvr.h
|
||||||
|
+++ b/drivers/media/video/hdpvr/hdpvr.h
|
||||||
|
@@ -102,7 +102,7 @@ struct hdpvr_device {
|
||||||
|
struct work_struct worker;
|
||||||
|
|
||||||
|
/* I2C adapter */
|
||||||
|
- struct i2c_adapter *i2c_adapter;
|
||||||
|
+ struct i2c_adapter i2c_adapter;
|
||||||
|
/* I2C lock */
|
||||||
|
struct mutex i2c_mutex;
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
From dec23057518b7035117a1a732aa48be6d34f1be8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andrew Lutomirski <luto@mit.edu>
|
||||||
|
Date: Sat, 12 Jun 2010 09:21:18 +0000
|
||||||
|
Subject: i915: Fix CRT hotplug regression in 2.6.35-rc1
|
||||||
|
|
||||||
|
Commit 7a772c492fcfffae812ffca78a628e76fa57fe58 has two bugs which
|
||||||
|
made the hotplug problems on my laptop worse instead of better.
|
||||||
|
|
||||||
|
First, it did not, in fact, disable the CRT plug interrupt -- it
|
||||||
|
disabled all the other hotplug interrupts. It seems rather doubtful
|
||||||
|
that that bit of the patch fixed anything, so let's just remove it.
|
||||||
|
(If you want to add it back, you probably meant ~CRT_HOTPLUG_INT_EN.)
|
||||||
|
|
||||||
|
Second, on at least my GM45, setting CRT_HOTPLUG_ACTIVATION_PERIOD_64
|
||||||
|
and CRT_HOTPLUG_VOLTAGE_COMPARE_50 (when they were previously unset)
|
||||||
|
causes a hotplug interrupt about three seconds later. The old code
|
||||||
|
never restored PORT_HOTPLUG_EN so this could only happen once, but
|
||||||
|
they new code restores those registers. So just set those bits when
|
||||||
|
we set up the interrupt in the first place.
|
||||||
|
|
||||||
|
Signed-off-by: Andy Lutomirski <luto@mit.edu>
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/i915/i915_irq.c | 12 +++++++++++-
|
||||||
|
drivers/gpu/drm/i915/i915_reg.h | 1 -
|
||||||
|
drivers/gpu/drm/i915/intel_crt.c | 6 ------
|
||||||
|
3 files changed, 11 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
|
||||||
|
index 2479be0..7acb1a6 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_irq.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_irq.c
|
||||||
|
@@ -1400,8 +1400,18 @@ int i915_driver_irq_postinstall(struct drm_device *dev)
|
||||||
|
hotplug_en |= SDVOC_HOTPLUG_INT_EN;
|
||||||
|
if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS)
|
||||||
|
hotplug_en |= SDVOB_HOTPLUG_INT_EN;
|
||||||
|
- if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS)
|
||||||
|
+ if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) {
|
||||||
|
hotplug_en |= CRT_HOTPLUG_INT_EN;
|
||||||
|
+
|
||||||
|
+ /* Programming the CRT detection parameters tends
|
||||||
|
+ to generate a spurious hotplug event about three
|
||||||
|
+ seconds later. So just do it once.
|
||||||
|
+ */
|
||||||
|
+ if (IS_G4X(dev))
|
||||||
|
+ hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64;
|
||||||
|
+ hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Ignore TV since it's buggy */
|
||||||
|
|
||||||
|
I915_WRITE(PORT_HOTPLUG_EN, hotplug_en);
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
|
||||||
|
index 64b0a3a..d390b17 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_reg.h
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_reg.h
|
||||||
|
@@ -1130,7 +1130,6 @@
|
||||||
|
#define CRT_HOTPLUG_DETECT_DELAY_2G (1 << 4)
|
||||||
|
#define CRT_HOTPLUG_DETECT_VOLTAGE_325MV (0 << 2)
|
||||||
|
#define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2)
|
||||||
|
-#define CRT_HOTPLUG_MASK (0x3fc) /* Bits 9-2 */
|
||||||
|
|
||||||
|
#define PORT_HOTPLUG_STAT 0x61114
|
||||||
|
#define HDMIB_HOTPLUG_INT_STATUS (1 << 29)
|
||||||
|
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
|
||||||
|
index 22ff384..ee0732b 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/intel_crt.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/intel_crt.c
|
||||||
|
@@ -234,14 +234,8 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
|
||||||
|
else
|
||||||
|
tries = 1;
|
||||||
|
hotplug_en = orig = I915_READ(PORT_HOTPLUG_EN);
|
||||||
|
- hotplug_en &= CRT_HOTPLUG_MASK;
|
||||||
|
hotplug_en |= CRT_HOTPLUG_FORCE_DETECT;
|
||||||
|
|
||||||
|
- if (IS_G4X(dev))
|
||||||
|
- hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64;
|
||||||
|
-
|
||||||
|
- hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50;
|
||||||
|
-
|
||||||
|
for (i = 0; i < tries ; i++) {
|
||||||
|
unsigned long timeout;
|
||||||
|
/* turn on the FORCE_DETECT */
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,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,56 @@
|
||||||
|
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
|
||||||
|
Date: Wed, 21 Jul 2010 07:01:19 +0000 (-0700)
|
||||||
|
Subject: Input: synaptics - relax capability ID checks on newer hardware
|
||||||
|
X-Git-Tag: v2.6.35-rc6~1^2
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=3619b8fead04ab9de643712e757ef6b5f79fd1ab
|
||||||
|
|
||||||
|
Input: synaptics - relax capability ID checks on newer hardware
|
||||||
|
|
||||||
|
Older firmwares fixed the middle byte of the Synaptics capabilities
|
||||||
|
query to 0x47, but starting with firmware 7.5 the middle byte
|
||||||
|
represents submodel ID, sometimes also called "dash number".
|
||||||
|
|
||||||
|
Reported-and-tested-by: Miroslav Šulc <fordfrog@gmail.com>
|
||||||
|
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
|
||||||
|
index 9ba9c4a..705589d 100644
|
||||||
|
--- a/drivers/input/mouse/synaptics.c
|
||||||
|
+++ b/drivers/input/mouse/synaptics.c
|
||||||
|
@@ -141,8 +141,13 @@ static int synaptics_capability(struct psmouse *psmouse)
|
||||||
|
priv->capabilities = (cap[0] << 16) | (cap[1] << 8) | cap[2];
|
||||||
|
priv->ext_cap = priv->ext_cap_0c = 0;
|
||||||
|
|
||||||
|
- if (!SYN_CAP_VALID(priv->capabilities))
|
||||||
|
+ /*
|
||||||
|
+ * Older firmwares had submodel ID fixed to 0x47
|
||||||
|
+ */
|
||||||
|
+ if (SYN_ID_FULL(priv->identity) < 0x705 &&
|
||||||
|
+ SYN_CAP_SUBMODEL_ID(priv->capabilities) != 0x47) {
|
||||||
|
return -1;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Unless capExtended is set the rest of the flags should be ignored
|
||||||
|
diff --git a/drivers/input/mouse/synaptics.h b/drivers/input/mouse/synaptics.h
|
||||||
|
index 7d4d5e1..b6aa7d2 100644
|
||||||
|
--- a/drivers/input/mouse/synaptics.h
|
||||||
|
+++ b/drivers/input/mouse/synaptics.h
|
||||||
|
@@ -47,7 +47,7 @@
|
||||||
|
#define SYN_CAP_FOUR_BUTTON(c) ((c) & (1 << 3))
|
||||||
|
#define SYN_CAP_MULTIFINGER(c) ((c) & (1 << 1))
|
||||||
|
#define SYN_CAP_PALMDETECT(c) ((c) & (1 << 0))
|
||||||
|
-#define SYN_CAP_VALID(c) ((((c) & 0x00ff00) >> 8) == 0x47)
|
||||||
|
+#define SYN_CAP_SUBMODEL_ID(c) (((c) & 0x00ff00) >> 8)
|
||||||
|
#define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20)
|
||||||
|
#define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12)
|
||||||
|
#define SYN_CAP_PRODUCT_ID(ec) (((ec) & 0xff0000) >> 16)
|
||||||
|
@@ -66,6 +66,7 @@
|
||||||
|
#define SYN_ID_MODEL(i) (((i) >> 4) & 0x0f)
|
||||||
|
#define SYN_ID_MAJOR(i) ((i) & 0x0f)
|
||||||
|
#define SYN_ID_MINOR(i) (((i) >> 16) & 0xff)
|
||||||
|
+#define SYN_ID_FULL(i) ((SYN_ID_MAJOR(i) << 8) | SYN_ID_MINOR(i))
|
||||||
|
#define SYN_ID_IS_SYNAPTICS(i) ((((i) >> 8) & 0xff) == 0x47)
|
||||||
|
|
||||||
|
/* synaptics special commands */
|
|
@ -0,0 +1,162 @@
|
||||||
|
From 5b51e801eef53be8e521316eea9e78e5c4595fd4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Date: Thu, 4 Mar 2010 13:38:59 -0800
|
||||||
|
Subject: [PATCH] iwlwifi: Recover TX flow failure
|
||||||
|
|
||||||
|
Monitors the tx statistics to detect the drop in throughput.
|
||||||
|
When the throughput drops, the ratio of the actual_ack_count and the
|
||||||
|
expected_ack_count also drops. At the same time, the aggregated
|
||||||
|
ba_timeout (the number of ba timeout retries) also rises. If the
|
||||||
|
actual_ack_count/expected_ack_count ratio is 0 and the number of ba
|
||||||
|
timeout retries rises to BA_TIMEOUT_MAX, no tx packets can be delivered.
|
||||||
|
Reloading the uCode and bring the system back to normal operational
|
||||||
|
state.
|
||||||
|
|
||||||
|
Signed-off-by: Trieu 'Andrew' Nguyen <trieux.t.nguyen@intel.com>
|
||||||
|
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||||
|
---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-agn.c | 14 ++++++++-
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-dev.h | 21 +++++++++++++
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-rx.c | 50 +++++++++++++++++++++++++++++++-
|
||||||
|
3 files changed, 83 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
index 07a9a02..dc751cb 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
@@ -2965,10 +2965,21 @@ static int iwl_mac_ampdu_action(struct ieee80211_hw *hw,
|
||||||
|
return ret;
|
||||||
|
case IEEE80211_AMPDU_TX_START:
|
||||||
|
IWL_DEBUG_HT(priv, "start Tx\n");
|
||||||
|
- return iwl_tx_agg_start(priv, sta->addr, tid, ssn);
|
||||||
|
+ ret = iwl_tx_agg_start(priv, sta->addr, tid, ssn);
|
||||||
|
+ if (ret == 0) {
|
||||||
|
+ priv->_agn.agg_tids_count++;
|
||||||
|
+ IWL_DEBUG_HT(priv, "priv->_agn.agg_tids_count = %u\n",
|
||||||
|
+ priv->_agn.agg_tids_count);
|
||||||
|
+ }
|
||||||
|
+ return ret;
|
||||||
|
case IEEE80211_AMPDU_TX_STOP:
|
||||||
|
IWL_DEBUG_HT(priv, "stop Tx\n");
|
||||||
|
ret = iwl_tx_agg_stop(priv, sta->addr, tid);
|
||||||
|
+ if ((ret == 0) && (priv->_agn.agg_tids_count > 0)) {
|
||||||
|
+ priv->_agn.agg_tids_count--;
|
||||||
|
+ IWL_DEBUG_HT(priv, "priv->_agn.agg_tids_count = %u\n",
|
||||||
|
+ priv->_agn.agg_tids_count);
|
||||||
|
+ }
|
||||||
|
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
@@ -3399,6 +3410,7 @@ static int iwl_init_drv(struct iwl_priv *priv)
|
||||||
|
priv->iw_mode = NL80211_IFTYPE_STATION;
|
||||||
|
priv->current_ht_config.smps = IEEE80211_SMPS_STATIC;
|
||||||
|
priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF;
|
||||||
|
+ priv->_agn.agg_tids_count = 0;
|
||||||
|
|
||||||
|
/* initialize force reset */
|
||||||
|
priv->force_reset[IWL_RF_RESET].reset_duration =
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
index 447e14b..e2a6b76 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
@@ -1275,6 +1275,26 @@ struct iwl_priv {
|
||||||
|
void *shared_virt;
|
||||||
|
dma_addr_t shared_phys;
|
||||||
|
/*End*/
|
||||||
|
+ union {
|
||||||
|
+#if defined(CONFIG_IWLAGN) || defined(CONFIG_IWLAGN_MODULE)
|
||||||
|
+ struct {
|
||||||
|
+ /* INT ICT Table */
|
||||||
|
+ __le32 *ict_tbl;
|
||||||
|
+ void *ict_tbl_vir;
|
||||||
|
+ dma_addr_t ict_tbl_dma;
|
||||||
|
+ dma_addr_t aligned_ict_tbl_dma;
|
||||||
|
+ int ict_index;
|
||||||
|
+ u32 inta;
|
||||||
|
+ bool use_ict;
|
||||||
|
+ /*
|
||||||
|
+ * reporting the number of tids has AGG on. 0 means
|
||||||
|
+ * no AGGREGATION
|
||||||
|
+ */
|
||||||
|
+ u8 agg_tids_count;
|
||||||
|
+ } _agn;
|
||||||
|
+#endif
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
struct iwl_hw_params hw_params;
|
||||||
|
|
||||||
|
/* INT ICT Table */
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
index fabc52f..f48d685 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
@@ -617,9 +617,18 @@ static void iwl_accumulative_statistics(struct iwl_priv *priv,
|
||||||
|
|
||||||
|
#define REG_RECALIB_PERIOD (60)
|
||||||
|
|
||||||
|
+/* the threshold ratio of actual_ack_cnt to expected_ack_cnt in percent */
|
||||||
|
+#define ACK_CNT_RATIO (50)
|
||||||
|
+#define BA_TIMEOUT_CNT (5)
|
||||||
|
+#define BA_TIMEOUT_MAX (16)
|
||||||
|
+
|
||||||
|
#define PLCP_MSG "plcp_err exceeded %u, %u, %u, %u, %u, %d, %u mSecs\n"
|
||||||
|
/*
|
||||||
|
- * This function checks for plcp error.
|
||||||
|
+ * This function checks for plcp error, ACK count ratios, aggregated BA
|
||||||
|
+ * timeout retries.
|
||||||
|
+ * - When the ACK count ratio is 0 and aggregated BA timeout retries is
|
||||||
|
+ * exceeding the BA_TIMEOUT_MAX, it will recover the failure by resetting
|
||||||
|
+ * the firmware.
|
||||||
|
* - When the plcp error is exceeding the thresholds, it will reset the radio
|
||||||
|
* to improve the throughput.
|
||||||
|
*/
|
||||||
|
@@ -629,6 +638,45 @@ void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
int combined_plcp_delta;
|
||||||
|
unsigned int plcp_msec;
|
||||||
|
unsigned long plcp_received_jiffies;
|
||||||
|
+ int actual_ack_cnt_delta;
|
||||||
|
+ int expected_ack_cnt_delta;
|
||||||
|
+ int ba_timeout_delta;
|
||||||
|
+
|
||||||
|
+ actual_ack_cnt_delta =
|
||||||
|
+ le32_to_cpu(pkt->u.stats.tx.actual_ack_cnt) -
|
||||||
|
+ le32_to_cpu(priv->statistics.tx.actual_ack_cnt);
|
||||||
|
+ expected_ack_cnt_delta =
|
||||||
|
+ le32_to_cpu(pkt->u.stats.tx.expected_ack_cnt) -
|
||||||
|
+ le32_to_cpu(priv->statistics.tx.expected_ack_cnt);
|
||||||
|
+ ba_timeout_delta =
|
||||||
|
+ le32_to_cpu(pkt->u.stats.tx.agg.ba_timeout) -
|
||||||
|
+ le32_to_cpu(priv->statistics.tx.agg.ba_timeout);
|
||||||
|
+ if ((priv->_agn.agg_tids_count > 0) &&
|
||||||
|
+ (expected_ack_cnt_delta > 0) &&
|
||||||
|
+ (((actual_ack_cnt_delta * 100) / expected_ack_cnt_delta)
|
||||||
|
+ < ACK_CNT_RATIO) &&
|
||||||
|
+ (ba_timeout_delta > BA_TIMEOUT_CNT)) {
|
||||||
|
+ IWL_DEBUG_RADIO(priv, "actual_ack_cnt delta = %d,"
|
||||||
|
+ " expected_ack_cnt = %d\n",
|
||||||
|
+ actual_ack_cnt_delta, expected_ack_cnt_delta);
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
+ IWL_DEBUG_RADIO(priv, "rx_detected_cnt delta = %d\n",
|
||||||
|
+ priv->delta_statistics.tx.rx_detected_cnt);
|
||||||
|
+ IWL_DEBUG_RADIO(priv,
|
||||||
|
+ "ack_or_ba_timeout_collision delta = %d\n",
|
||||||
|
+ priv->delta_statistics.tx.
|
||||||
|
+ ack_or_ba_timeout_collision);
|
||||||
|
+#endif
|
||||||
|
+ IWL_DEBUG_RADIO(priv, "agg ba_timeout delta = %d\n",
|
||||||
|
+ ba_timeout_delta);
|
||||||
|
+ if ((actual_ack_cnt_delta == 0) &&
|
||||||
|
+ (ba_timeout_delta >= BA_TIMEOUT_MAX)) {
|
||||||
|
+ IWL_DEBUG_RADIO(priv,
|
||||||
|
+ "call iwl_force_reset(IWL_FW_RESET)\n");
|
||||||
|
+ iwl_force_reset(priv, IWL_FW_RESET);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/*
|
||||||
|
* check for plcp_err and trigger radio reset if it exceeds
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,504 @@
|
||||||
|
From 8483e011e2ad5d5b27ebe4517fedf13e16d0b7cb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Date: Mon, 1 Mar 2010 17:23:50 -0800
|
||||||
|
Subject: [PATCH] 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>
|
||||||
|
---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-1000.c | 3 +
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-3945.c | 2 +
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-4965.c | 1 +
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-5000.c | 9 +++
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-6000.c | 8 ++
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-agn.c | 16 +++++
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-core.c | 93 +++++++++++++++++++++++++++
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-core.h | 7 ++
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-dev.h | 10 +++
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-tx.c | 2 +
|
||||||
|
drivers/net/wireless/iwlwifi/iwl3945-base.c | 16 +++++
|
||||||
|
11 files changed, 167 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||||
|
index 3bf2e6e..89dc401 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||||
|
@@ -211,6 +211,7 @@ static struct iwl_lib_ops iwl1000_lib = {
|
||||||
|
.set_ct_kill = iwl1000_set_ct_threshold,
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
+ .recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl1000_ops = {
|
||||||
|
@@ -248,6 +249,7 @@ struct iwl_cfg iwl1000_bgn_cfg = {
|
||||||
|
.support_ct_kill_exit = true,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF,
|
||||||
|
.chain_noise_scale = 1000,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iwl_cfg iwl1000_bg_cfg = {
|
||||||
|
@@ -276,6 +278,7 @@ struct iwl_cfg iwl1000_bg_cfg = {
|
||||||
|
.support_ct_kill_exit = true,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF,
|
||||||
|
.chain_noise_scale = 1000,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
MODULE_FIRMWARE(IWL1000_MODULE_FIRMWARE(IWL1000_UCODE_API_MAX));
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c
|
||||||
|
index 0728054..caebec4 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-3945.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-3945.c
|
||||||
|
@@ -2827,6 +2827,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 = {
|
||||||
|
@@ -2845,6 +2846,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,
|
||||||
|
};
|
||||||
|
|
||||||
|
DEFINE_PCI_DEVICE_TABLE(iwl3945_hw_card_ids) = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||||
|
index 8972166..aa49a6e 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||||
|
@@ -2251,6 +2251,7 @@ struct iwl_cfg iwl4965_agn_cfg = {
|
||||||
|
.led_compensation = 61,
|
||||||
|
.chain_noise_num_beacons = IWL4965_CAL_NUM_BEACONS,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Module firmware */
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||||
|
index e476acb..d05fad4 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||||
|
@@ -1500,6 +1500,7 @@ struct iwl_lib_ops iwl5000_lib = {
|
||||||
|
.set_ct_kill = iwl5000_set_ct_threshold,
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
+ .recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct iwl_lib_ops iwl5150_lib = {
|
||||||
|
@@ -1554,6 +1555,7 @@ static struct iwl_lib_ops iwl5150_lib = {
|
||||||
|
.set_ct_kill = iwl5150_set_ct_threshold,
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
+ .recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl5000_ops = {
|
||||||
|
@@ -1603,6 +1605,7 @@ struct iwl_cfg iwl5300_agn_cfg = {
|
||||||
|
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||||
|
.chain_noise_scale = 1000,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iwl_cfg iwl5100_bgn_cfg = {
|
||||||
|
@@ -1629,6 +1632,7 @@ struct iwl_cfg iwl5100_bgn_cfg = {
|
||||||
|
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||||
|
.chain_noise_scale = 1000,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iwl_cfg iwl5100_abg_cfg = {
|
||||||
|
@@ -1653,6 +1657,7 @@ struct iwl_cfg iwl5100_abg_cfg = {
|
||||||
|
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||||
|
.chain_noise_scale = 1000,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iwl_cfg iwl5100_agn_cfg = {
|
||||||
|
@@ -1679,6 +1684,7 @@ struct iwl_cfg iwl5100_agn_cfg = {
|
||||||
|
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||||
|
.chain_noise_scale = 1000,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iwl_cfg iwl5350_agn_cfg = {
|
||||||
|
@@ -1705,6 +1711,7 @@ struct iwl_cfg iwl5350_agn_cfg = {
|
||||||
|
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||||
|
.chain_noise_scale = 1000,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iwl_cfg iwl5150_agn_cfg = {
|
||||||
|
@@ -1731,6 +1738,7 @@ struct iwl_cfg iwl5150_agn_cfg = {
|
||||||
|
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||||
|
.chain_noise_scale = 1000,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iwl_cfg iwl5150_abg_cfg = {
|
||||||
|
@@ -1755,6 +1763,7 @@ struct iwl_cfg iwl5150_abg_cfg = {
|
||||||
|
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
|
||||||
|
.chain_noise_scale = 1000,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE(IWL5000_UCODE_API_MAX));
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||||
|
index 92b3e64..0c965cd 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||||
|
@@ -277,6 +277,7 @@ static struct iwl_lib_ops iwl6000_lib = {
|
||||||
|
.set_ct_kill = iwl6000_set_ct_threshold,
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
+ .recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl6000_ops = {
|
||||||
|
@@ -342,6 +343,7 @@ static struct iwl_lib_ops iwl6050_lib = {
|
||||||
|
.set_calib_version = iwl6050_set_calib_version,
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
+ .recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl6050_ops = {
|
||||||
|
@@ -385,6 +387,7 @@ struct iwl_cfg iwl6000i_2agn_cfg = {
|
||||||
|
.support_ct_kill_exit = true,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||||
|
.chain_noise_scale = 1000,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iwl_cfg iwl6000i_2abg_cfg = {
|
||||||
|
@@ -416,6 +419,7 @@ struct iwl_cfg iwl6000i_2abg_cfg = {
|
||||||
|
.support_ct_kill_exit = true,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||||
|
.chain_noise_scale = 1000,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iwl_cfg iwl6000i_2bg_cfg = {
|
||||||
|
@@ -447,6 +451,7 @@ struct iwl_cfg iwl6000i_2bg_cfg = {
|
||||||
|
.support_ct_kill_exit = true,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||||
|
.chain_noise_scale = 1000,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iwl_cfg iwl6050_2agn_cfg = {
|
||||||
|
@@ -479,6 +484,7 @@ struct iwl_cfg iwl6050_2agn_cfg = {
|
||||||
|
.support_ct_kill_exit = true,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||||
|
.chain_noise_scale = 1500,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iwl_cfg iwl6050_2abg_cfg = {
|
||||||
|
@@ -510,6 +516,7 @@ struct iwl_cfg iwl6050_2abg_cfg = {
|
||||||
|
.support_ct_kill_exit = true,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||||
|
.chain_noise_scale = 1500,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iwl_cfg iwl6000_3agn_cfg = {
|
||||||
|
@@ -542,6 +549,7 @@ struct iwl_cfg iwl6000_3agn_cfg = {
|
||||||
|
.support_ct_kill_exit = true,
|
||||||
|
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||||
|
.chain_noise_scale = 1000,
|
||||||
|
+ .monitor_recover_period = IWL_MONITORING_PERIOD,
|
||||||
|
};
|
||||||
|
|
||||||
|
MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
index bdff565..07a9a02 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
@@ -2106,6 +2106,13 @@ static void iwl_alive_start(struct iwl_priv *priv)
|
||||||
|
/* 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;
|
||||||
|
|
||||||
|
@@ -3316,6 +3323,13 @@ static void iwl_setup_deferred_work(struct iwl_priv *priv)
|
||||||
|
priv->ucode_trace.data = (unsigned long)priv;
|
||||||
|
priv->ucode_trace.function = iwl_bg_ucode_trace;
|
||||||
|
|
||||||
|
+ 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);
|
||||||
|
@@ -3336,6 +3350,8 @@ static void iwl_cancel_deferred_work(struct iwl_priv *priv)
|
||||||
|
cancel_work_sync(&priv->beacon_update);
|
||||||
|
del_timer_sync(&priv->statistics_periodic);
|
||||||
|
del_timer_sync(&priv->ucode_trace);
|
||||||
|
+ 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 --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||||
|
index 049b652..a5a2de6 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||||
|
@@ -3403,6 +3403,99 @@ int iwl_force_reset(struct iwl_priv *priv, int mode)
|
||||||
|
}
|
||||||
|
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 --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
index 36940a9..9076576 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
@@ -191,6 +191,8 @@ struct iwl_lib_ops {
|
||||||
|
struct iwl_temp_ops temp_ops;
|
||||||
|
/* station management */
|
||||||
|
void (*add_bcast_station)(struct iwl_priv *priv);
|
||||||
|
+ /* recover from tx queue stall */
|
||||||
|
+ void (*recover_from_tx_stall)(unsigned long data);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iwl_led_ops {
|
||||||
|
@@ -295,6 +297,8 @@ struct iwl_cfg {
|
||||||
|
const bool support_wimax_coexist;
|
||||||
|
u8 plcp_delta_threshold;
|
||||||
|
s32 chain_noise_scale;
|
||||||
|
+ /* timer period for monitor the driver queues */
|
||||||
|
+ u32 monitor_recover_period;
|
||||||
|
};
|
||||||
|
|
||||||
|
/***************************
|
||||||
|
@@ -577,6 +581,9 @@ static inline u16 iwl_pcie_link_ctl(struct iwl_priv *priv)
|
||||||
|
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 --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
index ef1720a..447e14b 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
@@ -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;
|
||||||
|
@@ -1039,6 +1043,11 @@ struct iwl_event_log {
|
||||||
|
#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,
|
||||||
|
@@ -1339,6 +1348,7 @@ struct iwl_priv {
|
||||||
|
struct work_struct run_time_calib_work;
|
||||||
|
struct timer_list statistics_periodic;
|
||||||
|
struct timer_list ucode_trace;
|
||||||
|
+ struct timer_list monitor_recover;
|
||||||
|
bool hw_ready;
|
||||||
|
/*For 3945*/
|
||||||
|
#define IWL_DEFAULT_TX_POWER 0x0F
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c
|
||||||
|
index 8dd0c03..6af23f2 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-tx.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-tx.c
|
||||||
|
@@ -310,6 +310,8 @@ static int iwl_queue_init(struct iwl_priv *priv, struct iwl_queue *q,
|
||||||
|
q->high_mark = 2;
|
||||||
|
|
||||||
|
q->write_ptr = q->read_ptr = 0;
|
||||||
|
+ q->last_read_ptr = 0;
|
||||||
|
+ q->repeat_same_read_ptr = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
index 19c77a8..853511e 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
@@ -2513,6 +2513,13 @@ static void iwl3945_alive_start(struct iwl_priv *priv)
|
||||||
|
/* 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;
|
||||||
|
|
||||||
|
@@ -3789,6 +3796,13 @@ static void iwl3945_setup_deferred_work(struct iwl_priv *priv)
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
@@ -3801,6 +3815,8 @@ static void iwl3945_cancel_deferred_work(struct iwl_priv *priv)
|
||||||
|
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[] = {
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
From dcde3533b9f501ad079c297b3bf7659739c4c287 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Date: Wed, 24 Feb 2010 08:28:30 -0800
|
||||||
|
Subject: [PATCH] iwlwifi: add internal short scan support for 3945
|
||||||
|
|
||||||
|
Add internal short scan support for 3945 NIC, This allows 3945 NIC
|
||||||
|
to support radio reset request like the other series of NICs.
|
||||||
|
|
||||||
|
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||||
|
---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl3945-base.c | 22 ++++++++++++++--------
|
||||||
|
1 files changed, 14 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
index b74a56c..19c77a8 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
@@ -2821,7 +2821,6 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
|
||||||
|
.len = sizeof(struct iwl3945_scan_cmd),
|
||||||
|
.flags = CMD_SIZE_HUGE,
|
||||||
|
};
|
||||||
|
- int rc = 0;
|
||||||
|
struct iwl3945_scan_cmd *scan;
|
||||||
|
struct ieee80211_conf *conf = NULL;
|
||||||
|
u8 n_probes = 0;
|
||||||
|
@@ -2849,7 +2848,6 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
|
||||||
|
if (test_bit(STATUS_SCAN_HW, &priv->status)) {
|
||||||
|
IWL_DEBUG_INFO(priv, "Multiple concurrent scan requests "
|
||||||
|
"Ignoring second request.\n");
|
||||||
|
- rc = -EIO;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2884,7 +2882,7 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
|
||||||
|
priv->scan = kmalloc(sizeof(struct iwl3945_scan_cmd) +
|
||||||
|
IWL_MAX_SCAN_SIZE, GFP_KERNEL);
|
||||||
|
if (!priv->scan) {
|
||||||
|
- rc = -ENOMEM;
|
||||||
|
+ IWL_DEBUG_SCAN(priv, "Fail to allocate scan memory\n");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -2927,7 +2925,9 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
|
||||||
|
scan_suspend_time, interval);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (priv->scan_request->n_ssids) {
|
||||||
|
+ if (priv->is_internal_short_scan) {
|
||||||
|
+ IWL_DEBUG_SCAN(priv, "Start internal passive scan.\n");
|
||||||
|
+ } else if (priv->scan_request->n_ssids) {
|
||||||
|
int i, p = 0;
|
||||||
|
IWL_DEBUG_SCAN(priv, "Kicking off active scan\n");
|
||||||
|
for (i = 0; i < priv->scan_request->n_ssids; i++) {
|
||||||
|
@@ -2975,13 +2975,20 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
- scan->tx_cmd.len = cpu_to_le16(
|
||||||
|
+ if (!priv->is_internal_short_scan) {
|
||||||
|
+ scan->tx_cmd.len = cpu_to_le16(
|
||||||
|
iwl_fill_probe_req(priv,
|
||||||
|
(struct ieee80211_mgmt *)scan->data,
|
||||||
|
priv->scan_request->ie,
|
||||||
|
priv->scan_request->ie_len,
|
||||||
|
IWL_MAX_SCAN_SIZE - sizeof(*scan)));
|
||||||
|
-
|
||||||
|
+ } else {
|
||||||
|
+ scan->tx_cmd.len = cpu_to_le16(
|
||||||
|
+ iwl_fill_probe_req(priv,
|
||||||
|
+ (struct ieee80211_mgmt *)scan->data,
|
||||||
|
+ NULL, 0,
|
||||||
|
+ IWL_MAX_SCAN_SIZE - sizeof(*scan)));
|
||||||
|
+ }
|
||||||
|
/* select Rx antennas */
|
||||||
|
scan->flags |= iwl3945_get_antenna_flags(priv);
|
||||||
|
|
||||||
|
@@ -3003,8 +3010,7 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
|
||||||
|
scan->len = cpu_to_le16(cmd.len);
|
||||||
|
|
||||||
|
set_bit(STATUS_SCAN_HW, &priv->status);
|
||||||
|
- rc = iwl_send_cmd_sync(priv, &cmd);
|
||||||
|
- if (rc)
|
||||||
|
+ if (iwl_send_cmd_sync(priv, &cmd))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
queue_delayed_work(priv->workqueue, &priv->scan_check,
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
commit a69b03e941abae00380fc6bc1877fb797a1b31e6
|
||||||
|
Author: John W. Linville <linville@tuxdriver.com>
|
||||||
|
Date: Mon Jun 14 14:30:25 2010 -0400
|
||||||
|
|
||||||
|
iwlwifi: cancel scan watchdog in iwl_bg_abort_scan
|
||||||
|
|
||||||
|
Avoids this:
|
||||||
|
|
||||||
|
WARNING: at net/mac80211/scan.c:312 ieee80211_scan_completed+0x5f/0x1f1
|
||||||
|
[mac80211]()
|
||||||
|
Hardware name: Latitude E5400
|
||||||
|
Modules linked in: aes_x86_64 aes_generic fuse ipt_MASQUERADE iptable_nat
|
||||||
|
nf_nat rfcomm sco bridge stp llc bnep l2cap sunrpc cpufreq_ondemand
|
||||||
|
acpi_cpufreq freq_table xt_physdev ip6t_REJECT nf_conntrack_ipv6
|
||||||
|
ip6table_filter ip6_tables ipv6 kvm_intel kvm uinput arc4 ecb
|
||||||
|
snd_hda_codec_intelhdmi snd_hda_codec_idt snd_hda_intel iwlagn snd_hda_codec
|
||||||
|
snd_hwdep snd_seq snd_seq_device iwlcore snd_pcm dell_wmi sdhci_pci sdhci
|
||||||
|
iTCO_wdt tg3 dell_laptop mmc_core i2c_i801 wmi mac80211 snd_timer
|
||||||
|
iTCO_vendor_support btusb joydev dcdbas cfg80211 bluetooth snd soundcore
|
||||||
|
microcode rfkill snd_page_alloc firewire_ohci firewire_core crc_itu_t
|
||||||
|
yenta_socket rsrc_nonstatic i915 drm_kms_helper drm i2c_algo_bit i2c_core video
|
||||||
|
output [last unloaded: scsi_wait_scan]
|
||||||
|
Pid: 979, comm: iwlagn Tainted: G W 2.6.33.3-85.fc13.x86_64 #1
|
||||||
|
Call Trace:
|
||||||
|
[<ffffffff8104b558>] warn_slowpath_common+0x77/0x8f
|
||||||
|
[<ffffffff8104b57f>] warn_slowpath_null+0xf/0x11
|
||||||
|
[<ffffffffa01bb7d9>] ieee80211_scan_completed+0x5f/0x1f1 [mac80211]
|
||||||
|
[<ffffffffa02a23f0>] iwl_bg_scan_completed+0xbb/0x17a [iwlcore]
|
||||||
|
[<ffffffff81060d3d>] worker_thread+0x1a4/0x232
|
||||||
|
[<ffffffffa02a2335>] ? iwl_bg_scan_completed+0x0/0x17a [iwlcore]
|
||||||
|
[<ffffffff81064817>] ? autoremove_wake_function+0x0/0x34
|
||||||
|
[<ffffffff81060b99>] ? worker_thread+0x0/0x232
|
||||||
|
[<ffffffff810643c7>] kthread+0x7a/0x82
|
||||||
|
[<ffffffff8100a924>] kernel_thread_helper+0x4/0x10
|
||||||
|
[<ffffffff8106434d>] ? kthread+0x0/0x82
|
||||||
|
[<ffffffff8100a920>] ? kernel_thread_helper+0x0/0x10
|
||||||
|
|
||||||
|
Reported here:
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=590436
|
||||||
|
|
||||||
|
Signed-off-by: John W. Linville <linville@tuxdriver.com>
|
||||||
|
Reported-by: Mihai Harpau <mishu@piatafinanciara.ro>
|
||||||
|
Cc: stable@kernel.org
|
||||||
|
Acked-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
|
||||||
|
index 5d3f51f..386c5f9 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-scan.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
|
||||||
|
@@ -491,6 +491,7 @@ void iwl_bg_abort_scan(struct work_struct *work)
|
||||||
|
|
||||||
|
mutex_lock(&priv->mutex);
|
||||||
|
|
||||||
|
+ cancel_delayed_work_sync(&priv->scan_check);
|
||||||
|
set_bit(STATUS_SCAN_ABORTING, &priv->status);
|
||||||
|
iwl_send_scan_abort(priv);
|
||||||
|
|
|
@ -0,0 +1,278 @@
|
||||||
|
From 56cf16e34b896ac40c6707eb053d45d2cab18bbd Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Date: Fri, 5 Mar 2010 14:22:46 -0800
|
||||||
|
Subject: [PATCH] iwlwifi: code cleanup for connectivity recovery
|
||||||
|
|
||||||
|
Split the connectivity check and recovery routine into separated
|
||||||
|
functions based on the types
|
||||||
|
1. iwl_good_ack_health() - check for ack count
|
||||||
|
2. iwl_good_plcp_health() - check for plcp error
|
||||||
|
|
||||||
|
Based on the type of errors being detected, different recovery methods
|
||||||
|
will be used to bring the system back to normal operational state.
|
||||||
|
|
||||||
|
Because different NIC has different HW and uCode, the behavior is also
|
||||||
|
different; these functions thus now form part of the ops infrastructure,
|
||||||
|
so we can have more control on how to monitor and recover from error condition
|
||||||
|
case per device.
|
||||||
|
|
||||||
|
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||||
|
---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-1000.c | 3 +-
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-4965.c | 2 +-
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-5000.c | 6 +-
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-6000.c | 6 +-
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-core.h | 11 +++-
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-rx.c | 97 +++++++++++++++++++++----------
|
||||||
|
6 files changed, 85 insertions(+), 40 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||||
|
index 2597574..7087631 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||||
|
@@ -212,7 +212,8 @@ static struct iwl_lib_ops iwl1000_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
- .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
+ .check_plcp_health = iwl_good_plcp_health,
|
||||||
|
+ .check_ack_health = iwl_good_ack_health,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl1000_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||||
|
index 6dd4328..dcca310 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||||
|
@@ -2217,7 +2217,7 @@ static struct iwl_lib_ops iwl4965_lib = {
|
||||||
|
.set_ct_kill = iwl4965_set_ct_threshold,
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
- .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
+ .check_plcp_health = iwl_good_plcp_health,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl4965_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||||
|
index 0c2469c..8e0dd13 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||||
|
@@ -1501,7 +1501,8 @@ struct iwl_lib_ops iwl5000_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
- .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
+ .check_plcp_health = iwl_good_plcp_health,
|
||||||
|
+ .check_ack_health = iwl_good_ack_health,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct iwl_lib_ops iwl5150_lib = {
|
||||||
|
@@ -1557,7 +1558,8 @@ static struct iwl_lib_ops iwl5150_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
- .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
+ .check_plcp_health = iwl_good_plcp_health,
|
||||||
|
+ .check_ack_health = iwl_good_ack_health,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl5000_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||||
|
index 189a8ce..1d4fea1 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||||
|
@@ -278,7 +278,8 @@ static struct iwl_lib_ops iwl6000_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
- .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
+ .check_plcp_health = iwl_good_plcp_health,
|
||||||
|
+ .check_ack_health = iwl_good_ack_health,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl6000_ops = {
|
||||||
|
@@ -345,7 +346,8 @@ static struct iwl_lib_ops iwl6050_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
- .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
+ .check_plcp_health = iwl_good_plcp_health,
|
||||||
|
+ .check_ack_health = iwl_good_ack_health,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl6050_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
index d67048e..5234a85 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
@@ -193,8 +193,11 @@ struct iwl_lib_ops {
|
||||||
|
void (*add_bcast_station)(struct iwl_priv *priv);
|
||||||
|
/* recover from tx queue stall */
|
||||||
|
void (*recover_from_tx_stall)(unsigned long data);
|
||||||
|
- /* recover from errors showed in statistics */
|
||||||
|
- void (*recover_from_statistics)(struct iwl_priv *priv,
|
||||||
|
+ /* check for plcp health */
|
||||||
|
+ bool (*check_plcp_health)(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt);
|
||||||
|
+ /* check for ack health */
|
||||||
|
+ bool (*check_ack_health)(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_packet *pkt);
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -438,7 +441,9 @@ void iwl_rx_missed_beacon_notif(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb);
|
||||||
|
void iwl_rx_spectrum_measure_notif(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb);
|
||||||
|
-void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
+bool iwl_good_plcp_health(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt);
|
||||||
|
+bool iwl_good_ack_health(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_packet *pkt);
|
||||||
|
void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb);
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
index f48d685..506ccf7 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
@@ -622,24 +622,18 @@ static void iwl_accumulative_statistics(struct iwl_priv *priv,
|
||||||
|
#define BA_TIMEOUT_CNT (5)
|
||||||
|
#define BA_TIMEOUT_MAX (16)
|
||||||
|
|
||||||
|
-#define PLCP_MSG "plcp_err exceeded %u, %u, %u, %u, %u, %d, %u mSecs\n"
|
||||||
|
-/*
|
||||||
|
- * This function checks for plcp error, ACK count ratios, aggregated BA
|
||||||
|
- * timeout retries.
|
||||||
|
- * - When the ACK count ratio is 0 and aggregated BA timeout retries is
|
||||||
|
- * exceeding the BA_TIMEOUT_MAX, it will recover the failure by resetting
|
||||||
|
- * the firmware.
|
||||||
|
- * - When the plcp error is exceeding the thresholds, it will reset the radio
|
||||||
|
- * to improve the throughput.
|
||||||
|
+/**
|
||||||
|
+ * iwl_good_ack_health - checks for ACK count ratios, BA timeout retries.
|
||||||
|
+ *
|
||||||
|
+ * When the ACK count ratio is 0 and aggregated BA timeout retries exceeding
|
||||||
|
+ * the BA_TIMEOUT_MAX, reload firmware and bring system back to normal
|
||||||
|
+ * operation state.
|
||||||
|
*/
|
||||||
|
-void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
- struct iwl_rx_packet *pkt)
|
||||||
|
+bool iwl_good_ack_health(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt)
|
||||||
|
{
|
||||||
|
- int combined_plcp_delta;
|
||||||
|
- unsigned int plcp_msec;
|
||||||
|
- unsigned long plcp_received_jiffies;
|
||||||
|
- int actual_ack_cnt_delta;
|
||||||
|
- int expected_ack_cnt_delta;
|
||||||
|
+ bool rc = true;
|
||||||
|
+ int actual_ack_cnt_delta, expected_ack_cnt_delta;
|
||||||
|
int ba_timeout_delta;
|
||||||
|
|
||||||
|
actual_ack_cnt_delta =
|
||||||
|
@@ -670,13 +664,27 @@ void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
#endif
|
||||||
|
IWL_DEBUG_RADIO(priv, "agg ba_timeout delta = %d\n",
|
||||||
|
ba_timeout_delta);
|
||||||
|
- if ((actual_ack_cnt_delta == 0) &&
|
||||||
|
- (ba_timeout_delta >= BA_TIMEOUT_MAX)) {
|
||||||
|
- IWL_DEBUG_RADIO(priv,
|
||||||
|
- "call iwl_force_reset(IWL_FW_RESET)\n");
|
||||||
|
- iwl_force_reset(priv, IWL_FW_RESET);
|
||||||
|
- }
|
||||||
|
+ if (!actual_ack_cnt_delta &&
|
||||||
|
+ (ba_timeout_delta >= BA_TIMEOUT_MAX))
|
||||||
|
+ rc = false;
|
||||||
|
}
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL(iwl_good_ack_health);
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * iwl_good_plcp_health - checks for plcp error.
|
||||||
|
+ *
|
||||||
|
+ * When the plcp error is exceeding the thresholds, reset the radio
|
||||||
|
+ * to improve the throughput.
|
||||||
|
+ */
|
||||||
|
+bool iwl_good_plcp_health(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt)
|
||||||
|
+{
|
||||||
|
+ bool rc = true;
|
||||||
|
+ int combined_plcp_delta;
|
||||||
|
+ unsigned int plcp_msec;
|
||||||
|
+ unsigned long plcp_received_jiffies;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* check for plcp_err and trigger radio reset if it exceeds
|
||||||
|
@@ -711,7 +719,8 @@ void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
* combined_plcp_delta,
|
||||||
|
* plcp_msec
|
||||||
|
*/
|
||||||
|
- IWL_DEBUG_RADIO(priv, PLCP_MSG,
|
||||||
|
+ IWL_DEBUG_RADIO(priv, "plcp_err exceeded %u, "
|
||||||
|
+ "%u, %u, %u, %u, %d, %u mSecs\n",
|
||||||
|
priv->cfg->plcp_delta_threshold,
|
||||||
|
le32_to_cpu(pkt->u.stats.rx.ofdm.plcp_err),
|
||||||
|
le32_to_cpu(priv->statistics.rx.ofdm.plcp_err),
|
||||||
|
@@ -719,15 +728,42 @@ void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
le32_to_cpu(
|
||||||
|
priv->statistics.rx.ofdm_ht.plcp_err),
|
||||||
|
combined_plcp_delta, plcp_msec);
|
||||||
|
- /*
|
||||||
|
- * Reset the RF radio due to the high plcp
|
||||||
|
- * error rate
|
||||||
|
- */
|
||||||
|
- iwl_force_reset(priv, IWL_RF_RESET);
|
||||||
|
+ rc = false;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL(iwl_good_plcp_health);
|
||||||
|
+
|
||||||
|
+static void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt)
|
||||||
|
+{
|
||||||
|
+ if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||||
|
+ return;
|
||||||
|
+ if (iwl_is_associated(priv)) {
|
||||||
|
+ if (priv->cfg->ops->lib->check_ack_health) {
|
||||||
|
+ if (!priv->cfg->ops->lib->check_ack_health(
|
||||||
|
+ priv, pkt)) {
|
||||||
|
+ /*
|
||||||
|
+ * low ack count detected
|
||||||
|
+ * restart Firmware
|
||||||
|
+ */
|
||||||
|
+ IWL_ERR(priv, "low ack count detected, "
|
||||||
|
+ "restart firmware\n");
|
||||||
|
+ iwl_force_reset(priv, IWL_FW_RESET);
|
||||||
|
+ }
|
||||||
|
+ } else if (priv->cfg->ops->lib->check_plcp_health) {
|
||||||
|
+ if (!priv->cfg->ops->lib->check_plcp_health(
|
||||||
|
+ priv, pkt)) {
|
||||||
|
+ /*
|
||||||
|
+ * high plcp error detected
|
||||||
|
+ * reset Radio
|
||||||
|
+ */
|
||||||
|
+ iwl_force_reset(priv, IWL_RF_RESET);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
-EXPORT_SYMBOL(iwl_recover_from_statistics);
|
||||||
|
|
||||||
|
void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb)
|
||||||
|
@@ -749,8 +785,7 @@ void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
iwl_accumulative_statistics(priv, (__le32 *)&pkt->u.stats);
|
||||||
|
#endif
|
||||||
|
- if (priv->cfg->ops->lib->recover_from_statistics)
|
||||||
|
- priv->cfg->ops->lib->recover_from_statistics(priv, pkt);
|
||||||
|
+ iwl_recover_from_statistics(priv, pkt);
|
||||||
|
|
||||||
|
memcpy(&priv->statistics, &pkt->u.stats, sizeof(priv->statistics));
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,150 @@
|
||||||
|
From 8ac33071b4c991e302be67fd0dae1d9cc4b502e3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Date: Tue, 16 Mar 2010 10:46:31 -0700
|
||||||
|
Subject: [PATCH] iwlwifi: iwl_good_ack_health() only apply to AGN device
|
||||||
|
|
||||||
|
iwl_good_ack_health() check for expected and actual ack count which only
|
||||||
|
apply to aggregation mode. Move the function to iwlagn module.
|
||||||
|
|
||||||
|
Reported-by: Chantry Xavier <chantry.xavier@gmail.com>
|
||||||
|
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||||
|
---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-agn.c | 54 +++++++++++++++++++++++++++++++
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-rx.c | 55 --------------------------------
|
||||||
|
2 files changed, 54 insertions(+), 55 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
index dc751cb..b5d410b 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
@@ -1448,6 +1448,60 @@ static void iwl_irq_tasklet(struct iwl_priv *priv)
|
||||||
|
iwl_enable_interrupts(priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* the threshold ratio of actual_ack_cnt to expected_ack_cnt in percent */
|
||||||
|
+#define ACK_CNT_RATIO (50)
|
||||||
|
+#define BA_TIMEOUT_CNT (5)
|
||||||
|
+#define BA_TIMEOUT_MAX (16)
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * iwl_good_ack_health - checks for ACK count ratios, BA timeout retries.
|
||||||
|
+ *
|
||||||
|
+ * When the ACK count ratio is 0 and aggregated BA timeout retries exceeding
|
||||||
|
+ * the BA_TIMEOUT_MAX, reload firmware and bring system back to normal
|
||||||
|
+ * operation state.
|
||||||
|
+ */
|
||||||
|
+bool iwl_good_ack_health(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt)
|
||||||
|
+{
|
||||||
|
+ bool rc = true;
|
||||||
|
+ int actual_ack_cnt_delta, expected_ack_cnt_delta;
|
||||||
|
+ int ba_timeout_delta;
|
||||||
|
+
|
||||||
|
+ actual_ack_cnt_delta =
|
||||||
|
+ le32_to_cpu(pkt->u.stats.tx.actual_ack_cnt) -
|
||||||
|
+ le32_to_cpu(priv->statistics.tx.actual_ack_cnt);
|
||||||
|
+ expected_ack_cnt_delta =
|
||||||
|
+ le32_to_cpu(pkt->u.stats.tx.expected_ack_cnt) -
|
||||||
|
+ le32_to_cpu(priv->statistics.tx.expected_ack_cnt);
|
||||||
|
+ ba_timeout_delta =
|
||||||
|
+ le32_to_cpu(pkt->u.stats.tx.agg.ba_timeout) -
|
||||||
|
+ le32_to_cpu(priv->statistics.tx.agg.ba_timeout);
|
||||||
|
+ if ((priv->_agn.agg_tids_count > 0) &&
|
||||||
|
+ (expected_ack_cnt_delta > 0) &&
|
||||||
|
+ (((actual_ack_cnt_delta * 100) / expected_ack_cnt_delta)
|
||||||
|
+ < ACK_CNT_RATIO) &&
|
||||||
|
+ (ba_timeout_delta > BA_TIMEOUT_CNT)) {
|
||||||
|
+ IWL_DEBUG_RADIO(priv, "actual_ack_cnt delta = %d,"
|
||||||
|
+ " expected_ack_cnt = %d\n",
|
||||||
|
+ actual_ack_cnt_delta, expected_ack_cnt_delta);
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
+ IWL_DEBUG_RADIO(priv, "rx_detected_cnt delta = %d\n",
|
||||||
|
+ priv->delta_statistics.tx.rx_detected_cnt);
|
||||||
|
+ IWL_DEBUG_RADIO(priv,
|
||||||
|
+ "ack_or_ba_timeout_collision delta = %d\n",
|
||||||
|
+ priv->delta_statistics.tx.
|
||||||
|
+ ack_or_ba_timeout_collision);
|
||||||
|
+#endif
|
||||||
|
+ IWL_DEBUG_RADIO(priv, "agg ba_timeout delta = %d\n",
|
||||||
|
+ ba_timeout_delta);
|
||||||
|
+ if (!actual_ack_cnt_delta &&
|
||||||
|
+ (ba_timeout_delta >= BA_TIMEOUT_MAX))
|
||||||
|
+ rc = false;
|
||||||
|
+ }
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
index 506ccf7..def5042 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
@@ -617,61 +617,6 @@ static void iwl_accumulative_statistics(struct iwl_priv *priv,
|
||||||
|
|
||||||
|
#define REG_RECALIB_PERIOD (60)
|
||||||
|
|
||||||
|
-/* the threshold ratio of actual_ack_cnt to expected_ack_cnt in percent */
|
||||||
|
-#define ACK_CNT_RATIO (50)
|
||||||
|
-#define BA_TIMEOUT_CNT (5)
|
||||||
|
-#define BA_TIMEOUT_MAX (16)
|
||||||
|
-
|
||||||
|
-/**
|
||||||
|
- * iwl_good_ack_health - checks for ACK count ratios, BA timeout retries.
|
||||||
|
- *
|
||||||
|
- * When the ACK count ratio is 0 and aggregated BA timeout retries exceeding
|
||||||
|
- * the BA_TIMEOUT_MAX, reload firmware and bring system back to normal
|
||||||
|
- * operation state.
|
||||||
|
- */
|
||||||
|
-bool iwl_good_ack_health(struct iwl_priv *priv,
|
||||||
|
- struct iwl_rx_packet *pkt)
|
||||||
|
-{
|
||||||
|
- bool rc = true;
|
||||||
|
- int actual_ack_cnt_delta, expected_ack_cnt_delta;
|
||||||
|
- int ba_timeout_delta;
|
||||||
|
-
|
||||||
|
- actual_ack_cnt_delta =
|
||||||
|
- le32_to_cpu(pkt->u.stats.tx.actual_ack_cnt) -
|
||||||
|
- le32_to_cpu(priv->statistics.tx.actual_ack_cnt);
|
||||||
|
- expected_ack_cnt_delta =
|
||||||
|
- le32_to_cpu(pkt->u.stats.tx.expected_ack_cnt) -
|
||||||
|
- le32_to_cpu(priv->statistics.tx.expected_ack_cnt);
|
||||||
|
- ba_timeout_delta =
|
||||||
|
- le32_to_cpu(pkt->u.stats.tx.agg.ba_timeout) -
|
||||||
|
- le32_to_cpu(priv->statistics.tx.agg.ba_timeout);
|
||||||
|
- if ((priv->_agn.agg_tids_count > 0) &&
|
||||||
|
- (expected_ack_cnt_delta > 0) &&
|
||||||
|
- (((actual_ack_cnt_delta * 100) / expected_ack_cnt_delta)
|
||||||
|
- < ACK_CNT_RATIO) &&
|
||||||
|
- (ba_timeout_delta > BA_TIMEOUT_CNT)) {
|
||||||
|
- IWL_DEBUG_RADIO(priv, "actual_ack_cnt delta = %d,"
|
||||||
|
- " expected_ack_cnt = %d\n",
|
||||||
|
- actual_ack_cnt_delta, expected_ack_cnt_delta);
|
||||||
|
-
|
||||||
|
-#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
- IWL_DEBUG_RADIO(priv, "rx_detected_cnt delta = %d\n",
|
||||||
|
- priv->delta_statistics.tx.rx_detected_cnt);
|
||||||
|
- IWL_DEBUG_RADIO(priv,
|
||||||
|
- "ack_or_ba_timeout_collision delta = %d\n",
|
||||||
|
- priv->delta_statistics.tx.
|
||||||
|
- ack_or_ba_timeout_collision);
|
||||||
|
-#endif
|
||||||
|
- IWL_DEBUG_RADIO(priv, "agg ba_timeout delta = %d\n",
|
||||||
|
- ba_timeout_delta);
|
||||||
|
- if (!actual_ack_cnt_delta &&
|
||||||
|
- (ba_timeout_delta >= BA_TIMEOUT_MAX))
|
||||||
|
- rc = false;
|
||||||
|
- }
|
||||||
|
- return rc;
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(iwl_good_ack_health);
|
||||||
|
-
|
||||||
|
/**
|
||||||
|
* iwl_good_plcp_health - checks for plcp error.
|
||||||
|
*
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,361 @@
|
||||||
|
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||||
|
To: kernel@lists.fedoraproject.org, "John W. Linville" <linville@redhat.com>
|
||||||
|
Subject: [PATCH 2/4 2.6.34.y] iwlwifi: manage QoS by mac stack
|
||||||
|
Date: Fri, 11 Jun 2010 17:05:12 +0200
|
||||||
|
|
||||||
|
commit e61146e36b40fd9d346118c40285913236c329f3 upstream.
|
||||||
|
|
||||||
|
We activate/deactivate QoS and setup default queue parameters in iwlwifi
|
||||||
|
driver. Mac stack do the same, so we do not need repeat that work here.
|
||||||
|
Stack also will tell when disable QoS, this will fix driver when working
|
||||||
|
with older APs, that do not have QoS implemented.
|
||||||
|
|
||||||
|
Patch make "force = true" in iwl_active_qos() assuming we always want
|
||||||
|
to do with QoS what mac stack wish.
|
||||||
|
|
||||||
|
Patch also remove unused qos_cap bits, do not initialize qos_active = 0,
|
||||||
|
as we have it initialized to zero by kzalloc.
|
||||||
|
|
||||||
|
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-agn.c | 15 ---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-core.c | 142 +++------------------------
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-core.h | 3 +-
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-dev.h | 21 ----
|
||||||
|
drivers/net/wireless/iwlwifi/iwl3945-base.c | 7 --
|
||||||
|
5 files changed, 17 insertions(+), 171 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
index bdff565..21c3ef0 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
@@ -2515,7 +2515,6 @@ void iwl_post_associate(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
struct ieee80211_conf *conf = NULL;
|
||||||
|
int ret = 0;
|
||||||
|
- unsigned long flags;
|
||||||
|
|
||||||
|
if (priv->iw_mode == NL80211_IFTYPE_AP) {
|
||||||
|
IWL_ERR(priv, "%s Should not be called in AP mode\n", __func__);
|
||||||
|
@@ -2600,10 +2599,6 @@ void iwl_post_associate(struct iwl_priv *priv)
|
||||||
|
if (priv->iw_mode == NL80211_IFTYPE_ADHOC)
|
||||||
|
priv->assoc_station_added = 1;
|
||||||
|
|
||||||
|
- spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
- iwl_activate_qos(priv, 0);
|
||||||
|
- spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
-
|
||||||
|
/* the chain noise calibration will enabled PM upon completion
|
||||||
|
* If chain noise has already been run, then we need to enable
|
||||||
|
* power management here */
|
||||||
|
@@ -2780,7 +2775,6 @@ static int iwl_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||||
|
void iwl_config_ap(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
- unsigned long flags;
|
||||||
|
|
||||||
|
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||||
|
return;
|
||||||
|
@@ -2832,10 +2826,6 @@ void iwl_config_ap(struct iwl_priv *priv)
|
||||||
|
/* restore RXON assoc */
|
||||||
|
priv->staging_rxon.filter_flags |= RXON_FILTER_ASSOC_MSK;
|
||||||
|
iwlcore_commit_rxon(priv);
|
||||||
|
- iwl_reset_qos(priv);
|
||||||
|
- spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
- iwl_activate_qos(priv, 1);
|
||||||
|
- spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
iwl_add_bcast_station(priv);
|
||||||
|
}
|
||||||
|
iwl_send_beacon_cmd(priv);
|
||||||
|
@@ -3396,11 +3386,6 @@ static int iwl_init_drv(struct iwl_priv *priv)
|
||||||
|
|
||||||
|
iwl_init_scan_params(priv);
|
||||||
|
|
||||||
|
- iwl_reset_qos(priv);
|
||||||
|
-
|
||||||
|
- priv->qos_data.qos_active = 0;
|
||||||
|
- priv->qos_data.qos_cap.val = 0;
|
||||||
|
-
|
||||||
|
priv->rates_mask = IWL_RATES_MASK;
|
||||||
|
/* Set the tx_power_user_lmt to the lowest power level
|
||||||
|
* this value will get overwritten by channel max power avg
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||||
|
index 049b652..2dd8aaa 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||||
|
@@ -325,17 +325,13 @@ EXPORT_SYMBOL(iwl_hw_nic_init);
|
||||||
|
/*
|
||||||
|
* QoS support
|
||||||
|
*/
|
||||||
|
-void iwl_activate_qos(struct iwl_priv *priv, u8 force)
|
||||||
|
+static void iwl_update_qos(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||||
|
return;
|
||||||
|
|
||||||
|
priv->qos_data.def_qos_parm.qos_flags = 0;
|
||||||
|
|
||||||
|
- if (priv->qos_data.qos_cap.q_AP.queue_request &&
|
||||||
|
- !priv->qos_data.qos_cap.q_AP.txop_request)
|
||||||
|
- priv->qos_data.def_qos_parm.qos_flags |=
|
||||||
|
- QOS_PARAM_FLG_TXOP_TYPE_MSK;
|
||||||
|
if (priv->qos_data.qos_active)
|
||||||
|
priv->qos_data.def_qos_parm.qos_flags |=
|
||||||
|
QOS_PARAM_FLG_UPDATE_EDCA_MSK;
|
||||||
|
@@ -343,118 +339,14 @@ void iwl_activate_qos(struct iwl_priv *priv, u8 force)
|
||||||
|
if (priv->current_ht_config.is_ht)
|
||||||
|
priv->qos_data.def_qos_parm.qos_flags |= QOS_PARAM_FLG_TGN_MSK;
|
||||||
|
|
||||||
|
- if (force || iwl_is_associated(priv)) {
|
||||||
|
- IWL_DEBUG_QOS(priv, "send QoS cmd with Qos active=%d FLAGS=0x%X\n",
|
||||||
|
- priv->qos_data.qos_active,
|
||||||
|
- priv->qos_data.def_qos_parm.qos_flags);
|
||||||
|
+ IWL_DEBUG_QOS(priv, "send QoS cmd with Qos active=%d FLAGS=0x%X\n",
|
||||||
|
+ priv->qos_data.qos_active,
|
||||||
|
+ priv->qos_data.def_qos_parm.qos_flags);
|
||||||
|
|
||||||
|
- iwl_send_cmd_pdu_async(priv, REPLY_QOS_PARAM,
|
||||||
|
- sizeof(struct iwl_qosparam_cmd),
|
||||||
|
- &priv->qos_data.def_qos_parm, NULL);
|
||||||
|
- }
|
||||||
|
+ iwl_send_cmd_pdu_async(priv, REPLY_QOS_PARAM,
|
||||||
|
+ sizeof(struct iwl_qosparam_cmd),
|
||||||
|
+ &priv->qos_data.def_qos_parm, NULL);
|
||||||
|
}
|
||||||
|
-EXPORT_SYMBOL(iwl_activate_qos);
|
||||||
|
-
|
||||||
|
-/*
|
||||||
|
- * AC CWmin CW max AIFSN TXOP Limit TXOP Limit
|
||||||
|
- * (802.11b) (802.11a/g)
|
||||||
|
- * AC_BK 15 1023 7 0 0
|
||||||
|
- * AC_BE 15 1023 3 0 0
|
||||||
|
- * AC_VI 7 15 2 6.016ms 3.008ms
|
||||||
|
- * AC_VO 3 7 2 3.264ms 1.504ms
|
||||||
|
- */
|
||||||
|
-void iwl_reset_qos(struct iwl_priv *priv)
|
||||||
|
-{
|
||||||
|
- u16 cw_min = 15;
|
||||||
|
- u16 cw_max = 1023;
|
||||||
|
- u8 aifs = 2;
|
||||||
|
- bool is_legacy = false;
|
||||||
|
- unsigned long flags;
|
||||||
|
- int i;
|
||||||
|
-
|
||||||
|
- spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
- /* QoS always active in AP and ADHOC mode
|
||||||
|
- * In STA mode wait for association
|
||||||
|
- */
|
||||||
|
- if (priv->iw_mode == NL80211_IFTYPE_ADHOC ||
|
||||||
|
- priv->iw_mode == NL80211_IFTYPE_AP)
|
||||||
|
- priv->qos_data.qos_active = 1;
|
||||||
|
- else
|
||||||
|
- priv->qos_data.qos_active = 0;
|
||||||
|
-
|
||||||
|
- /* check for legacy mode */
|
||||||
|
- if ((priv->iw_mode == NL80211_IFTYPE_ADHOC &&
|
||||||
|
- (priv->active_rate & IWL_OFDM_RATES_MASK) == 0) ||
|
||||||
|
- (priv->iw_mode == NL80211_IFTYPE_STATION &&
|
||||||
|
- (priv->staging_rxon.flags & RXON_FLG_SHORT_SLOT_MSK) == 0)) {
|
||||||
|
- cw_min = 31;
|
||||||
|
- is_legacy = 1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (priv->qos_data.qos_active)
|
||||||
|
- aifs = 3;
|
||||||
|
-
|
||||||
|
- /* AC_BE */
|
||||||
|
- priv->qos_data.def_qos_parm.ac[0].cw_min = cpu_to_le16(cw_min);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[0].cw_max = cpu_to_le16(cw_max);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[0].aifsn = aifs;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[0].edca_txop = 0;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[0].reserved1 = 0;
|
||||||
|
-
|
||||||
|
- if (priv->qos_data.qos_active) {
|
||||||
|
- /* AC_BK */
|
||||||
|
- i = 1;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_min = cpu_to_le16(cw_min);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_max = cpu_to_le16(cw_max);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].aifsn = 7;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop = 0;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
|
||||||
|
-
|
||||||
|
- /* AC_VI */
|
||||||
|
- i = 2;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_min =
|
||||||
|
- cpu_to_le16((cw_min + 1) / 2 - 1);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_max =
|
||||||
|
- cpu_to_le16(cw_min);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].aifsn = 2;
|
||||||
|
- if (is_legacy)
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop =
|
||||||
|
- cpu_to_le16(6016);
|
||||||
|
- else
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop =
|
||||||
|
- cpu_to_le16(3008);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
|
||||||
|
-
|
||||||
|
- /* AC_VO */
|
||||||
|
- i = 3;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_min =
|
||||||
|
- cpu_to_le16((cw_min + 1) / 4 - 1);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_max =
|
||||||
|
- cpu_to_le16((cw_min + 1) / 2 - 1);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].aifsn = 2;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
|
||||||
|
- if (is_legacy)
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop =
|
||||||
|
- cpu_to_le16(3264);
|
||||||
|
- else
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop =
|
||||||
|
- cpu_to_le16(1504);
|
||||||
|
- } else {
|
||||||
|
- for (i = 1; i < 4; i++) {
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_min =
|
||||||
|
- cpu_to_le16(cw_min);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_max =
|
||||||
|
- cpu_to_le16(cw_max);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].aifsn = aifs;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop = 0;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- IWL_DEBUG_QOS(priv, "set QoS to default \n");
|
||||||
|
-
|
||||||
|
- spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(iwl_reset_qos);
|
||||||
|
|
||||||
|
#define MAX_BIT_RATE_40_MHZ 150 /* Mbps */
|
||||||
|
#define MAX_BIT_RATE_20_MHZ 72 /* Mbps */
|
||||||
|
@@ -2306,12 +2198,6 @@ int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue,
|
||||||
|
cpu_to_le16((params->txop * 32));
|
||||||
|
|
||||||
|
priv->qos_data.def_qos_parm.ac[q].reserved1 = 0;
|
||||||
|
- priv->qos_data.qos_active = 1;
|
||||||
|
-
|
||||||
|
- if (priv->iw_mode == NL80211_IFTYPE_AP)
|
||||||
|
- iwl_activate_qos(priv, 1);
|
||||||
|
- else if (priv->assoc_id && iwl_is_associated(priv))
|
||||||
|
- iwl_activate_qos(priv, 0);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
|
||||||
|
@@ -2587,11 +2473,8 @@ int iwl_mac_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||||
|
IWL_DEBUG_MAC80211(priv, "leave\n");
|
||||||
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
|
||||||
|
- iwl_reset_qos(priv);
|
||||||
|
-
|
||||||
|
priv->cfg->ops->lib->post_associate(priv);
|
||||||
|
|
||||||
|
-
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(iwl_mac_beacon_update);
|
||||||
|
@@ -2833,6 +2716,15 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
|
||||||
|
iwl_set_tx_power(priv, conf->power_level, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (changed & IEEE80211_CONF_CHANGE_QOS) {
|
||||||
|
+ bool qos_active = !!(conf->flags & IEEE80211_CONF_QOS);
|
||||||
|
+
|
||||||
|
+ spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
+ priv->qos_data.qos_active = qos_active;
|
||||||
|
+ iwl_update_qos(priv);
|
||||||
|
+ spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (!iwl_is_ready(priv)) {
|
||||||
|
IWL_DEBUG_MAC80211(priv, "leave - not ready\n");
|
||||||
|
goto out;
|
||||||
|
@@ -2867,8 +2759,6 @@ void iwl_mac_reset_tsf(struct ieee80211_hw *hw)
|
||||||
|
memset(&priv->current_ht_config, 0, sizeof(struct iwl_ht_config));
|
||||||
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
|
||||||
|
- iwl_reset_qos(priv);
|
||||||
|
-
|
||||||
|
spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
priv->assoc_id = 0;
|
||||||
|
priv->assoc_capability = 0;
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
index 36940a9..70af968 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
@@ -304,8 +304,7 @@ struct iwl_cfg {
|
||||||
|
struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg,
|
||||||
|
struct ieee80211_ops *hw_ops);
|
||||||
|
void iwl_hw_detect(struct iwl_priv *priv);
|
||||||
|
-void iwl_reset_qos(struct iwl_priv *priv);
|
||||||
|
-void iwl_activate_qos(struct iwl_priv *priv, u8 force);
|
||||||
|
+void iwl_activate_qos(struct iwl_priv *priv);
|
||||||
|
int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue,
|
||||||
|
const struct ieee80211_tx_queue_params *params);
|
||||||
|
void iwl_set_rxon_hwcrypto(struct iwl_priv *priv, int hw_decrypt);
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
index ef1720a..cc12e89 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
@@ -519,30 +519,9 @@ struct iwl_ht_config {
|
||||||
|
u8 non_GF_STA_present;
|
||||||
|
};
|
||||||
|
|
||||||
|
-union iwl_qos_capabity {
|
||||||
|
- struct {
|
||||||
|
- u8 edca_count:4; /* bit 0-3 */
|
||||||
|
- u8 q_ack:1; /* bit 4 */
|
||||||
|
- u8 queue_request:1; /* bit 5 */
|
||||||
|
- u8 txop_request:1; /* bit 6 */
|
||||||
|
- u8 reserved:1; /* bit 7 */
|
||||||
|
- } q_AP;
|
||||||
|
- struct {
|
||||||
|
- u8 acvo_APSD:1; /* bit 0 */
|
||||||
|
- u8 acvi_APSD:1; /* bit 1 */
|
||||||
|
- u8 ac_bk_APSD:1; /* bit 2 */
|
||||||
|
- u8 ac_be_APSD:1; /* bit 3 */
|
||||||
|
- u8 q_ack:1; /* bit 4 */
|
||||||
|
- u8 max_len:2; /* bit 5-6 */
|
||||||
|
- u8 more_data_ack:1; /* bit 7 */
|
||||||
|
- } q_STA;
|
||||||
|
- u8 val;
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
/* QoS structures */
|
||||||
|
struct iwl_qos_info {
|
||||||
|
int qos_active;
|
||||||
|
- union iwl_qos_capabity qos_cap;
|
||||||
|
struct iwl_qosparam_cmd def_qos_parm;
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
index b74a56c..c054527 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
@@ -3152,8 +3152,6 @@ void iwl3945_post_associate(struct iwl_priv *priv)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- iwl_activate_qos(priv, 0);
|
||||||
|
-
|
||||||
|
/* we have just associated, don't start scan too early */
|
||||||
|
priv->next_scan_jiffies = jiffies + IWL_DELAY_NEXT_SCAN;
|
||||||
|
}
|
||||||
|
@@ -3861,11 +3859,6 @@ static int iwl3945_init_drv(struct iwl_priv *priv)
|
||||||
|
priv->iw_mode = NL80211_IFTYPE_STATION;
|
||||||
|
priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF;
|
||||||
|
|
||||||
|
- iwl_reset_qos(priv);
|
||||||
|
-
|
||||||
|
- priv->qos_data.qos_active = 0;
|
||||||
|
- priv->qos_data.qos_cap.val = 0;
|
||||||
|
-
|
||||||
|
priv->rates_mask = IWL_RATES_MASK;
|
||||||
|
priv->tx_power_user_lmt = IWL_DEFAULT_TX_POWER;
|
||||||
|
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
||||||
|
_______________________________________________
|
||||||
|
kernel mailing list
|
||||||
|
kernel@lists.fedoraproject.org
|
||||||
|
https://admin.fedoraproject.org/mailman/listinfo/kernel
|
||||||
|
|
|
@ -0,0 +1,208 @@
|
||||||
|
From b3786de4e1033b00d522a5c457a3ea9f8376d0d0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Date: Thu, 4 Mar 2010 13:38:58 -0800
|
||||||
|
Subject: [PATCH] iwlwifi: move plcp check to separated function
|
||||||
|
|
||||||
|
Move the plcp error checking into stand alone function and pointed by ops
|
||||||
|
to accommodate devices not needing this recovery.
|
||||||
|
|
||||||
|
Signed-off-by: Trieu 'Andrew' Nguyen <trieux.t.nguyen@intel.com>
|
||||||
|
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
||||||
|
---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-1000.c | 1 +
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-4965.c | 1 +
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-5000.c | 2 +
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-6000.c | 2 +
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-core.h | 5 +++
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-rx.c | 58 +++++++++++++++++++------------
|
||||||
|
6 files changed, 47 insertions(+), 22 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||||
|
index 89dc401..2597574 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-1000.c
|
||||||
|
@@ -212,6 +212,7 @@ static struct iwl_lib_ops iwl1000_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl1000_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||||
|
index aa49a6e..6dd4328 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
|
||||||
|
@@ -2217,6 +2217,7 @@ static struct iwl_lib_ops iwl4965_lib = {
|
||||||
|
.set_ct_kill = iwl4965_set_ct_threshold,
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl4965_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||||
|
index d05fad4..0c2469c 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
|
||||||
|
@@ -1501,6 +1501,7 @@ struct iwl_lib_ops iwl5000_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct iwl_lib_ops iwl5150_lib = {
|
||||||
|
@@ -1556,6 +1557,7 @@ static struct iwl_lib_ops iwl5150_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl5000_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||||
|
index 0c965cd..189a8ce 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
|
||||||
|
@@ -278,6 +278,7 @@ static struct iwl_lib_ops iwl6000_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl6000_ops = {
|
||||||
|
@@ -344,6 +345,7 @@ static struct iwl_lib_ops iwl6050_lib = {
|
||||||
|
},
|
||||||
|
.add_bcast_station = iwl_add_bcast_station,
|
||||||
|
.recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
+ .recover_from_statistics = iwl_recover_from_statistics,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iwl_ops iwl6050_ops = {
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
index 9076576..d67048e 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
@@ -193,6 +193,9 @@ struct iwl_lib_ops {
|
||||||
|
void (*add_bcast_station)(struct iwl_priv *priv);
|
||||||
|
/* recover from tx queue stall */
|
||||||
|
void (*recover_from_tx_stall)(unsigned long data);
|
||||||
|
+ /* recover from errors showed in statistics */
|
||||||
|
+ void (*recover_from_statistics)(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iwl_led_ops {
|
||||||
|
@@ -435,6 +438,8 @@ void iwl_rx_missed_beacon_notif(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb);
|
||||||
|
void iwl_rx_spectrum_measure_notif(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb);
|
||||||
|
+void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt);
|
||||||
|
void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb);
|
||||||
|
void iwl_reply_statistics(struct iwl_priv *priv,
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
index e5eb339..fabc52f 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
|
||||||
|
@@ -618,28 +618,18 @@ static void iwl_accumulative_statistics(struct iwl_priv *priv,
|
||||||
|
#define REG_RECALIB_PERIOD (60)
|
||||||
|
|
||||||
|
#define PLCP_MSG "plcp_err exceeded %u, %u, %u, %u, %u, %d, %u mSecs\n"
|
||||||
|
-void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
- struct iwl_rx_mem_buffer *rxb)
|
||||||
|
+/*
|
||||||
|
+ * This function checks for plcp error.
|
||||||
|
+ * - When the plcp error is exceeding the thresholds, it will reset the radio
|
||||||
|
+ * to improve the throughput.
|
||||||
|
+ */
|
||||||
|
+void iwl_recover_from_statistics(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_packet *pkt)
|
||||||
|
{
|
||||||
|
- int change;
|
||||||
|
- struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
||||||
|
int combined_plcp_delta;
|
||||||
|
unsigned int plcp_msec;
|
||||||
|
unsigned long plcp_received_jiffies;
|
||||||
|
|
||||||
|
- IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n",
|
||||||
|
- (int)sizeof(priv->statistics),
|
||||||
|
- le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK);
|
||||||
|
-
|
||||||
|
- change = ((priv->statistics.general.temperature !=
|
||||||
|
- pkt->u.stats.general.temperature) ||
|
||||||
|
- ((priv->statistics.flag &
|
||||||
|
- STATISTICS_REPLY_FLG_HT40_MODE_MSK) !=
|
||||||
|
- (pkt->u.stats.flag & STATISTICS_REPLY_FLG_HT40_MODE_MSK)));
|
||||||
|
-
|
||||||
|
-#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
- iwl_accumulative_statistics(priv, (__le32 *)&pkt->u.stats);
|
||||||
|
-#endif
|
||||||
|
/*
|
||||||
|
* check for plcp_err and trigger radio reset if it exceeds
|
||||||
|
* the plcp error threshold plcp_delta.
|
||||||
|
@@ -660,11 +650,11 @@ void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
le32_to_cpu(priv->statistics.rx.ofdm_ht.plcp_err));
|
||||||
|
|
||||||
|
if ((combined_plcp_delta > 0) &&
|
||||||
|
- ((combined_plcp_delta * 100) / plcp_msec) >
|
||||||
|
+ ((combined_plcp_delta * 100) / plcp_msec) >
|
||||||
|
priv->cfg->plcp_delta_threshold) {
|
||||||
|
/*
|
||||||
|
- * if plcp_err exceed the threshold, the following
|
||||||
|
- * data is printed in csv format:
|
||||||
|
+ * if plcp_err exceed the threshold,
|
||||||
|
+ * the following data is printed in csv format:
|
||||||
|
* Text: plcp_err exceeded %d,
|
||||||
|
* Received ofdm.plcp_err,
|
||||||
|
* Current ofdm.plcp_err,
|
||||||
|
@@ -679,9 +669,8 @@ void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
le32_to_cpu(priv->statistics.rx.ofdm.plcp_err),
|
||||||
|
le32_to_cpu(pkt->u.stats.rx.ofdm_ht.plcp_err),
|
||||||
|
le32_to_cpu(
|
||||||
|
- priv->statistics.rx.ofdm_ht.plcp_err),
|
||||||
|
+ priv->statistics.rx.ofdm_ht.plcp_err),
|
||||||
|
combined_plcp_delta, plcp_msec);
|
||||||
|
-
|
||||||
|
/*
|
||||||
|
* Reset the RF radio due to the high plcp
|
||||||
|
* error rate
|
||||||
|
@@ -689,6 +678,31 @@ void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
iwl_force_reset(priv, IWL_RF_RESET);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL(iwl_recover_from_statistics);
|
||||||
|
+
|
||||||
|
+void iwl_rx_statistics(struct iwl_priv *priv,
|
||||||
|
+ struct iwl_rx_mem_buffer *rxb)
|
||||||
|
+{
|
||||||
|
+ int change;
|
||||||
|
+ struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n",
|
||||||
|
+ (int)sizeof(priv->statistics),
|
||||||
|
+ le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK);
|
||||||
|
+
|
||||||
|
+ change = ((priv->statistics.general.temperature !=
|
||||||
|
+ pkt->u.stats.general.temperature) ||
|
||||||
|
+ ((priv->statistics.flag &
|
||||||
|
+ STATISTICS_REPLY_FLG_HT40_MODE_MSK) !=
|
||||||
|
+ (pkt->u.stats.flag & STATISTICS_REPLY_FLG_HT40_MODE_MSK)));
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
+ iwl_accumulative_statistics(priv, (__le32 *)&pkt->u.stats);
|
||||||
|
+#endif
|
||||||
|
+ if (priv->cfg->ops->lib->recover_from_statistics)
|
||||||
|
+ priv->cfg->ops->lib->recover_from_statistics(priv, pkt);
|
||||||
|
|
||||||
|
memcpy(&priv->statistics, &pkt->u.stats, sizeof(priv->statistics));
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c
|
||||||
|
index 0728054..ae43a43 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-3945.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-3945.c
|
||||||
|
@@ -2792,6 +2792,7 @@ static struct iwl_lib_ops iwl3945_lib = {
|
||||||
|
.isr = iwl_isr_legacy,
|
||||||
|
.config_ap = iwl3945_config_ap,
|
||||||
|
.add_bcast_station = iwl3945_add_bcast_station,
|
||||||
|
+ .recover_from_tx_stall = iwl_bg_monitor_recover,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct iwl_hcmd_utils_ops iwl3945_hcmd_utils = {
|
|
@ -0,0 +1,43 @@
|
||||||
|
From: Krzysztof Halasa <khc@pm.waw.pl>
|
||||||
|
Date: Thu, 10 Jun 2010 23:08:20 +0000 (+0200)
|
||||||
|
Subject: kbuild: Fix modpost segfault
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=1c938663d58b5b2965976a6f54cc51b5d6f691aa
|
||||||
|
|
||||||
|
kbuild: Fix modpost segfault
|
||||||
|
|
||||||
|
Alan <alan@clueserver.org> writes:
|
||||||
|
|
||||||
|
> program: /home/alan/GitTrees/linux-2.6-mid-ref/scripts/mod/modpost -o
|
||||||
|
> Module.symvers -S vmlinux.o
|
||||||
|
>
|
||||||
|
> Program received signal SIGSEGV, Segmentation fault.
|
||||||
|
|
||||||
|
It just hit me.
|
||||||
|
It's the offset calculation in reloc_location() which overflows:
|
||||||
|
return (void *)elf->hdr + sechdrs[section].sh_offset +
|
||||||
|
(r->r_offset - sechdrs[section].sh_addr);
|
||||||
|
|
||||||
|
E.g. for the first rodata r entry:
|
||||||
|
r->r_offset < sechdrs[section].sh_addr
|
||||||
|
and the expression in the parenthesis produces 0xFFFFFFE0 or something
|
||||||
|
equally wise.
|
||||||
|
|
||||||
|
Reported-by: Alan <alan@clueserver.org>
|
||||||
|
Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
|
||||||
|
Tested-by: Alan <alan@clueserver.org>
|
||||||
|
Signed-off-by: Michal Marek <mmarek@suse.cz>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
|
||||||
|
index 3318692..f877900 100644
|
||||||
|
--- a/scripts/mod/modpost.c
|
||||||
|
+++ b/scripts/mod/modpost.c
|
||||||
|
@@ -1342,7 +1342,7 @@ static unsigned int *reloc_location(struct elf_info *elf,
|
||||||
|
int section = sechdr->sh_info;
|
||||||
|
|
||||||
|
return (void *)elf->hdr + sechdrs[section].sh_offset +
|
||||||
|
- (r->r_offset - sechdrs[section].sh_addr);
|
||||||
|
+ r->r_offset - sechdrs[section].sh_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,49 @@
|
||||||
|
From: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
|
||||||
|
Date: Wed, 30 Jun 2010 08:02:45 +0000 (+0800)
|
||||||
|
Subject: KVM: MMU: fix conflict access permissions in direct sp
|
||||||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=6aa0b9dec5d6dde26ea17b0b5be8fccfe19df3c9
|
||||||
|
|
||||||
|
KVM: MMU: fix conflict access permissions in direct sp
|
||||||
|
|
||||||
|
In no-direct mapping, we mark sp is 'direct' when we mapping the
|
||||||
|
guest's larger page, but its access is encoded form upper page-struct
|
||||||
|
entire not include the last mapping, it will cause access conflict.
|
||||||
|
|
||||||
|
For example, have this mapping:
|
||||||
|
[W]
|
||||||
|
/ PDE1 -> |---|
|
||||||
|
P[W] | | LPA
|
||||||
|
\ PDE2 -> |---|
|
||||||
|
[R]
|
||||||
|
|
||||||
|
P have two children, PDE1 and PDE2, both PDE1 and PDE2 mapping the
|
||||||
|
same lage page(LPA). The P's access is WR, PDE1's access is WR,
|
||||||
|
PDE2's access is RO(just consider read-write permissions here)
|
||||||
|
|
||||||
|
When guest access PDE1, we will create a direct sp for LPA, the sp's
|
||||||
|
access is from P, is W, then we will mark the ptes is W in this sp.
|
||||||
|
|
||||||
|
Then, guest access PDE2, we will find LPA's shadow page, is the same as
|
||||||
|
PDE's, and mark the ptes is RO.
|
||||||
|
|
||||||
|
So, if guest access PDE1, the incorrect #PF is occured.
|
||||||
|
|
||||||
|
Fixed by encode the last mapping access into direct shadow page
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
|
||||||
|
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
|
||||||
|
Signed-off-by: Avi Kivity <avi@redhat.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
|
||||||
|
index 89d66ca..2331bdc 100644
|
||||||
|
--- a/arch/x86/kvm/paging_tmpl.h
|
||||||
|
+++ b/arch/x86/kvm/paging_tmpl.h
|
||||||
|
@@ -342,6 +342,7 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
|
||||||
|
/* advance table_gfn when emulating 1gb pages with 4k */
|
||||||
|
if (delta == 0)
|
||||||
|
table_gfn += PT_INDEX(addr, level);
|
||||||
|
+ access &= gw->pte_access;
|
||||||
|
} else {
|
||||||
|
direct = 0;
|
||||||
|
table_gfn = gw->table_gfn[level - 2];
|
|
@ -0,0 +1,51 @@
|
||||||
|
commit 7ba0dea4158155a68b833982199691dbc2d4e6dc
|
||||||
|
Author: Matthew Garrett <mjg@redhat.com>
|
||||||
|
Date: Mon Apr 19 16:51:39 2010 -0400
|
||||||
|
|
||||||
|
acpi: Fall back to manually changing SCI_EN
|
||||||
|
|
||||||
|
The ACPI spec tells us that the ACPI SCI_EN bit is under hardware control
|
||||||
|
and shouldn't be touched by the OS. It seems that the Leading Other OS
|
||||||
|
ignores this and some machines expect this behaviour. We have a blacklist
|
||||||
|
for these, but given that we're able to detect the failure case and the
|
||||||
|
alternative to breaking the spec is letting the machine crash and burn,
|
||||||
|
let's try falling back when we know the alternative is a mostly-dead
|
||||||
|
machine.
|
||||||
|
|
||||||
|
Signed-off-by: Matthew Garrett <mjg@redhat.com>
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
|
||||||
|
index f74834a..79df8d4 100644
|
||||||
|
--- a/drivers/acpi/sleep.c
|
||||||
|
+++ b/drivers/acpi/sleep.c
|
||||||
|
@@ -227,6 +227,7 @@ static int acpi_suspend_begin(suspend_state_t pm_state)
|
||||||
|
static int acpi_suspend_enter(suspend_state_t pm_state)
|
||||||
|
{
|
||||||
|
acpi_status status = AE_OK;
|
||||||
|
+ acpi_status enable_status = AE_OK;
|
||||||
|
unsigned long flags = 0;
|
||||||
|
u32 acpi_state = acpi_target_sleep_state;
|
||||||
|
|
||||||
|
@@ -254,10 +255,19 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If ACPI is not enabled by the BIOS, we need to enable it here. */
|
||||||
|
- if (set_sci_en_on_resume)
|
||||||
|
+ if (!set_sci_en_on_resume)
|
||||||
|
+ enable_status = acpi_enable();
|
||||||
|
+
|
||||||
|
+ if (set_sci_en_on_resume || enable_status == AE_NO_HARDWARE_RESPONSE)
|
||||||
|
+ /* If we're still in legacy mode then we have a problem. The
|
||||||
|
+ * spec tells us that this bit is under hardware control, but
|
||||||
|
+ * there's no plausible way that the OS can transition back to
|
||||||
|
+ * legacy mode so our choices here are to either ignore the
|
||||||
|
+ * spec or crash and burn horribly. The latter doesn't seem
|
||||||
|
+ * like it's ever going to be the preferable choice, so let's
|
||||||
|
+ * live dangerously.
|
||||||
|
+ */
|
||||||
|
acpi_write_bit_register(ACPI_BITREG_SCI_ENABLE, 1);
|
||||||
|
- else
|
||||||
|
- acpi_enable();
|
||||||
|
|
||||||
|
/* Reprogram control registers and execute _BFS */
|
||||||
|
acpi_leave_sleep_state_prep(acpi_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,199 @@
|
||||||
|
From 023f5b2d1fdad6ffe33a204a4e76e38edba9d9e5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@dreadnought.i.jkkm.org>
|
||||||
|
Date: Thu, 20 May 2010 08:59:58 -0400
|
||||||
|
Subject: linux-2.6-acpi-video-export-edid.patch
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/acpi/video.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++----
|
||||||
|
include/acpi/video.h | 16 +++++++
|
||||||
|
2 files changed, 118 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
|
||||||
|
index a0c93b3..4b8bda1 100644
|
||||||
|
--- a/drivers/acpi/video.c
|
||||||
|
+++ b/drivers/acpi/video.c
|
||||||
|
@@ -45,6 +45,7 @@
|
||||||
|
#include <acpi/acpi_bus.h>
|
||||||
|
#include <acpi/acpi_drivers.h>
|
||||||
|
#include <linux/suspend.h>
|
||||||
|
+#include <acpi/video.h>
|
||||||
|
|
||||||
|
#define PREFIX "ACPI: "
|
||||||
|
|
||||||
|
@@ -65,11 +66,6 @@
|
||||||
|
|
||||||
|
#define MAX_NAME_LEN 20
|
||||||
|
|
||||||
|
-#define ACPI_VIDEO_DISPLAY_CRT 1
|
||||||
|
-#define ACPI_VIDEO_DISPLAY_TV 2
|
||||||
|
-#define ACPI_VIDEO_DISPLAY_DVI 3
|
||||||
|
-#define ACPI_VIDEO_DISPLAY_LCD 4
|
||||||
|
-
|
||||||
|
#define _COMPONENT ACPI_VIDEO_COMPONENT
|
||||||
|
ACPI_MODULE_NAME("video");
|
||||||
|
|
||||||
|
@@ -1748,11 +1744,27 @@ acpi_video_get_device_attr(struct acpi_video_bus *video, unsigned long device_id
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
+acpi_video_get_device_type(struct acpi_video_bus *video,
|
||||||
|
+ unsigned long device_id)
|
||||||
|
+{
|
||||||
|
+ struct acpi_video_enumerated_device *ids;
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < video->attached_count; i++) {
|
||||||
|
+ ids = &video->attached_array[i];
|
||||||
|
+ if ((ids->value.int_val & 0xffff) == device_id)
|
||||||
|
+ return ids->value.int_val;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
acpi_video_bus_get_one_device(struct acpi_device *device,
|
||||||
|
struct acpi_video_bus *video)
|
||||||
|
{
|
||||||
|
unsigned long long device_id;
|
||||||
|
- int status;
|
||||||
|
+ int status, device_type;
|
||||||
|
struct acpi_video_device *data;
|
||||||
|
struct acpi_video_device_attrib* attribute;
|
||||||
|
|
||||||
|
@@ -1797,8 +1809,25 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
|
||||||
|
}
|
||||||
|
if(attribute->bios_can_detect)
|
||||||
|
data->flags.bios = 1;
|
||||||
|
- } else
|
||||||
|
- data->flags.unknown = 1;
|
||||||
|
+ } else {
|
||||||
|
+ /* Check for legacy IDs */
|
||||||
|
+ device_type = acpi_video_get_device_type(video,
|
||||||
|
+ device_id);
|
||||||
|
+ /* Ignore bits 16 and 18-20 */
|
||||||
|
+ switch (device_type & 0xffe2ffff) {
|
||||||
|
+ case ACPI_VIDEO_DISPLAY_LEGACY_MONITOR:
|
||||||
|
+ data->flags.crt = 1;
|
||||||
|
+ break;
|
||||||
|
+ case ACPI_VIDEO_DISPLAY_LEGACY_PANEL:
|
||||||
|
+ data->flags.lcd = 1;
|
||||||
|
+ break;
|
||||||
|
+ case ACPI_VIDEO_DISPLAY_LEGACY_TV:
|
||||||
|
+ data->flags.tvout = 1;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ data->flags.unknown = 1;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
acpi_video_device_bind(video, data);
|
||||||
|
acpi_video_device_find_cap(data);
|
||||||
|
@@ -2032,6 +2061,71 @@ out:
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int acpi_video_get_edid(struct acpi_device *device, int type, int device_id,
|
||||||
|
+ void **edid)
|
||||||
|
+{
|
||||||
|
+ struct acpi_video_bus *video;
|
||||||
|
+ struct acpi_video_device *video_device;
|
||||||
|
+ union acpi_object *buffer = NULL;
|
||||||
|
+ acpi_status status;
|
||||||
|
+ int i, length;
|
||||||
|
+
|
||||||
|
+ if (!device || !acpi_driver_data(device))
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ video = acpi_driver_data(device);
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < video->attached_count; i++) {
|
||||||
|
+ video_device = video->attached_array[i].bind_info;
|
||||||
|
+ length = 256;
|
||||||
|
+
|
||||||
|
+ if (!video_device)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ if (type) {
|
||||||
|
+ switch (type) {
|
||||||
|
+ case ACPI_VIDEO_DISPLAY_CRT:
|
||||||
|
+ if (!video_device->flags.crt)
|
||||||
|
+ continue;
|
||||||
|
+ break;
|
||||||
|
+ case ACPI_VIDEO_DISPLAY_TV:
|
||||||
|
+ if (!video_device->flags.tvout)
|
||||||
|
+ continue;
|
||||||
|
+ break;
|
||||||
|
+ case ACPI_VIDEO_DISPLAY_DVI:
|
||||||
|
+ if (!video_device->flags.dvi)
|
||||||
|
+ continue;
|
||||||
|
+ break;
|
||||||
|
+ case ACPI_VIDEO_DISPLAY_LCD:
|
||||||
|
+ if (!video_device->flags.lcd)
|
||||||
|
+ continue;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ } else if (video_device->device_id != device_id) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ status = acpi_video_device_EDID(video_device, &buffer, length);
|
||||||
|
+
|
||||||
|
+ if (ACPI_FAILURE(status) || !buffer ||
|
||||||
|
+ buffer->type != ACPI_TYPE_BUFFER) {
|
||||||
|
+ length = 128;
|
||||||
|
+ status = acpi_video_device_EDID(video_device, &buffer,
|
||||||
|
+ length);
|
||||||
|
+ if (ACPI_FAILURE(status) || !buffer ||
|
||||||
|
+ buffer->type != ACPI_TYPE_BUFFER) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ *edid = buffer->buffer.pointer;
|
||||||
|
+ return length;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return -ENODEV;
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL(acpi_video_get_edid);
|
||||||
|
+
|
||||||
|
static int
|
||||||
|
acpi_video_bus_get_devices(struct acpi_video_bus *video,
|
||||||
|
struct acpi_device *device)
|
||||||
|
diff --git a/include/acpi/video.h b/include/acpi/video.h
|
||||||
|
index cf7be3d..551793c 100644
|
||||||
|
--- a/include/acpi/video.h
|
||||||
|
+++ b/include/acpi/video.h
|
||||||
|
@@ -1,12 +1,28 @@
|
||||||
|
#ifndef __ACPI_VIDEO_H
|
||||||
|
#define __ACPI_VIDEO_H
|
||||||
|
|
||||||
|
+#define ACPI_VIDEO_DISPLAY_CRT 1
|
||||||
|
+#define ACPI_VIDEO_DISPLAY_TV 2
|
||||||
|
+#define ACPI_VIDEO_DISPLAY_DVI 3
|
||||||
|
+#define ACPI_VIDEO_DISPLAY_LCD 4
|
||||||
|
+
|
||||||
|
+#define ACPI_VIDEO_DISPLAY_LEGACY_MONITOR 0x0100
|
||||||
|
+#define ACPI_VIDEO_DISPLAY_LEGACY_PANEL 0x0110
|
||||||
|
+#define ACPI_VIDEO_DISPLAY_LEGACY_TV 0x0200
|
||||||
|
+
|
||||||
|
#if (defined CONFIG_ACPI_VIDEO || defined CONFIG_ACPI_VIDEO_MODULE)
|
||||||
|
extern int acpi_video_register(void);
|
||||||
|
extern void acpi_video_unregister(void);
|
||||||
|
+extern int acpi_video_get_edid(struct acpi_device *device, int type,
|
||||||
|
+ int device_id, void **edid);
|
||||||
|
#else
|
||||||
|
static inline int acpi_video_register(void) { return 0; }
|
||||||
|
static inline void acpi_video_unregister(void) { return; }
|
||||||
|
+static inline int acpi_video_get_edid(struct acpi_device *device, int type,
|
||||||
|
+ int device_id, void **edid)
|
||||||
|
+{
|
||||||
|
+ return -ENODEV;
|
||||||
|
+}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,128 @@
|
||||||
|
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile
|
||||||
|
index 6d69c7c..ff84d12 100644
|
||||||
|
--- a/scripts/kconfig/Makefile
|
||||||
|
+++ b/scripts/kconfig/Makefile
|
||||||
|
@@ -58,6 +58,11 @@ localyesconfig: $(obj)/streamline_config.pl $(obj)/conf
|
||||||
|
fi
|
||||||
|
$(Q)rm -f .tmp.config
|
||||||
|
|
||||||
|
+nonint_oldconfig: $(obj)/conf
|
||||||
|
+ $< -b $(Kconfig)
|
||||||
|
+loose_nonint_oldconfig: $(obj)/conf
|
||||||
|
+ $< -B $(Kconfig)
|
||||||
|
+
|
||||||
|
# Create new linux.pot file
|
||||||
|
# Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files
|
||||||
|
# The symlink is used to repair a deficiency in arch/um
|
||||||
|
diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c
|
||||||
|
index 9960d1c..ac8d455 100644
|
||||||
|
--- a/scripts/kconfig/conf.c
|
||||||
|
+++ b/scripts/kconfig/conf.c
|
||||||
|
@@ -23,6 +23,8 @@ enum {
|
||||||
|
ask_all,
|
||||||
|
ask_new,
|
||||||
|
ask_silent,
|
||||||
|
+ dont_ask,
|
||||||
|
+ dont_ask_dont_tell,
|
||||||
|
set_default,
|
||||||
|
set_yes,
|
||||||
|
set_mod,
|
||||||
|
@@ -360,7 +362,10 @@ static void conf(struct menu *menu)
|
||||||
|
|
||||||
|
switch (prop->type) {
|
||||||
|
case P_MENU:
|
||||||
|
- if (input_mode == ask_silent && rootEntry != menu) {
|
||||||
|
+ if ((input_mode == ask_silent ||
|
||||||
|
+ input_mode == dont_ask ||
|
||||||
|
+ input_mode == dont_ask_dont_tell) &&
|
||||||
|
+ rootEntry != menu) {
|
||||||
|
check_conf(menu);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
@@ -406,6 +411,8 @@ conf_childs:
|
||||||
|
indent -= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int return_value;
|
||||||
|
+
|
||||||
|
static void check_conf(struct menu *menu)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
@@ -418,12 +425,21 @@ static void check_conf(struct menu *menu)
|
||||||
|
if (sym && !sym_has_value(sym)) {
|
||||||
|
if (sym_is_changable(sym) ||
|
||||||
|
(sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
|
||||||
|
+ if (input_mode == dont_ask ||
|
||||||
|
+ input_mode == dont_ask_dont_tell) {
|
||||||
|
+ if (input_mode == dont_ask &&
|
||||||
|
+ sym->name && !sym_is_choice_value(sym)) {
|
||||||
|
+ fprintf(stderr,"CONFIG_%s\n",sym->name);
|
||||||
|
+ ++return_value;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
if (!conf_cnt++)
|
||||||
|
printf(_("*\n* Restart config...\n*\n"));
|
||||||
|
rootEntry = menu_get_parent_menu(menu);
|
||||||
|
conf(rootEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ }
|
||||||
|
|
||||||
|
for (child = menu->list; child; child = child->next)
|
||||||
|
check_conf(child);
|
||||||
|
@@ -439,7 +455,7 @@ int main(int ac, char **av)
|
||||||
|
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||||
|
textdomain(PACKAGE);
|
||||||
|
|
||||||
|
- while ((opt = getopt(ac, av, "osdD:nmyrh")) != -1) {
|
||||||
|
+ while ((opt = getopt(ac, av, "osbBdD:nmyrh")) != -1) {
|
||||||
|
switch (opt) {
|
||||||
|
case 'o':
|
||||||
|
input_mode = ask_silent;
|
||||||
|
@@ -448,6 +464,12 @@ int main(int ac, char **av)
|
||||||
|
input_mode = ask_silent;
|
||||||
|
sync_kconfig = 1;
|
||||||
|
break;
|
||||||
|
+ case 'b':
|
||||||
|
+ input_mode = dont_ask;
|
||||||
|
+ break;
|
||||||
|
+ case 'B':
|
||||||
|
+ input_mode = dont_ask_dont_tell;
|
||||||
|
+ break;
|
||||||
|
case 'd':
|
||||||
|
input_mode = set_default;
|
||||||
|
break;
|
||||||
|
@@ -525,6 +547,8 @@ int main(int ac, char **av)
|
||||||
|
case ask_silent:
|
||||||
|
case ask_all:
|
||||||
|
case ask_new:
|
||||||
|
+ case dont_ask:
|
||||||
|
+ case dont_ask_dont_tell:
|
||||||
|
conf_read(NULL);
|
||||||
|
break;
|
||||||
|
case set_no:
|
||||||
|
@@ -586,12 +610,16 @@ int main(int ac, char **av)
|
||||||
|
conf(&rootmenu);
|
||||||
|
input_mode = ask_silent;
|
||||||
|
/* fall through */
|
||||||
|
+ case dont_ask:
|
||||||
|
+ case dont_ask_dont_tell:
|
||||||
|
case ask_silent:
|
||||||
|
/* Update until a loop caused no more changes */
|
||||||
|
do {
|
||||||
|
conf_cnt = 0;
|
||||||
|
check_conf(&rootmenu);
|
||||||
|
- } while (conf_cnt);
|
||||||
|
+ } while (conf_cnt &&
|
||||||
|
+ (input_mode != dont_ask &&
|
||||||
|
+ input_mode != dont_ask_dont_tell));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -613,5 +641,5 @@ int main(int ac, char **av)
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- return 0;
|
||||||
|
+ return return_value;
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
|
||||||
|
index 4173125..baa32a0 100644
|
||||||
|
--- a/drivers/pci/intel-iommu.c
|
||||||
|
+++ b/drivers/pci/intel-iommu.c
|
||||||
|
@@ -340,7 +340,7 @@ int dmar_disabled = 0;
|
||||||
|
int dmar_disabled = 1;
|
||||||
|
#endif /*CONFIG_DMAR_DEFAULT_ON*/
|
||||||
|
|
||||||
|
-static int __initdata dmar_map_gfx = 1;
|
||||||
|
+static int dmar_map_gfx = 1;
|
||||||
|
static int dmar_forcedac;
|
||||||
|
static int intel_iommu_strict;
|
||||||
|
|
||||||
|
@@ -3728,6 +3728,12 @@ static void __devinit quirk_iommu_rwbf(struct pci_dev *dev)
|
||||||
|
*/
|
||||||
|
printk(KERN_INFO "DMAR: Forcing write-buffer flush capability\n");
|
||||||
|
rwbf_quirk = 1;
|
||||||
|
+
|
||||||
|
+ /* https://bugzilla.redhat.com/show_bug.cgi?id=538163 */
|
||||||
|
+ if (dev->revision == 0x07) {
|
||||||
|
+ printk(KERN_INFO "DMAR: Disabling IOMMU for graphics on this chipset\n");
|
||||||
|
+ dmar_map_gfx = 0;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf);
|
|
@ -0,0 +1,6 @@
|
||||||
|
#
|
||||||
|
# Small compile fixes (For more involved fixes, please use a separate patch).
|
||||||
|
#
|
||||||
|
# Please add the errors from gcc before the diffs to save others having
|
||||||
|
# to do a compile to figure out what your diff is fixing. Thanks.
|
||||||
|
#
|
|
@ -0,0 +1,385 @@
|
||||||
|
From df42d15cd28f468ecd4c30465b98a53cce90617c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Tue, 30 Mar 2010 00:16:25 -0400
|
||||||
|
Subject: dev-crash-driver.patch
|
||||||
|
|
||||||
|
---
|
||||||
|
arch/ia64/include/asm/crash.h | 90 +++++++++++++++++++++++++++++
|
||||||
|
arch/ia64/kernel/ia64_ksyms.c | 3 +
|
||||||
|
arch/x86/include/asm/crash.h | 75 ++++++++++++++++++++++++
|
||||||
|
arch/x86/mm/ioremap.c | 2 +
|
||||||
|
drivers/char/Kconfig | 2 +
|
||||||
|
drivers/char/Makefile | 2 +
|
||||||
|
drivers/char/crash.c | 128 +++++++++++++++++++++++++++++++++++++++++
|
||||||
|
7 files changed, 302 insertions(+), 0 deletions(-)
|
||||||
|
create mode 100644 arch/ia64/include/asm/crash.h
|
||||||
|
create mode 100644 arch/x86/include/asm/crash.h
|
||||||
|
create mode 100644 drivers/char/crash.c
|
||||||
|
|
||||||
|
diff --git a/arch/ia64/include/asm/crash.h b/arch/ia64/include/asm/crash.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..541af84
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/arch/ia64/include/asm/crash.h
|
||||||
|
@@ -0,0 +1,90 @@
|
||||||
|
+#ifndef _ASM_IA64_CRASH_H
|
||||||
|
+#define _ASM_IA64_CRASH_H
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * linux/include/asm-ia64/crash.h
|
||||||
|
+ *
|
||||||
|
+ * Copyright (c) 2004 Red Hat, Inc. All rights reserved.
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License as published by
|
||||||
|
+ * the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
+ * any later version.
|
||||||
|
+ *
|
||||||
|
+ * This program is distributed in the hope that it will be useful,
|
||||||
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU General Public License
|
||||||
|
+ * along with this program; if not, write to the Free Software
|
||||||
|
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifdef __KERNEL__
|
||||||
|
+
|
||||||
|
+#include <linux/efi.h>
|
||||||
|
+#include <linux/mm.h>
|
||||||
|
+#include <asm/mmzone.h>
|
||||||
|
+
|
||||||
|
+static inline void *
|
||||||
|
+map_virtual(u64 offset, struct page **pp)
|
||||||
|
+{
|
||||||
|
+ struct page *page;
|
||||||
|
+ unsigned long pfn;
|
||||||
|
+ u32 type;
|
||||||
|
+
|
||||||
|
+ if (REGION_NUMBER(offset) == 5) {
|
||||||
|
+ char byte;
|
||||||
|
+
|
||||||
|
+ if (__get_user(byte, (char *)offset) == 0)
|
||||||
|
+ return (void *)offset;
|
||||||
|
+ else
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ switch (type = efi_mem_type(offset))
|
||||||
|
+ {
|
||||||
|
+ case EFI_LOADER_CODE:
|
||||||
|
+ case EFI_LOADER_DATA:
|
||||||
|
+ case EFI_BOOT_SERVICES_CODE:
|
||||||
|
+ case EFI_BOOT_SERVICES_DATA:
|
||||||
|
+ case EFI_CONVENTIONAL_MEMORY:
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ default:
|
||||||
|
+ printk(KERN_INFO
|
||||||
|
+ "crash memory driver: invalid memory type for %lx: %d\n",
|
||||||
|
+ offset, type);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ pfn = offset >> PAGE_SHIFT;
|
||||||
|
+
|
||||||
|
+ if (!pfn_valid(pfn)) {
|
||||||
|
+ printk(KERN_INFO
|
||||||
|
+ "crash memory driver: invalid pfn: %lx )\n", pfn);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ page = pfn_to_page(pfn);
|
||||||
|
+
|
||||||
|
+ if (!page->virtual) {
|
||||||
|
+ printk(KERN_INFO
|
||||||
|
+ "crash memory driver: offset: %lx page: %lx page->virtual: NULL\n",
|
||||||
|
+ offset, (unsigned long)page);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return (page->virtual + (offset & (PAGE_SIZE-1)));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline void unmap_virtual(struct page *page)
|
||||||
|
+{
|
||||||
|
+ return;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#endif /* __KERNEL__ */
|
||||||
|
+
|
||||||
|
+#endif /* _ASM_IA64_CRASH_H */
|
||||||
|
diff --git a/arch/ia64/kernel/ia64_ksyms.c b/arch/ia64/kernel/ia64_ksyms.c
|
||||||
|
index 7f4a0ed..552fe24 100644
|
||||||
|
--- a/arch/ia64/kernel/ia64_ksyms.c
|
||||||
|
+++ b/arch/ia64/kernel/ia64_ksyms.c
|
||||||
|
@@ -84,6 +84,9 @@ EXPORT_SYMBOL(ia64_save_scratch_fpregs);
|
||||||
|
#include <asm/unwind.h>
|
||||||
|
EXPORT_SYMBOL(unw_init_running);
|
||||||
|
|
||||||
|
+#include <linux/efi.h>
|
||||||
|
+EXPORT_SYMBOL_GPL(efi_mem_type);
|
||||||
|
+
|
||||||
|
#if defined(CONFIG_IA64_ESI) || defined(CONFIG_IA64_ESI_MODULE)
|
||||||
|
extern void esi_call_phys (void);
|
||||||
|
EXPORT_SYMBOL_GPL(esi_call_phys);
|
||||||
|
diff --git a/arch/x86/include/asm/crash.h b/arch/x86/include/asm/crash.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..dfcc006
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/arch/x86/include/asm/crash.h
|
||||||
|
@@ -0,0 +1,75 @@
|
||||||
|
+#ifndef _ASM_I386_CRASH_H
|
||||||
|
+#define _ASM_I386_CRASH_H
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * linux/include/asm-i386/crash.h
|
||||||
|
+ *
|
||||||
|
+ * Copyright (c) 2004 Red Hat, Inc. All rights reserved.
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License as published by
|
||||||
|
+ * the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
+ * any later version.
|
||||||
|
+ *
|
||||||
|
+ * This program is distributed in the hope that it will be useful,
|
||||||
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU General Public License
|
||||||
|
+ * along with this program; if not, write to the Free Software
|
||||||
|
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifdef __KERNEL__
|
||||||
|
+
|
||||||
|
+#include <linux/mm.h>
|
||||||
|
+#include <linux/highmem.h>
|
||||||
|
+#include <asm/mmzone.h>
|
||||||
|
+
|
||||||
|
+extern int page_is_ram(unsigned long);
|
||||||
|
+
|
||||||
|
+static inline void *
|
||||||
|
+map_virtual(u64 offset, struct page **pp)
|
||||||
|
+{
|
||||||
|
+ struct page *page;
|
||||||
|
+ unsigned long pfn;
|
||||||
|
+ void *vaddr;
|
||||||
|
+
|
||||||
|
+ pfn = (unsigned long)(offset >> PAGE_SHIFT);
|
||||||
|
+
|
||||||
|
+ if (!page_is_ram(pfn)) {
|
||||||
|
+ printk(KERN_INFO
|
||||||
|
+ "crash memory driver: !page_is_ram(pfn: %lx)\n", pfn);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!pfn_valid(pfn)) {
|
||||||
|
+ printk(KERN_INFO
|
||||||
|
+ "crash memory driver: invalid pfn: %lx )\n", pfn);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ page = pfn_to_page(pfn);
|
||||||
|
+
|
||||||
|
+ vaddr = kmap(page);
|
||||||
|
+ if (!vaddr) {
|
||||||
|
+ printk(KERN_INFO
|
||||||
|
+ "crash memory driver: pfn: %lx kmap(page: %lx) failed\n",
|
||||||
|
+ pfn, (unsigned long)page);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ *pp = page;
|
||||||
|
+ return (vaddr + (offset & (PAGE_SIZE-1)));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline void unmap_virtual(struct page *page)
|
||||||
|
+{
|
||||||
|
+ kunmap(page);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#endif /* __KERNEL__ */
|
||||||
|
+
|
||||||
|
+#endif /* _ASM_I386_CRASH_H */
|
||||||
|
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
|
||||||
|
index 5eb1ba7..3e525d2 100644
|
||||||
|
--- a/arch/x86/mm/ioremap.c
|
||||||
|
+++ b/arch/x86/mm/ioremap.c
|
||||||
|
@@ -24,6 +24,8 @@
|
||||||
|
|
||||||
|
#include "physaddr.h"
|
||||||
|
|
||||||
|
+EXPORT_SYMBOL_GPL(page_is_ram);
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Fix up the linear direct mapping of the kernel to avoid cache attribute
|
||||||
|
* conflicts.
|
||||||
|
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
|
||||||
|
index 3141dd3..153658c 100644
|
||||||
|
--- a/drivers/char/Kconfig
|
||||||
|
+++ b/drivers/char/Kconfig
|
||||||
|
@@ -471,6 +471,8 @@ config LEGACY_PTYS
|
||||||
|
security. This option enables these legacy devices; on most
|
||||||
|
systems, it is safe to say N.
|
||||||
|
|
||||||
|
+config CRASH
|
||||||
|
+ tristate "Crash Utility memory driver"
|
||||||
|
|
||||||
|
config LEGACY_PTY_COUNT
|
||||||
|
int "Maximum number of legacy PTY in use"
|
||||||
|
diff --git a/drivers/char/Makefile b/drivers/char/Makefile
|
||||||
|
index f957edf..604c418 100644
|
||||||
|
--- a/drivers/char/Makefile
|
||||||
|
+++ b/drivers/char/Makefile
|
||||||
|
@@ -111,6 +111,8 @@ obj-$(CONFIG_PS3_FLASH) += ps3flash.o
|
||||||
|
obj-$(CONFIG_JS_RTC) += js-rtc.o
|
||||||
|
js-rtc-y = rtc.o
|
||||||
|
|
||||||
|
+obj-$(CONFIG_CRASH) += crash.o
|
||||||
|
+
|
||||||
|
# Files generated that shall be removed upon make clean
|
||||||
|
clean-files := consolemap_deftbl.c defkeymap.c
|
||||||
|
|
||||||
|
diff --git a/drivers/char/crash.c b/drivers/char/crash.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..e5437de
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/char/crash.c
|
||||||
|
@@ -0,0 +1,128 @@
|
||||||
|
+/*
|
||||||
|
+ * linux/drivers/char/crash.c
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2004 Dave Anderson <anderson@redhat.com>
|
||||||
|
+ * Copyright (C) 2004 Red Hat, Inc.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+/******************************************************************************
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License as published by
|
||||||
|
+ * the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
+ * any later version.
|
||||||
|
+ *
|
||||||
|
+ * This program is distributed in the hope that it will be useful,
|
||||||
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU General Public License
|
||||||
|
+ * along with this program; if not, write to the Free Software
|
||||||
|
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
+ *
|
||||||
|
+ *****************************************************************************/
|
||||||
|
+
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/types.h>
|
||||||
|
+#include <linux/miscdevice.h>
|
||||||
|
+#include <linux/init.h>
|
||||||
|
+#include <asm/io.h>
|
||||||
|
+#include <asm/uaccess.h>
|
||||||
|
+#include <asm/types.h>
|
||||||
|
+#include <asm/crash.h>
|
||||||
|
+
|
||||||
|
+#define CRASH_VERSION "1.0"
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * These are the file operation functions that allow crash utility
|
||||||
|
+ * access to physical memory.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+static loff_t
|
||||||
|
+crash_llseek(struct file * file, loff_t offset, int orig)
|
||||||
|
+{
|
||||||
|
+ switch (orig) {
|
||||||
|
+ case 0:
|
||||||
|
+ file->f_pos = offset;
|
||||||
|
+ return file->f_pos;
|
||||||
|
+ case 1:
|
||||||
|
+ file->f_pos += offset;
|
||||||
|
+ return file->f_pos;
|
||||||
|
+ default:
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Determine the page address for an address offset value,
|
||||||
|
+ * get a virtual address for it, and copy it out.
|
||||||
|
+ * Accesses must fit within a page.
|
||||||
|
+ */
|
||||||
|
+static ssize_t
|
||||||
|
+crash_read(struct file *file, char *buf, size_t count, loff_t *poff)
|
||||||
|
+{
|
||||||
|
+ void *vaddr;
|
||||||
|
+ struct page *page;
|
||||||
|
+ u64 offset;
|
||||||
|
+ ssize_t read;
|
||||||
|
+
|
||||||
|
+ offset = *poff;
|
||||||
|
+ if (offset >> PAGE_SHIFT != (offset+count-1) >> PAGE_SHIFT)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ vaddr = map_virtual(offset, &page);
|
||||||
|
+ if (!vaddr)
|
||||||
|
+ return -EFAULT;
|
||||||
|
+
|
||||||
|
+ if (copy_to_user(buf, vaddr, count)) {
|
||||||
|
+ unmap_virtual(page);
|
||||||
|
+ return -EFAULT;
|
||||||
|
+ }
|
||||||
|
+ unmap_virtual(page);
|
||||||
|
+
|
||||||
|
+ read = count;
|
||||||
|
+ *poff += read;
|
||||||
|
+ return read;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct file_operations crash_fops = {
|
||||||
|
+ .owner = THIS_MODULE,
|
||||||
|
+ .llseek = crash_llseek,
|
||||||
|
+ .read = crash_read,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct miscdevice crash_dev = {
|
||||||
|
+ MISC_DYNAMIC_MINOR,
|
||||||
|
+ "crash",
|
||||||
|
+ &crash_fops
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int __init
|
||||||
|
+crash_init(void)
|
||||||
|
+{
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = misc_register(&crash_dev);
|
||||||
|
+ if (ret) {
|
||||||
|
+ printk(KERN_ERR
|
||||||
|
+ "crash memory driver: cannot misc_register (MISC_DYNAMIC_MINOR)\n");
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = 0;
|
||||||
|
+ printk(KERN_INFO "crash memory driver: version %s\n", CRASH_VERSION);
|
||||||
|
+out:
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void __exit
|
||||||
|
+crash_cleanup_module(void)
|
||||||
|
+{
|
||||||
|
+ misc_deregister(&crash_dev);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+module_init(crash_init);
|
||||||
|
+module_exit(crash_cleanup_module);
|
||||||
|
+
|
||||||
|
+MODULE_LICENSE("GPL");
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
From 76ec0e2e6d6edf81abc0331d5e7873ef7b2f6019 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Wed, 8 Jul 2009 13:06:01 -0400
|
||||||
|
Subject: [PATCH 6/6] fedora: linux-2.6-debug-always-inline-kzalloc.patch
|
||||||
|
|
||||||
|
---
|
||||||
|
include/linux/slab.h | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/linux/slab.h b/include/linux/slab.h
|
||||||
|
index 2da8372..d4ef74f 100644
|
||||||
|
--- a/include/linux/slab.h
|
||||||
|
+++ b/include/linux/slab.h
|
||||||
|
@@ -310,7 +310,7 @@ static inline void *kmem_cache_zalloc(struct kmem_cache *k, gfp_t flags)
|
||||||
|
* @size: how many bytes of memory are required.
|
||||||
|
* @flags: the type of memory to allocate (see kmalloc).
|
||||||
|
*/
|
||||||
|
-static inline void *kzalloc(size_t size, gfp_t flags)
|
||||||
|
+static __always_inline void *kzalloc(size_t size, gfp_t flags)
|
||||||
|
{
|
||||||
|
return kmalloc(size, flags | __GFP_ZERO);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
From 542dee6f43067fa0101b53925aadf1d08c997cd4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Mon, 29 Mar 2010 23:40:27 -0400
|
||||||
|
Subject: linux-2.6-debug-nmi-timeout
|
||||||
|
|
||||||
|
---
|
||||||
|
arch/x86/kernel/apic/nmi.c | 2 +-
|
||||||
|
lib/Kconfig.debug | 8 ++++++++
|
||||||
|
2 files changed, 9 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/arch/x86/kernel/apic/nmi.c b/arch/x86/kernel/apic/nmi.c
|
||||||
|
index 8aa65ad..ba7d55e 100644
|
||||||
|
--- a/arch/x86/kernel/apic/nmi.c
|
||||||
|
+++ b/arch/x86/kernel/apic/nmi.c
|
||||||
|
@@ -439,7 +439,7 @@ nmi_watchdog_tick(struct pt_regs *regs, unsigned reason)
|
||||||
|
* wait a few IRQs (5 seconds) before doing the oops ...
|
||||||
|
*/
|
||||||
|
__this_cpu_inc(alert_counter);
|
||||||
|
- if (__this_cpu_read(alert_counter) == 5 * nmi_hz)
|
||||||
|
+ if (__this_cpu_read(alert_counter) == CONFIG_DEBUG_NMI_TIMEOUT * nmi_hz)
|
||||||
|
/*
|
||||||
|
* die_nmi will return ONLY if NOTIFY_STOP happens..
|
||||||
|
*/
|
||||||
|
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
|
||||||
|
index 1fafb4b..963e78b 100644
|
||||||
|
--- a/lib/Kconfig.debug
|
||||||
|
+++ b/lib/Kconfig.debug
|
||||||
|
@@ -254,6 +254,14 @@ config SCHEDSTATS
|
||||||
|
application, you can say N to avoid the very slight overhead
|
||||||
|
this adds.
|
||||||
|
|
||||||
|
+config DEBUG_NMI_TIMEOUT
|
||||||
|
+ int "Number of seconds before NMI timeout"
|
||||||
|
+ depends on X86
|
||||||
|
+ default 5
|
||||||
|
+ help
|
||||||
|
+ This value is the number of seconds the NMI watchdog will tick
|
||||||
|
+ before it decides the machine has hung.
|
||||||
|
+
|
||||||
|
config TIMER_STATS
|
||||||
|
bool "Collect kernel timers statistics"
|
||||||
|
depends on DEBUG_KERNEL && PROC_FS
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
diff --git a/init/main.c b/init/main.c
|
||||||
|
index 7449819..98cfaae 100644
|
||||||
|
--- a/init/main.c
|
||||||
|
+++ b/init/main.c
|
||||||
|
@@ -369,6 +369,10 @@ static void __init setup_nr_cpu_ids(void)
|
||||||
|
nr_cpu_ids = find_last_bit(cpumask_bits(cpu_possible_mask),NR_CPUS) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#include <linux/ext3_fs_i.h>
|
||||||
|
+#include <linux/skbuff.h>
|
||||||
|
+#include <linux/sched.h>
|
||||||
|
+
|
||||||
|
/* Called by boot processor to activate the rest. */
|
||||||
|
static void __init smp_init(void)
|
||||||
|
{
|
||||||
|
@@ -391,6 +395,15 @@ static void __init smp_init(void)
|
||||||
|
/* Any cleanup work */
|
||||||
|
printk(KERN_INFO "Brought up %ld CPUs\n", (long)num_online_cpus());
|
||||||
|
smp_cpus_done(setup_max_cpus);
|
||||||
|
+
|
||||||
|
+ printk(KERN_DEBUG "sizeof(vma)=%u bytes\n", (unsigned int) sizeof(struct vm_area_struct));
|
||||||
|
+ printk(KERN_DEBUG "sizeof(page)=%u bytes\n", (unsigned int) sizeof(struct page));
|
||||||
|
+ printk(KERN_DEBUG "sizeof(inode)=%u bytes\n", (unsigned int) sizeof(struct inode));
|
||||||
|
+ printk(KERN_DEBUG "sizeof(dentry)=%u bytes\n", (unsigned int) sizeof(struct dentry));
|
||||||
|
+ printk(KERN_DEBUG "sizeof(ext3inode)=%u bytes\n", (unsigned int) sizeof(struct ext3_inode_info));
|
||||||
|
+ printk(KERN_DEBUG "sizeof(buffer_head)=%u bytes\n", (unsigned int) sizeof(struct buffer_head));
|
||||||
|
+ printk(KERN_DEBUG "sizeof(skbuff)=%u bytes\n", (unsigned int) sizeof(struct sk_buff));
|
||||||
|
+ printk(KERN_DEBUG "sizeof(task_struct)=%u bytes\n", (unsigned int) sizeof(struct task_struct));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,65 @@
|
||||||
|
From b04c57d9dc889462951312be2ac81ff6c702e954 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Wed, 8 Jul 2009 13:05:09 -0400
|
||||||
|
Subject: [PATCH 3/6] fedora: linux-2.6-debug-taint-vm.patch
|
||||||
|
|
||||||
|
---
|
||||||
|
kernel/panic.c | 4 +++-
|
||||||
|
mm/slab.c | 8 ++++----
|
||||||
|
mm/slub.c | 2 +-
|
||||||
|
4 files changed, 11 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/kernel/panic.c b/kernel/panic.c
|
||||||
|
index 984b3ec..6d1c3be 100644
|
||||||
|
--- a/kernel/panic.c
|
||||||
|
+++ b/kernel/panic.c
|
||||||
|
@@ -199,6 +199,7 @@ const char *print_tainted(void)
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
+EXPORT_SYMBOL(print_tainted);
|
||||||
|
|
||||||
|
int test_taint(unsigned flag)
|
||||||
|
{
|
||||||
|
diff --git a/mm/slab.c b/mm/slab.c
|
||||||
|
index e74a16e..7bc287e 100644
|
||||||
|
--- a/mm/slab.c
|
||||||
|
+++ b/mm/slab.c
|
||||||
|
@@ -1803,8 +1803,8 @@ static void check_poison_obj(struct kmem_cache *cachep, void *objp)
|
||||||
|
/* Print header */
|
||||||
|
if (lines == 0) {
|
||||||
|
printk(KERN_ERR
|
||||||
|
- "Slab corruption: %s start=%p, len=%d\n",
|
||||||
|
- cachep->name, realobj, size);
|
||||||
|
+ "Slab corruption (%s): %s start=%p, len=%d\n",
|
||||||
|
+ print_tainted(), cachep->name, realobj, size);
|
||||||
|
print_objinfo(cachep, objp, 0);
|
||||||
|
}
|
||||||
|
/* Hexdump the affected line */
|
||||||
|
@@ -2902,8 +2902,8 @@ static void check_slabp(struct kmem_cache *cachep, struct slab *slabp)
|
||||||
|
if (entries != cachep->num - slabp->inuse) {
|
||||||
|
bad:
|
||||||
|
printk(KERN_ERR "slab: Internal list corruption detected in "
|
||||||
|
- "cache '%s'(%d), slabp %p(%d). Hexdump:\n",
|
||||||
|
- cachep->name, cachep->num, slabp, slabp->inuse);
|
||||||
|
+ "cache '%s'(%d), slabp %p(%d). Tainted(%s). Hexdump:\n",
|
||||||
|
+ cachep->name, cachep->num, slabp, slabp->inuse, print_tainted());
|
||||||
|
for (i = 0;
|
||||||
|
i < sizeof(*slabp) + cachep->num * sizeof(kmem_bufctl_t);
|
||||||
|
i++) {
|
||||||
|
diff --git a/mm/slub.c b/mm/slub.c
|
||||||
|
index 819f056..8eff0f4 100644
|
||||||
|
--- a/mm/slub.c
|
||||||
|
+++ b/mm/slub.c
|
||||||
|
@@ -433,7 +433,7 @@ static void slab_bug(struct kmem_cache *s, char *fmt, ...)
|
||||||
|
va_end(args);
|
||||||
|
printk(KERN_ERR "========================================"
|
||||||
|
"=====================================\n");
|
||||||
|
- printk(KERN_ERR "BUG %s: %s\n", s->name, buf);
|
||||||
|
+ printk(KERN_ERR "BUG %s (%s): %s\n", s->name, print_tainted(), buf);
|
||||||
|
printk(KERN_ERR "----------------------------------------"
|
||||||
|
"-------------------------------------\n\n");
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.6.2.5
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
From 03657519851cd180983db4bd0c38eaeed4aa2962 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@treachery.i.jkkm.org>
|
||||||
|
Date: Mon, 11 Jan 2010 08:25:12 -0500
|
||||||
|
Subject: linux-2.6-debug-vm-would-have-oomkilled.patch
|
||||||
|
|
||||||
|
---
|
||||||
|
kernel/sysctl.c | 8 ++++++++
|
||||||
|
mm/oom_kill.c | 7 +++++++
|
||||||
|
2 files changed, 15 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
|
||||||
|
index 8a68b24..72a4ff1 100644
|
||||||
|
--- a/kernel/sysctl.c
|
||||||
|
+++ b/kernel/sysctl.c
|
||||||
|
@@ -71,6 +71,7 @@ extern int sysctl_overcommit_ratio;
|
||||||
|
extern int sysctl_panic_on_oom;
|
||||||
|
extern int sysctl_oom_kill_allocating_task;
|
||||||
|
extern int sysctl_oom_dump_tasks;
|
||||||
|
+extern int sysctl_would_have_oomkilled;
|
||||||
|
extern int max_threads;
|
||||||
|
extern int core_uses_pid;
|
||||||
|
extern int suid_dumpable;
|
||||||
|
@@ -973,6 +974,13 @@ static struct ctl_table vm_table[] = {
|
||||||
|
.proc_handler = proc_dointvec,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
+ .procname = "would_have_oomkilled",
|
||||||
|
+ .data = &sysctl_would_have_oomkilled,
|
||||||
|
+ .maxlen = sizeof(sysctl_would_have_oomkilled),
|
||||||
|
+ .mode = 0644,
|
||||||
|
+ .proc_handler = &proc_dointvec,
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
.procname = "overcommit_ratio",
|
||||||
|
.data = &sysctl_overcommit_ratio,
|
||||||
|
.maxlen = sizeof(sysctl_overcommit_ratio),
|
||||||
|
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
|
||||||
|
index f52481b..a892f07 100644
|
||||||
|
--- a/mm/oom_kill.c
|
||||||
|
+++ b/mm/oom_kill.c
|
||||||
|
@@ -31,6 +31,7 @@
|
||||||
|
int sysctl_panic_on_oom;
|
||||||
|
int sysctl_oom_kill_allocating_task;
|
||||||
|
int sysctl_oom_dump_tasks;
|
||||||
|
+int sysctl_would_have_oomkilled;
|
||||||
|
static DEFINE_SPINLOCK(zone_scan_lock);
|
||||||
|
/* #define DEBUG */
|
||||||
|
|
||||||
|
@@ -396,6 +397,12 @@ static void __oom_kill_task(struct task_struct *p, int verbose)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (sysctl_would_have_oomkilled == 1) {
|
||||||
|
+ printk(KERN_ERR "Would have killed process %d (%s). But continuing instead.\n",
|
||||||
|
+ task_pid_nr(p), p->comm);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (verbose)
|
||||||
|
printk(KERN_ERR "Killed process %d (%s) "
|
||||||
|
"vsz:%lukB, anon-rss:%lukB, file-rss:%lukB\n",
|
||||||
|
--
|
||||||
|
1.6.5.2
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
diff --git a/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,110 @@
|
||||||
|
From 14bdd0d36f5284108468bb73afd50726b07c7a84 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Mon, 29 Mar 2010 23:43:49 -0400
|
||||||
|
Subject: linux-2.6-defaults-pci_no_msi
|
||||||
|
|
||||||
|
---
|
||||||
|
Documentation/kernel-parameters.txt | 3 +++
|
||||||
|
drivers/pci/Kconfig | 12 ++++++++++++
|
||||||
|
drivers/pci/msi.c | 9 +++++++++
|
||||||
|
drivers/pci/pci.c | 2 ++
|
||||||
|
drivers/pci/pci.h | 2 ++
|
||||||
|
5 files changed, 28 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
|
||||||
|
index e4cbca5..8154a0f 100644
|
||||||
|
--- a/Documentation/kernel-parameters.txt
|
||||||
|
+++ b/Documentation/kernel-parameters.txt
|
||||||
|
@@ -1911,6 +1911,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
|
check_enable_amd_mmconf [X86] check for and enable
|
||||||
|
properly configured MMIO access to PCI
|
||||||
|
config space on AMD family 10h CPU
|
||||||
|
+ msi [MSI] If the PCI_MSI kernel config parameter is
|
||||||
|
+ enabled, this kernel boot option can be used to
|
||||||
|
+ enable the use of MSI interrupts system-wide.
|
||||||
|
nomsi [MSI] If the PCI_MSI kernel config parameter is
|
||||||
|
enabled, this kernel boot option can be used to
|
||||||
|
disable the use of MSI interrupts system-wide.
|
||||||
|
diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
|
||||||
|
index 7858a11..b12fcad 100644
|
||||||
|
--- a/drivers/pci/Kconfig
|
||||||
|
+++ b/drivers/pci/Kconfig
|
||||||
|
@@ -21,6 +21,18 @@ config PCI_MSI
|
||||||
|
|
||||||
|
If you don't know what to do here, say N.
|
||||||
|
|
||||||
|
+config PCI_MSI_DEFAULT_ON
|
||||||
|
+ def_bool y
|
||||||
|
+ prompt "Use Message Signaled Interrupts by default"
|
||||||
|
+ depends on PCI_MSI
|
||||||
|
+ help
|
||||||
|
+ Selecting this option will enable use of PCI MSI where applicable
|
||||||
|
+ by default. Support for MSI can be disabled through the use of the
|
||||||
|
+ pci=nomsi boot flag. Conversely, if this option is not selected,
|
||||||
|
+ support for PCI MSI can be enabled by passing the pci=msi flag.
|
||||||
|
+
|
||||||
|
+ If you don't know what to do here, say N.
|
||||||
|
+
|
||||||
|
config PCI_DEBUG
|
||||||
|
bool "PCI Debugging"
|
||||||
|
depends on PCI && DEBUG_KERNEL
|
||||||
|
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
|
||||||
|
index f9cf317..6b0539a 100644
|
||||||
|
--- a/drivers/pci/msi.c
|
||||||
|
+++ b/drivers/pci/msi.c
|
||||||
|
@@ -22,7 +22,11 @@
|
||||||
|
#include "pci.h"
|
||||||
|
#include "msi.h"
|
||||||
|
|
||||||
|
+#ifdef CONFIG_PCI_MSI_DEFAULT_ON
|
||||||
|
static int pci_msi_enable = 1;
|
||||||
|
+#else
|
||||||
|
+static int pci_msi_enable = 0;
|
||||||
|
+#endif /*CONFIG_PCI_MSI_DEFAULT_ON*/
|
||||||
|
|
||||||
|
/* Arch hooks */
|
||||||
|
|
||||||
|
@@ -836,6 +840,11 @@ int pci_msi_enabled(void)
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(pci_msi_enabled);
|
||||||
|
|
||||||
|
+void pci_yes_msi(void)
|
||||||
|
+{
|
||||||
|
+ pci_msi_enable = 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void pci_msi_init_pci_dev(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
INIT_LIST_HEAD(&dev->msi_list);
|
||||||
|
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
|
||||||
|
index 1531f3a..3cb332b 100644
|
||||||
|
--- a/drivers/pci/pci.c
|
||||||
|
+++ b/drivers/pci/pci.c
|
||||||
|
@@ -2983,6 +2983,8 @@ static int __init pci_setup(char *str)
|
||||||
|
if (*str && (str = pcibios_setup(str)) && *str) {
|
||||||
|
if (!strcmp(str, "nomsi")) {
|
||||||
|
pci_no_msi();
|
||||||
|
+ } else if (!strcmp(str, "msi")) {
|
||||||
|
+ pci_yes_msi();
|
||||||
|
} else if (!strcmp(str, "noaer")) {
|
||||||
|
pci_no_aer();
|
||||||
|
} else if (!strcmp(str, "nodomains")) {
|
||||||
|
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
|
||||||
|
index 4eb10f4..caa051e 100644
|
||||||
|
--- a/drivers/pci/pci.h
|
||||||
|
+++ b/drivers/pci/pci.h
|
||||||
|
@@ -122,9 +122,11 @@ extern unsigned int pci_pm_d3_delay;
|
||||||
|
|
||||||
|
#ifdef CONFIG_PCI_MSI
|
||||||
|
void pci_no_msi(void);
|
||||||
|
+void pci_yes_msi(void);
|
||||||
|
extern void pci_msi_init_pci_dev(struct pci_dev *dev);
|
||||||
|
#else
|
||||||
|
static inline void pci_no_msi(void) { }
|
||||||
|
+static inline void pci_yes_msi(void) { }
|
||||||
|
static inline void pci_msi_init_pci_dev(struct pci_dev *dev) { }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
commit 7d0d20a25c6f477fb198b85510c78156d7d7c5af
|
||||||
|
Author: Matthew Garrett <mjg@redhat.com>
|
||||||
|
Date: Tue Jun 9 20:11:47 2009 +0100
|
||||||
|
|
||||||
|
usb: Allow drivers to enable USB autosuspend on a per-device basis
|
||||||
|
|
||||||
|
USB autosuspend is currently only enabled by default for hubs. On other
|
||||||
|
hardware the decision is made by userspace. This is unnecessary in cases
|
||||||
|
where we know that the hardware supports autosuspend, so this patch adds
|
||||||
|
a function to allow drivers to enable it at probe time.
|
||||||
|
|
||||||
|
Signed-off-by: Matthew Garrett <mjg@redhat.com>
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/usb/core/driver.c | 16 ++++++++++++++++
|
||||||
|
include/linux/usb.h | 4 ++++
|
||||||
|
2 files changed, 20 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
|
||||||
|
index 60a45f1..03e0228 100644
|
||||||
|
--- a/drivers/usb/core/driver.c
|
||||||
|
+++ b/drivers/usb/core/driver.c
|
||||||
|
@@ -1648,6 +1648,21 @@ void usb_autopm_put_interface_async(struct usb_interface *intf)
|
||||||
|
EXPORT_SYMBOL_GPL(usb_autopm_put_interface_async);
|
||||||
|
|
||||||
|
/**
|
||||||
|
+ * usb_device_autosuspend_enable - enable autosuspend on a device
|
||||||
|
+ * @udev: the usb_device to be autosuspended
|
||||||
|
+ *
|
||||||
|
+ * This routine should be called by an interface driver when it knows that
|
||||||
|
+ * the device in question supports USB autosuspend.
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+void usb_device_autosuspend_enable(struct usb_device *udev)
|
||||||
|
+{
|
||||||
|
+ udev->autosuspend_disabled = 0;
|
||||||
|
+ usb_external_suspend_device(udev, PMSG_USER_SUSPEND);
|
||||||
|
+}
|
||||||
|
+EXPORT_SYMBOL_GPL(usb_device_autosuspend_enable);
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
* usb_autopm_get_interface - increment a USB interface's PM-usage counter
|
||||||
|
* @intf: the usb_interface whose counter should be incremented
|
||||||
|
*
|
||||||
|
diff --git a/include/linux/usb.h b/include/linux/usb.h
|
||||||
|
index e101a2d..dd47590 100644
|
||||||
|
--- a/include/linux/usb.h
|
||||||
|
+++ b/include/linux/usb.h
|
||||||
|
@@ -540,6 +540,7 @@ extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id);
|
||||||
|
|
||||||
|
/* USB autosuspend and autoresume */
|
||||||
|
#ifdef CONFIG_USB_SUSPEND
|
||||||
|
+extern void usb_device_autosuspend_enable(struct usb_device *udev);
|
||||||
|
extern int usb_autopm_get_interface(struct usb_interface *intf);
|
||||||
|
extern void usb_autopm_put_interface(struct usb_interface *intf);
|
||||||
|
extern int usb_autopm_get_interface_async(struct usb_interface *intf);
|
||||||
|
@@ -563,6 +564,9 @@ static inline void usb_mark_last_busy(struct usb_device *udev)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
+static inline void usb_device_autosuspend_enable(struct usb_device *udev)
|
||||||
|
+{ }
|
||||||
|
+
|
||||||
|
static inline int usb_autopm_get_interface(struct usb_interface *intf)
|
||||||
|
{ return 0; }
|
||||||
|
static inline int usb_autopm_get_interface_async(struct usb_interface *intf)
|
||||||
|
--
|
||||||
|
1.6.5.2
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -0,0 +1,993 @@
|
||||||
|
From 5006dd0fae6126c149868102c100cd90a20ef2e3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Mon, 29 Mar 2010 23:20:18 -0400
|
||||||
|
Subject: execshield
|
||||||
|
|
||||||
|
cebbert@redhat.com: added fix for bz#220892
|
||||||
|
|
||||||
|
diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h
|
||||||
|
index 617bd56..526248d 100644
|
||||||
|
--- a/arch/x86/include/asm/desc.h
|
||||||
|
+++ b/arch/x86/include/asm/desc.h
|
||||||
|
@@ -5,6 +5,7 @@
|
||||||
|
#include <asm/ldt.h>
|
||||||
|
#include <asm/mmu.h>
|
||||||
|
#include <linux/smp.h>
|
||||||
|
+#include <linux/mm_types.h>
|
||||||
|
|
||||||
|
static inline void fill_ldt(struct desc_struct *desc,
|
||||||
|
const struct user_desc *info)
|
||||||
|
@@ -93,6 +94,9 @@ static inline int desc_empty(const void *ptr)
|
||||||
|
|
||||||
|
#define load_TLS(t, cpu) native_load_tls(t, cpu)
|
||||||
|
#define set_ldt native_set_ldt
|
||||||
|
+#ifdef CONFIG_X86_32
|
||||||
|
+#define load_user_cs_desc native_load_user_cs_desc
|
||||||
|
+#endif /*CONFIG_X86_32*/
|
||||||
|
|
||||||
|
#define write_ldt_entry(dt, entry, desc) \
|
||||||
|
native_write_ldt_entry(dt, entry, desc)
|
||||||
|
@@ -392,4 +396,25 @@ static inline void set_system_intr_gate_ist(int n, void *addr, unsigned ist)
|
||||||
|
_set_gate(n, GATE_INTERRUPT, addr, 0x3, ist, __KERNEL_CS);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef CONFIG_X86_32
|
||||||
|
+static inline void set_user_cs(struct desc_struct *desc, unsigned long limit)
|
||||||
|
+{
|
||||||
|
+ limit = (limit - 1) / PAGE_SIZE;
|
||||||
|
+ desc->a = limit & 0xffff;
|
||||||
|
+ desc->b = (limit & 0xf0000) | 0x00c0fb00;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline void native_load_user_cs_desc(int cpu, struct mm_struct *mm)
|
||||||
|
+{
|
||||||
|
+ get_cpu_gdt_table(cpu)[GDT_ENTRY_DEFAULT_USER_CS] = (mm)->context.user_cs;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#define arch_add_exec_range arch_add_exec_range
|
||||||
|
+#define arch_remove_exec_range arch_remove_exec_range
|
||||||
|
+#define arch_flush_exec_range arch_flush_exec_range
|
||||||
|
+extern void arch_add_exec_range(struct mm_struct *mm, unsigned long limit);
|
||||||
|
+extern void arch_remove_exec_range(struct mm_struct *mm, unsigned long limit);
|
||||||
|
+extern void arch_flush_exec_range(struct mm_struct *mm);
|
||||||
|
+#endif /* CONFIG_X86_32 */
|
||||||
|
+
|
||||||
|
#endif /* _ASM_X86_DESC_H */
|
||||||
|
diff --git a/arch/x86/include/asm/mmu.h b/arch/x86/include/asm/mmu.h
|
||||||
|
index 80a1dee..8314c66 100644
|
||||||
|
--- a/arch/x86/include/asm/mmu.h
|
||||||
|
+++ b/arch/x86/include/asm/mmu.h
|
||||||
|
@@ -7,12 +7,19 @@
|
||||||
|
/*
|
||||||
|
* The x86 doesn't have a mmu context, but
|
||||||
|
* we put the segment information here.
|
||||||
|
+ *
|
||||||
|
+ * exec_limit is used to track the range PROT_EXEC
|
||||||
|
+ * mappings span.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
void *ldt;
|
||||||
|
int size;
|
||||||
|
struct mutex lock;
|
||||||
|
void *vdso;
|
||||||
|
+#ifdef CONFIG_X86_32
|
||||||
|
+ struct desc_struct user_cs;
|
||||||
|
+ unsigned long exec_limit;
|
||||||
|
+#endif
|
||||||
|
} mm_context_t;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
|
||||||
|
index 5653f43..55dadb2 100644
|
||||||
|
--- a/arch/x86/include/asm/paravirt.h
|
||||||
|
+++ b/arch/x86/include/asm/paravirt.h
|
||||||
|
@@ -289,6 +289,12 @@ static inline void set_ldt(const void *addr, unsigned entries)
|
||||||
|
{
|
||||||
|
PVOP_VCALL2(pv_cpu_ops.set_ldt, addr, entries);
|
||||||
|
}
|
||||||
|
+#ifdef CONFIG_X86_32
|
||||||
|
+static inline void load_user_cs_desc(unsigned int cpu, struct mm_struct *mm)
|
||||||
|
+{
|
||||||
|
+ PVOP_VCALL2(pv_cpu_ops.load_user_cs_desc, cpu, mm);
|
||||||
|
+}
|
||||||
|
+#endif /*CONFIG_X86_32*/
|
||||||
|
static inline void store_gdt(struct desc_ptr *dtr)
|
||||||
|
{
|
||||||
|
PVOP_VCALL1(pv_cpu_ops.store_gdt, dtr);
|
||||||
|
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
|
||||||
|
index db9ef55..19c2793 100644
|
||||||
|
--- a/arch/x86/include/asm/paravirt_types.h
|
||||||
|
+++ b/arch/x86/include/asm/paravirt_types.h
|
||||||
|
@@ -118,6 +118,9 @@ struct pv_cpu_ops {
|
||||||
|
void (*store_gdt)(struct desc_ptr *);
|
||||||
|
void (*store_idt)(struct desc_ptr *);
|
||||||
|
void (*set_ldt)(const void *desc, unsigned entries);
|
||||||
|
+#ifdef CONFIG_X86_32
|
||||||
|
+ void (*load_user_cs_desc)(int cpu, struct mm_struct *mm);
|
||||||
|
+#endif
|
||||||
|
unsigned long (*store_tr)(void);
|
||||||
|
void (*load_tls)(struct thread_struct *t, unsigned int cpu);
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
|
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
|
||||||
|
index b753ea5..4893156 100644
|
||||||
|
--- a/arch/x86/include/asm/processor.h
|
||||||
|
+++ b/arch/x86/include/asm/processor.h
|
||||||
|
@@ -162,6 +162,9 @@ static inline int hlt_works(int cpu)
|
||||||
|
|
||||||
|
#define cache_line_size() (boot_cpu_data.x86_cache_alignment)
|
||||||
|
|
||||||
|
+#define __HAVE_ARCH_ALIGN_STACK
|
||||||
|
+extern unsigned long arch_align_stack(unsigned long sp);
|
||||||
|
+
|
||||||
|
extern void cpu_detect(struct cpuinfo_x86 *c);
|
||||||
|
|
||||||
|
extern struct pt_regs *idle_regs(struct pt_regs *);
|
||||||
|
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
|
||||||
|
index 4868e4a..6c8d2ca 100644
|
||||||
|
--- a/arch/x86/kernel/cpu/common.c
|
||||||
|
+++ b/arch/x86/kernel/cpu/common.c
|
||||||
|
@@ -802,6 +802,20 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
|
||||||
|
/* Filter out anything that depends on CPUID levels we don't have */
|
||||||
|
filter_cpuid_features(c, true);
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * emulation of NX with segment limits unfortunately means
|
||||||
|
+ * we have to disable the fast system calls, due to the way that
|
||||||
|
+ * sysexit clears the segment limits on return.
|
||||||
|
+ * If we have either disabled exec-shield on the boot command line,
|
||||||
|
+ * or we have NX, then we don't need to do this.
|
||||||
|
+ */
|
||||||
|
+ if (exec_shield != 0) {
|
||||||
|
+#ifdef CONFIG_X86_PAE
|
||||||
|
+ if (!test_cpu_cap(c, X86_FEATURE_NX))
|
||||||
|
+#endif
|
||||||
|
+ clear_cpu_cap(c, X86_FEATURE_SEP);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* If the model name is still unset, do table lookup. */
|
||||||
|
if (!c->x86_model_id[0]) {
|
||||||
|
const char *p;
|
||||||
|
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
|
||||||
|
index 1db183e..238b97d 100644
|
||||||
|
--- a/arch/x86/kernel/paravirt.c
|
||||||
|
+++ b/arch/x86/kernel/paravirt.c
|
||||||
|
@@ -345,6 +345,9 @@ struct pv_cpu_ops pv_cpu_ops = {
|
||||||
|
.read_tscp = native_read_tscp,
|
||||||
|
.load_tr_desc = native_load_tr_desc,
|
||||||
|
.set_ldt = native_set_ldt,
|
||||||
|
+#ifdef CONFIG_X86_32
|
||||||
|
+ .load_user_cs_desc = native_load_user_cs_desc,
|
||||||
|
+#endif /*CONFIG_X86_32*/
|
||||||
|
.load_gdt = native_load_gdt,
|
||||||
|
.load_idt = native_load_idt,
|
||||||
|
.store_gdt = native_store_gdt,
|
||||||
|
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
|
||||||
|
index f6c6266..8ac2589 100644
|
||||||
|
--- a/arch/x86/kernel/process_32.c
|
||||||
|
+++ b/arch/x86/kernel/process_32.c
|
||||||
|
@@ -251,7 +251,10 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
|
||||||
|
void
|
||||||
|
start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
|
||||||
|
{
|
||||||
|
+ int cpu;
|
||||||
|
+
|
||||||
|
set_user_gs(regs, 0);
|
||||||
|
+
|
||||||
|
regs->fs = 0;
|
||||||
|
set_fs(USER_DS);
|
||||||
|
regs->ds = __USER_DS;
|
||||||
|
@@ -260,6 +263,11 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
|
||||||
|
regs->cs = __USER_CS;
|
||||||
|
regs->ip = new_ip;
|
||||||
|
regs->sp = new_sp;
|
||||||
|
+
|
||||||
|
+ cpu = get_cpu();
|
||||||
|
+ load_user_cs_desc(cpu, current->mm);
|
||||||
|
+ put_cpu();
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Free the old FP and other extended state
|
||||||
|
*/
|
||||||
|
@@ -319,6 +327,9 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
|
||||||
|
if (preload_fpu)
|
||||||
|
prefetch(next->xstate);
|
||||||
|
|
||||||
|
+ if (next_p->mm)
|
||||||
|
+ load_user_cs_desc(cpu, next_p->mm);
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Reload esp0.
|
||||||
|
*/
|
||||||
|
@@ -412,3 +423,40 @@ unsigned long get_wchan(struct task_struct *p)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void modify_cs(struct mm_struct *mm, unsigned long limit)
|
||||||
|
+{
|
||||||
|
+ mm->context.exec_limit = limit;
|
||||||
|
+ set_user_cs(&mm->context.user_cs, limit);
|
||||||
|
+ if (mm == current->mm) {
|
||||||
|
+ int cpu;
|
||||||
|
+
|
||||||
|
+ cpu = get_cpu();
|
||||||
|
+ load_user_cs_desc(cpu, mm);
|
||||||
|
+ put_cpu();
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void arch_add_exec_range(struct mm_struct *mm, unsigned long limit)
|
||||||
|
+{
|
||||||
|
+ if (limit > mm->context.exec_limit)
|
||||||
|
+ modify_cs(mm, limit);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void arch_remove_exec_range(struct mm_struct *mm, unsigned long old_end)
|
||||||
|
+{
|
||||||
|
+ struct vm_area_struct *vma;
|
||||||
|
+ unsigned long limit = PAGE_SIZE;
|
||||||
|
+
|
||||||
|
+ if (old_end == mm->context.exec_limit) {
|
||||||
|
+ for (vma = mm->mmap; vma; vma = vma->vm_next)
|
||||||
|
+ if ((vma->vm_flags & VM_EXEC) && (vma->vm_end > limit))
|
||||||
|
+ limit = vma->vm_end;
|
||||||
|
+ modify_cs(mm, limit);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void arch_flush_exec_range(struct mm_struct *mm)
|
||||||
|
+{
|
||||||
|
+ mm->context.exec_limit = 0;
|
||||||
|
+ set_user_cs(&mm->context.user_cs, 0);
|
||||||
|
+}
|
||||||
|
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
|
||||||
|
index 1168e44..c452918 100644
|
||||||
|
--- a/arch/x86/kernel/traps.c
|
||||||
|
+++ b/arch/x86/kernel/traps.c
|
||||||
|
@@ -115,6 +115,76 @@ die_if_kernel(const char *str, struct pt_regs *regs, long err)
|
||||||
|
if (!user_mode_vm(regs))
|
||||||
|
die(str, regs, err);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+static inline int
|
||||||
|
+__compare_user_cs_desc(const struct desc_struct *desc1,
|
||||||
|
+ const struct desc_struct *desc2)
|
||||||
|
+{
|
||||||
|
+ return ((desc1->limit0 != desc2->limit0) ||
|
||||||
|
+ (desc1->limit != desc2->limit) ||
|
||||||
|
+ (desc1->base0 != desc2->base0) ||
|
||||||
|
+ (desc1->base1 != desc2->base1) ||
|
||||||
|
+ (desc1->base2 != desc2->base2));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * lazy-check for CS validity on exec-shield binaries:
|
||||||
|
+ *
|
||||||
|
+ * the original non-exec stack patch was written by
|
||||||
|
+ * Solar Designer <solar at openwall.com>. Thanks!
|
||||||
|
+ */
|
||||||
|
+static int
|
||||||
|
+check_lazy_exec_limit(int cpu, struct pt_regs *regs, long error_code)
|
||||||
|
+{
|
||||||
|
+ struct desc_struct *desc1, *desc2;
|
||||||
|
+ struct vm_area_struct *vma;
|
||||||
|
+ unsigned long limit;
|
||||||
|
+
|
||||||
|
+ if (current->mm == NULL)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ limit = -1UL;
|
||||||
|
+ if (current->mm->context.exec_limit != -1UL) {
|
||||||
|
+ limit = PAGE_SIZE;
|
||||||
|
+ spin_lock(¤t->mm->page_table_lock);
|
||||||
|
+ for (vma = current->mm->mmap; vma; vma = vma->vm_next)
|
||||||
|
+ if ((vma->vm_flags & VM_EXEC) && (vma->vm_end > limit))
|
||||||
|
+ limit = vma->vm_end;
|
||||||
|
+ vma = get_gate_vma(current);
|
||||||
|
+ if (vma && (vma->vm_flags & VM_EXEC) && (vma->vm_end > limit))
|
||||||
|
+ limit = vma->vm_end;
|
||||||
|
+ spin_unlock(¤t->mm->page_table_lock);
|
||||||
|
+ if (limit >= TASK_SIZE)
|
||||||
|
+ limit = -1UL;
|
||||||
|
+ current->mm->context.exec_limit = limit;
|
||||||
|
+ }
|
||||||
|
+ set_user_cs(¤t->mm->context.user_cs, limit);
|
||||||
|
+
|
||||||
|
+ desc1 = ¤t->mm->context.user_cs;
|
||||||
|
+ desc2 = get_cpu_gdt_table(cpu) + GDT_ENTRY_DEFAULT_USER_CS;
|
||||||
|
+
|
||||||
|
+ if (__compare_user_cs_desc(desc1, desc2)) {
|
||||||
|
+ /*
|
||||||
|
+ * The CS was not in sync - reload it and retry the
|
||||||
|
+ * instruction. If the instruction still faults then
|
||||||
|
+ * we won't hit this branch next time around.
|
||||||
|
+ */
|
||||||
|
+ if (print_fatal_signals >= 2) {
|
||||||
|
+ printk(KERN_ERR "#GPF fixup (%ld[seg:%lx]) at %08lx, CPU#%d.\n",
|
||||||
|
+ error_code, error_code/8, regs->ip,
|
||||||
|
+ smp_processor_id());
|
||||||
|
+ printk(KERN_ERR "exec_limit: %08lx, user_cs: %08x/%08x, CPU_cs: %08x/%08x.\n",
|
||||||
|
+ current->mm->context.exec_limit,
|
||||||
|
+ desc1->a, desc1->b, desc2->a, desc2->b);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ load_user_cs_desc(cpu, current->mm);
|
||||||
|
+
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void __kprobes
|
||||||
|
@@ -273,6 +343,29 @@ do_general_protection(struct pt_regs *regs, long error_code)
|
||||||
|
if (!user_mode(regs))
|
||||||
|
goto gp_in_kernel;
|
||||||
|
|
||||||
|
+#ifdef CONFIG_X86_32
|
||||||
|
+{
|
||||||
|
+ int cpu;
|
||||||
|
+ int ok;
|
||||||
|
+
|
||||||
|
+ cpu = get_cpu();
|
||||||
|
+ ok = check_lazy_exec_limit(cpu, regs, error_code);
|
||||||
|
+ put_cpu();
|
||||||
|
+
|
||||||
|
+ if (ok)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (print_fatal_signals) {
|
||||||
|
+ printk(KERN_ERR "#GPF(%ld[seg:%lx]) at %08lx, CPU#%d.\n",
|
||||||
|
+ error_code, error_code/8, regs->ip, smp_processor_id());
|
||||||
|
+ printk(KERN_ERR "exec_limit: %08lx, user_cs: %08x/%08x.\n",
|
||||||
|
+ current->mm->context.exec_limit,
|
||||||
|
+ current->mm->context.user_cs.a,
|
||||||
|
+ current->mm->context.user_cs.b);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+#endif /*CONFIG_X86_32*/
|
||||||
|
+
|
||||||
|
tsk->thread.error_code = error_code;
|
||||||
|
tsk->thread.trap_no = 13;
|
||||||
|
|
||||||
|
@@ -863,19 +956,37 @@ do_device_not_available(struct pt_regs *regs, long error_code)
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_32
|
||||||
|
+/*
|
||||||
|
+ * The fixup code for errors in iret jumps to here (iret_exc). It loses
|
||||||
|
+ * the original trap number and erorr code. The bogus trap 32 and error
|
||||||
|
+ * code 0 are what the vanilla kernel delivers via:
|
||||||
|
+ * DO_ERROR_INFO(32, SIGSEGV, "iret exception", iret_error, ILL_BADSTK, 0, 1)
|
||||||
|
+ *
|
||||||
|
+ * NOTE: Because of the final "1" in the macro we need to enable interrupts.
|
||||||
|
+ *
|
||||||
|
+ * In case of a general protection fault in the iret instruction, we
|
||||||
|
+ * need to check for a lazy CS update for exec-shield.
|
||||||
|
+ */
|
||||||
|
dotraplinkage void do_iret_error(struct pt_regs *regs, long error_code)
|
||||||
|
{
|
||||||
|
- siginfo_t info;
|
||||||
|
+ int ok;
|
||||||
|
+ int cpu;
|
||||||
|
+
|
||||||
|
local_irq_enable();
|
||||||
|
|
||||||
|
- info.si_signo = SIGILL;
|
||||||
|
- info.si_errno = 0;
|
||||||
|
- info.si_code = ILL_BADSTK;
|
||||||
|
- info.si_addr = NULL;
|
||||||
|
- if (notify_die(DIE_TRAP, "iret exception",
|
||||||
|
- regs, error_code, 32, SIGILL) == NOTIFY_STOP)
|
||||||
|
- return;
|
||||||
|
- do_trap(32, SIGILL, "iret exception", regs, error_code, &info);
|
||||||
|
+ cpu = get_cpu();
|
||||||
|
+ ok = check_lazy_exec_limit(cpu, regs, error_code);
|
||||||
|
+ put_cpu();
|
||||||
|
+
|
||||||
|
+ if (!ok && notify_die(DIE_TRAP, "iret exception", regs,
|
||||||
|
+ error_code, 32, SIGSEGV) != NOTIFY_STOP) {
|
||||||
|
+ siginfo_t info;
|
||||||
|
+ info.si_signo = SIGSEGV;
|
||||||
|
+ info.si_errno = 0;
|
||||||
|
+ info.si_code = ILL_BADSTK;
|
||||||
|
+ info.si_addr = 0;
|
||||||
|
+ do_trap(32, SIGSEGV, "iret exception", regs, error_code, &info);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c
|
||||||
|
index 1dab519..360f39d 100644
|
||||||
|
--- a/arch/x86/mm/mmap.c
|
||||||
|
+++ b/arch/x86/mm/mmap.c
|
||||||
|
@@ -124,13 +124,16 @@ static unsigned long mmap_legacy_base(void)
|
||||||
|
*/
|
||||||
|
void arch_pick_mmap_layout(struct mm_struct *mm)
|
||||||
|
{
|
||||||
|
- if (mmap_is_legacy()) {
|
||||||
|
+ if (!(2 & exec_shield) && mmap_is_legacy()) {
|
||||||
|
mm->mmap_base = mmap_legacy_base();
|
||||||
|
mm->get_unmapped_area = arch_get_unmapped_area;
|
||||||
|
mm->unmap_area = arch_unmap_area;
|
||||||
|
} else {
|
||||||
|
mm->mmap_base = mmap_base();
|
||||||
|
mm->get_unmapped_area = arch_get_unmapped_area_topdown;
|
||||||
|
+ if (!(current->personality & READ_IMPLIES_EXEC)
|
||||||
|
+ && mmap_is_ia32())
|
||||||
|
+ mm->get_unmapped_exec_area = arch_get_unmapped_exec_area;
|
||||||
|
mm->unmap_area = arch_unmap_area_topdown;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diff --git a/arch/x86/mm/setup_nx.c b/arch/x86/mm/setup_nx.c
|
||||||
|
index a3250aa..e0d9cce 100644
|
||||||
|
--- a/arch/x86/mm/setup_nx.c
|
||||||
|
+++ b/arch/x86/mm/setup_nx.c
|
||||||
|
@@ -1,3 +1,4 @@
|
||||||
|
+#include <linux/sched.h>
|
||||||
|
#include <linux/spinlock.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
@@ -23,6 +24,7 @@ static int __init noexec_setup(char *str)
|
||||||
|
disable_nx = 0;
|
||||||
|
} else if (!strncmp(str, "off", 3)) {
|
||||||
|
disable_nx = 1;
|
||||||
|
+ exec_shield = 0;
|
||||||
|
}
|
||||||
|
x86_configure_nx();
|
||||||
|
return 0;
|
||||||
|
@@ -40,6 +42,10 @@ void __cpuinit x86_configure_nx(void)
|
||||||
|
void __init x86_report_nx(void)
|
||||||
|
{
|
||||||
|
if (!cpu_has_nx) {
|
||||||
|
+ if (exec_shield)
|
||||||
|
+ printk(KERN_INFO "Using x86 segment limits to approximate NX protection\n");
|
||||||
|
+ else
|
||||||
|
+
|
||||||
|
printk(KERN_NOTICE "Notice: NX (Execute Disable) protection "
|
||||||
|
"missing in CPU or disabled in BIOS!\n");
|
||||||
|
} else {
|
||||||
|
diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c
|
||||||
|
index 426f3a1..e0286b1 100644
|
||||||
|
--- a/arch/x86/mm/tlb.c
|
||||||
|
+++ b/arch/x86/mm/tlb.c
|
||||||
|
@@ -6,6 +6,7 @@
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
|
+#include <asm/desc.h>
|
||||||
|
#include <asm/tlbflush.h>
|
||||||
|
#include <asm/mmu_context.h>
|
||||||
|
#include <asm/cache.h>
|
||||||
|
@@ -131,6 +132,12 @@ void smp_invalidate_interrupt(struct pt_regs *regs)
|
||||||
|
union smp_flush_state *f;
|
||||||
|
|
||||||
|
cpu = smp_processor_id();
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_X86_32
|
||||||
|
+ if (current->active_mm)
|
||||||
|
+ load_user_cs_desc(cpu, current->active_mm);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* orig_rax contains the negated interrupt vector.
|
||||||
|
* Use that to determine where the sender put the data.
|
||||||
|
diff --git a/arch/x86/vdso/vdso32-setup.c b/arch/x86/vdso/vdso32-setup.c
|
||||||
|
index 02b442e..957bb67 100644
|
||||||
|
--- a/arch/x86/vdso/vdso32-setup.c
|
||||||
|
+++ b/arch/x86/vdso/vdso32-setup.c
|
||||||
|
@@ -331,7 +331,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
|
||||||
|
if (compat)
|
||||||
|
addr = VDSO_HIGH_BASE;
|
||||||
|
else {
|
||||||
|
- addr = get_unmapped_area(NULL, 0, PAGE_SIZE, 0, 0);
|
||||||
|
+ addr = get_unmapped_area_prot(NULL, 0, PAGE_SIZE, 0, 0, 1);
|
||||||
|
if (IS_ERR_VALUE(addr)) {
|
||||||
|
ret = addr;
|
||||||
|
goto up_fail;
|
||||||
|
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
|
||||||
|
index b607239..e426a3f 100644
|
||||||
|
--- a/arch/x86/xen/enlighten.c
|
||||||
|
+++ b/arch/x86/xen/enlighten.c
|
||||||
|
@@ -334,6 +334,24 @@ static void xen_set_ldt(const void *addr, unsigned entries)
|
||||||
|
xen_mc_issue(PARAVIRT_LAZY_CPU);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef CONFIG_X86_32
|
||||||
|
+static void xen_load_user_cs_desc(int cpu, struct mm_struct *mm)
|
||||||
|
+{
|
||||||
|
+ void *gdt;
|
||||||
|
+ xmaddr_t mgdt;
|
||||||
|
+ u64 descriptor;
|
||||||
|
+ struct desc_struct user_cs;
|
||||||
|
+
|
||||||
|
+ gdt = &get_cpu_gdt_table(cpu)[GDT_ENTRY_DEFAULT_USER_CS];
|
||||||
|
+ mgdt = virt_to_machine(gdt);
|
||||||
|
+
|
||||||
|
+ user_cs = mm->context.user_cs;
|
||||||
|
+ descriptor = (u64) user_cs.a | ((u64) user_cs.b) << 32;
|
||||||
|
+
|
||||||
|
+ HYPERVISOR_update_descriptor(mgdt.maddr, descriptor);
|
||||||
|
+}
|
||||||
|
+#endif /*CONFIG_X86_32*/
|
||||||
|
+
|
||||||
|
static void xen_load_gdt(const struct desc_ptr *dtr)
|
||||||
|
{
|
||||||
|
unsigned long va = dtr->address;
|
||||||
|
@@ -960,6 +978,9 @@ static const struct pv_cpu_ops xen_cpu_ops __initdata = {
|
||||||
|
|
||||||
|
.load_tr_desc = paravirt_nop,
|
||||||
|
.set_ldt = xen_set_ldt,
|
||||||
|
+#ifdef CONFIG_X86_32
|
||||||
|
+ .load_user_cs_desc = xen_load_user_cs_desc,
|
||||||
|
+#endif /*CONFIG_X86_32*/
|
||||||
|
.load_gdt = xen_load_gdt,
|
||||||
|
.load_idt = xen_load_idt,
|
||||||
|
.load_tls = xen_load_tls,
|
||||||
|
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
|
||||||
|
index 535e763..d114af6 100644
|
||||||
|
--- a/fs/binfmt_elf.c
|
||||||
|
+++ b/fs/binfmt_elf.c
|
||||||
|
@@ -74,7 +74,7 @@ static struct linux_binfmt elf_format = {
|
||||||
|
.hasvdso = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
-#define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE)
|
||||||
|
+#define BAD_ADDR(x) IS_ERR_VALUE(x)
|
||||||
|
|
||||||
|
static int set_brk(unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
@@ -701,6 +701,11 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (current->personality == PER_LINUX && (exec_shield & 2)) {
|
||||||
|
+ executable_stack = EXSTACK_DISABLE_X;
|
||||||
|
+ current->flags |= PF_RANDOMIZE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Some simple consistency checks for the interpreter */
|
||||||
|
if (elf_interpreter) {
|
||||||
|
retval = -ELIBBAD;
|
||||||
|
@@ -717,6 +722,15 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
||||||
|
if (retval)
|
||||||
|
goto out_free_dentry;
|
||||||
|
|
||||||
|
+#ifdef CONFIG_X86_32
|
||||||
|
+ /*
|
||||||
|
+ * Turn off the CS limit completely if exec-shield disabled or
|
||||||
|
+ * NX active:
|
||||||
|
+ */
|
||||||
|
+ if (!exec_shield || executable_stack != EXSTACK_DISABLE_X || (__supported_pte_mask & _PAGE_NX))
|
||||||
|
+ arch_add_exec_range(current->mm, -1);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/* OK, This is the point of no return */
|
||||||
|
current->flags &= ~PF_FORKNOEXEC;
|
||||||
|
current->mm->def_flags = def_flags;
|
||||||
|
@@ -724,7 +738,8 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
||||||
|
/* Do this immediately, since STACK_TOP as used in setup_arg_pages
|
||||||
|
may depend on the personality. */
|
||||||
|
SET_PERSONALITY(loc->elf_ex);
|
||||||
|
- if (elf_read_implies_exec(loc->elf_ex, executable_stack))
|
||||||
|
+ if (!(exec_shield & 2) &&
|
||||||
|
+ elf_read_implies_exec(loc->elf_ex, executable_stack))
|
||||||
|
current->personality |= READ_IMPLIES_EXEC;
|
||||||
|
|
||||||
|
if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
|
||||||
|
@@ -890,7 +905,7 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
||||||
|
interpreter,
|
||||||
|
&interp_map_addr,
|
||||||
|
load_bias);
|
||||||
|
- if (!IS_ERR((void *)elf_entry)) {
|
||||||
|
+ if (!BAD_ADDR(elf_entry)) {
|
||||||
|
/*
|
||||||
|
* load_elf_interp() returns relocation
|
||||||
|
* adjustment
|
||||||
|
diff --git a/include/linux/mm.h b/include/linux/mm.h
|
||||||
|
index e70f21b..44e6d63 100644
|
||||||
|
--- a/include/linux/mm.h
|
||||||
|
+++ b/include/linux/mm.h
|
||||||
|
@@ -1259,7 +1259,13 @@ extern int install_special_mapping(struct mm_struct *mm,
|
||||||
|
unsigned long addr, unsigned long len,
|
||||||
|
unsigned long flags, struct page **pages);
|
||||||
|
|
||||||
|
-extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
|
||||||
|
+extern unsigned long get_unmapped_area_prot(struct file *, unsigned long, unsigned long, unsigned long, unsigned long, int);
|
||||||
|
+
|
||||||
|
+static inline unsigned long get_unmapped_area(struct file *file, unsigned long addr,
|
||||||
|
+ unsigned long len, unsigned long pgoff, unsigned long flags)
|
||||||
|
+{
|
||||||
|
+ return get_unmapped_area_prot(file, addr, len, pgoff, flags, 0);
|
||||||
|
+}
|
||||||
|
|
||||||
|
extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
|
||||||
|
unsigned long len, unsigned long prot,
|
||||||
|
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
|
||||||
|
index b8bb9a6..f478e39 100644
|
||||||
|
--- a/include/linux/mm_types.h
|
||||||
|
+++ b/include/linux/mm_types.h
|
||||||
|
@@ -227,6 +227,9 @@ struct mm_struct {
|
||||||
|
unsigned long (*get_unmapped_area) (struct file *filp,
|
||||||
|
unsigned long addr, unsigned long len,
|
||||||
|
unsigned long pgoff, unsigned long flags);
|
||||||
|
+ unsigned long (*get_unmapped_exec_area) (struct file *filp,
|
||||||
|
+ unsigned long addr, unsigned long len,
|
||||||
|
+ unsigned long pgoff, unsigned long flags);
|
||||||
|
void (*unmap_area) (struct mm_struct *mm, unsigned long addr);
|
||||||
|
#endif
|
||||||
|
unsigned long mmap_base; /* base of mmap area */
|
||||||
|
diff --git a/include/linux/resource.h b/include/linux/resource.h
|
||||||
|
index f1e914e..d2aef9a 100644
|
||||||
|
--- a/include/linux/resource.h
|
||||||
|
+++ b/include/linux/resource.h
|
||||||
|
@@ -53,8 +53,11 @@ struct rlimit {
|
||||||
|
/*
|
||||||
|
* Limit the stack by to some sane default: root can always
|
||||||
|
* increase this limit if needed.. 8MB seems reasonable.
|
||||||
|
+ *
|
||||||
|
+ * (2MB more to cover randomization effects.)
|
||||||
|
*/
|
||||||
|
-#define _STK_LIM (8*1024*1024)
|
||||||
|
+#define _STK_LIM (10*1024*1024)
|
||||||
|
+#define EXEC_STACK_BIAS (2*1024*1024)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GPG2 wants 64kB of mlocked memory, to make sure pass phrases
|
||||||
|
diff --git a/include/linux/sched.h b/include/linux/sched.h
|
||||||
|
index dad7f66..c5a3948 100644
|
||||||
|
--- a/include/linux/sched.h
|
||||||
|
+++ b/include/linux/sched.h
|
||||||
|
@@ -102,6 +102,9 @@ struct fs_struct;
|
||||||
|
struct bts_context;
|
||||||
|
struct perf_event_context;
|
||||||
|
|
||||||
|
+extern int exec_shield;
|
||||||
|
+extern int print_fatal_signals;
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* List of flags we want to share for kernel threads,
|
||||||
|
* if only because they are not used by them anyway.
|
||||||
|
@@ -390,6 +393,10 @@ extern void arch_pick_mmap_layout(struct mm_struct *mm);
|
||||||
|
extern unsigned long
|
||||||
|
arch_get_unmapped_area(struct file *, unsigned long, unsigned long,
|
||||||
|
unsigned long, unsigned long);
|
||||||
|
+
|
||||||
|
+extern unsigned long
|
||||||
|
+arch_get_unmapped_exec_area(struct file *, unsigned long, unsigned long,
|
||||||
|
+ unsigned long, unsigned long);
|
||||||
|
extern unsigned long
|
||||||
|
arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr,
|
||||||
|
unsigned long len, unsigned long pgoff,
|
||||||
|
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
|
||||||
|
index 8686b0f..a4fad81 100644
|
||||||
|
--- a/kernel/sysctl.c
|
||||||
|
+++ b/kernel/sysctl.c
|
||||||
|
@@ -99,6 +99,26 @@ extern int sysctl_nr_open_min, sysctl_nr_open_max;
|
||||||
|
#ifndef CONFIG_MMU
|
||||||
|
extern int sysctl_nr_trim_pages;
|
||||||
|
#endif
|
||||||
|
+
|
||||||
|
+int exec_shield = (1<<0);
|
||||||
|
+/* exec_shield is a bitmask:
|
||||||
|
+ * 0: off; vdso at STACK_TOP, 1 page below TASK_SIZE
|
||||||
|
+ * (1<<0) 1: on [also on if !=0]
|
||||||
|
+ * (1<<1) 2: force noexecstack regardless of PT_GNU_STACK
|
||||||
|
+ * The old settings
|
||||||
|
+ * (1<<2) 4: vdso just below .text of main (unless too low)
|
||||||
|
+ * (1<<3) 8: vdso just below .text of PT_INTERP (unless too low)
|
||||||
|
+ * are ignored because the vdso is placed completely randomly
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+static int __init setup_exec_shield(char *str)
|
||||||
|
+{
|
||||||
|
+ get_option(&str, &exec_shield);
|
||||||
|
+
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+__setup("exec-shield=", setup_exec_shield);
|
||||||
|
+
|
||||||
|
#ifdef CONFIG_BLOCK
|
||||||
|
extern int blk_iopoll_enabled;
|
||||||
|
#endif
|
||||||
|
@@ -400,6 +420,14 @@ static struct ctl_table kern_table[] = {
|
||||||
|
.mode = 0644,
|
||||||
|
.proc_handler = proc_dointvec,
|
||||||
|
},
|
||||||
|
+ {
|
||||||
|
+ .procname = "exec-shield",
|
||||||
|
+ .data = &exec_shield,
|
||||||
|
+ .maxlen = sizeof(int),
|
||||||
|
+ .mode = 0644,
|
||||||
|
+ .proc_handler = &proc_dointvec,
|
||||||
|
+ },
|
||||||
|
+
|
||||||
|
#ifdef CONFIG_PROC_SYSCTL
|
||||||
|
{
|
||||||
|
.procname = "tainted",
|
||||||
|
diff --git a/mm/mmap.c b/mm/mmap.c
|
||||||
|
index 75557c6..8173284 100644
|
||||||
|
--- a/mm/mmap.c
|
||||||
|
+++ b/mm/mmap.c
|
||||||
|
@@ -28,6 +28,7 @@
|
||||||
|
#include <linux/rmap.h>
|
||||||
|
#include <linux/mmu_notifier.h>
|
||||||
|
#include <linux/perf_event.h>
|
||||||
|
+#include <linux/random.h>
|
||||||
|
|
||||||
|
#include <asm/uaccess.h>
|
||||||
|
#include <asm/cacheflush.h>
|
||||||
|
@@ -44,6 +45,18 @@
|
||||||
|
#define arch_rebalance_pgtables(addr, len) (addr)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+/* No sane architecture will #define these to anything else */
|
||||||
|
+#ifndef arch_add_exec_range
|
||||||
|
+#define arch_add_exec_range(mm, limit) do { ; } while (0)
|
||||||
|
+#endif
|
||||||
|
+#ifndef arch_flush_exec_range
|
||||||
|
+#define arch_flush_exec_range(mm) do { ; } while (0)
|
||||||
|
+#endif
|
||||||
|
+#ifndef arch_remove_exec_range
|
||||||
|
+#define arch_remove_exec_range(mm, limit) do { ; } while (0)
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+
|
||||||
|
static void unmap_region(struct mm_struct *mm,
|
||||||
|
struct vm_area_struct *vma, struct vm_area_struct *prev,
|
||||||
|
unsigned long start, unsigned long end);
|
||||||
|
@@ -388,6 +401,8 @@ static inline void
|
||||||
|
__vma_link_list(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||||
|
struct vm_area_struct *prev, struct rb_node *rb_parent)
|
||||||
|
{
|
||||||
|
+ if (vma->vm_flags & VM_EXEC)
|
||||||
|
+ arch_add_exec_range(mm, vma->vm_end);
|
||||||
|
if (prev) {
|
||||||
|
vma->vm_next = prev->vm_next;
|
||||||
|
prev->vm_next = vma;
|
||||||
|
@@ -489,6 +504,8 @@ __vma_unlink(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||||
|
rb_erase(&vma->vm_rb, &mm->mm_rb);
|
||||||
|
if (mm->mmap_cache == vma)
|
||||||
|
mm->mmap_cache = prev;
|
||||||
|
+ if (vma->vm_flags & VM_EXEC)
|
||||||
|
+ arch_remove_exec_range(mm, vma->vm_end);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -798,6 +815,8 @@ struct vm_area_struct *vma_merge(struct mm_struct *mm,
|
||||||
|
} else /* cases 2, 5, 7 */
|
||||||
|
err = vma_adjust(prev, prev->vm_start,
|
||||||
|
end, prev->vm_pgoff, NULL);
|
||||||
|
+ if (prev->vm_flags & VM_EXEC)
|
||||||
|
+ arch_add_exec_range(mm, prev->vm_end);
|
||||||
|
if (err)
|
||||||
|
return NULL;
|
||||||
|
return prev;
|
||||||
|
@@ -952,7 +971,8 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
|
||||||
|
/* Obtain the address to map to. we verify (or select) it and ensure
|
||||||
|
* that it represents a valid section of the address space.
|
||||||
|
*/
|
||||||
|
- addr = get_unmapped_area(file, addr, len, pgoff, flags);
|
||||||
|
+ addr = get_unmapped_area_prot(file, addr, len, pgoff, flags,
|
||||||
|
+ prot & PROT_EXEC);
|
||||||
|
if (addr & ~PAGE_MASK)
|
||||||
|
return addr;
|
||||||
|
|
||||||
|
@@ -1504,8 +1524,8 @@ void arch_unmap_area_topdown(struct mm_struct *mm, unsigned long addr)
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long
|
||||||
|
-get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
|
||||||
|
- unsigned long pgoff, unsigned long flags)
|
||||||
|
+get_unmapped_area_prot(struct file *file, unsigned long addr, unsigned long len,
|
||||||
|
+ unsigned long pgoff, unsigned long flags, int exec)
|
||||||
|
{
|
||||||
|
unsigned long (*get_area)(struct file *, unsigned long,
|
||||||
|
unsigned long, unsigned long, unsigned long);
|
||||||
|
@@ -1518,7 +1538,11 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
|
||||||
|
if (len > TASK_SIZE)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
- get_area = current->mm->get_unmapped_area;
|
||||||
|
+ if (exec && current->mm->get_unmapped_exec_area)
|
||||||
|
+ get_area = current->mm->get_unmapped_exec_area;
|
||||||
|
+ else
|
||||||
|
+ get_area = current->mm->get_unmapped_area;
|
||||||
|
+
|
||||||
|
if (file && file->f_op && file->f_op->get_unmapped_area)
|
||||||
|
get_area = file->f_op->get_unmapped_area;
|
||||||
|
addr = get_area(file, addr, len, pgoff, flags);
|
||||||
|
@@ -1532,8 +1556,83 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
|
||||||
|
|
||||||
|
return arch_rebalance_pgtables(addr, len);
|
||||||
|
}
|
||||||
|
+EXPORT_SYMBOL(get_unmapped_area_prot);
|
||||||
|
+
|
||||||
|
+static bool should_randomize(void)
|
||||||
|
+{
|
||||||
|
+ return (current->flags & PF_RANDOMIZE) &&
|
||||||
|
+ !(current->personality & ADDR_NO_RANDOMIZE);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#define SHLIB_BASE 0x00110000
|
||||||
|
+
|
||||||
|
+unsigned long
|
||||||
|
+arch_get_unmapped_exec_area(struct file *filp, unsigned long addr0,
|
||||||
|
+ unsigned long len0, unsigned long pgoff, unsigned long flags)
|
||||||
|
+{
|
||||||
|
+ unsigned long addr = addr0, len = len0;
|
||||||
|
+ struct mm_struct *mm = current->mm;
|
||||||
|
+ struct vm_area_struct *vma;
|
||||||
|
+ unsigned long tmp;
|
||||||
|
+
|
||||||
|
+ if (len > TASK_SIZE)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ if (flags & MAP_FIXED)
|
||||||
|
+ return addr;
|
||||||
|
+
|
||||||
|
+ if (!addr)
|
||||||
|
+ addr = !should_randomize() ? SHLIB_BASE :
|
||||||
|
+ randomize_range(SHLIB_BASE, 0x01000000, len);
|
||||||
|
+
|
||||||
|
+ if (addr) {
|
||||||
|
+ addr = PAGE_ALIGN(addr);
|
||||||
|
+ vma = find_vma(mm, addr);
|
||||||
|
+ if (TASK_SIZE - len >= addr &&
|
||||||
|
+ (!vma || addr + len <= vma->vm_start))
|
||||||
|
+ return addr;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ addr = SHLIB_BASE;
|
||||||
|
+ for (vma = find_vma(mm, addr); ; vma = vma->vm_next) {
|
||||||
|
+ /* At this point: (!vma || addr < vma->vm_end). */
|
||||||
|
+ if (TASK_SIZE - len < addr)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ if (!vma || addr + len <= vma->vm_start) {
|
||||||
|
+ /*
|
||||||
|
+ * Must not let a PROT_EXEC mapping get into the
|
||||||
|
+ * brk area:
|
||||||
|
+ */
|
||||||
|
+ if (addr + len > mm->brk)
|
||||||
|
+ goto failed;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Up until the brk area we randomize addresses
|
||||||
|
+ * as much as possible:
|
||||||
|
+ */
|
||||||
|
+ if (addr >= 0x01000000 && should_randomize()) {
|
||||||
|
+ tmp = randomize_range(0x01000000,
|
||||||
|
+ PAGE_ALIGN(max(mm->start_brk,
|
||||||
|
+ (unsigned long)0x08000000)), len);
|
||||||
|
+ vma = find_vma(mm, tmp);
|
||||||
|
+ if (TASK_SIZE - len >= tmp &&
|
||||||
|
+ (!vma || tmp + len <= vma->vm_start))
|
||||||
|
+ return tmp;
|
||||||
|
+ }
|
||||||
|
+ /*
|
||||||
|
+ * Ok, randomization didnt work out - return
|
||||||
|
+ * the result of the linear search:
|
||||||
|
+ */
|
||||||
|
+ return addr;
|
||||||
|
+ }
|
||||||
|
+ addr = vma->vm_end;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+failed:
|
||||||
|
+ return current->mm->get_unmapped_area(filp, addr0, len0, pgoff, flags);
|
||||||
|
+}
|
||||||
|
|
||||||
|
-EXPORT_SYMBOL(get_unmapped_area);
|
||||||
|
|
||||||
|
/* Look up the first VMA which satisfies addr < vm_end, NULL if none. */
|
||||||
|
struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
|
||||||
|
@@ -1608,6 +1707,16 @@ out:
|
||||||
|
return prev ? prev->vm_next : vma;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int over_stack_limit(unsigned long sz)
|
||||||
|
+{
|
||||||
|
+ struct rlimit *rlim = current->signal->rlim;
|
||||||
|
+
|
||||||
|
+ if (sz < EXEC_STACK_BIAS)
|
||||||
|
+ return 0;
|
||||||
|
+ return (sz - EXEC_STACK_BIAS) >
|
||||||
|
+ ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Verify that the stack growth is acceptable and
|
||||||
|
* update accounting. This is shared with both the
|
||||||
|
@@ -1624,7 +1733,7 @@ static int acct_stack_growth(struct vm_area_struct *vma, unsigned long size, uns
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
/* Stack limit test */
|
||||||
|
- if (size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur))
|
||||||
|
+ if (over_stack_limit(size))
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
/* mlock limit tests */
|
||||||
|
@@ -1936,10 +2045,14 @@ static int __split_vma(struct mm_struct * mm, struct vm_area_struct * vma,
|
||||||
|
if (new->vm_ops && new->vm_ops->open)
|
||||||
|
new->vm_ops->open(new);
|
||||||
|
|
||||||
|
- if (new_below)
|
||||||
|
+ if (new_below) {
|
||||||
|
+ unsigned long old_end = vma->vm_end;
|
||||||
|
+
|
||||||
|
err = vma_adjust(vma, addr, vma->vm_end, vma->vm_pgoff +
|
||||||
|
((addr - new->vm_start) >> PAGE_SHIFT), new);
|
||||||
|
- else
|
||||||
|
+ if (vma->vm_flags & VM_EXEC)
|
||||||
|
+ arch_remove_exec_range(mm, old_end);
|
||||||
|
+ } else
|
||||||
|
err = vma_adjust(vma, vma->vm_start, addr, vma->vm_pgoff, new);
|
||||||
|
|
||||||
|
/* Success. */
|
||||||
|
@@ -2223,6 +2336,7 @@ void exit_mmap(struct mm_struct *mm)
|
||||||
|
|
||||||
|
free_pgtables(tlb, vma, FIRST_USER_ADDRESS, 0);
|
||||||
|
tlb_finish_mmu(tlb, 0, end);
|
||||||
|
+ arch_flush_exec_range(mm);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Walk the list again, actually closing and freeing it,
|
||||||
|
diff --git a/mm/mprotect.c b/mm/mprotect.c
|
||||||
|
index 8bc969d..3c9b4fc 100644
|
||||||
|
--- a/mm/mprotect.c
|
||||||
|
+++ b/mm/mprotect.c
|
||||||
|
@@ -26,9 +26,14 @@
|
||||||
|
#include <linux/perf_event.h>
|
||||||
|
#include <asm/uaccess.h>
|
||||||
|
#include <asm/pgtable.h>
|
||||||
|
+#include <asm/pgalloc.h>
|
||||||
|
#include <asm/cacheflush.h>
|
||||||
|
#include <asm/tlbflush.h>
|
||||||
|
|
||||||
|
+#ifndef arch_remove_exec_range
|
||||||
|
+#define arch_remove_exec_range(mm, limit) do { ; } while (0)
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#ifndef pgprot_modify
|
||||||
|
static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot)
|
||||||
|
{
|
||||||
|
@@ -139,7 +144,7 @@ mprotect_fixup(struct vm_area_struct *vma, struct vm_area_struct **pprev,
|
||||||
|
struct mm_struct *mm = vma->vm_mm;
|
||||||
|
unsigned long oldflags = vma->vm_flags;
|
||||||
|
long nrpages = (end - start) >> PAGE_SHIFT;
|
||||||
|
- unsigned long charged = 0;
|
||||||
|
+ unsigned long charged = 0, old_end = vma->vm_end;
|
||||||
|
pgoff_t pgoff;
|
||||||
|
int error;
|
||||||
|
int dirty_accountable = 0;
|
||||||
|
@@ -204,6 +209,9 @@ success:
|
||||||
|
dirty_accountable = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (oldflags & VM_EXEC)
|
||||||
|
+ arch_remove_exec_range(current->mm, old_end);
|
||||||
|
+
|
||||||
|
mmu_notifier_invalidate_range_start(mm, start, end);
|
||||||
|
if (is_vm_hugetlb_page(vma))
|
||||||
|
hugetlb_change_protection(vma, start, end, vma->vm_page_prot);
|
||||||
|
diff --git a/mm/mremap.c b/mm/mremap.c
|
||||||
|
index e9c75ef..0a5379f 100644
|
||||||
|
--- a/mm/mremap.c
|
||||||
|
+++ b/mm/mremap.c
|
||||||
|
@@ -488,10 +488,10 @@ unsigned long do_mremap(unsigned long addr,
|
||||||
|
if (vma->vm_flags & VM_MAYSHARE)
|
||||||
|
map_flags |= MAP_SHARED;
|
||||||
|
|
||||||
|
- new_addr = get_unmapped_area(vma->vm_file, 0, new_len,
|
||||||
|
+ new_addr = get_unmapped_area_prot(vma->vm_file, 0, new_len,
|
||||||
|
vma->vm_pgoff +
|
||||||
|
((addr - vma->vm_start) >> PAGE_SHIFT),
|
||||||
|
- map_flags);
|
||||||
|
+ map_flags, vma->vm_flags & VM_EXEC);
|
||||||
|
if (new_addr & ~PAGE_MASK) {
|
||||||
|
ret = new_addr;
|
||||||
|
goto out;
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
commit ae69717118e1f14ed8737459f8c4baca1cb9c404
|
||||||
|
Author: Matthew Garrett <mjg@redhat.com>
|
||||||
|
Date: Wed Dec 16 14:31:30 2009 -0500
|
||||||
|
|
||||||
|
Fix btusb autosuspend
|
||||||
|
|
||||||
|
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
|
||||||
|
index 4c33417..ec54dd6 100644
|
||||||
|
--- a/drivers/bluetooth/btusb.c
|
||||||
|
+++ b/drivers/bluetooth/btusb.c
|
||||||
|
@@ -307,6 +307,7 @@ static void btusb_bulk_complete(struct urb *urb)
|
||||||
|
return;
|
||||||
|
|
||||||
|
usb_anchor_urb(urb, &data->bulk_anchor);
|
||||||
|
+ usb_mark_last_busy(data->udev);
|
||||||
|
|
||||||
|
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||||
|
if (err < 0) {
|
|
@ -0,0 +1,13 @@
|
||||||
|
fixes:
|
||||||
|
implicit declaration of function kzalloc
|
||||||
|
|
||||||
|
--- linux-2.6.34.noarch/drivers/usb/serial/qcserial.c~ 2010-06-08 15:19:41.000000000 -0400
|
||||||
|
+++ linux-2.6.34.noarch/drivers/usb/serial/qcserial.c 2010-06-08 15:19:47.000000000 -0400
|
||||||
|
@@ -11,6 +11,7 @@
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
+#include <linux/slab.h>
|
||||||
|
#include <linux/tty.h>
|
||||||
|
#include <linux/tty_flip.h>
|
||||||
|
#include <linux/usb.h>
|
|
@ -0,0 +1,41 @@
|
||||||
|
Date: Mon, 1 Feb 2010 12:53:47 +1300
|
||||||
|
From: Peter Hutterer <peter.hutterer@redhat.com>
|
||||||
|
To: Dave Airlie <airlied@redhat.com>
|
||||||
|
Subject: [PATCH] HID: add multi-input quirk for eGalax Touchcontroller
|
||||||
|
|
||||||
|
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
Tested-by: Alfred Broda <guaranga@wp.pl>
|
||||||
|
---
|
||||||
|
drivers/hid/hid-ids.h | 3 +++
|
||||||
|
drivers/hid/usbhid/hid-quirks.c | 1 +
|
||||||
|
2 files changed, 4 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
||||||
|
index f5144b8..2e698a2 100644
|
||||||
|
--- a/drivers/hid/hid-ids.h
|
||||||
|
+++ b/drivers/hid/hid-ids.h
|
||||||
|
@@ -158,6 +158,9 @@
|
||||||
|
|
||||||
|
#define USB_VENDOR_ID_DRAGONRISE 0x0079
|
||||||
|
|
||||||
|
+#define USB_VENDOR_ID_EGALAX 0x0EEF
|
||||||
|
+#define USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER 0x0001
|
||||||
|
+
|
||||||
|
#define USB_VENDOR_ID_ELO 0x04E7
|
||||||
|
#define USB_DEVICE_ID_ELO_TS2700 0x0020
|
||||||
|
|
||||||
|
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
|
||||||
|
index e987562..dc27d74 100644
|
||||||
|
--- a/drivers/hid/usbhid/hid-quirks.c
|
||||||
|
+++ b/drivers/hid/usbhid/hid-quirks.c
|
||||||
|
@@ -32,6 +32,7 @@ static const struct hid_blacklist {
|
||||||
|
{ USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR, HID_QUIRK_BADPAD },
|
||||||
|
{ USB_VENDOR_ID_ALPS, USB_DEVICE_ID_IBM_GAMEPAD, HID_QUIRK_BADPAD },
|
||||||
|
{ USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD, HID_QUIRK_BADPAD },
|
||||||
|
+ { USB_VENDOR_ID_EGALAX, USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER, HID_QUIRK_MULTI_INPUT },
|
||||||
|
{ USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
|
||||||
|
{ USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
|
||||||
|
{ USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
|
||||||
|
--
|
||||||
|
1.6.5.2
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
From b2c6d55b2351152696aafb8c9bf3ec8968acf77c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||||
|
Date: Mon, 29 Mar 2010 23:59:58 -0400
|
||||||
|
Subject: linux-2.6-input-kill-stupid-messages
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/input/keyboard/atkbd.c | 5 +++++
|
||||||
|
1 files changed, 5 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
|
||||||
|
index d358ef8..38db098 100644
|
||||||
|
--- a/drivers/input/keyboard/atkbd.c
|
||||||
|
+++ b/drivers/input/keyboard/atkbd.c
|
||||||
|
@@ -425,11 +426,15 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
|
||||||
|
goto out;
|
||||||
|
case ATKBD_RET_ACK:
|
||||||
|
case ATKBD_RET_NAK:
|
||||||
|
+#if 0
|
||||||
|
+ /* Quite a few key switchers and other tools trigger this
|
||||||
|
+ * and it confuses people who can do nothing about it */
|
||||||
|
if (printk_ratelimit())
|
||||||
|
dev_warn(&serio->dev,
|
||||||
|
"Spurious %s on %s. "
|
||||||
|
"Some program might be trying access hardware directly.\n",
|
||||||
|
data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys);
|
||||||
|
+#endif
|
||||||
|
goto out;
|
||||||
|
case ATKBD_RET_ERR:
|
||||||
|
atkbd->err_count++;
|
||||||
|
--
|
||||||
|
1.7.0.1
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
Subject: [PATCH] [intel_iommu] Default to igfx_off
|
||||||
|
From: drago01 <drago01@gmail.com>
|
||||||
|
To: fedora-kernel-list <fedora-kernel-list@redhat.com>
|
||||||
|
|
||||||
|
This option seems to causes way to many issues, it is
|
||||||
|
being investigated by Intel's chipset team for months now and
|
||||||
|
we still don't have any outcome.
|
||||||
|
|
||||||
|
The results so far are "black screen when starting X",
|
||||||
|
"system hangs when using GL", "system does not resume".
|
||||||
|
|
||||||
|
The patch adds an intel_iommu=igfx_on option, which makes it opt in,
|
||||||
|
rather than opt out.
|
||||||
|
|
||||||
|
Signed-off-by: Adel Gadllah <adel.gadllah@gmail.com>
|
||||||
|
Reviewed-by: Adam Jackson <ajax@redhat.com>
|
||||||
|
---
|
||||||
|
Documentation/kernel-parameters.txt | 11 +++++------
|
||||||
|
drivers/pci/intel-iommu.c | 9 +++++----
|
||||||
|
2 files changed, 10 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
|
||||||
|
index e7848a0..9914485 100644
|
||||||
|
--- a/Documentation/kernel-parameters.txt
|
||||||
|
+++ b/Documentation/kernel-parameters.txt
|
||||||
|
@@ -992,12 +992,11 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
|
Enable intel iommu driver.
|
||||||
|
off
|
||||||
|
Disable intel iommu driver.
|
||||||
|
- igfx_off [Default Off]
|
||||||
|
- By default, gfx is mapped as normal device. If a gfx
|
||||||
|
- device has a dedicated DMAR unit, the DMAR unit is
|
||||||
|
- bypassed by not enabling DMAR with this option. In
|
||||||
|
- this case, gfx device will use physical address for
|
||||||
|
- DMA.
|
||||||
|
+ igfx_on [Default Off]
|
||||||
|
+ By default, the gfx's DMAR unit is bypassed by not enabling
|
||||||
|
+ DMAR with this option. So the gfx device will use physical
|
||||||
|
+ address for DMA. When this option is enabled it the gfx is
|
||||||
|
+ mapped as normal device.
|
||||||
|
forcedac [x86_64]
|
||||||
|
With this option iommu will not optimize to look
|
||||||
|
for io virtual address below 32 bit forcing dual
|
||||||
|
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
|
||||||
|
index 4173125..8f36786 100644
|
||||||
|
--- a/drivers/pci/intel-iommu.c
|
||||||
|
+++ b/drivers/pci/intel-iommu.c
|
||||||
|
@@ -340,7 +340,8 @@ int dmar_disabled = 0;
|
||||||
|
int dmar_disabled = 1;
|
||||||
|
#endif /*CONFIG_DMAR_DEFAULT_ON*/
|
||||||
|
|
||||||
|
-static int dmar_map_gfx = 1;
|
||||||
|
+/* disabled by default; causes way too many issues */
|
||||||
|
+static int dmar_map_gfx = 0;
|
||||||
|
static int dmar_forcedac;
|
||||||
|
static int intel_iommu_strict;
|
||||||
|
|
||||||
|
@@ -361,10 +362,10 @@ static int __init intel_iommu_setup(char *str)
|
||||||
|
} else if (!strncmp(str, "off", 3)) {
|
||||||
|
dmar_disabled = 1;
|
||||||
|
printk(KERN_INFO "Intel-IOMMU: disabled\n");
|
||||||
|
- } else if (!strncmp(str, "igfx_off", 8)) {
|
||||||
|
- dmar_map_gfx = 0;
|
||||||
|
+ } else if (!strncmp(str, "igfx_on", 7)) {
|
||||||
|
+ dmar_map_gfx = 1;
|
||||||
|
printk(KERN_INFO
|
||||||
|
- "Intel-IOMMU: disable GFX device mapping\n");
|
||||||
|
+ "Intel-IOMMU: enabled GFX device mapping\n");
|
||||||
|
} else if (!strncmp(str, "forcedac", 8)) {
|
||||||
|
printk(KERN_INFO
|
||||||
|
"Intel-IOMMU: Forcing DAC for PCI devices\n");
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
_______________________________________________
|
||||||
|
kernel mailing list
|
||||||
|
kernel@lists.fedoraproject.org
|
||||||
|
https://admin.fedoraproject.org/mailman/listinfo/kernel
|
||||||
|
|
|
@ -0,0 +1,181 @@
|
||||||
|
Backport of "cfg80211: age scan results on resume" by Dan Williams.
|
||||||
|
|
||||||
|
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
|
||||||
|
index 23c0ab7..0432eb6 100644
|
||||||
|
--- a/include/net/cfg80211.h
|
||||||
|
+++ b/include/net/cfg80211.h
|
||||||
|
@@ -450,6 +450,9 @@ struct ieee80211_channel;
|
||||||
|
* wireless extensions but this is subject to reevaluation as soon as this
|
||||||
|
* code is used more widely and we have a first user without wext.
|
||||||
|
*
|
||||||
|
+ * @suspend: wiphy device needs to be suspended
|
||||||
|
+ * @resume: wiphy device needs to be resumed
|
||||||
|
+ *
|
||||||
|
* @add_virtual_intf: create a new virtual interface with the given name,
|
||||||
|
* must set the struct wireless_dev's iftype.
|
||||||
|
*
|
||||||
|
@@ -499,6 +502,9 @@ struct ieee80211_channel;
|
||||||
|
* @set_channel: Set channel
|
||||||
|
*/
|
||||||
|
struct cfg80211_ops {
|
||||||
|
+ int (*suspend)(struct wiphy *wiphy);
|
||||||
|
+ int (*resume)(struct wiphy *wiphy);
|
||||||
|
+
|
||||||
|
int (*add_virtual_intf)(struct wiphy *wiphy, char *name,
|
||||||
|
enum nl80211_iftype type, u32 *flags,
|
||||||
|
struct vif_params *params);
|
||||||
|
diff --git a/include/net/wireless.h b/include/net/wireless.h
|
||||||
|
index 21c5d96..ae2d34d 100644
|
||||||
|
--- a/include/net/wireless.h
|
||||||
|
+++ b/include/net/wireless.h
|
||||||
|
@@ -220,6 +220,9 @@ struct wiphy {
|
||||||
|
/* dir in debugfs: ieee80211/<wiphyname> */
|
||||||
|
struct dentry *debugfsdir;
|
||||||
|
|
||||||
|
+ /* time spent in suspend, in seconds */
|
||||||
|
+ unsigned long suspend_duration;
|
||||||
|
+
|
||||||
|
char priv[0] __attribute__((__aligned__(NETDEV_ALIGN)));
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
|
||||||
|
index 9d4e4d8..691183e 100644
|
||||||
|
--- a/net/mac80211/cfg.c
|
||||||
|
+++ b/net/mac80211/cfg.c
|
||||||
|
@@ -1141,6 +1141,32 @@ static int ieee80211_set_channel(struct wiphy *wiphy,
|
||||||
|
return ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef CONFIG_PM
|
||||||
|
+static int ieee80211_suspend(struct wiphy *wiphy)
|
||||||
|
+{
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int ieee80211_resume(struct wiphy *wiphy)
|
||||||
|
+{
|
||||||
|
+ struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||||
|
+ unsigned long age_jiffies;
|
||||||
|
+ struct ieee80211_bss *bss;
|
||||||
|
+
|
||||||
|
+ age_jiffies = msecs_to_jiffies(wiphy->suspend_duration * MSEC_PER_SEC);
|
||||||
|
+ spin_lock_bh(&local->bss_lock);
|
||||||
|
+ list_for_each_entry(bss, &local->bss_list, list) {
|
||||||
|
+ bss->last_update -= age_jiffies;
|
||||||
|
+ }
|
||||||
|
+ spin_unlock_bh(&local->bss_lock);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+#else
|
||||||
|
+#define ieee80211_suspend NULL
|
||||||
|
+#define ieee80211_resume NULL
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
struct cfg80211_ops mac80211_config_ops = {
|
||||||
|
.add_virtual_intf = ieee80211_add_iface,
|
||||||
|
.del_virtual_intf = ieee80211_del_iface,
|
||||||
|
@@ -1169,4 +1195,6 @@ struct cfg80211_ops mac80211_config_ops = {
|
||||||
|
.change_bss = ieee80211_change_bss,
|
||||||
|
.set_txq_params = ieee80211_set_txq_params,
|
||||||
|
.set_channel = ieee80211_set_channel,
|
||||||
|
+ .suspend = ieee80211_suspend,
|
||||||
|
+ .resume = ieee80211_resume,
|
||||||
|
};
|
||||||
|
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
|
||||||
|
index f5c7c33..eb43ff5 100644
|
||||||
|
--- a/net/mac80211/scan.c
|
||||||
|
+++ b/net/mac80211/scan.c
|
||||||
|
@@ -745,6 +745,15 @@ static void ieee80211_scan_add_ies(struct iw_request_info *info,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static inline unsigned int elapsed_jiffies_msecs(unsigned long start)
|
||||||
|
+{
|
||||||
|
+ unsigned long end = jiffies;
|
||||||
|
+
|
||||||
|
+ if (end >= start)
|
||||||
|
+ return jiffies_to_msecs(end - start);
|
||||||
|
+
|
||||||
|
+ return jiffies_to_msecs(end + (MAX_JIFFY_OFFSET - start) + 1);
|
||||||
|
+}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ieee80211_scan_result(struct ieee80211_local *local,
|
||||||
|
@@ -857,8 +866,8 @@ ieee80211_scan_result(struct ieee80211_local *local,
|
||||||
|
&iwe, buf);
|
||||||
|
memset(&iwe, 0, sizeof(iwe));
|
||||||
|
iwe.cmd = IWEVCUSTOM;
|
||||||
|
- sprintf(buf, " Last beacon: %dms ago",
|
||||||
|
- jiffies_to_msecs(jiffies - bss->last_update));
|
||||||
|
+ sprintf(buf, " Last beacon: %ums ago",
|
||||||
|
+ elapsed_jiffies_msecs(bss->last_update));
|
||||||
|
iwe.u.data.length = strlen(buf);
|
||||||
|
current_ev = iwe_stream_add_point(info, current_ev,
|
||||||
|
end_buf, &iwe, buf);
|
||||||
|
diff --git a/net/wireless/core.h b/net/wireless/core.h
|
||||||
|
index f7fb9f4..a4031a9 100644
|
||||||
|
--- a/net/wireless/core.h
|
||||||
|
+++ b/net/wireless/core.h
|
||||||
|
@@ -41,6 +41,8 @@ struct cfg80211_registered_device {
|
||||||
|
struct mutex devlist_mtx;
|
||||||
|
struct list_head netdev_list;
|
||||||
|
|
||||||
|
+ unsigned long suspend_at;
|
||||||
|
+
|
||||||
|
/* must be last because of the way we do wiphy_priv(),
|
||||||
|
* and it should at least be aligned to NETDEV_ALIGN */
|
||||||
|
struct wiphy wiphy __attribute__((__aligned__(NETDEV_ALIGN)));
|
||||||
|
diff --git a/net/wireless/sysfs.c b/net/wireless/sysfs.c
|
||||||
|
index 79a3828..dc92564 100644
|
||||||
|
--- a/net/wireless/sysfs.c
|
||||||
|
+++ b/net/wireless/sysfs.c
|
||||||
|
@@ -55,6 +55,39 @@ static int wiphy_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+static int wiphy_suspend(struct device *dev, pm_message_t state)
|
||||||
|
+{
|
||||||
|
+ struct cfg80211_registered_device *rdev = dev_to_rdev(dev);
|
||||||
|
+ int ret = 0;
|
||||||
|
+
|
||||||
|
+ rdev->wiphy.suspend_duration = 0;
|
||||||
|
+ rdev->suspend_at = get_seconds();
|
||||||
|
+
|
||||||
|
+ if (rdev->ops->suspend) {
|
||||||
|
+ rtnl_lock();
|
||||||
|
+ ret = rdev->ops->suspend(&rdev->wiphy);
|
||||||
|
+ rtnl_unlock();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int wiphy_resume(struct device *dev)
|
||||||
|
+{
|
||||||
|
+ struct cfg80211_registered_device *rdev = dev_to_rdev(dev);
|
||||||
|
+ int ret = 0;
|
||||||
|
+
|
||||||
|
+ rdev->wiphy.suspend_duration = get_seconds() - rdev->suspend_at;
|
||||||
|
+
|
||||||
|
+ if (rdev->ops->resume) {
|
||||||
|
+ rtnl_lock();
|
||||||
|
+ ret = rdev->ops->resume(&rdev->wiphy);
|
||||||
|
+ rtnl_unlock();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
struct class ieee80211_class = {
|
||||||
|
.name = "ieee80211",
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
@@ -63,6 +96,8 @@ struct class ieee80211_class = {
|
||||||
|
#ifdef CONFIG_HOTPLUG
|
||||||
|
.dev_uevent = wiphy_uevent,
|
||||||
|
#endif
|
||||||
|
+ .suspend = wiphy_suspend,
|
||||||
|
+ .resume = wiphy_resume,
|
||||||
|
};
|
||||||
|
|
||||||
|
int wiphy_sysfs_init(void)
|
|
@ -0,0 +1,57 @@
|
||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index f908acc..960ff6f 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -746,6 +746,10 @@ quiet_cmd_vmlinux__ ?= LD $@
|
||||||
|
--start-group $(vmlinux-main) --end-group \
|
||||||
|
$(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o FORCE ,$^)
|
||||||
|
|
||||||
|
+ifdef AFTER_LINK
|
||||||
|
+cmd_vmlinux__ += ; $(AFTER_LINK)
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
# Generate new vmlinux version
|
||||||
|
quiet_cmd_vmlinux_version = GEN .version
|
||||||
|
cmd_vmlinux_version = set -e; \
|
||||||
|
diff --git a/arch/powerpc/kernel/vdso32/Makefile b/arch/powerpc/kernel/vdso32/Makefile
|
||||||
|
index 51ead52..ad21273 100644
|
||||||
|
--- a/arch/powerpc/kernel/vdso32/Makefile
|
||||||
|
+++ b/arch/powerpc/kernel/vdso32/Makefile
|
||||||
|
@@ -41,7 +41,8 @@ $(obj-vdso32): %.o: %.S
|
||||||
|
|
||||||
|
# actual build commands
|
||||||
|
quiet_cmd_vdso32ld = VDSO32L $@
|
||||||
|
- cmd_vdso32ld = $(CROSS32CC) $(c_flags) -Wl,-T $^ -o $@
|
||||||
|
+ cmd_vdso32ld = $(CROSS32CC) $(c_flags) -Wl,-T $^ -o $@ \
|
||||||
|
+ $(if $(AFTER_LINK),; $(AFTER_LINK))
|
||||||
|
quiet_cmd_vdso32as = VDSO32A $@
|
||||||
|
cmd_vdso32as = $(CROSS32CC) $(a_flags) -c -o $@ $<
|
||||||
|
|
||||||
|
diff --git a/arch/powerpc/kernel/vdso64/Makefile b/arch/powerpc/kernel/vdso64/Makefile
|
||||||
|
index 79da65d..f11c21b 100644
|
||||||
|
--- a/arch/powerpc/kernel/vdso64/Makefile
|
||||||
|
+++ b/arch/powerpc/kernel/vdso64/Makefile
|
||||||
|
@@ -36,7 +36,8 @@ $(obj-vdso64): %.o: %.S
|
||||||
|
|
||||||
|
# actual build commands
|
||||||
|
quiet_cmd_vdso64ld = VDSO64L $@
|
||||||
|
- cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $^ -o $@
|
||||||
|
+ cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $^ -o $@ \
|
||||||
|
+ $(if $(AFTER_LINK),; $(AFTER_LINK))
|
||||||
|
quiet_cmd_vdso64as = VDSO64A $@
|
||||||
|
cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
|
||||||
|
|
||||||
|
diff --git a/arch/x86/vdso/Makefile b/arch/x86/vdso/Makefile
|
||||||
|
index 6b4ffed..cbc3d05 100644
|
||||||
|
--- a/arch/x86/vdso/Makefile
|
||||||
|
+++ b/arch/x86/vdso/Makefile
|
||||||
|
@@ -120,7 +120,8 @@ $(obj)/vdso32-syms.lds: $(vdso32.so-y:%=$(obj)/vdso32-%-syms.lds) FORCE
|
||||||
|
quiet_cmd_vdso = VDSO $@
|
||||||
|
cmd_vdso = $(CC) -nostdlib -o $@ \
|
||||||
|
$(VDSO_LDFLAGS) $(VDSO_LDFLAGS_$(filter %.lds,$(^F))) \
|
||||||
|
- -Wl,-T,$(filter %.lds,$^) $(filter %.o,$^)
|
||||||
|
+ -Wl,-T,$(filter %.lds,$^) $(filter %.o,$^) \
|
||||||
|
+ $(if $(AFTER_LINK),; $(AFTER_LINK))
|
||||||
|
|
||||||
|
VDSO_LDFLAGS = -fPIC -shared $(call cc-ldoption, -Wl$(comma)--hash-style=sysv)
|
||||||
|
GCOV_PROFILE := n
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue