summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreisnerd <eisnerd@localhost>2008-05-16 07:30:35 +0000
committereisnerd <eisnerd@localhost>2008-05-16 07:30:35 +0000
commit33eb7051045f18257fff1af7e3fd3d4c0040ffa2 (patch)
tree7cdde343e8d4ef174280335777701b1b27cff727 /sys-kernel
parentSMTP Auth fix included upstream (diff)
downloadjokey-33eb7051045f18257fff1af7e3fd3d4c0040ffa2.tar.gz
jokey-33eb7051045f18257fff1af7e3fd3d4c0040ffa2.tar.bz2
jokey-33eb7051045f18257fff1af7e3fd3d4c0040ffa2.zip
bumb ThinkPadSources to 2.6.25
svn path=/trunk/; revision=398
Diffstat (limited to 'sys-kernel')
-rw-r--r--sys-kernel/thinkpad-sources/ChangeLog15
-rw-r--r--sys-kernel/thinkpad-sources/Manifest23
-rw-r--r--sys-kernel/thinkpad-sources/files/2.6.25/02-disk-protect-for-2.6.25.patch917
-rw-r--r--sys-kernel/thinkpad-sources/files/2.6.25/03-ipw2200-inject-for-2.6.25.patch77
-rw-r--r--sys-kernel/thinkpad-sources/files/2.6.25/04-linux-phc-0.3.1-for-2.6.25.patch526
-rw-r--r--sys-kernel/thinkpad-sources/files/2.6.25/colored-printk-2.6.25.part1.patch113
-rw-r--r--sys-kernel/thinkpad-sources/files/2.6.25/colored-printk-2.6.25.part2.patch220
-rw-r--r--sys-kernel/thinkpad-sources/files/2.6.25/colored-printk-2.6.25.part3.patch146
-rw-r--r--sys-kernel/thinkpad-sources/files/2.6.25/kernel-2.6.25-export-init_mm.patch11
-rw-r--r--sys-kernel/thinkpad-sources/files/2.6.25/kernel-2.6.25-rcu-license.patch20
-rw-r--r--sys-kernel/thinkpad-sources/files/2.6.25/pci-e_aspm_v3.5.patch1101
-rw-r--r--sys-kernel/thinkpad-sources/files/2.6.25/vt-fix.patch146
-rw-r--r--sys-kernel/thinkpad-sources/files/configs/config-for-core-2.6.252333
-rw-r--r--sys-kernel/thinkpad-sources/thinkpad-sources-2.6.25.ebuild (renamed from sys-kernel/thinkpad-sources/thinkpad-sources-2.6.24-r3.ebuild)33
14 files changed, 5662 insertions, 19 deletions
diff --git a/sys-kernel/thinkpad-sources/ChangeLog b/sys-kernel/thinkpad-sources/ChangeLog
index cd1ed8d..9b2af2c 100644
--- a/sys-kernel/thinkpad-sources/ChangeLog
+++ b/sys-kernel/thinkpad-sources/ChangeLog
@@ -1,5 +1,20 @@
+ 16 May 2008; Florian Manschwetus <FlorianManschwetus@gmx.de>
+ -thinkpad-sources-2.6.24-r3.ebuild, +thinkpad-sources-2.6.25.ebuild,
+ +files/2.6.25/kernel-2.6.25-export-init_mm.patch,
+ +files/2.6.25/kernel-2.6.25-rcu-license.patch, +files/2.6.25,
+ +files/2.6.25/colored-printk-2.6.25.part1.patch,
+ +files/2.6.25/pci-e_aspm_v3.5.patch,
+ +files/2.6.25/04-linux-phc-0.3.1-for-2.6.25.patch,
+ +files/configs/config-for-core-2.6.25,
+ +files/2.6.25/colored-printk-2.6.25.part2.patch,
+ +files/2.6.25/colored-printk-2.6.25.part3.patch,
+ +files/2.6.25/02-disk-protect-for-2.6.25.patch,
+ +files/2.6.25/03-ipw2200-inject-for-2.6.25.patch,
+ +files/2.6.25/vt-fix.patch:
+ Bumb to 2.6.25 and clean of 2.6.24-r3
+
14 Mar 2008; Florian Manschwetus <florianmanschwetus@gmx.de>
+thinkpad-sources-2.6.24-r4.ebuild:
bump to 2.6.24-r4
diff --git a/sys-kernel/thinkpad-sources/Manifest b/sys-kernel/thinkpad-sources/Manifest
index e0cf23a..b990062 100644
--- a/sys-kernel/thinkpad-sources/Manifest
+++ b/sys-kernel/thinkpad-sources/Manifest
@@ -4,16 +4,29 @@ AUX 2.6.24-r1/pci-e_aspm_v3.patch 30672 RMD160 6533c11e2e8b8b7f092488b193e9b31ff
AUX 2.6.24-r3/disk-protect-fix-for-2.6.24.patch 723 RMD160 93670c5310ff7e2cd2fd33367756fec91f1ce7fc SHA1 7d896adf370dbdef73e39a1b58a0cc66be337483 SHA256 5f755833a64abd8d9ef2a5a060b40f22478e13ee91c2722cc2161f87a80bec01
AUX 2.6.24/disk-protect-for-2.6.24.patch 26920 RMD160 6ec7ac0b4c56ba15d0bc66cfe1c2ec71263cfbd0 SHA1 917c4d0f3620227f61e399a73bbedf6ec227e357 SHA256 bf831e5a068ffbf4182974287c600646afee84878c12697da05f8bca440ae22e
AUX 2.6.24/linux-phc-0.3.1-for-2.6.24-rc1.patch 15425 RMD160 a1317ed8dabde11a1abde5887d972912bb8130b3 SHA1 4c31ff80c16ab0238e6fa254507d79f11e301241 SHA256 0789f27d86f8aa580d628ce0190eb50a0232678107f85d63819ba09a435ff057
+AUX 2.6.25/02-disk-protect-for-2.6.25.patch 28041 RMD160 db29875229b28a95c68c1da982727a4e08f105ab SHA1 4799500b74091173d1c1f17a6f7df668f800a400 SHA256 a6ce92c1eac576709e4dd067663f6fed427dd7721b2633b1d954301300cb38b7
+AUX 2.6.25/03-ipw2200-inject-for-2.6.25.patch 2182 RMD160 da365e1a73901e813ec9e73caca385dd5290d7b4 SHA1 67528e54a48288edee6f6c1642d73dee7a4146d2 SHA256 2e1016a2ebbde01ba34ea60b86ceec9082399afaaab0fd5ad03546a9a6b197e9
+AUX 2.6.25/04-linux-phc-0.3.1-for-2.6.25.patch 15389 RMD160 2c33673ff0ec9021c1ec214b022fe73900c2811a SHA1 292f4a9874cb5905ef4feb06bfbcbc07e8dcdfca SHA256 1c00c0b22116b59bb4f77e5dcaad649120ad100eb4fded50924e76279d965049
+AUX 2.6.25/colored-printk-2.6.25.part1.patch 3151 RMD160 15417414247874e7c47bc0ac44a1eb9565bebfae SHA1 5edeca7d5f8625f8fadcdfbdbac2d3480cba8d2c SHA256 290afd26e79fc4493de29ea20e86ea92f809da1e3db6c2e8a0edf9e0455fcea8
+AUX 2.6.25/colored-printk-2.6.25.part2.patch 7972 RMD160 4ecc61abcf310a6013124fc1a49d046d7ab11fd6 SHA1 60a14368c01148f9ead5b4fe682d36e24a9e8933 SHA256 bbbff7947588f222610bd75be772351f9de08eb3df3ce4be20153bac7759578f
+AUX 2.6.25/colored-printk-2.6.25.part3.patch 4150 RMD160 c1ffc2b7d28ac86b167179b9793bc2971648118d SHA1 4d8ee860b0d0b0951b34414f2591e725d88aa53a SHA256 e12e2aedff58baa521523160ad8a16fca8372b347c147d1c16263d3b6c79aab9
+AUX 2.6.25/kernel-2.6.25-export-init_mm.patch 527 RMD160 09470465828a58d09f6a924e51ea9b34754cf108 SHA1 c0790545008f44287e8b8264c5d9919bf372e6c8 SHA256 4be986289e4032eecc8909cf636d3e47e66044d9bc40d36f4e10f8ba472ef203
+AUX 2.6.25/kernel-2.6.25-rcu-license.patch 492 RMD160 375a45f3b55a6e591c872eb3213b1cb7d3f9cb3f SHA1 1aa76913d07870967fccc4deb235619ca2ce7297 SHA256 1e27b7522dd0a2ac2ee6913c4a1a403eff7e2652b9dfd4625f657f5ff2f8a75f
+AUX 2.6.25/pci-e_aspm_v3.5.patch 32683 RMD160 8e126c0894d85f508ac190a6fecaa45fb7c56875 SHA1 697401cab1315e1c9025b8c17d0cfc78c59d2cda SHA256 89bf8956cc6cc0720bf0dad7107691a5bc5bd33da35fab1909e9f59f08e9ae5b
+AUX 2.6.25/vt-fix.patch 6046 RMD160 6c018e117029867928713f9c1577f70a32a8541c SHA1 9da5b59769ead4d971def7a26d98cae3741f2474 SHA256 4e62d4467e3c11f3f3e37787e583ffefe333cbdf367cae2fef384673dcd31d47
AUX configs/config-for-core-2.6.24-r3 54230 RMD160 f8e14cb7ced5f2c4686e0ca71f4af7fd50a52ef7 SHA1 fd96216727e11ade2f60fd59c6bb0ca573aa2111 SHA256 d07ea05322d46d0c26a7ed15c557d48628c1a60bd68204f8a9829c961ed70639
-DIST genpatches-2.6.24-3.base.tar.bz2 22714 RMD160 826ab844e3f4d96f94e09d8763a0131d01bdce94 SHA1 1c50a62af1265684b8039d936a4fb044b3eb72b8 SHA256 51e9a3b0ca3f7434b9b0e91072509e7f697998efbfc869b6528daa7811bc2bb3
-DIST genpatches-2.6.24-3.extras.tar.bz2 43587 RMD160 a41366bb7372c168d4ede2de420256e25560122c SHA1 3a048660019206344a065beaa8dbaadbfa0a7f3b SHA256 8cee70233f609bd01c1645e9cb90c4637ee6f989b4583d652ea2df57a8894296
+AUX configs/config-for-core-2.6.25 57068 RMD160 1cab7fb18d023e9aabd0df30db4a4825ee52eee2 SHA1 5b6ec9e157213243e444e1f899d1a097946a1eb7 SHA256 3b35429771d0f11d57c1ee57f5fee1db15622e7c1533f6330f6fd6e47945e190
DIST genpatches-2.6.24-4.base.tar.bz2 39369 RMD160 c6c0bd063edbd4a2d1606cc53580530e6b0e01c4 SHA1 b6e0d72b5d452648ca3f33a529e4b6a063b10ed7 SHA256 bae9b6d932d18089283ca5ec4a8999b888dbf8d5ae3f5be8302c823f14b6f082
DIST genpatches-2.6.24-4.extras.tar.bz2 43587 RMD160 a41366bb7372c168d4ede2de420256e25560122c SHA1 3a048660019206344a065beaa8dbaadbfa0a7f3b SHA256 8cee70233f609bd01c1645e9cb90c4637ee6f989b4583d652ea2df57a8894296
+DIST genpatches-2.6.25-4.base.tar.bz2 22088 RMD160 fd3a402ac7bd0f5fd7b623571b3e0452beb90fb3 SHA1 28c320f763160a428b466c4cdec3da7d17145e03 SHA256 7898eda702de503afe70b8d36e0594623453457cfa3fb7eabdd2b44de7f88fb0
+DIST genpatches-2.6.25-4.extras.tar.bz2 41717 RMD160 bc2f220a944f701d944061f11d633f2301139ccc SHA1 79d093c93ff1c76e98bff174d5b3c603cd1f0d7e SHA256 0cc8eaab5e746a7b514ee6c86e6ae986618ae4929c0a0c4a8e6098c9d3a43eae
DIST linux-2.6.24.tar.bz2 46737783 RMD160 0e5194c69c3d82c41ece689c4f84e638f8776d34 SHA1 351aebc784a5395fe4c92d1e514a89680482f7e2 SHA256 413c64fbbcf81244cb5571be4963644a1e81166a2b0f008a016528363b65c5d3
-DIST thinkpad-acpi-0.19-20080213_v2.6.24.2.patch.gz 39955 RMD160 25054fa54d9c3b9c4990247f655dd90e5a450f03 SHA1 d22e0796696bb7c0c2aa3b5779293bedea8d19dd SHA256 e6f8b98dc53af178fd3cfa21919a00411e05772a229c5123b07ff56e756c6e7a
+DIST linux-2.6.25.tar.bz2 48601689 RMD160 cf3ed52f888fe9df7a93abe4fdc2f598e1ba0ce4 SHA1 aa6187a1c212dd2d8bd906b023fcefdcf711f35e SHA256 108b2a3f2b05c0e57d1d0977619525e46f8d4b425aef4b38b47dcf94292f2dd2
DIST thinkpad-acpi-0.19-20080229_v2.6.24.3.patch.gz 41763 RMD160 bdcea1df691197351b60ad0721f0fd6c9cf36d7f SHA1 0e88d4223908e6c837576b3f986c8ebd94d9b9bc SHA256 5b5d6a2fc9da5ccf0dddec0ac470deb88b6adb5f2606015672c9f79120569e13
+DIST thinkpad-acpi-0.20-20080430_v2.6.25.1.patch.gz 14918 RMD160 ed6e3b8b686fe95b68536ef29359d82967542860 SHA1 bd92ed2559b03b09519ddf37cea73a1d3c7c7003 SHA256 57b8fdc3b44ed9c7255e979d3db3ff6d351adc436b3a973f87ebb333c800b001
DIST tuxonice-3.0-rc5-for-2.6.24.patch.bz2 113258 RMD160 c1fde23de970b6347302ae2bff71bf3ab1bfbeb3 SHA1 bf559c8dead1d0372d3388e4f9d2c4d145862ec1 SHA256 0a3b502b89bebbcd0f701a0e89c072797257ce766b2ea2d2bda1f6762ca2ce9b
-EBUILD thinkpad-sources-2.6.24-r3.ebuild 3439 RMD160 f7db57d66555810ccb04b2d9ed9a993cee8d92c7 SHA1 c8e5b3ebc44cd88092026c904aaabf98ebd0415e SHA256 e6e4b8103264242ff4c3d996b9bf113aa0d43c6482eab2b424dca7726f7b6b64
+DIST tuxonice-3.0-rc7-for-2.6.25.patch.bz2 113685 RMD160 863ca8197572c2b1a14a0922fff21723fe23d455 SHA1 3629a55777740bda65d5df62309aa3e978e91f79 SHA256 1dbd15f436026c5383db42da7ce96708542b3dd42e17446bf809e5b8ce5c3bd2
EBUILD thinkpad-sources-2.6.24-r4.ebuild 3439 RMD160 b574ba9ae5f097444523bda049ae9247914aa4dd SHA1 2d1cf7e59f33a85587568a0cd46d1ab545ad1607 SHA256 15ca5c2cdb3fafc2589d587116f94eb5abd6d627100b246053bab810cdac6900
-MISC ChangeLog 3307 RMD160 c3e125be3fbf03690a430c262266f66095e26652 SHA1 73d89db5268af806f1406bed7e72ecf167d0093c SHA256 52b3dc6df4c0473fdca900e0ea641abb8ed4c78c944b8d16e035abe3e008bce7
+EBUILD thinkpad-sources-2.6.25.ebuild 3678 RMD160 27fdee391b1bb1fdccd28d3f8154d8ef85901fba SHA1 30d6f8171a05a2d08247ef9b2941ba9c54ffb402 SHA256 604ef6d2172c6a364f292509f88f32d16f56c584bba45d985447751f00426c1f
+MISC ChangeLog 4016 RMD160 8ff530776a534cb79b2bb90729eb1a3699907a51 SHA1 8297e8cd1738af94677a8c053c2535840f744641 SHA256 b8002e68a05a49ed8e457718152e9b3f8e4a5cf24187c038bc8c6088c88a4c2f
MISC metadata.xml 284 RMD160 5062b08f804b7eaf9e1765c0d38b7fc95bc467e4 SHA1 687ba9103e597aad8a7231ff9a470d841f7121df SHA256 6ca83c8927bd3516baac49bc9ea82ddbeeddbe38a5a98b637d6eb1f1d436c84a
diff --git a/sys-kernel/thinkpad-sources/files/2.6.25/02-disk-protect-for-2.6.25.patch b/sys-kernel/thinkpad-sources/files/2.6.25/02-disk-protect-for-2.6.25.patch
new file mode 100644
index 0000000..9738753
--- /dev/null
+++ b/sys-kernel/thinkpad-sources/files/2.6.25/02-disk-protect-for-2.6.25.patch
@@ -0,0 +1,917 @@
+diff -Naur a/block/blk-core.c b/block/blk-core.c
+--- a/block/blk-core.c 2008-04-13 14:04:22.000000000 +0200
++++ b/block/blk-core.c 2008-04-13 14:25:48.000000000 +0200
+@@ -320,6 +320,46 @@
+ }
+ EXPORT_SYMBOL(blk_unplug);
+
++/*
++ * Issue lower level unprotect function if no timers are pending.
++ */
++void blk_unfreeze_work(struct work_struct *work)
++{
++ struct request_queue *q = container_of(work, struct request_queue, unfreeze_work);
++ int pending;
++ unsigned long flags;
++
++ spin_lock_irqsave(q->queue_lock, flags);
++ pending = timer_pending(&q->unfreeze_timer);
++ spin_unlock_irqrestore(q->queue_lock, flags);
++ if (!pending)
++ q->issue_unprotect_fn(q);
++}
++
++/*
++ * Called when the queue freeze timeout expires...
++ */
++void blk_unfreeze_timeout(unsigned long data)
++{
++ struct request_queue *q = (struct request_queue *) data;
++
++ kblockd_schedule_work(&q->unfreeze_work);
++}
++
++/*
++ * The lower level driver parks and freezes the queue, and this block layer
++ * function sets up the freeze timeout timer on return. If the queue is
++ * already frozen then this is called to extend the timer...
++ */
++void blk_freeze_queue(struct request_queue *q, int seconds)
++{
++ /* Don't accept arbitrarily long freezes */
++ if (seconds >= q->max_unfreeze)
++ seconds = q->max_unfreeze;
++ /* set/reset the timer */
++ mod_timer(&q->unfreeze_timer, msecs_to_jiffies(seconds*1000) + jiffies);
++}
++
+ /**
+ * blk_start_queue - restart a previously stopped queue
+ * @q: The &struct request_queue in question
+@@ -482,6 +522,7 @@
+ }
+
+ init_timer(&q->unplug_timer);
++ init_timer(&q->unfreeze_timer);
+
+ kobject_init(&q->kobj, &blk_queue_ktype);
+
+diff -Naur a/block/blk.h b/block/blk.h
+--- a/block/blk.h 2008-04-13 14:04:22.000000000 +0200
++++ b/block/blk.h 2008-04-13 14:25:48.000000000 +0200
+@@ -18,6 +18,9 @@
+
+ void blk_unplug_work(struct work_struct *work);
+ void blk_unplug_timeout(unsigned long data);
++void blk_unfreeze_work(struct work_struct *work);
++void blk_unfreeze_timeout(unsigned long data);
++void blk_freeze_queue(struct request_queue *q, int seconds);
+
+ struct io_context *current_io_context(gfp_t gfp_flags, int node);
+
+diff -Naur a/block/blk-settings.c b/block/blk-settings.c
+--- a/block/blk-settings.c 2008-04-13 14:04:22.000000000 +0200
++++ b/block/blk-settings.c 2008-04-13 14:25:48.000000000 +0200
+@@ -112,6 +112,16 @@
+ q->unplug_timer.function = blk_unplug_timeout;
+ q->unplug_timer.data = (unsigned long)q;
+
++ q->max_unfreeze = 30;
++
++ INIT_WORK(&q->unfreeze_work, blk_unfreeze_work);
++
++ q->unfreeze_timer.function = blk_unfreeze_timeout;
++ q->unfreeze_timer.data = (unsigned long)q;
++
++ /* Set protect_method to auto detection initially */
++ q->protect_method = 2;
++
+ /*
+ * by default assume old behaviour and bounce for any highmem page
+ */
+@@ -119,6 +129,18 @@
+ }
+ EXPORT_SYMBOL(blk_queue_make_request);
+
++void blk_queue_issue_protect_fn(struct request_queue *q, issue_protect_fn *ipf)
++{
++ q->issue_protect_fn = ipf;
++}
++EXPORT_SYMBOL(blk_queue_issue_protect_fn);
++
++void blk_queue_issue_unprotect_fn(struct request_queue *q, issue_unprotect_fn *iuf)
++{
++ q->issue_unprotect_fn = iuf;
++}
++EXPORT_SYMBOL(blk_queue_issue_unprotect_fn);
++
+ /**
+ * blk_queue_bounce_limit - set bounce buffer limit for queue
+ * @q: the request queue for the device
+diff -Naur a/block/blk-sysfs.c b/block/blk-sysfs.c
+--- a/block/blk-sysfs.c 2008-04-13 14:04:22.000000000 +0200
++++ b/block/blk-sysfs.c 2008-04-13 14:25:48.000000000 +0200
+@@ -270,6 +270,160 @@
+ .release = blk_release_queue,
+ };
+
++/*
++ * When reading the 'protect' attribute, we return seconds remaining
++ * before unfreeze timeout expires
++ */
++static ssize_t queue_protect_show(struct request_queue *q, char *page)
++{
++ unsigned int seconds = 0;
++
++ spin_lock_irq(q->queue_lock);
++ if (blk_queue_stopped(q) && timer_pending(&q->unfreeze_timer))
++ /*
++ * Adding 1 in order to guarantee nonzero value until timer
++ * has actually expired.
++ */
++ seconds = jiffies_to_msecs(q->unfreeze_timer.expires
++ - jiffies) / 1000 + 1;
++ spin_unlock_irq(q->queue_lock);
++ return queue_var_show(seconds, (page));
++}
++
++/*
++ * When writing the 'protect' attribute, input is the number of seconds
++ * to freeze the queue for. We call a lower level helper function to
++ * park the heads and freeze/block the queue, then we make a block layer
++ * call to setup the thaw timeout. If input is 0, then we thaw the queue.
++ */
++static ssize_t queue_protect_store(struct request_queue *q,
++ const char *page, size_t count)
++{
++ unsigned long freeze = 0;
++
++ queue_var_store(&freeze, page, count);
++
++ if (freeze>0) {
++ /* Park and freeze */
++ if (!blk_queue_stopped(q))
++ q->issue_protect_fn(q);
++ /* set / reset the thaw timer */
++ spin_lock_irq(q->queue_lock);
++ blk_freeze_queue(q, freeze);
++ spin_unlock_irq(q->queue_lock);
++ } else {
++ spin_lock_irq(q->queue_lock);
++ freeze = del_timer(&q->unfreeze_timer);
++ spin_unlock_irq(q->queue_lock);
++ if (freeze)
++ q->issue_unprotect_fn(q);
++ }
++
++ return count;
++}
++
++static ssize_t
++queue_str_show(char *page, char *str, int status)
++{
++ ssize_t len;
++
++ if (status & 1)
++ len = sprintf(page, "[%s]", str);
++ else
++ len = sprintf(page, "%s", str);
++ if (status & 2)
++ len += sprintf(page+len, "\n");
++ else
++ len += sprintf(page+len, " ");
++ return len;
++}
++
++/*
++ * Returns current protect_method.
++ */
++static ssize_t queue_protect_method_show(struct request_queue *q, char *page)
++{
++ int len = 0;
++ int unload = q->protect_method;
++
++ len += queue_str_show(page+len, "auto", (unload & 2) >> 1);
++ len += queue_str_show(page+len, "unload", unload & 1);
++ len += queue_str_show(page+len, "standby", !unload ? 3 : 2);
++ return len;
++}
++
++/*
++ * Stores the device protect method.
++ */
++static ssize_t queue_protect_method_store(struct request_queue *q,
++ const char *page, size_t count)
++{
++ spin_lock_irq(q->queue_lock);
++ if (!strcmp(page, "auto") || !strcmp(page, "auto\n"))
++ q->protect_method = 2;
++ else if (!strcmp(page, "unload") || !strcmp(page, "unload\n"))
++ q->protect_method = 1;
++ else if (!strcmp(page, "standby") || !strcmp(page, "standby\n"))
++ q->protect_method = 0;
++ else {
++ spin_unlock_irq(q->queue_lock);
++ return -EINVAL;
++ }
++ spin_unlock_irq(q->queue_lock);
++ return count;
++}
++
++static struct queue_sysfs_entry queue_protect_entry = {
++ .attr = { .name = "protect", .mode = S_IRUGO | S_IWUSR },
++ .show = queue_protect_show,
++ .store = queue_protect_store,
++};
++static struct queue_sysfs_entry queue_protect_method_entry = {
++ .attr = { .name = "protect_method", .mode = S_IRUGO | S_IWUSR },
++ .show = queue_protect_method_show,
++ .store = queue_protect_method_store,
++};
++
++static int blk_protect_register(struct request_queue *q)
++{
++ int error = 0;
++
++ /* check that the lower level driver has a protect handler */
++ if (!q->issue_protect_fn)
++ return 0;
++
++ /* create the attributes */
++ error = sysfs_create_file(&q->kobj, &queue_protect_entry.attr);
++ if (error) {
++ printk(KERN_ERR
++ "blk_protect_register(): failed to create protect queue attribute!\n");
++ return error;
++ }
++
++ error = sysfs_create_file(&q->kobj, &queue_protect_method_entry.attr);
++ if (error) {
++ sysfs_remove_file(&q->kobj, &queue_protect_entry.attr);
++ printk(KERN_ERR
++ "blk_protect_register(): failed to create protect_method attribute!\n");
++ return error;
++ }
++ kobject_get(&q->kobj);
++
++ return 0;
++}
++
++static void blk_protect_unregister(struct request_queue *q)
++{
++ /* check that the lower level driver has a protect handler */
++ if (!q->issue_protect_fn)
++ return;
++
++ /* remove the attributes */
++ sysfs_remove_file(&q->kobj, &queue_protect_method_entry.attr);
++ sysfs_remove_file(&q->kobj, &queue_protect_entry.attr);
++ kobject_put(&q->kobj);
++}
++
+ int blk_register_queue(struct gendisk *disk)
+ {
+ int ret;
+@@ -287,13 +441,20 @@
+ kobject_uevent(&q->kobj, KOBJ_ADD);
+
+ ret = elv_register_queue(q);
++ if (ret)
++ goto err;
++ ret = blk_protect_register(q);
+ if (ret) {
+- kobject_uevent(&q->kobj, KOBJ_REMOVE);
+- kobject_del(&q->kobj);
+- return ret;
++ elv_unregister_queue(q);
++ goto err;
+ }
+
+ return 0;
++
++err:
++ kobject_uevent(&q->kobj, KOBJ_REMOVE);
++ kobject_del(&q->kobj);
++ return ret;
+ }
+
+ void blk_unregister_queue(struct gendisk *disk)
+@@ -301,6 +462,7 @@
+ struct request_queue *q = disk->queue;
+
+ if (q && q->request_fn) {
++ blk_protect_unregister(q);
+ elv_unregister_queue(q);
+
+ kobject_uevent(&q->kobj, KOBJ_REMOVE);
+diff -Naur a/Documentation/block/disk-protection.txt b/Documentation/block/disk-protection.txt
+--- a/Documentation/block/disk-protection.txt 1970-01-01 01:00:00.000000000 +0100
++++ b/Documentation/block/disk-protection.txt 2008-04-13 14:25:48.000000000 +0200
+@@ -0,0 +1,79 @@
++Hard disk protection
++====================
++
++
++Intro
++-----
++ATA/ATAPI-7 specifies the IDLE IMMEDIATE command with UNLOAD FEATURE.
++Issuing this command should cause the drive to switch to idle mode and
++unload disk heads. This feature is being used in modern laptops in
++conjunction with accelerometers and appropriate software to implement
++a shock protection facility. The idea is to stop all I/O operations on
++the internal hard drive and park its heads on the ramp when critical
++situations are anticipated. The desire to have such a feature
++available on GNU/Linux systems has been the original motivation to
++implement a generic disk parking interface in the Linux kernel.
++
++
++The interface
++-------------
++The interface works as follows: Writing an integer value to
++/sys/block/*/queue/protect will park the respective drive and freeze
++the block layer queue for the specified number of seconds. When the
++timeout expires and no further disk park request has been issued in
++the meantime, the queue is unfrozen and accumulated I/O operations are
++performed.
++
++IMPORTANT NOTE:
++Not all ATA drives implement IDLE IMMEDIATE with UNLOAD FEATURE and
++quite a few of those that do so, don't report this capability as
++described in the specs. When a disk park has been requested through
++sysfs as described above, the kernel will try to determine if the
++drive supports the UNLOAD FEATURE by default. The kernel will only
++rely on the IDLE IMMEDIATE with UNLOAD FEATURE command if it is
++convinced that this command is actually supported by the disk drive;
++otherwise, it will fall back to STANDBY IMMEDIATE. Resuming from the
++latter will take much longer and it is generally more likely to have a
++negative impact on the drive's lifetime due to the inclease of spin
++down and up cycles. If you want to use this interface in a shock
++protection framework and you know that your drive does indeed support
++the IDLE IMMEDIATE with UNLOAD FEATURE command despite not saying so,
++you can force the kernel to issue that command by doing the following
++on the command line:
++# echo -n unload > /sys/block/sda/queue/protect_method
++(replace sda by the drive identifier as appropriate).
++
++/sys/block/*/queue/protect_method accepts auto, unload and standby
++respectively. Reading from protect_method shows the available options
++surrounding the active one with brackets. When auto is active, this
++will change to whatever the kernel sees fit after the next disk park
++command has been issued.
++
++
++References
++----------
++
++There are several laptops from different brands featuring shock
++protection capabilities. As manufacturers have refused to support open
++source development of the required software components so far, Linux
++support for shock protection varies considerably between different
++hardware implementations. Ideally, this section should contain a list
++of poiters at different projects aiming at an implementation of shock
++protection on different systeems. Unfortunately, I only know of a
++single project which, although still considered experimental, is fit
++for use. Please feel free to add projects that have been the victims
++of my ignorance.
++
++- http://www.thinkwiki.org/wiki/HDAPS
++ See this page for information about Linux support of the hard disk
++ active protection syystem as implemented in IBM/Lenovo Thinkpads.
++
++
++CREDITS
++-------
++
++The patch to implement the interface described in this file has
++originally been published by Jon Escombe <lists-Xbpc2PeERmvQXOPxS62xeg@public.gmane.org>.
++
++
++05 Dec 2006, Elias Oltmanns <eo-oA28OIkTjSVZXbeN9DUtxg@public.gmane.org>
+diff -Naur a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
+--- a/drivers/ata/libata-scsi.c 2008-04-13 14:04:23.000000000 +0200
++++ b/drivers/ata/libata-scsi.c 2008-04-13 14:26:04.000000000 +0200
+@@ -831,7 +831,7 @@
+ * prevent SCSI midlayer from automatically deferring
+ * requests.
+ */
+- sdev->max_device_blocked = 1;
++ sdev->max_device_blocked = 2;
+ }
+
+ /**
+@@ -905,6 +905,38 @@
+ return 0;
+ }
+
++extern int scsi_protect_queue(struct request_queue *q, int unload);
++extern int scsi_unprotect_queue(struct request_queue *q);
++
++static int ata_scsi_issue_protect_fn(struct request_queue *q)
++{
++ struct scsi_device *sdev = q->queuedata;
++ struct ata_port *ap = ata_shost_to_port(sdev->host);
++ struct ata_device *dev = ata_scsi_find_dev(ap, sdev);
++ int unload = q->protect_method;
++ unsigned long flags;
++
++ if (!dev) {
++ printk(KERN_DEBUG "ata_scsi_issue_protect_fn(): Couldn't find ATA device to be parked.\n");
++ return -ENXIO;
++ }
++
++ if (unload == 2) {
++ unload = ata_id_has_unload(dev->id) ? 1 : 0;
++ spin_lock_irqsave(q->queue_lock, flags);
++ q->protect_method = unload;
++ spin_unlock_irqrestore(q->queue_lock, flags);
++ }
++
++ /* call scsi_protect_queue, requesting either unload or standby */
++ return scsi_protect_queue(q, unload);
++}
++
++static int ata_scsi_issue_unprotect_fn(struct request_queue *q)
++{
++ return scsi_unprotect_queue(q);
++}
++
+ /**
+ * ata_scsi_slave_config - Set SCSI device attributes
+ * @sdev: SCSI device to examine
+@@ -927,6 +959,10 @@
+
+ if (dev)
+ rc = ata_scsi_dev_config(sdev, dev);
++ blk_queue_issue_protect_fn(sdev->request_queue,
++ ata_scsi_issue_protect_fn);
++ blk_queue_issue_unprotect_fn(sdev->request_queue,
++ ata_scsi_issue_unprotect_fn);
+
+ return rc;
+ }
+@@ -3206,7 +3242,7 @@
+ * Set host_blocked to 1 to prevent SCSI midlayer from
+ * automatically deferring requests.
+ */
+- shost->max_host_blocked = 1;
++ shost->max_host_blocked = 2;
+
+ rc = scsi_add_host(ap->scsi_host, ap->host->dev);
+ if (rc)
+diff -Naur a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c
+--- a/drivers/ide/ide-disk.c 2008-04-13 14:04:31.000000000 +0200
++++ b/drivers/ide/ide-disk.c 2008-04-13 14:25:48.000000000 +0200
+@@ -612,6 +612,148 @@
+ }
+
+ /*
++ * todo:
++ * - we freeze the queue regardless of success and rely on the
++ * ide_protect_queue function to thaw immediately if the command
++ * failed (to be consistent with the libata handler)... should
++ * we also inspect here?
++ */
++void ide_end_protect_rq(struct request *rq, int error)
++{
++ struct completion *waiting = rq->end_io_data;
++
++ rq->end_io_data = NULL;
++ /* spin lock already accquired */
++ if (!blk_queue_stopped(rq->q))
++ blk_stop_queue(rq->q);
++
++ complete(waiting);
++}
++
++int ide_unprotect_queue(struct request_queue *q)
++{
++ struct request rq;
++ unsigned long flags;
++ int pending, rc = 0;
++ ide_drive_t *drive = q->queuedata;
++ ide_task_t task;
++
++ if (!blk_queue_stopped(q))
++ return -EIO;
++
++ /* Are there any pending jobs on the queue? */
++ pending = ((q->rq.count[READ] > 0) || (q->rq.count[WRITE] > 0)) ? 1 : 0;
++
++ spin_lock_irqsave(q->queue_lock, flags);
++ blk_start_queue(q);
++ spin_unlock_irqrestore(q->queue_lock, flags);
++
++ /* The unload feature of the IDLE_IMMEDIATE command
++ temporarily disables HD power management from spinning down
++ the disk. Any other command will reenable HD pm, so, if
++ there are no pending jobs on the queue, another
++ CHECK_POWER_MODE1 command without the unload feature should do
++ just fine. */
++ if (!pending) {
++ printk(KERN_DEBUG "ide_unprotect_queue(): No pending I/O, re-enabling power management..\n");
++ memset(&task, 0, sizeof(task));
++ task.tf.command = WIN_CHECKPOWERMODE1; /* CHECK_POWER_MODE1 */
++ task.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
++ task.data_phase = TASKFILE_NO_DATA;
++ ide_init_drive_cmd(&rq);
++ rq.cmd_type = REQ_TYPE_ATA_TASKFILE;
++ rq.special = &task;
++ rc = ide_do_drive_cmd(drive, &rq, ide_head_wait);
++ }
++
++ return rc;
++}
++
++int ide_protect_queue(struct request_queue *q, int unload)
++{
++ ide_drive_t *drive = q->queuedata;
++ struct request rq;
++ ide_task_t task;
++ int ret = 0;
++ DECLARE_COMPLETION(wait);
++
++ memset(&rq, 0, sizeof(rq));
++ memset(&task, 0, sizeof(task));
++
++ if (blk_queue_stopped(q))
++ return -EIO;
++
++ task.data_phase = TASKFILE_NO_DATA;
++ task.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
++ if (unload) {
++ task.tf.command = 0xe1;
++ task.tf.feature = 0x44;
++ task.tf.lbal = 0x4c;
++ task.tf.lbam = 0x4e;
++ task.tf.lbah = 0x55;
++ } else
++ task.tf.command = 0xe0;
++
++ /* Issue the park command & freeze */
++ ide_init_drive_cmd(&rq);
++
++ rq.cmd_type = REQ_TYPE_ATA_TASKFILE;
++ rq.special = &task;
++ rq.end_io_data = &wait;
++ rq.end_io = ide_end_protect_rq;
++
++ ret = ide_do_drive_cmd(drive, &rq, ide_next);
++ wait_for_completion(&wait);
++
++ if (ret) {
++ printk(KERN_DEBUG "ide_protect_queue(): Warning: head NOT parked!..\n");
++ ide_unprotect_queue(q);
++ return ret;
++ }
++
++ if (unload) {
++ if (task.tf.lbal == 0xc4)
++ printk(KERN_DEBUG "ide_protect_queue(): head parked..\n");
++ else {
++ /* error parking the head */
++ printk(KERN_DEBUG "ide_protect_queue(): head NOT parked!..\n");
++ ret = -EIO;
++ ide_unprotect_queue(q);
++ }
++ } else
++ printk(KERN_DEBUG "ide_protect_queue(): head park not requested, used standby!..\n");
++
++ return ret;
++}
++
++int idedisk_issue_protect_fn(struct request_queue *q)
++{
++ ide_drive_t *drive = q->queuedata;
++ int unload = q->protect_method;
++ unsigned long flags;
++
++ /*
++ * Check capability of the device -
++ * - if "idle immediate with unload" is supported we use that, else
++ * we use "standby immediate" and live with spinning down the drive..
++ * (Word 84, bit 13 of IDENTIFY DEVICE data)
++ */
++ if (unload == 2) {
++ unload = drive->id->cfsse & (1 << 13) ? 1 : 0;
++ spin_lock_irqsave(q->queue_lock, flags);
++ q->protect_method = unload;
++ spin_unlock_irqrestore(q->queue_lock, flags);
++ }
++
++ return ide_protect_queue(q, unload);
++}
++
++int idedisk_issue_unprotect_fn(struct request_queue *q)
++{
++ return ide_unprotect_queue(q);
++}
++
++/*
+ * This is tightly woven into the driver->do_special can not touch.
+ * DON'T do it again until a total personality rewrite is committed.
+ */
+@@ -877,6 +1019,9 @@
+ drive->wcache = 1;
+
+ write_cache(drive, 1);
++
++ blk_queue_issue_protect_fn(drive->queue, idedisk_issue_protect_fn);
++ blk_queue_issue_unprotect_fn(drive->queue, idedisk_issue_unprotect_fn);
+ }
+
+ static void ide_cacheflush_p(ide_drive_t *drive)
+diff -Naur a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
+--- a/drivers/ide/ide-io.c 2008-04-13 14:04:31.000000000 +0200
++++ b/drivers/ide/ide-io.c 2008-04-13 14:25:48.000000000 +0200
+@@ -1158,6 +1158,17 @@
+ }
+
+ /*
++ * Don't accept a request when the queue is stopped (unless we
++ * are resuming from suspend). Prevents existing queue entries
++ * being processed after queue is stopped by the hard disk
++ * protection mechanism...
++ */
++ if (test_bit(QUEUE_FLAG_STOPPED, &drive->queue->queue_flags) && !blk_pm_resume_request(rq)) {
++ hwgroup->busy = 0;
++ break;
++ }
++
++ /*
+ * Sanity: don't accept a request that isn't a PM request
+ * if we are currently power managed. This is very important as
+ * blk_stop_queue() doesn't prevent the elv_next_request()
+@@ -1651,6 +1662,9 @@
+ where = ELEVATOR_INSERT_FRONT;
+ rq->cmd_flags |= REQ_PREEMPT;
+ }
++ if (action == ide_next)
++ where = ELEVATOR_INSERT_FRONT;
++
+ __elv_add_request(drive->queue, rq, where, 0);
+ ide_do_request(hwgroup, IDE_NO_IRQ);
+ spin_unlock_irqrestore(&ide_lock, flags);
+diff -Naur a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
+--- a/drivers/scsi/scsi_lib.c 2008-04-13 14:04:50.000000000 +0200
++++ b/drivers/scsi/scsi_lib.c 2008-04-13 14:25:48.000000000 +0200
+@@ -2248,7 +2248,13 @@
+ int
+ scsi_device_quiesce(struct scsi_device *sdev)
+ {
++ int i;
+ int err = scsi_device_set_state(sdev, SDEV_QUIESCE);
++ for (i = 0; err && (sdev->sdev_state == SDEV_BLOCK) && (i < 100);
++ i++) {
++ msleep_interruptible(200);
++ err = scsi_device_set_state(sdev, SDEV_QUIESCE);
++ }
+ if (err)
+ return err;
+
+@@ -2496,3 +2502,168 @@
+ kunmap_atomic(virt, KM_BIO_SRC_IRQ);
+ }
+ EXPORT_SYMBOL(scsi_kunmap_atomic_sg);
++
++/*
++ * Structure required for synchronous io completion after queue freezing
++ */
++struct scsi_protect_io_context_sync {
++ struct scsi_device *sdev;
++ int result;
++ char *sense;
++ struct completion *waiting;
++};
++
++/*
++ * scsi_protect_wait_done()
++ * Command completion handler for scsi_protect_queue().
++ *
++ * Unable to call scsi_internal_device_block() as
++ * scsi_end_request() already has the spinlock. So,
++ * we put the necessary functionality inline.
++ *
++ * todo:
++ * - we block the queue regardless of success and rely on the
++ * scsi_protect_queue function to unblock if the command
++ * failed... should we also inspect here?
++ */
++static void scsi_protect_wait_done(void *data, char *sense, int result, int resid)
++{
++ struct scsi_protect_io_context_sync *siocs = data;
++ struct completion *waiting = siocs->waiting;
++ struct request_queue *q = siocs->sdev->request_queue;
++
++ siocs->waiting = NULL;
++ siocs->result = result;
++ memcpy(siocs->sense, sense, SCSI_SENSE_BUFFERSIZE);
++
++ if (!scsi_device_set_state(siocs->sdev, SDEV_BLOCK))
++ blk_stop_queue(q);
++
++ complete(waiting);
++}
++
++/*
++ * scsi_unprotect_queue()
++ * - release the queue that was previously blocked
++ */
++int scsi_unprotect_queue(struct request_queue *q)
++{
++ struct scsi_device *sdev = q->queuedata;
++ int rc = 0, pending = 0;
++ u8 scsi_cmd[MAX_COMMAND_SIZE];
++ struct scsi_sense_hdr sshdr;
++
++ if (sdev->sdev_state != SDEV_BLOCK)
++ return -ENXIO;
++
++ /* Are there any pending jobs on the queue? */
++ pending = ((q->rq.count[READ] > 0) || (q->rq.count[WRITE] > 0)) ? 1 : 0;
++
++ rc = scsi_internal_device_unblock(sdev);
++ if (rc)
++ return rc;
++
++ if (!pending) {
++ printk(KERN_DEBUG "scsi_unprotect_queue(): No pending I/O, re-enabling power management..\n");
++
++ memset(scsi_cmd, 0, sizeof(scsi_cmd));
++ scsi_cmd[0] = ATA_16;
++ scsi_cmd[1] = (3 << 1); /* Non-data */
++ /* scsi_cmd[2] is already 0 -- no off.line, cc, or data xfer */
++ scsi_cmd[14] = 0xe5; /* CHECK_POWER_MODE1 */
++
++ /* Good values for timeout and retries? Values below
++ from scsi_ioctl_send_command() for default case... */
++ if (scsi_execute_req(sdev, scsi_cmd, DMA_NONE, NULL, 0, &sshdr,
++ (10*HZ), 5))
++ rc = -EIO;
++ }
++ return rc;
++}
++EXPORT_SYMBOL_GPL(scsi_unprotect_queue);
++
++/*
++ * scsi_protect_queue()
++ * - build and issue the park/standby command..
++ * - queue is blocked during command completion handler
++ */
++int scsi_protect_queue(struct request_queue *q, int unload)
++{
++ struct scsi_protect_io_context_sync siocs;
++ struct scsi_device *sdev = q->queuedata;
++ int rc = 0;
++ u8 args[7];
++ u8 scsi_cmd[MAX_COMMAND_SIZE];
++ unsigned char sense[SCSI_SENSE_BUFFERSIZE];
++ unsigned char *desc;
++ DECLARE_COMPLETION_ONSTACK(wait);
++
++ if (sdev->sdev_state != SDEV_RUNNING)
++ return -ENXIO;
++
++ memset(args, 0, sizeof(args));
++ memset(sense, 0, sizeof(sense));
++
++ if (unload) {
++ args[0] = 0xe1;
++ args[1] = 0x44;
++ args[3] = 0x4c;
++ args[4] = 0x4e;
++ args[5] = 0x55;
++ } else
++ args[0] = 0xe0;
++
++ memset(scsi_cmd, 0, sizeof(scsi_cmd));
++ scsi_cmd[0] = ATA_16;
++ scsi_cmd[1] = (3 << 1); /* Non-data */
++ scsi_cmd[2] = 0x20; /* no off.line, or data xfer, request cc */
++ scsi_cmd[4] = args[1];
++ scsi_cmd[6] = args[2];
++ scsi_cmd[8] = args[3];
++ scsi_cmd[10] = args[4];
++ scsi_cmd[12] = args[5];
++ scsi_cmd[14] = args[0];
++ siocs.sdev = sdev;
++ siocs.sense = sense;
++ siocs.waiting = &wait;
++
++ rc = scsi_execute_async(sdev, scsi_cmd, COMMAND_SIZE(scsi_cmd[0]),
++ DMA_NONE, NULL, 0, 0, (10*HZ), 5,
++ &siocs, &scsi_protect_wait_done, GFP_NOWAIT);
++ if (rc)
++ goto out;
++ wait_for_completion(&wait);
++
++ if (siocs.result != ((DRIVER_SENSE << 24) + SAM_STAT_CHECK_CONDITION)) {
++ printk(KERN_DEBUG "scsi_protect_queue(): head NOT parked!..\n");
++ scsi_unprotect_queue(q); /* just in case we still managed to block */
++ rc = -EIO;
++ goto out;
++ }
++
++ desc = sense + 8;
++
++ /* Retrieve data from check condition */
++ args[1] = desc[3];
++ args[2] = desc[5];
++ args[3] = desc[7];
++ args[4] = desc[9];
++ args[5] = desc[11];
++ args[0] = desc[13];
++
++ if (unload) {
++ if (args[3] == 0xc4)
++ printk(KERN_DEBUG "scsi_protect_queue(): head parked..\n");
++ else {
++ /* error parking the head */
++ printk(KERN_DEBUG "scsi_protect_queue(): head NOT parked!..\n");
++ rc = -EIO;
++ scsi_unprotect_queue(q);
++ }
++ } else
++ printk(KERN_DEBUG "scsi_protect_queue(): head park not requested, used standby!..\n");
++
++out:
++ return rc;
++}
++EXPORT_SYMBOL_GPL(scsi_protect_queue);
+diff -Naur a/include/linux/ata.h b/include/linux/ata.h
+--- a/include/linux/ata.h 2008-04-13 14:04:53.000000000 +0200
++++ b/include/linux/ata.h 2008-04-13 14:25:48.000000000 +0200
+@@ -459,6 +459,18 @@
+
+ #define ata_id_cdb_intr(id) (((id)[0] & 0x60) == 0x20)
+
++static inline int ata_id_has_unload(const u16 *id)
++{
++ /* ATA-7 specifies two places to indicate unload feature support.
++ * Since I don't really understand the difference, I'll just check
++ * both and only return zero if none of them indicates otherwise. */
++ if ((id[84] & 0xC000) == 0x4000 && id[84] & (1 << 13))
++ return id[84] & (1 << 13);
++ if ((id[87] & 0xC000) == 0x4000)
++ return id[87] & (1 << 13);
++ return 0;
++}
++
+ static inline bool ata_id_has_hipm(const u16 *id)
+ {
+ u16 val = id[76];
+diff -Naur a/include/linux/blkdev.h b/include/linux/blkdev.h
+--- a/include/linux/blkdev.h 2008-04-13 14:04:53.000000000 +0200
++++ b/include/linux/blkdev.h 2008-04-13 14:25:48.000000000 +0200
+@@ -260,6 +260,8 @@
+ typedef void (prepare_flush_fn) (struct request_queue *, struct request *);
+ typedef void (softirq_done_fn)(struct request *);
+ typedef int (dma_drain_needed_fn)(struct request *);
++typedef int (issue_protect_fn) (struct request_queue *);
++typedef int (issue_unprotect_fn) (struct request_queue *);
+
+ enum blk_queue_state {
+ Queue_down,
+@@ -297,6 +299,8 @@
+ prepare_flush_fn *prepare_flush_fn;
+ softirq_done_fn *softirq_done_fn;
+ dma_drain_needed_fn *dma_drain_needed;
++ issue_protect_fn *issue_protect_fn;
++ issue_unprotect_fn *issue_unprotect_fn;
+
+ /*
+ * Dispatch queue sorting
+@@ -312,6 +316,14 @@
+ unsigned long unplug_delay; /* After this many jiffies */
+ struct work_struct unplug_work;
+
++ /*
++ * Auto-unfreeze state
++ */
++ struct timer_list unfreeze_timer;
++ int max_unfreeze; /* At most this many seconds */
++ struct work_struct unfreeze_work;
++ int protect_method;
++
+ struct backing_dev_info backing_dev_info;
+
+ /*
+@@ -718,6 +730,8 @@
+ extern unsigned blk_ordered_cur_seq(struct request_queue *);
+ extern unsigned blk_ordered_req_seq(struct request *);
+ extern void blk_ordered_complete_seq(struct request_queue *, unsigned, int);
++extern void blk_queue_issue_protect_fn(struct request_queue *, issue_protect_fn *);
++extern void blk_queue_issue_unprotect_fn(struct request_queue *, issue_unprotect_fn *);
+
+ extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *);
+ extern void blk_dump_rq_flags(struct request *, char *);
+diff -Naur a/include/linux/ide.h b/include/linux/ide.h
+--- a/include/linux/ide.h 2008-04-13 14:04:53.000000000 +0200
++++ b/include/linux/ide.h 2008-04-13 14:25:48.000000000 +0200
+@@ -837,6 +837,7 @@
+ */
+ typedef enum {
+ ide_wait, /* insert rq at end of list, and wait for it */
++ ide_next, /* insert rq immediately after current request */
+ ide_preempt, /* insert rq in front of current request */
+ ide_head_wait, /* insert rq in front of current request and wait for it */
+ ide_end /* insert rq at end of list, but don't wait for it */
diff --git a/sys-kernel/thinkpad-sources/files/2.6.25/03-ipw2200-inject-for-2.6.25.patch b/sys-kernel/thinkpad-sources/files/2.6.25/03-ipw2200-inject-for-2.6.25.patch
new file mode 100644
index 0000000..ffb49a9
--- /dev/null
+++ b/sys-kernel/thinkpad-sources/files/2.6.25/03-ipw2200-inject-for-2.6.25.patch
@@ -0,0 +1,77 @@
+--- a/drivers/net/wireless/ipw2200.c 2007-10-07 12:41:29.000000000 +0200
++++ b/drivers/net/wireless/ipw2200.c 2007-10-07 12:50:43.000000000 +0200
+@@ -1860,6 +1860,66 @@
+ static DEVICE_ATTR(net_stats, S_IWUSR | S_IRUGO,
+ show_net_stats, store_net_stats);
+
++static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb, int pri);
++
++/* SYSFS INJECT */
++static ssize_t store_inject(struct device *d,
++#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)
++ struct device_attribute *attr,
++#endif
++ const char *buf, size_t count)
++{
++ struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
++ struct ieee80211_device *ieee = priv->ieee;
++ struct ieee80211_txb * txb;
++ struct sk_buff *skb_frag;
++ unsigned char * newbuf;
++ unsigned long flags;
++
++ // should test (ieee->is_queue_full)
++
++ // Fw only accepts data, so avoid accidental fw errors.
++ if ( (buf[0]&0x0c) != '\x08') {
++ //printk("ipw2200: inject: discarding non-data frame (type=%02X)\n",(int)(unsigned char)buf[0]);
++ return count;
++ }
++
++ if (count>1500) {
++ count=1500;
++ printk("ipw2200: inject: cutting down frame to 1500 bytes\n");
++ }
++
++ spin_lock_irqsave(&priv->lock, flags);
++
++ // Create a txb with one skb
++ txb = kmalloc(sizeof(struct ieee80211_txb) + sizeof(u8 *), GFP_ATOMIC);
++ if (!txb)
++ goto nosepuede;
++ txb->nr_frags=1;
++ txb->frag_size = ieee->tx_headroom;
++ txb->fragments[0]=__dev_alloc_skb(count + ieee->tx_headroom, GFP_ATOMIC);
++ if (!txb->fragments[0]) {
++ kfree(txb);
++ goto nosepuede;
++ }
++ skb_reserve(txb->fragments[0], ieee->tx_headroom);
++ txb->encrypted=0;
++ txb->payload_size=count;
++ skb_frag = txb->fragments[0];
++ newbuf=skb_put(skb_frag, count);
++
++ // copy data into txb->skb and send it
++ memcpy(newbuf, buf, count);
++
++ ipw_tx_skb(priv, txb, 0);
++
++nosepuede:
++ spin_unlock_irqrestore(&priv->lock, flags);
++ return count;
++}
++
++static DEVICE_ATTR(inject, S_IWUSR, NULL, store_inject);
++
+ static ssize_t show_channels(struct device *d,
+ struct device_attribute *attr,
+ char *buf)
+@@ -11498,6 +11558,7 @@
+ #ifdef CONFIG_IPW2200_PROMISCUOUS
+ &dev_attr_rtap_iface.attr,
+ &dev_attr_rtap_filter.attr,
++ &dev_attr_inject.attr,
+ #endif
+ NULL
+ };
diff --git a/sys-kernel/thinkpad-sources/files/2.6.25/04-linux-phc-0.3.1-for-2.6.25.patch b/sys-kernel/thinkpad-sources/files/2.6.25/04-linux-phc-0.3.1-for-2.6.25.patch
new file mode 100644
index 0000000..f40f581
--- /dev/null
+++ b/sys-kernel/thinkpad-sources/files/2.6.25/04-linux-phc-0.3.1-for-2.6.25.patch
@@ -0,0 +1,526 @@
+diff --new-file -a --unified=5 --recursive linux-2.6.24-rc1/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c linux-2.6.24-rc1_phc/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
+--- linux-2.6.23-rc3/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c 2007-08-13 06:25:24.000000000 +0200
++++ linux-source-2.6.23-rc3/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c 2007-08-14 15:33:30.000000000 +0200
+@@ -23,10 +23,15 @@
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
++/* This file has been patched with Linux PHC: https://www.dedigentoo.org/trac/linux-phc
++ * Patch version: linux-phc-0.3.1-kernel-vanilla-2.6.23.patch
++ */
++
++
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <linux/init.h>
+ #include <linux/smp.h>
+ #include <linux/sched.h>
+@@ -59,12 +59,18 @@
+ #define INTEL_MSR_RANGE (0xffff)
+ #define CPUID_6_ECX_APERFMPERF_CAPABILITY (0x1)
+
++#define INTEL_MSR_VID_MASK (0x00ff)
++#define INTEL_MSR_FID_MASK (0xff00)
++#define INTEL_MSR_FID_SHIFT (0x8)
++#define PHC_VERSION_STRING "0.3.1:1"
++
+ struct acpi_cpufreq_data {
+ struct acpi_processor_performance *acpi_data;
+ struct cpufreq_frequency_table *freq_table;
+ unsigned int max_freq;
+ unsigned int resume;
+ unsigned int cpu_feature;
++ acpi_integer *original_controls;
+ };
+
+ static DEFINE_PER_CPU(struct acpi_cpufreq_data *, drv_data);
+@@ -102,17 +113,19 @@
+ }
+
+ static unsigned extract_msr(u32 msr, struct acpi_cpufreq_data *data)
+ {
+ int i;
++ u32 fid;
+ struct acpi_processor_performance *perf;
+
+- msr &= INTEL_MSR_RANGE;
++ fid = msr & INTEL_MSR_FID_MASK;
+ perf = data->acpi_data;
+
+ for (i=0; data->freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
+- if (msr == perf->states[data->freq_table[i].index].status)
++ if (fid == (perf->states[data->freq_table[i].index].status &
++ INTEL_MSR_FID_MASK))
+ return data->freq_table[i].frequency;
+ }
+ return data->freq_table[0].frequency;
+ }
+
+@@ -729,10 +742,12 @@
+ if (data) {
+ cpufreq_frequency_table_put_attr(policy->cpu);
+ per_cpu(drv_data, policy->cpu) = NULL;
+ acpi_processor_unregister_performance(data->acpi_data,
+ policy->cpu);
++ if (data->original_controls)
++ kfree(data->original_controls);
+ kfree(data);
+ }
+
+ return 0;
+ }
+@@ -746,12 +761,452 @@
+ data->resume = 1;
+
+ return 0;
+ }
+
++
++
++
++/* sysfs interface to change operating points voltages */
++
++static unsigned int extract_fid_from_control(unsigned int control)
++{
++ return ((control & INTEL_MSR_FID_MASK) >> INTEL_MSR_FID_SHIFT);
++}
++
++static unsigned int extract_vid_from_control(unsigned int control)
++{
++ return (control & INTEL_MSR_VID_MASK);
++}
++
++static ssize_t check_origial_table (struct acpi_cpufreq_data *data)
++{
++ struct acpi_processor_performance *acpi_data;
++ struct cpufreq_frequency_table *freq_table;
++ unsigned int state_index;
++
++ acpi_data = data->acpi_data;
++ freq_table = data->freq_table;
++
++ if (data->original_controls == NULL) {
++ // Backup original control values
++ data->original_controls = kcalloc(acpi_data->state_count,
++ sizeof(acpi_integer), GFP_KERNEL);
++ if (data->original_controls == NULL) {
++ printk("failed to allocate memory for original control values\n");
++ return -ENOMEM;
++ }
++ for (state_index = 0; state_index < acpi_data->state_count; state_index++) {
++ data->original_controls[state_index] = acpi_data->states[state_index].control;
++ }
++ }
++ return 0;
++}
++
++static ssize_t show_freq_attr_vids(struct cpufreq_policy *policy, char *buf)
++{
++ struct acpi_cpufreq_data *data = per_cpu(drv_data, policy->cpu);
++ struct acpi_processor_performance *acpi_data;
++ struct cpufreq_frequency_table *freq_table;
++ unsigned int i;
++ unsigned int vid;
++ ssize_t count = 0;
++
++ if (unlikely(data == NULL ||
++ data->acpi_data == NULL ||
++ data->freq_table == NULL ||
++ data->cpu_feature != SYSTEM_INTEL_MSR_CAPABLE)) {
++ return -ENODEV;
++ }
++
++ acpi_data = data->acpi_data;
++ freq_table = data->freq_table;
++
++ for (i = 0; freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
++ vid = extract_vid_from_control(acpi_data->states[freq_table[i].index].control);
++ count += sprintf(&buf[count], "%u ", vid);
++ }
++ count += sprintf(&buf[count], "\n");
++
++ return count;
++}
++
++static ssize_t show_freq_attr_default_vids(struct cpufreq_policy *policy, char *buf)
++{
++ struct acpi_cpufreq_data *data = per_cpu(drv_data, policy->cpu);
++ struct cpufreq_frequency_table *freq_table;
++ unsigned int i;
++ unsigned int vid;
++ ssize_t count = 0;
++ ssize_t retval;
++
++ if (unlikely(data == NULL ||
++ data->acpi_data == NULL ||
++ data->freq_table == NULL ||
++ data->cpu_feature != SYSTEM_INTEL_MSR_CAPABLE)) {
++ return -ENODEV;
++ }
++
++ retval = check_origial_table(data);
++ if (0 != retval)
++ return retval;
++
++ freq_table = data->freq_table;
++
++ for (i = 0; freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
++ vid = extract_vid_from_control(data->original_controls[freq_table[i].index]);
++ count += sprintf(&buf[count], "%u ", vid);
++ }
++ count += sprintf(&buf[count], "\n");
++
++ return count;
++}
++
++static ssize_t show_freq_attr_fids(struct cpufreq_policy *policy, char *buf)
++{
++ struct acpi_cpufreq_data *data = per_cpu(drv_data, policy->cpu);
++ struct acpi_processor_performance *acpi_data;
++ struct cpufreq_frequency_table *freq_table;
++ unsigned int i;
++ unsigned int fid;
++ ssize_t count = 0;
++
++ if (unlikely(data == NULL ||
++ data->acpi_data == NULL ||
++ data->freq_table == NULL ||
++ data->cpu_feature != SYSTEM_INTEL_MSR_CAPABLE)) {
++ return -ENODEV;
++ }
++
++ acpi_data = data->acpi_data;
++ freq_table = data->freq_table;
++
++ for (i = 0; freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
++ fid = extract_fid_from_control(acpi_data->states[freq_table[i].index].control);
++ count += sprintf(&buf[count], "%u ", fid);
++ }
++ count += sprintf(&buf[count], "\n");
++
++ return count;
++}
++
++static ssize_t show_freq_attr_controls(struct cpufreq_policy *policy, char *buf)
++{
++ struct acpi_cpufreq_data *data = per_cpu(drv_data, policy->cpu);
++ struct acpi_processor_performance *acpi_data;
++ struct cpufreq_frequency_table *freq_table;
++ unsigned int i;
++ unsigned int fid;
++ unsigned int vid;
++ ssize_t count = 0;
++
++ if (unlikely(data == NULL ||
++ data->acpi_data == NULL ||
++ data->freq_table == NULL ||
++ data->cpu_feature != SYSTEM_INTEL_MSR_CAPABLE)) {
++ return -ENODEV;
++ }
++
++ acpi_data = data->acpi_data;
++ freq_table = data->freq_table;
++
++ for (i = 0; freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
++ fid = extract_fid_from_control(acpi_data->states[freq_table[i].index].control);
++ vid = extract_vid_from_control(acpi_data->states[freq_table[i].index].control);
++ count += sprintf(&buf[count], "%u:%u ", fid, vid);
++ }
++ count += sprintf(&buf[count], "\n");
++
++ return count;
++}
++
++static ssize_t show_freq_attr_default_controls(struct cpufreq_policy *policy, char *buf)
++{
++ struct acpi_cpufreq_data *data = per_cpu(drv_data, policy->cpu);
++ struct cpufreq_frequency_table *freq_table;
++ unsigned int i;
++ unsigned int fid;
++ unsigned int vid;
++ ssize_t count = 0;
++ ssize_t retval;
++
++ if (unlikely(data == NULL ||
++ data->acpi_data == NULL ||
++ data->freq_table == NULL ||
++ data->cpu_feature != SYSTEM_INTEL_MSR_CAPABLE)) {
++ return -ENODEV;
++ }
++
++ retval = check_origial_table(data);
++ if (0 != retval)
++ return retval;
++
++ freq_table = data->freq_table;
++
++ for (i = 0; freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
++ fid = extract_fid_from_control(data->original_controls[freq_table[i].index]);
++ vid = extract_vid_from_control(data->original_controls[freq_table[i].index]);
++ count += sprintf(&buf[count], "%u:%u ", fid, vid);
++ }
++ count += sprintf(&buf[count], "\n");
++
++ return count;
++}
++
++
++static ssize_t store_freq_attr_vids(struct cpufreq_policy *policy, const char *buf, size_t count)
++{
++ struct acpi_cpufreq_data *data = per_cpu(drv_data, policy->cpu);
++ struct acpi_processor_performance *acpi_data;
++ struct cpufreq_frequency_table *freq_table;
++ unsigned int freq_index;
++ unsigned int state_index;
++ unsigned int new_vid;
++ unsigned int original_vid;
++ unsigned int new_control;
++ unsigned int original_control;
++ const char *curr_buf = buf;
++ char *next_buf;
++ ssize_t retval;
++
++ if (unlikely(data == NULL ||
++ data->acpi_data == NULL ||
++ data->freq_table == NULL ||
++ data->cpu_feature != SYSTEM_INTEL_MSR_CAPABLE)) {
++ return -ENODEV;
++ }
++
++ retval = check_origial_table(data);
++ if (0 != retval)
++ return retval;
++
++ acpi_data = data->acpi_data;
++ freq_table = data->freq_table;
++
++ for (freq_index = 0; freq_table[freq_index].frequency != CPUFREQ_TABLE_END; freq_index++) {
++ new_vid = simple_strtoul(curr_buf, &next_buf, 10);
++ if (next_buf == curr_buf) {
++ if ((curr_buf - buf == count - 1) && (*curr_buf == '\n')) {
++ curr_buf++;
++ break;
++ }
++ printk("failed to parse vid value at %i (%s)\n", freq_index, curr_buf);
++ return -EINVAL;
++ }
++
++ state_index = freq_table[freq_index].index;
++ original_control = data->original_controls[state_index];
++ original_vid = original_control & INTEL_MSR_VID_MASK;
++ if (new_vid <= original_vid) {
++ new_control = (original_control & ~INTEL_MSR_VID_MASK) | new_vid;
++ dprintk("setting control at %i to %x (default is %x)\n",
++ freq_index, new_control, original_control);
++ acpi_data->states[state_index].control = new_control;
++
++ } else {
++ printk("skipping vid at %i, %u is greater than default %u\n",
++ freq_index, new_vid, original_vid);
++ }
++
++ curr_buf = next_buf;
++ while ((curr_buf - buf < count) && ((*curr_buf == ' ') || (*curr_buf == ','))) {
++ curr_buf++;
++ }
++ }
++
++ /* set new voltage at current frequency */
++ data->resume = 1;
++ acpi_cpufreq_target(policy, get_cur_freq_on_cpu(policy->cpu), CPUFREQ_RELATION_L);
++
++ return curr_buf - buf;
++}
++
++static ssize_t store_freq_attr_controls(struct cpufreq_policy *policy, const char *buf, size_t count)
++{
++ struct acpi_cpufreq_data *data = per_cpu(drv_data, policy->cpu);
++ struct acpi_processor_performance *acpi_data;
++ struct cpufreq_frequency_table *freq_table;
++ const char *curr_buf;
++ unsigned int op_count;
++ unsigned int state_index;
++ int isok;
++ char *next_buf;
++ ssize_t retval;
++ unsigned int new_vid;
++ unsigned int original_vid;
++ unsigned int new_fid;
++ unsigned int old_fid;
++ unsigned int original_control;
++ unsigned int old_control;
++ unsigned int new_control;
++ int found;
++
++ if (unlikely(data == NULL ||
++ data->acpi_data == NULL ||
++ data->freq_table == NULL ||
++ data->cpu_feature != SYSTEM_INTEL_MSR_CAPABLE)) {
++ return -ENODEV;
++ }
++
++ retval = check_origial_table(data);
++ if (0 != retval)
++ return retval;
++
++ acpi_data = data->acpi_data;
++ freq_table = data->freq_table;
++
++ op_count = 0;
++ curr_buf = buf;
++ next_buf = NULL;
++ isok = 1;
++
++ while ( (isok) && (curr_buf != NULL) )
++ {
++ op_count++;
++ // Parse fid
++ new_fid = simple_strtoul(curr_buf, &next_buf, 10);
++ if ((next_buf != curr_buf) && (next_buf != NULL))
++ {
++ // Parse separator between frequency and voltage
++ curr_buf = next_buf;
++ next_buf = NULL;
++ if (*curr_buf==':')
++ {
++ curr_buf++;
++ // Parse vid
++ new_vid = simple_strtoul(curr_buf, &next_buf, 10);
++ if ((next_buf != curr_buf) && (next_buf != NULL))
++ {
++ found = 0;
++ for (state_index = 0; state_index < acpi_data->state_count; state_index++) {
++ old_control = acpi_data->states[state_index].control;
++ old_fid = extract_fid_from_control(old_control);
++ if (new_fid == old_fid)
++ {
++ found = 1;
++ original_control = data->original_controls[state_index];
++ original_vid = extract_vid_from_control(original_control);
++ if (new_vid <= original_vid)
++ {
++ new_control = (original_control & ~INTEL_MSR_VID_MASK) | new_vid;
++ dprintk("setting control at %i to %x (default is %x)\n",
++ state_index, new_control, original_control);
++ acpi_data->states[state_index].control = new_control;
++
++ } else {
++ printk("skipping vid at %i, %u is greater than default %u\n",
++ state_index, new_vid, original_vid);
++ }
++ }
++ }
++
++ if (found == 0)
++ {
++ printk("operating point # %u not found (FID = %u)\n", op_count, new_fid);
++ isok = 0;
++ }
++
++ // Parse seprator before next operating point, if any
++ curr_buf = next_buf;
++ next_buf = NULL;
++ if ((*curr_buf == ',') || (*curr_buf == ' '))
++ curr_buf++;
++ else
++ curr_buf = NULL;
++ }
++ else
++ {
++ printk("failed to parse VID of operating point # %u (%s)\n", op_count, curr_buf);
++ isok = 0;
++ }
++ }
++ else
++ {
++ printk("failed to parse operating point # %u (%s)\n", op_count, curr_buf);
++ isok = 0;
++ }
++ }
++ else
++ {
++ printk("failed to parse FID of operating point # %u (%s)\n", op_count, curr_buf);
++ isok = 0;
++ }
++ }
++
++ if (isok)
++ {
++ retval = count;
++ /* set new voltage at current frequency */
++ data->resume = 1;
++ acpi_cpufreq_target(policy, get_cur_freq_on_cpu(policy->cpu), CPUFREQ_RELATION_L);
++ }
++ else
++ {
++ retval = -EINVAL;
++ }
++
++ return retval;
++}
++
++static ssize_t show_freq_attr_phc_version(struct cpufreq_policy *policy, char *buf)
++{
++ ssize_t count = 0;
++ count += sprintf(&buf[count], "%s\n", PHC_VERSION_STRING);
++ return count;
++}
++
++static struct freq_attr cpufreq_freq_attr_phc_version =
++{
++ .attr = { .name = "phc_version", .mode = 0444, .owner = THIS_MODULE },
++ .show = show_freq_attr_phc_version,
++ .store = NULL,
++};
++
++static struct freq_attr cpufreq_freq_attr_vids =
++{
++ .attr = { .name = "phc_vids", .mode = 0644, .owner = THIS_MODULE },
++ .show = show_freq_attr_vids,
++ .store = store_freq_attr_vids,
++};
++
++static struct freq_attr cpufreq_freq_attr_default_vids =
++{
++ .attr = { .name = "phc_default_vids", .mode = 0444, .owner = THIS_MODULE },
++ .show = show_freq_attr_default_vids,
++ .store = NULL,
++};
++
++static struct freq_attr cpufreq_freq_attr_fids =
++{
++ .attr = { .name = "phc_fids", .mode = 0444, .owner = THIS_MODULE },
++ .show = show_freq_attr_fids,
++ .store = NULL,
++};
++
++static struct freq_attr cpufreq_freq_attr_controls =
++{
++ .attr = { .name = "phc_controls", .mode = 0644, .owner = THIS_MODULE },
++ .show = show_freq_attr_controls,
++ .store = store_freq_attr_controls,
++};
++
++static struct freq_attr cpufreq_freq_attr_default_controls =
++{
++ .attr = { .name = "phc_default_controls", .mode = 0444, .owner = THIS_MODULE },
++ .show = show_freq_attr_default_controls,
++ .store = NULL,
++};
++
++
+ static struct freq_attr *acpi_cpufreq_attr[] = {
++ &cpufreq_freq_attr_phc_version,
+ &cpufreq_freq_attr_scaling_available_freqs,
++ &cpufreq_freq_attr_vids,
++ &cpufreq_freq_attr_default_vids,
++ &cpufreq_freq_attr_fids,
++ &cpufreq_freq_attr_controls,
++ &cpufreq_freq_attr_default_controls,
+ NULL,
+ };
+
+ static struct cpufreq_driver acpi_cpufreq_driver = {
+ .verify = acpi_cpufreq_verify,
diff --git a/sys-kernel/thinkpad-sources/files/2.6.25/colored-printk-2.6.25.part1.patch b/sys-kernel/thinkpad-sources/files/2.6.25/colored-printk-2.6.25.part1.patch
new file mode 100644
index 0000000..e239571
--- /dev/null
+++ b/sys-kernel/thinkpad-sources/files/2.6.25/colored-printk-2.6.25.part1.patch
@@ -0,0 +1,113 @@
+diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
+index 47c6be8..a55a1c9 100644
+--- a/drivers/char/Kconfig
++++ b/drivers/char/Kconfig
+@@ -58,6 +58,49 @@ config VT_CONSOLE
+
+ If unsure, say Y.
+
++config VT_CKO
++ bool "Colored kernel message output"
++ depends on VT_CONSOLE
++ ---help---
++ This option enables kernel messages to be emitted in
++ colors other than the default.
++ This option enlarges your kernel by approximately 1/2 KB.
++
++ If unsure, say N.
++
++config VT_PRINTK_COLOR
++ hex "Colored kernel message output"
++ range 0x00 0xFF
++ depends on VT_CKO
++ default 0x07
++ ---help---
++ This option defines with which color kernel messages will be
++ printed to the console.
++
++ The value you need to enter here is the value is composed
++ (OR-ed) of a foreground and a background color.
++
++ Foreground:
++ 0x00 = black, 0x08 = dark gray,
++ 0x01 = red, 0x09 = light red,
++ 0x02 = green, 0x0A = light green,
++ 0x03 = brown, 0x0B = yellow,
++ 0x04 = blue, 0x0C = light blue,
++ 0x05 = magenta, 0x0D = light magenta,
++ 0x06 = cyan, 0x0E = light cyan,
++ 0x07 = gray, 0x0F = white,
++
++ (Foreground colors 0x08 to 0x0F do not work when a VGA
++ console font with 512 glyphs is used.)
++
++ Background:
++ 0x00 = black, 0x40 = blue,
++ 0x10 = red, 0x50 = magenta,
++ 0x20 = green, 0x60 = cyan,
++ 0x30 = brown, 0x70 = gray,
++
++ For example, 0x1F would yield white on red.
++
+ config HW_CONSOLE
+ bool
+ depends on VT && !S390 && !UML
+diff --git a/drivers/char/vt.c b/drivers/char/vt.c
+index 159c9e2..cf61236 100644
+--- a/drivers/char/vt.c
++++ b/drivers/char/vt.c
+@@ -73,6 +73,7 @@
+ */
+
+ #include <linux/module.h>
++#include <linux/moduleparam.h>
+ #include <linux/types.h>
+ #include <linux/sched.h>
+ #include <linux/tty.h>
+@@ -2392,6 +2393,24 @@ struct tty_driver *console_driver;
+
+ #ifdef CONFIG_VT_CONSOLE
+
++#ifdef CONFIG_VT_CKO
++static unsigned int printk_color __read_mostly = CONFIG_VT_PRINTK_COLOR;
++module_param(printk_color, uint, S_IRUGO | S_IWUSR);
++
++static void vc_set_color(struct vc_data *vc, unsigned char color)
++{
++ vc->vc_color = color_table[color & 0xF] |
++ (color_table[(color >> 4) & 0x7] << 4) |
++ (color & 0x80);
++ update_attr(vc);
++}
++#else
++static const unsigned int printk_color;
++static inline void vc_set_color(const struct vc_data *vc, unsigned char c)
++{
++}
++#endif
++
+ /*
+ * Console on virtual terminal
+ *
+@@ -2434,6 +2453,7 @@ static void vt_console_print(struct console *co, const char *b, unsigned count)
+ hide_cursor(vc);
+
+ start = (ushort *)vc->vc_pos;
++ vc_set_color(vc, printk_color);
+
+ /* Contrived structure to try to emulate original need_wrap behaviour
+ * Problems caused when we have need_wrap set on '\n' character */
+@@ -2482,6 +2502,7 @@ static void vt_console_print(struct console *co, const char *b, unsigned count)
+ }
+ }
+ set_cursor(vc);
++ vc_set_color(vc, vc->vc_def_color);
+ notify_update(vc);
+
+ quit:
+--
+To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
+the body of a message to majordomo@vger.kernel.org
+More majordomo info at http://vger.kernel.org/majordomo-info.html
+Please read the FAQ at http://www.tux.org/lkml/
+
diff --git a/sys-kernel/thinkpad-sources/files/2.6.25/colored-printk-2.6.25.part2.patch b/sys-kernel/thinkpad-sources/files/2.6.25/colored-printk-2.6.25.part2.patch
new file mode 100644
index 0000000..231e9d0
--- /dev/null
+++ b/sys-kernel/thinkpad-sources/files/2.6.25/colored-printk-2.6.25.part2.patch
@@ -0,0 +1,220 @@
+diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c
+index cff84cd..ba137a4 100644
+--- a/arch/x86/kernel/early_printk.c
++++ b/arch/x86/kernel/early_printk.c
+@@ -15,7 +15,8 @@
+ static int max_ypos = 25, max_xpos = 80;
+ static int current_ypos = 25, current_xpos = 0;
+
+-static void early_vga_write(struct console *con, const char *str, unsigned n)
++static void early_vga_write(struct console *con, const char *str, unsigned n,
++ unsigned int loglevel)
+ {
+ char c;
+ int i, k, j;
+@@ -84,7 +85,8 @@ static int early_serial_putc(unsigned char ch)
+ return timeout ? 0 : -1;
+ }
+
+-static void early_serial_write(struct console *con, const char *s, unsigned n)
++static void early_serial_write(struct console *con, const char *s, unsigned n,
++ unsigned int loglevel)
+ {
+ while (*s && n-- > 0) {
+ if (*s == '\n')
+@@ -180,7 +182,8 @@ static void __init simnow_init(char *str)
+ simnow_fd = simnow(XOPEN, (unsigned long)fn, O_WRONLY|O_APPEND|O_CREAT, 0644);
+ }
+
+-static void simnow_write(struct console *con, const char *s, unsigned n)
++static void simnow_write(struct console *con, const char *s, unsigned n,
++ unsigned int loglevel)
+ {
+ simnow(XWRITE, simnow_fd, (unsigned long)s, n);
+ }
+@@ -204,7 +207,7 @@ void early_printk(const char *fmt, ...)
+
+ va_start(ap,fmt);
+ n = vscnprintf(buf,512,fmt,ap);
+- early_console->write(early_console,buf,n);
++ early_console->write(early_console, buf, n, 0);
+ va_end(ap);
+ }
+
+diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
+index a55a1c9..3f5877e 100644
+--- a/drivers/char/Kconfig
++++ b/drivers/char/Kconfig
+@@ -75,7 +75,9 @@ config VT_PRINTK_COLOR
+ default 0x07
+ ---help---
+ This option defines with which color kernel messages will be
+- printed to the console.
++ printed to the console. This applies to all log levels.
++ You can change the colors at run-time, or set them at boot-time
++ using the "vt.printk_color" option.
+
+ The value you need to enter here is the value is composed
+ (OR-ed) of a foreground and a background color.
+diff --git a/drivers/char/vt.c b/drivers/char/vt.c
+index cf61236..75ca0cf 100644
+--- a/drivers/char/vt.c
++++ b/drivers/char/vt.c
+@@ -2394,8 +2394,17 @@ struct tty_driver *console_driver;
+ #ifdef CONFIG_VT_CONSOLE
+
+ #ifdef CONFIG_VT_CKO
+-static unsigned int printk_color __read_mostly = CONFIG_VT_PRINTK_COLOR;
+-module_param(printk_color, uint, S_IRUGO | S_IWUSR);
++static unsigned int printk_color[8] __read_mostly = {
++ CONFIG_VT_PRINTK_COLOR, /* KERN_EMERG */
++ CONFIG_VT_PRINTK_COLOR, /* KERN_ALERT */
++ CONFIG_VT_PRINTK_COLOR, /* KERN_CRIT */
++ CONFIG_VT_PRINTK_COLOR, /* KERN_ERR */
++ CONFIG_VT_PRINTK_COLOR, /* KERN_WARNING */
++ CONFIG_VT_PRINTK_COLOR, /* KERN_NOTICE */
++ CONFIG_VT_PRINTK_COLOR, /* KERN_INFO */
++ CONFIG_VT_PRINTK_COLOR, /* KERN_DEBUG */
++};
++module_param_array(printk_color, uint, NULL, S_IRUGO | S_IWUSR);
+
+ static void vc_set_color(struct vc_data *vc, unsigned char color)
+ {
+@@ -2405,7 +2414,7 @@ static void vc_set_color(struct vc_data *vc, unsigned char color)
+ update_attr(vc);
+ }
+ #else
+-static const unsigned int printk_color;
++static const unsigned int printk_color[8];
+ static inline void vc_set_color(const struct vc_data *vc, unsigned char c)
+ {
+ }
+@@ -2417,10 +2426,11 @@ static inline void vc_set_color(const struct vc_data *vc, unsigned char c)
+ * The console must be locked when we get here.
+ */
+
+-static void vt_console_print(struct console *co, const char *b, unsigned count)
++static void vt_console_print(struct console *co, const char *b,
++ unsigned int count, unsigned int loglevel)
+ {
+ struct vc_data *vc = vc_cons[fg_console].d;
+- unsigned char c;
++ unsigned char current_color, c;
+ static DEFINE_SPINLOCK(printing_lock);
+ const ushort *start;
+ ushort cnt = 0;
+@@ -2453,7 +2463,13 @@ static void vt_console_print(struct console *co, const char *b, unsigned count)
+ hide_cursor(vc);
+
+ start = (ushort *)vc->vc_pos;
+- vc_set_color(vc, printk_color);
++
++ /*
++ * We always get a valid loglevel - <8> and "no level" is transformed
++ * to <4> in the typical kernel.
++ */
++ current_color = printk_color[loglevel];
++ vc_set_color(vc, current_color);
+
+ /* Contrived structure to try to emulate original need_wrap behaviour
+ * Problems caused when we have need_wrap set on '\n' character */
+diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c
+index 665341e..ae04e77 100644
+--- a/drivers/net/netconsole.c
++++ b/drivers/net/netconsole.c
+@@ -694,7 +694,8 @@ static struct notifier_block netconsole_netdev_notifier = {
+ .notifier_call = netconsole_netdev_event,
+ };
+
+-static void write_msg(struct console *con, const char *msg, unsigned int len)
++static void write_msg(struct console *con, const char *msg, unsigned int len,
++ unsigned int loglevel)
+ {
+ int frag, left;
+ unsigned long flags;
+diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
+index 77f7a7f..21a0ebf 100644
+--- a/drivers/serial/8250.c
++++ b/drivers/serial/8250.c
+@@ -2466,7 +2466,8 @@ static void serial8250_console_putchar(struct uart_port *port, int ch)
+ * The console_lock must be held when we get here.
+ */
+ static void
+-serial8250_console_write(struct console *co, const char *s, unsigned int count)
++serial8250_console_write(struct console *co, const char *s, unsigned int count,
++ unsigned int loglevel)
+ {
+ struct uart_8250_port *up = &serial8250_ports[co->index];
+ unsigned long flags;
+diff --git a/drivers/serial/8250_early.c b/drivers/serial/8250_early.c
+index 38776e8..88aa01c 100644
+--- a/drivers/serial/8250_early.c
++++ b/drivers/serial/8250_early.c
+@@ -83,7 +83,8 @@ static void __init serial_putc(struct uart_port *port, int c)
+ }
+
+ static void __init early_serial8250_write(struct console *console,
+- const char *s, unsigned int count)
++ const char *s, unsigned int count,
++ unsigned int loglevel)
+ {
+ struct uart_port *port = &early_device.port;
+ unsigned int ier;
+diff --git a/include/linux/console.h b/include/linux/console.h
+index a5f88a6..23626e6 100644
+--- a/include/linux/console.h
++++ b/include/linux/console.h
+@@ -94,7 +94,8 @@ void give_up_console(const struct consw *sw);
+
+ struct console {
+ char name[16];
+- void (*write)(struct console *, const char *, unsigned);
++ void (*write)(struct console *, const char *,
++ unsigned int, unsigned int);
+ int (*read)(struct console *, char *, unsigned);
+ struct tty_driver *(*device)(struct console *, int *);
+ void (*unblank)(void);
+diff --git a/kernel/printk.c b/kernel/printk.c
+index bdd4ea8..809ba4b 100644
+--- a/kernel/printk.c
++++ b/kernel/printk.c
+@@ -435,7 +435,8 @@ asmlinkage long sys_syslog(int type, char __user *buf, int len)
+ /*
+ * Call the console drivers on a range of log_buf
+ */
+-static void __call_console_drivers(unsigned start, unsigned end)
++static void __call_console_drivers(unsigned int start, unsigned int end,
++ unsigned int loglevel)
+ {
+ struct console *con;
+
+@@ -443,7 +444,7 @@ static void __call_console_drivers(unsigned start, unsigned end)
+ if ((con->flags & CON_ENABLED) && con->write &&
+ (cpu_online(smp_processor_id()) ||
+ (con->flags & CON_ANYTIME)))
+- con->write(con, &LOG_BUF(start), end - start);
++ con->write(con, &LOG_BUF(start), end - start, loglevel);
+ }
+ }
+
+@@ -470,10 +471,11 @@ static void _call_console_drivers(unsigned start,
+ if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) {
+ /* wrapped write */
+ __call_console_drivers(start & LOG_BUF_MASK,
+- log_buf_len);
+- __call_console_drivers(0, end & LOG_BUF_MASK);
++ log_buf_len, msg_log_level);
++ __call_console_drivers(0, end & LOG_BUF_MASK,
++ msg_log_level);
+ } else {
+- __call_console_drivers(start, end);
++ __call_console_drivers(start, end, msg_log_level);
+ }
+ }
+ }
+--
+To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
+the body of a message to majordomo@vger.kernel.org
+More majordomo info at http://vger.kernel.org/majordomo-info.html
+Please read the FAQ at http://www.tux.org/lkml/
+
diff --git a/sys-kernel/thinkpad-sources/files/2.6.25/colored-printk-2.6.25.part3.patch b/sys-kernel/thinkpad-sources/files/2.6.25/colored-printk-2.6.25.part3.patch
new file mode 100644
index 0000000..06d9f6c
--- /dev/null
+++ b/sys-kernel/thinkpad-sources/files/2.6.25/colored-printk-2.6.25.part3.patch
@@ -0,0 +1,146 @@
+diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
+index 3f5877e..600c75a 100644
+--- a/drivers/char/Kconfig
++++ b/drivers/char/Kconfig
+@@ -58,28 +58,20 @@ config VT_CONSOLE
+
+ If unsure, say Y.
+
+-config VT_CKO
++menuconfig VT_CKO
+ bool "Colored kernel message output"
+ depends on VT_CONSOLE
+ ---help---
+ This option enables kernel messages to be emitted in
+ colors other than the default.
++ You can also change the colors at run-time, or set them at boot-time
++ using the "vt.printk_color" option.
++
+ This option enlarges your kernel by approximately 1/2 KB.
+
+ If unsure, say N.
+
+-config VT_PRINTK_COLOR
+- hex "Colored kernel message output"
+- range 0x00 0xFF
+- depends on VT_CKO
+- default 0x07
+- ---help---
+- This option defines with which color kernel messages will be
+- printed to the console. This applies to all log levels.
+- You can change the colors at run-time, or set them at boot-time
+- using the "vt.printk_color" option.
+-
+- The value you need to enter here is the value is composed
++ The value you need to enter is the value is composed
+ (OR-ed) of a foreground and a background color.
+
+ Foreground:
+@@ -103,6 +95,74 @@ config VT_PRINTK_COLOR
+
+ For example, 0x1F would yield white on red.
+
++if VT_CKO
++
++config VT_PRINTK_EMERG_COLOR
++ hex 'Color for "emergency" level'
++ range 0x00 0xFF
++ default 0x07
++ ---help---
++ This option defines in which color kernel emergency messages
++ will be printed to the console.
++
++config VT_PRINTK_ALERT_COLOR
++ hex 'Color for "alert" level'
++ range 0x00 0xFF
++ default 0x07
++ ---help---
++ This option defines in which color kernel alert messages
++ will be printed to the console.
++
++config VT_PRINTK_CRIT_COLOR
++ hex 'Color for "critical" level'
++ range 0x00 0xFF
++ default 0x07
++ ---help---
++ This option defines in which color critical kernel messages
++ will be printed to the console.
++
++config VT_PRINTK_ERROR_COLOR
++ hex 'Color for "error" level'
++ range 0x00 0xFF
++ default 0x07
++ ---help---
++ This option defines in which color kernel error messages
++ will be printed to the console.
++
++config VT_PRINTK_WARNING_COLOR
++ hex 'Color for "warning" level'
++ range 0x00 0xFF
++ default 0x07
++ ---help---
++ This option defines in which color kernel warning messages
++ will be printed to the console.
++
++config VT_PRINTK_NOTICE_COLOR
++ hex 'Color for "notice" level'
++ range 0x00 0xFF
++ default 0x07
++ ---help---
++ This option defines in which color kernel notices
++ will be printed to the console.
++
++config VT_PRINTK_INFO_COLOR
++ hex 'Color for "info" level'
++ range 0x00 0xFF
++ default 0x07
++ ---help---
++ This option defines in which color informational kernel messages
++ will be printed to the console.
++
++config VT_PRINTK_DEBUG_COLOR
++ hex 'Color for "debug" level'
++ range 0x00 0xFF
++ default 0x07
++ ---help---
++ This option defines in which color kernel debugging messages
++ will be printed to the console.
++
++endif # VT_CKO
++
+ config HW_CONSOLE
+ bool
+ depends on VT && !S390 && !UML
+diff --git a/drivers/char/vt.c b/drivers/char/vt.c
+index 75ca0cf..a3f2ff3 100644
+--- a/drivers/char/vt.c
++++ b/drivers/char/vt.c
+@@ -2395,14 +2395,14 @@ struct tty_driver *console_driver;
+
+ #ifdef CONFIG_VT_CKO
+ static unsigned int printk_color[8] __read_mostly = {
+- CONFIG_VT_PRINTK_COLOR, /* KERN_EMERG */
+- CONFIG_VT_PRINTK_COLOR, /* KERN_ALERT */
+- CONFIG_VT_PRINTK_COLOR, /* KERN_CRIT */
+- CONFIG_VT_PRINTK_COLOR, /* KERN_ERR */
+- CONFIG_VT_PRINTK_COLOR, /* KERN_WARNING */
+- CONFIG_VT_PRINTK_COLOR, /* KERN_NOTICE */
+- CONFIG_VT_PRINTK_COLOR, /* KERN_INFO */
+- CONFIG_VT_PRINTK_COLOR, /* KERN_DEBUG */
++ CONFIG_VT_PRINTK_EMERG_COLOR,
++ CONFIG_VT_PRINTK_ALERT_COLOR,
++ CONFIG_VT_PRINTK_CRIT_COLOR,
++ CONFIG_VT_PRINTK_ERROR_COLOR,
++ CONFIG_VT_PRINTK_WARNING_COLOR,
++ CONFIG_VT_PRINTK_NOTICE_COLOR,
++ CONFIG_VT_PRINTK_INFO_COLOR,
++ CONFIG_VT_PRINTK_DEBUG_COLOR,
+ };
+ module_param_array(printk_color, uint, NULL, S_IRUGO | S_IWUSR);
+
+--
+To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
+the body of a message to majordomo@vger.kernel.org
+More majordomo info at http://vger.kernel.org/majordomo-info.html
+Please read the FAQ at http://www.tux.org/lkml/
+
diff --git a/sys-kernel/thinkpad-sources/files/2.6.25/kernel-2.6.25-export-init_mm.patch b/sys-kernel/thinkpad-sources/files/2.6.25/kernel-2.6.25-export-init_mm.patch
new file mode 100644
index 0000000..5f95a6b
--- /dev/null
+++ b/sys-kernel/thinkpad-sources/files/2.6.25/kernel-2.6.25-export-init_mm.patch
@@ -0,0 +1,11 @@
+--- arch/x86/kernel/init_task.c.orig 2008-04-17 04:49:44.000000000 +0200
++++ arch/x86/kernel/init_task.c 2008-04-17 23:52:15.000000000 +0200
+@@ -15,7 +15,7 @@
+ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+ struct mm_struct init_mm = INIT_MM(init_mm);
+-EXPORT_UNUSED_SYMBOL(init_mm); /* will be removed in 2.6.26 */
++EXPORT_SYMBOL(init_mm); /* will be removed in 2.6.26 */ // temporary kludge
+
+ /*
+ * Initial thread structure.
diff --git a/sys-kernel/thinkpad-sources/files/2.6.25/kernel-2.6.25-rcu-license.patch b/sys-kernel/thinkpad-sources/files/2.6.25/kernel-2.6.25-rcu-license.patch
new file mode 100644
index 0000000..fbdb7c2
--- /dev/null
+++ b/sys-kernel/thinkpad-sources/files/2.6.25/kernel-2.6.25-rcu-license.patch
@@ -0,0 +1,20 @@
+--- kernel/rcupreempt.c.orig 2008-04-17 04:49:44.000000000 +0200
++++ kernel/rcupreempt.c 2008-04-19 12:27:19.000000000 +0200
+@@ -283,7 +283,7 @@
+ local_irq_restore(flags);
+ }
+ }
+-EXPORT_SYMBOL_GPL(__rcu_read_lock);
++EXPORT_SYMBOL(__rcu_read_lock);
+
+ void __rcu_read_unlock(void)
+ {
+@@ -353,7 +353,7 @@
+ local_irq_restore(flags);
+ }
+ }
+-EXPORT_SYMBOL_GPL(__rcu_read_unlock);
++EXPORT_SYMBOL(__rcu_read_unlock);
+
+ /*
+ * If a global counter flip has occurred since the last time that we
diff --git a/sys-kernel/thinkpad-sources/files/2.6.25/pci-e_aspm_v3.5.patch b/sys-kernel/thinkpad-sources/files/2.6.25/pci-e_aspm_v3.5.patch
new file mode 100644
index 0000000..ecdc8cb
--- /dev/null
+++ b/sys-kernel/thinkpad-sources/files/2.6.25/pci-e_aspm_v3.5.patch
@@ -0,0 +1,1101 @@
+PCI Express ASPM defines a protocol for PCI Express components in the D0
+state to reduce Link power by placing their Links into a low power state
+and instructing the other end of the Link to do likewise. This
+capability allows hardware-autonomous, dynamic Link power reduction
+beyond what is achievable by software-only controlled power management.
+However, The device should be configured by software appropriately.
+Enabling ASPM will save power, but will introduce device latency.
+
+This patch adds ASPM support in Linux. It introduces a global policy for
+ASPM, a sysfs file /sys/module/pcie_aspm/parameters/policy can control
+it. The interface can be used as a boot option too. Currently we have
+below setting:
+ -default, BIOS default setting
+ -powersave, highest power saving mode, enable all available ASPM
+state and clock power management
+ -performance, highest performance, disable ASPM and clock power
+management
+By default, the 'default' policy is used currently.
+
+In my test, power difference between powersave mode and performance mode
+is about 1.3w in a system with 3 PCIE links.
+
+Note: some devices might not work well with aspm, either because chipset
+issue or device issue. The patch provide API (pci_disable_link_state),
+driver can disable ASPM for specific device.
+
+Signed-off-by: Shaohua Li <shaohua.li <at> intel.com>
+---
+ drivers/pci/pci-sysfs.c | 5
+ drivers/pci/pci.c | 4
+ drivers/pci/pcie/Kconfig | 20 +
+ drivers/pci/pcie/Makefile | 3
+ drivers/pci/pcie/aspm.c | 811 ++++++++++++++++++++++++++++++++++++++++++++++
+ drivers/pci/probe.c | 5
+ drivers/pci/remove.c | 4
+ include/linux/pci-aspm.h | 56 +++
+ include/linux/pci.h | 5
+ include/linux/pci_regs.h | 8
+ 10 files changed, 921 insertions(+)
+
+Index: linux/drivers/pci/pcie/Makefile
+===================================================================
+--- linux.orig/drivers/pci/pcie/Makefile 2008-02-20 10:22:16.000000000 +0800
++++ linux/drivers/pci/pcie/Makefile 2008-02-20 13:59:10.000000000 +0800
+@@ -2,6 +2,9 @@
+ # Makefile for PCI-Express PORT Driver
+ #
+
++# Build PCI Express ASPM if needed
++obj-$(CONFIG_PCIEASPM) += aspm.o
++
+ pcieportdrv-y := portdrv_core.o portdrv_pci.o portdrv_bus.o
+
+ obj-$(CONFIG_PCIEPORTBUS) += pcieportdrv.o
+Index: linux/drivers/pci/pcie/aspm.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux/drivers/pci/pcie/aspm.c 2008-02-20 14:09:59.000000000 +0800
+@@ -0,0 +1,811 @@
++/*
++ * File: drivers/pci/pcie/aspm.c
++ * Enabling PCIE link L0s/L1 state and Clock Power Management
++ *
++ * Copyright (C) 2007 Intel
++ * Copyright (C) Zhang Yanmin (yanmin.zhang <at> intel.com)
++ * Copyright (C) Shaohua Li (shaohua.li <at> intel.com)
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/pci.h>
++#include <linux/pci_regs.h>
++#include <linux/errno.h>
++#include <linux/pm.h>
++#include <linux/init.h>
++#include <linux/slab.h>
++#include <linux/pci-aspm.h>
++#include "../pci.h"
++
++#ifdef MODULE_PARAM_PREFIX
++#undef MODULE_PARAM_PREFIX
++#endif
++#define MODULE_PARAM_PREFIX "pcie_aspm."
++
++struct endpoint_state {
++ unsigned int l0s_acceptable_latency;
++ unsigned int l1_acceptable_latency;
++};
++
++struct pcie_link_state {
++ struct list_head sibiling;
++ struct pci_dev *pdev;
++
++ /* ASPM state */
++ unsigned int support_state;
++ unsigned int enabled_state;
++ unsigned int bios_aspm_state;
++ /* upstream component */
++ unsigned int l0s_upper_latency;
++ unsigned int l1_upper_latency;
++ /* downstream component */
++ unsigned int l0s_down_latency;
++ unsigned int l1_down_latency;
++ /* Clock PM state*/
++ unsigned int clk_pm_capable;
++ unsigned int clk_pm_enabled;
++ unsigned int bios_clk_state;
++
++ /*
++ * A pcie downstream port only has one slot under it, so at most there
++ * are 8 functions
++ */
++ struct endpoint_state endpoints[8];
++};
++
++static int aspm_disabled;
++static DEFINE_MUTEX(aspm_lock);
++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 const char *policy_str[] = {
++ [POLICY_DEFAULT] = "default",
++ [POLICY_PERFORMANCE] = "performance",
++ [POLICY_POWERSAVE] = "powersave"
++};
++
++static int policy_to_aspm_state(struct pci_dev *pdev)
++{
++ struct pcie_link_state *link_state = pdev->link_state;
++
++ switch (aspm_policy) {
++ case POLICY_PERFORMANCE:
++ /* Disable ASPM and Clock PM */
++ return 0;
++ case POLICY_POWERSAVE:
++ /* Enable ASPM L0s/L1 */
++ return PCIE_LINK_STATE_L0S|PCIE_LINK_STATE_L1;
++ case POLICY_DEFAULT:
++ return link_state->bios_aspm_state;
++ }
++ return 0;
++}
++
++static int policy_to_clkpm_state(struct pci_dev *pdev)
++{
++ struct pcie_link_state *link_state = pdev->link_state;
++
++ switch (aspm_policy) {
++ case POLICY_PERFORMANCE:
++ /* Disable ASPM and Clock PM */
++ return 0;
++ case POLICY_POWERSAVE:
++ /* Disable Clock PM */
++ return 1;
++ case POLICY_DEFAULT:
++ return link_state->bios_clk_state;
++ }
++ return 0;
++}
++
++static void pcie_set_clock_pm(struct pci_dev *pdev, int enable)
++{
++ struct pci_dev *child_dev;
++ int pos;
++ u16 reg16;
++ struct pcie_link_state *link_state = pdev->link_state;
++
++ list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list) {
++ pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP);
++ if (!pos)
++ return;
++ pci_read_config_word(child_dev, pos + PCI_EXP_LNKCTL, &reg16);
++ if (enable)
++ reg16 |= PCI_EXP_LNKCTL_CLKREQ_EN;
++ else
++ reg16 &= ~PCI_EXP_LNKCTL_CLKREQ_EN;
++ pci_write_config_word(child_dev, pos + PCI_EXP_LNKCTL, reg16);
++ }
++ link_state->clk_pm_enabled = !!enable;
++}
++
++static void pcie_check_clock_pm(struct pci_dev *pdev)
++{
++ int pos;
++ u32 reg32;
++ u16 reg16;
++ int capable = 1, enabled = 1;
++ struct pci_dev *child_dev;
++ struct pcie_link_state *link_state = pdev->link_state;
++
++ /* All functions should have the same cap and state, take the worst */
++ list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list) {
++ pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP);
++ if (!pos)
++ return;
++ pci_read_config_dword(child_dev, pos + PCI_EXP_LNKCAP, &reg32);
++ if (!(reg32 & PCI_EXP_LNKCAP_CLKPM)) {
++ capable = 0;
++ enabled = 0;
++ break;
++ }
++ pci_read_config_word(child_dev, pos + PCI_EXP_LNKCTL, &reg16);
++ if (!(reg16 & PCI_EXP_LNKCTL_CLKREQ_EN))
++ enabled = 0;
++ }
++ link_state->clk_pm_capable = capable;
++ link_state->clk_pm_enabled = enabled;
++ link_state->bios_clk_state = enabled;
++ pcie_set_clock_pm(pdev, policy_to_clkpm_state(pdev));
++}
++
++/*
++ * pcie_aspm_configure_common_clock: check if the 2 ends of a link
++ * could use common clock. If they are, configure them to use the
++ * common clock. That will reduce the ASPM state exit latency.
++ */
++static void pcie_aspm_configure_common_clock(struct pci_dev *pdev)
++{
++ int pos, child_pos;
++ u16 reg16 = 0;
++ struct pci_dev *child_dev;
++ int same_clock = 1;
++
++ /*
++ * all functions of a slot should have the same Slot Clock
++ * Configuration, so just check one function
++ * */
++ child_dev = list_entry(pdev->subordinate->devices.next, struct pci_dev,
++ bus_list);
++ BUG_ON(!child_dev->is_pcie);
++
++ /* Check downstream component if bit Slot Clock Configuration is 1 */
++ child_pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP);
++ pci_read_config_word(child_dev, child_pos + PCI_EXP_LNKSTA, &reg16);
++ if (!(reg16 & PCI_EXP_LNKSTA_SLC))
++ same_clock = 0;
++
++ /* Check upstream component if bit Slot Clock Configuration is 1 */
++ pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
++ pci_read_config_word(pdev, pos + PCI_EXP_LNKSTA, &reg16);
++ if (!(reg16 & PCI_EXP_LNKSTA_SLC))
++ same_clock = 0;
++
++ /* Configure downstream component, all functions */
++ list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list) {
++ child_pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP);
++ pci_read_config_word(child_dev, child_pos + PCI_EXP_LNKCTL,
++ &reg16);
++ if (same_clock)
++ reg16 |= PCI_EXP_LNKCTL_CCC;
++ else
++ reg16 &= ~PCI_EXP_LNKCTL_CCC;
++ pci_write_config_word(child_dev, child_pos + PCI_EXP_LNKCTL,
++ reg16);
++ }
++
++ /* Configure upstream component */
++ pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, &reg16);
++ if (same_clock)
++ reg16 |= PCI_EXP_LNKCTL_CCC;
++ else
++ reg16 &= ~PCI_EXP_LNKCTL_CCC;
++ pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
++
++ /* retrain link */
++ reg16 |= PCI_EXP_LNKCTL_RL;
++ pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
++
++ /* Wait for link training end */
++ while (1) {
++ pci_read_config_word(pdev, pos + PCI_EXP_LNKSTA, &reg16);
++ if (!(reg16 & PCI_EXP_LNKSTA_LT))
++ break;
++ cpu_relax();
++ }
++}
++
++/*
++ * calc_L0S_latency: Convert L0s latency encoding to ns
++ */
++static unsigned int calc_L0S_latency(unsigned int latency_encoding, int ac)
++{
++ unsigned int ns = 64;
++
++ if (latency_encoding == 0x7) {
++ if (ac)
++ ns = -1U;
++ else
++ ns = 5*1000; /* > 4us */
++ } else
++ ns *= (1 << latency_encoding);
++ return ns;
++}
++
++/*
++ * calc_L1_latency: Convert L1 latency encoding to ns
++ */
++static unsigned int calc_L1_latency(unsigned int latency_encoding, int ac)
++{
++ unsigned int ns = 1000;
++
++ if (latency_encoding == 0x7) {
++ if (ac)
++ ns = -1U;
++ else
++ ns = 65*1000; /* > 64us */
++ } else
++ ns *= (1 << latency_encoding);
++ return ns;
++}
++
++static void pcie_aspm_get_cap_device(struct pci_dev *pdev, u32 *state,
++ unsigned int *l0s, unsigned int *l1, unsigned int *enabled)
++{
++ int pos;
++ u16 reg16;
++ u32 reg32;
++ unsigned int latency;
++
++ pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
++ pci_read_config_dword(pdev, pos + PCI_EXP_LNKCAP, &reg32);
++ *state = (reg32 & PCI_EXP_LNKCAP_ASPMS) >> 10;
++ if (*state != PCIE_LINK_STATE_L0S &&
++ *state != (PCIE_LINK_STATE_L1|PCIE_LINK_STATE_L0S))
++ *state = 0;
++ if (*state == 0)
++ return;
++
++ latency = (reg32 & PCI_EXP_LNKCAP_L0SEL) >> 12;
++ *l0s = calc_L0S_latency(latency, 0);
++ if (*state & PCIE_LINK_STATE_L1) {
++ latency = (reg32 & PCI_EXP_LNKCAP_L1EL) >> 15;
++ *l1 = calc_L1_latency(latency, 0);
++ }
++ pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, &reg16);
++ *enabled = reg16 & (PCIE_LINK_STATE_L0S|PCIE_LINK_STATE_L1);
++}
++
++static void pcie_aspm_cap_init(struct pci_dev *pdev)
++{
++ struct pci_dev *child_dev;
++ u32 state, tmp;
++ struct pcie_link_state *link_state = pdev->link_state;
++
++ /* upstream component states */
++ pcie_aspm_get_cap_device(pdev, &link_state->support_state,
++ &link_state->l0s_upper_latency,
++ &link_state->l1_upper_latency,
++ &link_state->enabled_state);
++ /* downstream component states, all functions have the same setting */
++ child_dev = list_entry(pdev->subordinate->devices.next, struct pci_dev,
++ bus_list);
++ pcie_aspm_get_cap_device(child_dev, &state,
++ &link_state->l0s_down_latency,
++ &link_state->l1_down_latency,
++ &tmp);
++ link_state->support_state &= state;
++ if (!link_state->support_state)
++ return;
++ link_state->enabled_state &= link_state->support_state;
++ link_state->bios_aspm_state = link_state->enabled_state;
++
++ /* ENDPOINT states*/
++ list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list) {
++ int pos;
++ u32 reg32;
++ unsigned int latency;
++ struct endpoint_state *ep_state =
++ &link_state->endpoints[PCI_FUNC(child_dev->devfn)];
++
++ if (child_dev->pcie_type != PCI_EXP_TYPE_ENDPOINT &&
++ child_dev->pcie_type != PCI_EXP_TYPE_LEG_END)
++ continue;
++
++ pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP);
++ pci_read_config_dword(child_dev, pos + PCI_EXP_DEVCAP, &reg32);
++ latency = (reg32 & PCI_EXP_DEVCAP_L0S) >> 6;
++ latency = calc_L0S_latency(latency, 1);
++ ep_state->l0s_acceptable_latency = latency;
++ if (link_state->support_state & PCIE_LINK_STATE_L1) {
++ latency = (reg32 & PCI_EXP_DEVCAP_L1) >> 9;
++ latency = calc_L1_latency(latency, 1);
++ ep_state->l1_acceptable_latency = latency;
++ }
++ }
++}
++
++static unsigned int __pcie_aspm_check_state_one(struct pci_dev *pdev,
++ unsigned int state)
++{
++ struct pci_dev *parent_dev, *tmp_dev;
++ unsigned int latency, l1_latency = 0;
++ struct pcie_link_state *link_state;
++ struct endpoint_state *ep_state;
++
++ parent_dev = pdev->bus->self;
++ link_state = parent_dev->link_state;
++ state &= link_state->support_state;
++ if (state == 0)
++ return 0;
++ ep_state = &link_state->endpoints[PCI_FUNC(pdev->devfn)];
++
++ /*
++ * Check latency for endpoint device.
++ * TBD: The latency from the endpoint to root complex vary per
++ * switch's upstream link state above the device. Here we just do a
++ * simple check which assumes all links above the device can be in L1
++ * state, that is we just consider the worst case. If switch's upstream
++ * link can't be put into L0S/L1, then our check is too strictly.
++ */
++ tmp_dev = pdev;
++ while (state & (PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1)) {
++ parent_dev = tmp_dev->bus->self;
++ link_state = parent_dev->link_state;
++ if (state & PCIE_LINK_STATE_L0S) {
++ latency = max_t(unsigned int,
++ link_state->l0s_upper_latency,
++ link_state->l0s_down_latency);
++ if (latency > ep_state->l0s_acceptable_latency)
++ state &= ~PCIE_LINK_STATE_L0S;
++ }
++ if (state & PCIE_LINK_STATE_L1) {
++ latency = max_t(unsigned int,
++ link_state->l1_upper_latency,
++ link_state->l1_down_latency);
++ if (latency + l1_latency >
++ ep_state->l1_acceptable_latency)
++ state &= ~PCIE_LINK_STATE_L1;
++ }
++ if (!parent_dev->bus->self) /* parent_dev is a root port */
++ break;
++ else {
++ /*
++ * parent_dev is the downstream port of a switch, make
++ * tmp_dev the upstream port of the switch
++ */
++ tmp_dev = parent_dev->bus->self;
++ /*
++ * every switch on the path to root complex need 1 more
++ * microsecond for L1. Spec doesn't mention L0S.
++ */
++ if (state & PCIE_LINK_STATE_L1)
++ l1_latency += 1000;
++ }
++ }
++ return state;
++}
++
++static unsigned int pcie_aspm_check_state(struct pci_dev *pdev,
++ unsigned int state)
++{
++ struct pci_dev *child_dev;
++
++ /* If no child, disable the link */
++ if (list_empty(&pdev->subordinate->devices))
++ return 0;
++ list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list) {
++ if (child_dev->pcie_type == PCI_EXP_TYPE_PCI_BRIDGE) {
++ /*
++ * If downstream component of a link is pci bridge, we
++ * disable ASPM for now for the link
++ * */
++ state = 0;
++ break;
++ }
++ if ((child_dev->pcie_type != PCI_EXP_TYPE_ENDPOINT &&
++ child_dev->pcie_type != PCI_EXP_TYPE_LEG_END))
++ continue;
++ /* Device not in D0 doesn't need check latency */
++ if (child_dev->current_state == PCI_D1 ||
++ child_dev->current_state == PCI_D2 ||
++ child_dev->current_state == PCI_D3hot ||
++ child_dev->current_state == PCI_D3cold)
++ continue;
++ state = __pcie_aspm_check_state_one(child_dev, state);
++ }
++ return state;
++}
++
++static void __pcie_aspm_config_one_dev(struct pci_dev *pdev, unsigned int state)
++{
++ u16 reg16;
++ int pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
++
++ pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, &reg16);
++ reg16 &= ~0x3;
++ reg16 |= state;
++ pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
++}
++
++static void __pcie_aspm_config_link(struct pci_dev *pdev, unsigned int state)
++{
++ struct pci_dev *child_dev;
++ int valid = 1;
++ struct pcie_link_state *link_state = pdev->link_state;
++
++ /*
++ * if the downstream component has pci bridge function, don't do ASPM
++ * now
++ */
++ list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list) {
++ if (child_dev->pcie_type == PCI_EXP_TYPE_PCI_BRIDGE) {
++ valid = 0;
++ break;
++ }
++ }
++ if (!valid)
++ return;
++
++ /*
++ * spec 2.0 suggests all functions should be configured the same
++ * setting for ASPM. Enabling ASPM L1 should be done in upstream
++ * component first and then downstream, and vice versa for disabling
++ * ASPM L1. Spec doesn't mention L0S.
++ */
++ if (state & PCIE_LINK_STATE_L1)
++ __pcie_aspm_config_one_dev(pdev, state);
++
++ list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list)
++ __pcie_aspm_config_one_dev(child_dev, state);
++
++ if (!(state & PCIE_LINK_STATE_L1))
++ __pcie_aspm_config_one_dev(pdev, state);
++
++ link_state->enabled_state = state;
++}
++
++static void __pcie_aspm_configure_link_state(struct pci_dev *pdev,
++ unsigned int state)
++{
++ struct pcie_link_state *link_state = pdev->link_state;
++
++ if (link_state->support_state == 0)
++ return;
++ state &= PCIE_LINK_STATE_L0S|PCIE_LINK_STATE_L1;
++
++ /* state 0 means disabling aspm */
++ state = pcie_aspm_check_state(pdev, state);
++ if (link_state->enabled_state == state)
++ return;
++ __pcie_aspm_config_link(pdev, state);
++}
++
++/*
++ * pcie_aspm_configure_link_state: enable/disable PCI express link state
++ * @pdev: the root port or switch downstream port
++ */
++static void pcie_aspm_configure_link_state(struct pci_dev *pdev,
++ unsigned int state)
++{
++ down_read(&pci_bus_sem);
++ mutex_lock(&aspm_lock);
++ __pcie_aspm_configure_link_state(pdev, state);
++ mutex_unlock(&aspm_lock);
++ up_read(&pci_bus_sem);
++}
++
++static void free_link_state(struct pci_dev *pdev)
++{
++ kfree(pdev->link_state);
++ pdev->link_state = NULL;
++}
++
++/*
++ * pcie_aspm_init_link_state: Initiate PCI express link state.
++ * It is called after the pcie and its children devices are scaned.
++ * @pdev: the root port or switch downstream port
++ */
++void pcie_aspm_init_link_state(struct pci_dev *pdev)
++{
++ unsigned int state;
++ struct pcie_link_state *link_state;
++ int error = 0;
++
++ if (aspm_disabled || !pdev->is_pcie || pdev->link_state)
++ return;
++ if (pdev->pcie_type != PCI_EXP_TYPE_ROOT_PORT &&
++ pdev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM)
++ return;
++ down_read(&pci_bus_sem);
++ if (list_empty(&pdev->subordinate->devices))
++ goto out;
++
++ mutex_lock(&aspm_lock);
++
++ link_state = kzalloc(sizeof(*link_state), GFP_KERNEL);
++ if (!link_state)
++ goto unlock_out;
++ pdev->link_state = link_state;
++
++ pcie_aspm_configure_common_clock(pdev);
++
++ pcie_aspm_cap_init(pdev);
++
++ /* config link state to avoid BIOS error */
++ state = pcie_aspm_check_state(pdev, policy_to_aspm_state(pdev));
++ __pcie_aspm_config_link(pdev, state);
++
++ pcie_check_clock_pm(pdev);
++
++ link_state->pdev = pdev;
++ list_add(&link_state->sibiling, &link_list);
++
++unlock_out:
++ if (error)
++ free_link_state(pdev);
++ mutex_unlock(&aspm_lock);
++out:
++ up_read(&pci_bus_sem);
++}
++
++/* @pdev: the endpoint device */
++void pcie_aspm_exit_link_state(struct pci_dev *pdev)
++{
++ struct pci_dev *parent = pdev->bus->self;
++ struct pcie_link_state *link_state = parent->link_state;
++
++ if (aspm_disabled || !pdev->is_pcie || !parent || !link_state)
++ return;
++ if (parent->pcie_type != PCI_EXP_TYPE_ROOT_PORT &&
++ parent->pcie_type != PCI_EXP_TYPE_DOWNSTREAM)
++ return;
++ down_read(&pci_bus_sem);
++ mutex_lock(&aspm_lock);
++
++ /*
++ * All PCIe functions are in one slot, remove one function will remove
++ * the the whole slot, so just wait
++ */
++ if (!list_empty(&parent->subordinate->devices))
++ goto out;
++
++ /* All functions are removed, so just disable ASPM for the link */
++ __pcie_aspm_config_one_dev(parent, 0);
++ list_del(&link_state->sibiling);
++ /* Clock PM is for endpoint device */
++
++ free_link_state(parent);
++out:
++ mutex_unlock(&aspm_lock);
++ up_read(&pci_bus_sem);
++}
++
++/* @pdev: the root port or switch downstream port */
++void pcie_aspm_pm_state_change(struct pci_dev *pdev)
++{
++ struct pcie_link_state *link_state = pdev->link_state;
++
++ if (aspm_disabled || !pdev->is_pcie || !pdev->link_state)
++ return;
++ if (pdev->pcie_type != PCI_EXP_TYPE_ROOT_PORT &&
++ pdev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM)
++ return;
++ /*
++ * devices changed PM state, we should recheck if latency meets all
++ * functions' requirement
++ */
++ pcie_aspm_configure_link_state(pdev, link_state->enabled_state);
++}
++
++/*
++ * pci_disable_link_state - disable pci device's link state, so the link will
++ * never enter specific states
++ */
++void pci_disable_link_state(struct pci_dev *pdev, int state)
++{
++ struct pci_dev *parent = pdev->bus->self;
++ struct pcie_link_state *link_state;
++
++ if (aspm_disabled || !pdev->is_pcie)
++ return;
++ if (pdev->pcie_type == PCI_EXP_TYPE_ROOT_PORT ||
++ pdev->pcie_type == PCI_EXP_TYPE_DOWNSTREAM)
++ parent = pdev;
++ if (!parent || !parent->link_state)
++ return;
++
++ down_read(&pci_bus_sem);
++ mutex_lock(&aspm_lock);
++ link_state = parent->link_state;
++ link_state->support_state &=
++ ~(state & (PCIE_LINK_STATE_L0S|PCIE_LINK_STATE_L1));
++ if (state & PCIE_LINK_STATE_CLKPM)
++ link_state->clk_pm_capable = 0;
++
++ __pcie_aspm_configure_link_state(parent, link_state->enabled_state);
++ if (!link_state->clk_pm_capable && link_state->clk_pm_enabled)
++ pcie_set_clock_pm(parent, 0);
++ mutex_unlock(&aspm_lock);
++ up_read(&pci_bus_sem);
++}
++EXPORT_SYMBOL(pci_disable_link_state);
++
++static int pcie_aspm_set_policy(const char *val, struct kernel_param *kp)
++{
++ int i;
++ struct pci_dev *pdev;
++ struct pcie_link_state *link_state;
++
++ for (i = 0; i < ARRAY_SIZE(policy_str); i++)
++ if (!strncmp(val, policy_str[i], strlen(policy_str[i])))
++ break;
++ if (i >= ARRAY_SIZE(policy_str))
++ return -EINVAL;
++ if (i == aspm_policy)
++ return 0;
++
++ down_read(&pci_bus_sem);
++ mutex_lock(&aspm_lock);
++ aspm_policy = i;
++ list_for_each_entry(link_state, &link_list, sibiling) {
++ pdev = link_state->pdev;
++ __pcie_aspm_configure_link_state(pdev,
++ policy_to_aspm_state(pdev));
++ if (link_state->clk_pm_capable &&
++ link_state->clk_pm_enabled != policy_to_clkpm_state(pdev))
++ pcie_set_clock_pm(pdev, policy_to_clkpm_state(pdev));
++
++ }
++ mutex_unlock(&aspm_lock);
++ up_read(&pci_bus_sem);
++ return 0;
++}
++
++static int pcie_aspm_get_policy(char *buffer, struct kernel_param *kp)
++{
++ int i, cnt = 0;
++ for (i = 0; i < ARRAY_SIZE(policy_str); i++)
++ if (i == aspm_policy)
++ cnt += sprintf(buffer + cnt, "[%s] ", policy_str[i]);
++ else
++ cnt += sprintf(buffer + cnt, "%s ", policy_str[i]);
++ return cnt;
++}
++
++module_param_call(policy, pcie_aspm_set_policy, pcie_aspm_get_policy,
++ NULL, 0644);
++
++#ifdef CONFIG_PCIEASPM_DEBUG
++static ssize_t link_state_show(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ struct pci_dev *pci_device = to_pci_dev(dev);
++ struct pcie_link_state *link_state = pci_device->link_state;
++
++ return sprintf(buf, "%d\n", link_state->enabled_state);
++}
++
++static ssize_t link_state_store(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf,
++ size_t n)
++{
++ struct pci_dev *pci_device = to_pci_dev(dev);
++ int state;
++
++ if (n < 1)
++ return -EINVAL;
++ state = buf[0]-'0';
++ if (state >= 0 && state <= 3) {
++ /* setup link aspm state */
++ pcie_aspm_configure_link_state(pci_device, state);
++ return n;
++ }
++
++ return -EINVAL;
++}
++
++static ssize_t clk_ctl_show(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ struct pci_dev *pci_device = to_pci_dev(dev);
++ struct pcie_link_state *link_state = pci_device->link_state;
++
++ return sprintf(buf, "%d\n", link_state->clk_pm_enabled);
++}
++
++static ssize_t clk_ctl_store(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf,
++ size_t n)
++{
++ struct pci_dev *pci_device = to_pci_dev(dev);
++ int state;
++
++ if (n < 1)
++ return -EINVAL;
++ state = buf[0]-'0';
++
++ down_read(&pci_bus_sem);
++ mutex_lock(&aspm_lock);
++ pcie_set_clock_pm(pci_device, !!state);
++ mutex_unlock(&aspm_lock);
++ up_read(&pci_bus_sem);
++
++ return n;
++}
++
++static DEVICE_ATTR(link_state, 0644, link_state_show, link_state_store);
++static DEVICE_ATTR(clk_ctl, 0644, clk_ctl_show, clk_ctl_store);
++
++static char power_group[] = "power";
++void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev)
++{
++ struct pcie_link_state *link_state = pdev->link_state;
++
++ if (!pdev->is_pcie || (pdev->pcie_type != PCI_EXP_TYPE_ROOT_PORT &&
++ pdev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM) || !link_state)
++ return;
++
++ if (link_state->support_state)
++ sysfs_add_file_to_group(&pdev->dev.kobj,
++ &dev_attr_link_state.attr, power_group);
++ if (link_state->clk_pm_capable)
++ sysfs_add_file_to_group(&pdev->dev.kobj,
++ &dev_attr_clk_ctl.attr, power_group);
++}
++
++void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev)
++{
++ struct pcie_link_state *link_state = pdev->link_state;
++
++ if (!pdev->is_pcie || (pdev->pcie_type != PCI_EXP_TYPE_ROOT_PORT &&
++ pdev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM) || !link_state)
++ return;
++
++ if (link_state->support_state)
++ sysfs_remove_file_from_group(&pdev->dev.kobj,
++ &dev_attr_link_state.attr, power_group);
++ if (link_state->clk_pm_capable)
++ sysfs_remove_file_from_group(&pdev->dev.kobj,
++ &dev_attr_clk_ctl.attr, power_group);
++}
++#endif
++
++static int __init pcie_aspm_disable(char *str)
++{
++ aspm_disabled = 1;
++ return 1;
++}
++
++__setup("pcie_noaspm", pcie_aspm_disable);
++
++#ifdef CONFIG_ACPI
++#include <acpi/acpi_bus.h>
++#include <linux/pci-acpi.h>
++static void pcie_aspm_platform_init(void)
++{
++ pcie_osc_support_set(OSC_ACTIVE_STATE_PWR_SUPPORT|
++ OSC_CLOCK_PWR_CAPABILITY_SUPPORT);
++}
++#else
++static inline void pcie_aspm_platform_init(void) { }
++#endif
++
++static int __init pcie_aspm_init(void)
++{
++ if (aspm_disabled)
++ return 0;
++ pcie_aspm_platform_init();
++ return 0;
++}
++
++fs_initcall(pcie_aspm_init);
+Index: linux/drivers/pci/pcie/Kconfig
+===================================================================
+--- linux.orig/drivers/pci/pcie/Kconfig 2008-02-20 10:22:16.000000000 +0800
++++ linux/drivers/pci/pcie/Kconfig 2008-02-20 13:59:10.000000000 +0800
+@@ -26,3 +26,23 @@ config HOTPLUG_PCI_PCIE
+ When in doubt, say N.
+
+ source "drivers/pci/pcie/aer/Kconfig"
++
++#
++# PCI Express ASPM
++#
++config PCIEASPM
++ bool "PCI Express ASPM support(Experimental)"
++ depends on PCI && EXPERIMENTAL && PCIEPORTBUS
++ default y
++ help
++ This enables PCI Express ASPM (Active State Power Management) and
++ Clock Power Management. ASPM supports state L0/L0s/L1.
++
++ When in doubt, say N.
++config PCIEASPM_DEBUG
++ bool "Debug PCI Express ASPM"
++ depends on PCIEASPM
++ default n
++ help
++ This enables PCI Express ASPM debug support. It will add per-device
++ interface to control ASPM.
+Index: linux/include/linux/pci.h
+===================================================================
+--- linux.orig/include/linux/pci.h 2008-02-20 10:22:16.000000000 +0800
++++ linux/include/linux/pci.h 2008-02-20 13:59:10.000000000 +0800
+@@ -128,6 +128,7 @@ struct pci_cap_saved_state {
+ u32 data[0];
+ };
+
++struct pcie_link_state;
+ /*
+ * The pci_dev structure is used to describe PCI devices.
+ */
+@@ -165,6 +166,10 @@ struct pci_dev {
+ this is D0-D3, D0 being fully functional,
+ and D3 being off. */
+
++#ifdef CONFIG_PCIEASPM
++ struct pcie_link_state *link_state; /* ASPM link state. */
++#endif
++
+ pci_channel_state_t error_state; /* current connectivity state */
+ struct device dev; /* Generic device interface */
+
+Index: linux/include/linux/pci_regs.h
+===================================================================
+--- linux.orig/include/linux/pci_regs.h 2008-02-20 10:22:16.000000000 +0800
++++ linux/include/linux/pci_regs.h 2008-02-20 13:59:10.000000000 +0800
+@@ -395,9 +395,17 @@
+ #define PCI_EXP_DEVSTA_AUXPD 0x10 /* AUX Power Detected */
+ #define PCI_EXP_DEVSTA_TRPND 0x20 /* Transactions Pending */
+ #define PCI_EXP_LNKCAP 12 /* Link Capabilities */
++#define PCI_EXP_LNKCAP_ASPMS 0xc00 /* ASPM Support */
++#define PCI_EXP_LNKCAP_L0SEL 0x7000 /* L0s Exit Latency */
++#define PCI_EXP_LNKCAP_L1EL 0x38000 /* L1 Exit Latency */
++#define PCI_EXP_LNKCAP_CLKPM 0x40000 /* L1 Clock Power Management */
+ #define PCI_EXP_LNKCTL 16 /* Link Control */
++#define PCI_EXP_LNKCTL_RL 0x20 /* Retrain Link */
++#define PCI_EXP_LNKCTL_CCC 0x40 /* Common Clock COnfiguration */
+ #define PCI_EXP_LNKCTL_CLKREQ_EN 0x100 /* Enable clkreq */
+ #define PCI_EXP_LNKSTA 18 /* Link Status */
++#define PCI_EXP_LNKSTA_LT 0x800 /* Link Training */
++#define PCI_EXP_LNKSTA_SLC 0x1000 /* Slot Clock Configuration */
+ #define PCI_EXP_SLTCAP 20 /* Slot Capabilities */
+ #define PCI_EXP_SLTCTL 24 /* Slot Control */
+ #define PCI_EXP_SLTSTA 26 /* Slot Status */
+Index: linux/drivers/pci/probe.c
+===================================================================
+--- linux.orig/drivers/pci/probe.c 2008-02-20 10:22:16.000000000 +0800
++++ linux/drivers/pci/probe.c 2008-02-20 13:59:10.000000000 +0800
+@@ -9,6 +9,7 @@
+ #include <linux/slab.h>
+ #include <linux/module.h>
+ #include <linux/cpumask.h>
++#include <linux/pci-aspm.h>
+ #include "pci.h"
+
+ #define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */
+@@ -1005,6 +1006,10 @@ int pci_scan_slot(struct pci_bus *bus, i
+ break;
+ }
+ }
++
++ if (bus->self)
++ pcie_aspm_init_link_state(bus->self);
++
+ return nr;
+ }
+
+Index: linux/drivers/pci/remove.c
+===================================================================
+--- linux.orig/drivers/pci/remove.c 2008-02-20 10:22:16.000000000 +0800
++++ linux/drivers/pci/remove.c 2008-02-20 13:59:10.000000000 +0800
+@@ -1,5 +1,6 @@
+ #include <linux/pci.h>
+ #include <linux/module.h>
++#include <linux/pci-aspm.h>
+ #include "pci.h"
+
+ static void pci_free_resources(struct pci_dev *dev)
+@@ -30,6 +31,9 @@ static void pci_stop_dev(struct pci_dev
+ dev->global_list.next = dev->global_list.prev = NULL;
+ up_write(&pci_bus_sem);
+ }
++
++ if (dev->bus->self)
++ pcie_aspm_exit_link_state(dev);
+ }
+
+ static void pci_destroy_dev(struct pci_dev *dev)
+Index: linux/drivers/pci/pci.c
+===================================================================
+--- linux.orig/drivers/pci/pci.c 2008-02-20 10:22:16.000000000 +0800
++++ linux/drivers/pci/pci.c 2008-02-20 13:59:10.000000000 +0800
+@@ -18,6 +18,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/string.h>
+ #include <linux/log2.h>
++#include <linux/pci-aspm.h>
+ #include <asm/dma.h> /* isa_dma_bridge_buggy */
+ #include "pci.h"
+
+@@ -519,6 +520,9 @@ pci_set_power_state(struct pci_dev *dev,
+ if (need_restore)
+ pci_restore_bars(dev);
+
++ if (dev->bus->self)
++ pcie_aspm_pm_state_change(dev->bus->self);
++
+ return 0;
+ }
+
+Index: linux/drivers/pci/pci-sysfs.c
+===================================================================
+--- linux.orig/drivers/pci/pci-sysfs.c 2008-02-20 10:22:16.000000000 +0800
++++ linux/drivers/pci/pci-sysfs.c 2008-02-20 13:59:10.000000000 +0800
+@@ -21,6 +21,7 @@
+ #include <linux/topology.h>
+ #include <linux/mm.h>
+ #include <linux/capability.h>
++#include <linux/pci-aspm.h>
+ #include "pci.h"
+
+ static int sysfs_initialized; /* = 0 */
+@@ -650,6 +651,8 @@ int __must_check pci_create_sysfs_dev_fi
+ if (pcibios_add_platform_entries(pdev))
+ goto err_rom_file;
+
++ pcie_aspm_create_sysfs_dev_files(pdev);
++
+ return 0;
+
+ err_rom_file:
+@@ -679,6 +682,8 @@ void pci_remove_sysfs_dev_files(struct p
+ if (!sysfs_initialized)
+ return;
+
++ pcie_aspm_remove_sysfs_dev_files(pdev);
++
+ if (pdev->cfg_size < 4096)
+ sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr);
+ else
+Index: linux/include/linux/pci-aspm.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux/include/linux/pci-aspm.h 2008-02-20 13:59:10.000000000 +0800
+@@ -0,0 +1,56 @@
++/*
++ * aspm.h
++ *
++ * PCI Express ASPM defines and function prototypes
++ *
++ * Copyright (C) 2007 Intel Corp.
++ * Zhang Yanmin (yanmin.zhang <at> intel.com)
++ * Shaohua Li (shaohua.li <at> intel.com)
++ *
++ * For more information, please consult the following manuals (look at
++ * http://www.pcisig.com/ for how to get them):
++ *
++ * PCI Express Specification
++ */
++
++#ifndef LINUX_ASPM_H
++#define LINUX_ASPM_H
++
++#include <linux/pci.h>
++
++#define PCIE_LINK_STATE_L0S 1
++#define PCIE_LINK_STATE_L1 2
++#define PCIE_LINK_STATE_CLKPM 4
++
++#ifdef CONFIG_PCIEASPM
++extern void pcie_aspm_init_link_state(struct pci_dev *pdev);
++extern void pcie_aspm_exit_link_state(struct pci_dev *pdev);
++extern void pcie_aspm_pm_state_change(struct pci_dev *pdev);
++extern void pci_disable_link_state(struct pci_dev *pdev, int state);
++#else
++static inline void pcie_aspm_init_link_state(struct pci_dev *pdev)
++{
++}
++static inline void pcie_aspm_exit_link_state(struct pci_dev *pdev)
++{
++}
++static inline void pcie_aspm_pm_state_change(struct pci_dev *pdev)
++{
++}
++static inline void pci_disable_link_state(struct pci_dev *pdev, int state)
++{
++}
++#endif
++
++#ifdef CONFIG_PCIEASPM_DEBUG /* this depends on CONFIG_PCIEASPM */
++extern void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev);
++extern void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev);
++#else
++static inline void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev)
++{
++}
++static inline void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev)
++{
++}
++#endif
++#endif /* LINUX_ASPM_H */
+
diff --git a/sys-kernel/thinkpad-sources/files/2.6.25/vt-fix.patch b/sys-kernel/thinkpad-sources/files/2.6.25/vt-fix.patch
new file mode 100644
index 0000000..62c7a7e
--- /dev/null
+++ b/sys-kernel/thinkpad-sources/files/2.6.25/vt-fix.patch
@@ -0,0 +1,146 @@
+diff --git a/drivers/char/vt.c b/drivers/char/vt.c
+index 9b58b89..159c9e2 100644
+--- a/drivers/char/vt.c
++++ b/drivers/char/vt.c
+@@ -301,7 +301,7 @@ static void scrup(struct vc_data *vc, unsigned int t, unsigned int b, int nr)
+ d = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t);
+ s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * (t + nr));
+ scr_memmovew(d, s, (b - t - nr) * vc->vc_size_row);
+- scr_memsetw(d + (b - t - nr) * vc->vc_cols, vc->vc_video_erase_char,
++ scr_memsetw(d + (b - t - nr) * vc->vc_cols, vc->vc_scrl_erase_char,
+ vc->vc_size_row * nr);
+ }
+
+@@ -319,7 +319,7 @@ static void scrdown(struct vc_data *vc, unsigned int t, unsigned int b, int nr)
+ s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t);
+ step = vc->vc_cols * nr;
+ scr_memmovew(s + step, s, (b - t - nr) * vc->vc_size_row);
+- scr_memsetw(s, vc->vc_video_erase_char, 2 * step);
++ scr_memsetw(s, vc->vc_scrl_erase_char, 2 * step);
+ }
+
+ static void do_update_region(struct vc_data *vc, unsigned long start, int count)
+@@ -400,7 +400,7 @@ static u8 build_attr(struct vc_data *vc, u8 _color, u8 _intensity, u8 _blink,
+ * Bit 7 : blink
+ */
+ {
+- u8 a = vc->vc_color;
++ u8 a = _color;
+ if (!vc->vc_can_do_color)
+ return _intensity |
+ (_italic ? 2 : 0) |
+@@ -434,6 +434,7 @@ static void update_attr(struct vc_data *vc)
+ vc->vc_blink, vc->vc_underline,
+ vc->vc_reverse ^ vc->vc_decscnm, vc->vc_italic);
+ vc->vc_video_erase_char = (build_attr(vc, vc->vc_color, 1, vc->vc_blink, 0, vc->vc_decscnm, 0) << 8) | ' ';
++ vc->vc_scrl_erase_char = (build_attr(vc, vc->vc_def_color, 1, false, false, false, false) << 8) | ' ';
+ }
+
+ /* Note: inverting the screen twice should revert to the original state */
+diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
+index 0222824..ca2a543 100644
+--- a/drivers/video/console/fbcon.c
++++ b/drivers/video/console/fbcon.c
+@@ -1882,7 +1882,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
+ scr_memsetw((unsigned short *) (vc->vc_origin +
+ vc->vc_size_row *
+ (b - count)),
+- vc->vc_video_erase_char,
++ vc->vc_scrl_erase_char,
+ vc->vc_size_row * count);
+ return 1;
+ break;
+@@ -1954,7 +1954,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
+ scr_memsetw((unsigned short *) (vc->vc_origin +
+ vc->vc_size_row *
+ (b - count)),
+- vc->vc_video_erase_char,
++ vc->vc_scrl_erase_char,
+ vc->vc_size_row * count);
+ return 1;
+ }
+@@ -1973,7 +1973,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
+ scr_memsetw((unsigned short *) (vc->vc_origin +
+ vc->vc_size_row *
+ t),
+- vc->vc_video_erase_char,
++ vc->vc_scrl_erase_char,
+ vc->vc_size_row * count);
+ return 1;
+ break;
+@@ -2043,7 +2043,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
+ scr_memsetw((unsigned short *) (vc->vc_origin +
+ vc->vc_size_row *
+ t),
+- vc->vc_video_erase_char,
++ vc->vc_scrl_erase_char,
+ vc->vc_size_row * count);
+ return 1;
+ }
+diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
+index bd8d995..38a296b 100644
+--- a/drivers/video/console/mdacon.c
++++ b/drivers/video/console/mdacon.c
+@@ -531,7 +531,7 @@ static void mdacon_cursor(struct vc_data *c, int mode)
+
+ static int mdacon_scroll(struct vc_data *c, int t, int b, int dir, int lines)
+ {
+- u16 eattr = mda_convert_attr(c->vc_video_erase_char);
++ u16 eattr = mda_convert_attr(c->vc_scrl_erase_char);
+
+ if (!lines)
+ return 0;
+diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
+index 67a682d..a11cc2f 100644
+--- a/drivers/video/console/sticon.c
++++ b/drivers/video/console/sticon.c
+@@ -170,12 +170,12 @@ static int sticon_scroll(struct vc_data *conp, int t, int b, int dir, int count)
+ switch (dir) {
+ case SM_UP:
+ sti_bmove(sti, t + count, 0, t, 0, b - t - count, conp->vc_cols);
+- sti_clear(sti, b - count, 0, count, conp->vc_cols, conp->vc_video_erase_char);
++ sti_clear(sti, b - count, 0, count, conp->vc_cols, conp->vc_scrl_erase_char);
+ break;
+
+ case SM_DOWN:
+ sti_bmove(sti, t, 0, t + count, 0, b - t - count, conp->vc_cols);
+- sti_clear(sti, t, 0, count, conp->vc_cols, conp->vc_video_erase_char);
++ sti_clear(sti, t, 0, count, conp->vc_cols, conp->vc_scrl_erase_char);
+ break;
+ }
+
+diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
+index 6df29a6..bd1f57b 100644
+--- a/drivers/video/console/vgacon.c
++++ b/drivers/video/console/vgacon.c
+@@ -1350,7 +1350,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir,
+ } else
+ c->vc_origin += delta;
+ scr_memsetw((u16 *) (c->vc_origin + c->vc_screenbuf_size -
+- delta), c->vc_video_erase_char,
++ delta), c->vc_scrl_erase_char,
+ delta);
+ } else {
+ if (oldo - delta < vga_vram_base) {
+@@ -1363,7 +1363,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir,
+ } else
+ c->vc_origin -= delta;
+ c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;
+- scr_memsetw((u16 *) (c->vc_origin), c->vc_video_erase_char,
++ scr_memsetw((u16 *) (c->vc_origin), c->vc_scrl_erase_char,
+ delta);
+ }
+ c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;
+diff --git a/include/linux/console_struct.h b/include/linux/console_struct.h
+index d71f7c0..b03f80a 100644
+--- a/include/linux/console_struct.h
++++ b/include/linux/console_struct.h
+@@ -53,6 +53,7 @@ struct vc_data {
+ unsigned short vc_hi_font_mask; /* [#] Attribute set for upper 256 chars of font or 0 if not supported */
+ struct console_font vc_font; /* Current VC font set */
+ unsigned short vc_video_erase_char; /* Background erase character */
++ unsigned short vc_scrl_erase_char; /* Erase character for scroll */
+ /* VT terminal data */
+ unsigned int vc_state; /* Escape sequence parser state */
+ unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current escape sequence */
+
diff --git a/sys-kernel/thinkpad-sources/files/configs/config-for-core-2.6.25 b/sys-kernel/thinkpad-sources/files/configs/config-for-core-2.6.25
new file mode 100644
index 0000000..a201789
--- /dev/null
+++ b/sys-kernel/thinkpad-sources/files/configs/config-for-core-2.6.25
@@ -0,0 +1,2333 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.25-thinkpad
+# Thu May 15 12:44:35 2008
+#
+# CONFIG_64BIT is not set
+CONFIG_X86_32=y
+# CONFIG_X86_64 is not set
+CONFIG_X86=y
+CONFIG_DEFCONFIG_LIST="arch/x86/configs/i386_defconfig"
+# CONFIG_GENERIC_LOCKBREAK is not set
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CMOS_UPDATE=y
+CONFIG_CLOCKSOURCE_WATCHDOG=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_SEMAPHORE_SLEEPERS=y
+CONFIG_FAST_CMPXCHG_LOCAL=y
+CONFIG_MMU=y
+CONFIG_ZONE_DMA=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_GENERIC_IOMAP=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_HWEIGHT=y
+# CONFIG_GENERIC_GPIO is not set
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_DMI=y
+# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+# CONFIG_GENERIC_TIME_VSYSCALL is not set
+CONFIG_ARCH_HAS_CPU_RELAX=y
+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+# CONFIG_ZONE_DMA32 is not set
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+# CONFIG_AUDIT_ARCH is not set
+CONFIG_ARCH_SUPPORTS_AOUT=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_PENDING_IRQ=y
+CONFIG_X86_SMP=y
+CONFIG_X86_32_SMP=y
+CONFIG_X86_HT=y
+CONFIG_X86_BIOS_REBOOT=y
+CONFIG_X86_TRAMPOLINE=y
+CONFIG_KTIME_SCALAR=y
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+CONFIG_AUDIT=y
+CONFIG_AUDITSYSCALL=y
+CONFIG_AUDIT_TREE=y
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=15
+# CONFIG_CGROUPS is not set
+CONFIG_GROUP_SCHED=y
+CONFIG_FAIR_GROUP_SCHED=y
+# CONFIG_RT_GROUP_SCHED is not set
+CONFIG_USER_SCHED=y
+# CONFIG_CGROUP_SCHED is not set
+CONFIG_SYSFS_DEPRECATED=y
+CONFIG_SYSFS_DEPRECATED_V2=y
+# CONFIG_RELAY is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
+# CONFIG_BLK_DEV_INITRD is not set
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+# CONFIG_COMPAT_BRK is not set
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+# CONFIG_MARKERS is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+CONFIG_STOP_MACHINE=y
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+# CONFIG_BLK_DEV_BSG is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+# CONFIG_CLASSIC_RCU is not set
+
+#
+# Processor type and features
+#
+CONFIG_TICK_ONESHOT=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_SMP=y
+CONFIG_X86_PC=y
+# CONFIG_X86_ELAN is not set
+# CONFIG_X86_VOYAGER is not set
+# CONFIG_X86_NUMAQ is not set
+# CONFIG_X86_SUMMIT is not set
+# CONFIG_X86_BIGSMP is not set
+# CONFIG_X86_VISWS is not set
+# CONFIG_X86_GENERICARCH is not set
+# CONFIG_X86_ES7000 is not set
+# CONFIG_X86_RDC321X is not set
+# CONFIG_X86_VSMP is not set
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+# CONFIG_PARAVIRT_GUEST 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 is not set
+# CONFIG_MPENTIUMII is not set
+# CONFIG_MPENTIUMIII is not set
+# CONFIG_MPENTIUMM is not set
+CONFIG_MPENTIUM4=y
+# CONFIG_MK6 is not set
+# CONFIG_MK7 is not set
+# CONFIG_MK8 is not set
+# CONFIG_MCRUSOE is not set
+# CONFIG_MEFFICEON is not set
+# CONFIG_MWINCHIPC6 is not set
+# CONFIG_MWINCHIP2 is not set
+# CONFIG_MWINCHIP3D is not set
+# CONFIG_MGEODEGX1 is not set
+# CONFIG_MGEODE_LX is not set
+# CONFIG_MCYRIXIII is not set
+# CONFIG_MVIAC3_2 is not set
+# CONFIG_MVIAC7 is not set
+# CONFIG_MPSC is not set
+# CONFIG_MCORE2 is not set
+# CONFIG_GENERIC_CPU is not set
+# CONFIG_X86_GENERIC is not set
+CONFIG_X86_CMPXCHG=y
+CONFIG_X86_L1_CACHE_SHIFT=7
+CONFIG_X86_XADD=y
+CONFIG_X86_WP_WORKS_OK=y
+CONFIG_X86_INVLPG=y
+CONFIG_X86_BSWAP=y
+CONFIG_X86_POPAD_OK=y
+CONFIG_X86_GOOD_APIC=y
+CONFIG_X86_INTEL_USERCOPY=y
+CONFIG_X86_USE_PPRO_CHECKSUM=y
+CONFIG_X86_P6_NOP=y
+CONFIG_X86_TSC=y
+CONFIG_X86_CMOV=y
+CONFIG_X86_MINIMUM_CPU_FAMILY=6
+CONFIG_X86_DEBUGCTLMSR=y
+CONFIG_HPET_TIMER=y
+CONFIG_HPET_EMULATE_RTC=y
+# CONFIG_IOMMU_HELPER is not set
+CONFIG_NR_CPUS=2
+# CONFIG_SCHED_SMT is not set
+CONFIG_SCHED_MC=y
+# CONFIG_PREEMPT_NONE is not set
+# CONFIG_PREEMPT_VOLUNTARY is not set
+CONFIG_PREEMPT=y
+CONFIG_PREEMPT_RCU=y
+# CONFIG_RCU_TRACE is not set
+CONFIG_X86_LOCAL_APIC=y
+CONFIG_X86_IO_APIC=y
+CONFIG_X86_MCE=y
+# CONFIG_X86_MCE_NONFATAL is not set
+# CONFIG_X86_MCE_P4THERMAL is not set
+CONFIG_VM86=y
+# CONFIG_TOSHIBA is not set
+# CONFIG_I8K is not set
+# CONFIG_X86_REBOOTFIXUPS is not set
+# CONFIG_MICROCODE is not set
+# CONFIG_X86_MSR is not set
+# CONFIG_X86_CPUID is not set
+# CONFIG_NOHIGHMEM is not set
+CONFIG_HIGHMEM4G=y
+# CONFIG_HIGHMEM64G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_HIGHMEM=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_SPARSEMEM_STATIC=y
+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BOUNCE=y
+CONFIG_VIRT_TO_BUS=y
+CONFIG_HIGHPTE=y
+# CONFIG_MATH_EMULATION is not set
+CONFIG_MTRR=y
+# CONFIG_EFI is not set
+# CONFIG_IRQBALANCE is not set
+CONFIG_SECCOMP=y
+# CONFIG_HZ_100 is not set
+# CONFIG_HZ_250 is not set
+CONFIG_HZ_300=y
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=300
+CONFIG_SCHED_HRTICK=y
+# CONFIG_KEXEC is not set
+# CONFIG_CRASH_DUMP is not set
+CONFIG_PHYSICAL_START=0x100000
+# CONFIG_RELOCATABLE is not set
+CONFIG_PHYSICAL_ALIGN=0x100000
+CONFIG_HOTPLUG_CPU=y
+# CONFIG_COMPAT_VDSO is not set
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_PM_SLEEP_SMP=y
+CONFIG_PM_SLEEP=y
+CONFIG_SUSPEND=y
+CONFIG_SUSPEND_FREEZER=y
+CONFIG_HIBERNATION=y
+CONFIG_PM_STD_PARTITION="/dev/sda5"
+CONFIG_TOI_CORE=y
+
+#
+# Image Storage (you need at least one allocator)
+#
+CONFIG_TOI_FILE=y
+CONFIG_TOI_SWAP=y
+
+#
+# General Options
+#
+CONFIG_TOI_DEFAULT_PRE_HIBERNATE=""
+CONFIG_TOI_DEFAULT_POST_HIBERNATE=""
+CONFIG_TOI_CRYPTO=y
+CONFIG_TOI_USERUI=y
+CONFIG_TOI_USERUI_DEFAULT_PATH="/usr/local/sbin/tuxonice_fbsplash"
+# CONFIG_TOI_KEEP_IMAGE is not set
+CONFIG_TOI_REPLACE_SWSUSP=y
+CONFIG_TOI_CHECKSUM=y
+CONFIG_TOI_DEFAULT_WAIT=25
+# CONFIG_TOI_PAGEFLAGS_TEST is not set
+CONFIG_TOI=y
+CONFIG_ACPI=y
+CONFIG_ACPI_SLEEP=y
+CONFIG_ACPI_PROCFS=y
+CONFIG_ACPI_PROCFS_POWER=y
+CONFIG_ACPI_SYSFS_POWER=y
+CONFIG_ACPI_PROC_EVENT=y
+CONFIG_ACPI_AC=y
+CONFIG_ACPI_BATTERY=y
+CONFIG_ACPI_BUTTON=y
+CONFIG_ACPI_FAN=y
+CONFIG_ACPI_DOCK=y
+CONFIG_ACPI_BAY=y
+CONFIG_ACPI_PROCESSOR=y
+CONFIG_ACPI_HOTPLUG_CPU=y
+CONFIG_ACPI_THERMAL=y
+CONFIG_ACPI_WMI=y
+# CONFIG_ACPI_ASUS is not set
+# CONFIG_ACPI_TOSHIBA is not set
+# CONFIG_ACPI_CUSTOM_DSDT is not set
+CONFIG_ACPI_BLACKLIST_YEAR=0
+# CONFIG_ACPI_DEBUG is not set
+CONFIG_ACPI_EC=y
+CONFIG_ACPI_POWER=y
+CONFIG_ACPI_SYSTEM=y
+CONFIG_X86_PM_TIMER=y
+CONFIG_ACPI_CONTAINER=y
+# CONFIG_ACPI_SBS is not set
+# CONFIG_APM is not set
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+# CONFIG_CPU_FREQ_DEBUG is not set
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+
+#
+# CPUFreq processor drivers
+#
+CONFIG_X86_ACPI_CPUFREQ=y
+# CONFIG_X86_POWERNOW_K6 is not set
+# CONFIG_X86_POWERNOW_K7 is not set
+# CONFIG_X86_POWERNOW_K8 is not set
+# 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_P4_CLOCKMOD is not set
+# CONFIG_X86_CPUFREQ_NFORCE2 is not set
+# CONFIG_X86_LONGRUN is not set
+# CONFIG_X86_LONGHAUL is not set
+# CONFIG_X86_E_POWERSAVER is not set
+
+#
+# shared options
+#
+# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set
+CONFIG_X86_SPEEDSTEP_LIB=y
+# CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK is not set
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_LADDER=y
+CONFIG_CPU_IDLE_GOV_MENU=y
+
+#
+# Bus options (PCI etc.)
+#
+CONFIG_PCI=y
+# CONFIG_PCI_GOBIOS is not set
+# CONFIG_PCI_GOMMCONFIG is not set
+# CONFIG_PCI_GODIRECT is not set
+CONFIG_PCI_GOANY=y
+CONFIG_PCI_BIOS=y
+CONFIG_PCI_DIRECT=y
+CONFIG_PCI_MMCONFIG=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCIEPORTBUS=y
+CONFIG_HOTPLUG_PCI_PCIE=y
+CONFIG_PCIEAER=y
+CONFIG_PCIEASPM=y
+# CONFIG_PCIEASPM_DEBUG is not set
+CONFIG_ARCH_SUPPORTS_MSI=y
+CONFIG_PCI_MSI=y
+CONFIG_PCI_LEGACY=y
+# CONFIG_PCI_DEBUG is not set
+CONFIG_HT_IRQ=y
+CONFIG_ISA_DMA_API=y
+CONFIG_ISA=y
+# CONFIG_EISA is not set
+# CONFIG_MCA is not set
+# CONFIG_SCx200 is not set
+CONFIG_PCCARD=y
+# CONFIG_PCMCIA_DEBUG is not set
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
+CONFIG_CARDBUS=y
+
+#
+# PC-card bridges
+#
+CONFIG_YENTA=y
+CONFIG_YENTA_O2=y
+CONFIG_YENTA_RICOH=y
+CONFIG_YENTA_TI=y
+CONFIG_YENTA_ENE_TUNE=y
+CONFIG_YENTA_TOSHIBA=y
+# CONFIG_PD6729 is not set
+# CONFIG_I82092 is not set
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+CONFIG_PCMCIA_PROBE=y
+CONFIG_PCCARD_NONSTATIC=y
+CONFIG_HOTPLUG_PCI=y
+# CONFIG_HOTPLUG_PCI_FAKE is not set
+# CONFIG_HOTPLUG_PCI_COMPAQ is not set
+CONFIG_HOTPLUG_PCI_IBM=y
+CONFIG_HOTPLUG_PCI_ACPI=y
+# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set
+# CONFIG_HOTPLUG_PCI_CPCI is not set
+# CONFIG_HOTPLUG_PCI_SHPC is not set
+
+#
+# Executable file formats / Emulations
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_AOUT=y
+CONFIG_BINFMT_MISC=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+CONFIG_XFRM_USER=m
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_XFRM_STATISTICS is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_ASK_IP_FIB_HASH=y
+# CONFIG_IP_FIB_TRIE is not set
+CONFIG_IP_FIB_HASH=y
+# CONFIG_IP_MULTIPLE_TABLES is not set
+# CONFIG_IP_ROUTE_MULTIPATH is not set
+# CONFIG_IP_ROUTE_VERBOSE is not set
+# CONFIG_IP_PNP is not set
+CONFIG_NET_IPIP=y
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+CONFIG_SYN_COOKIES=y
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+CONFIG_INET_TUNNEL=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+CONFIG_TCP_MD5SIG=y
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=y
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+CONFIG_IPV6_MIP6=y
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_NETFILTER_ADVANCED=y
+
+#
+# Core Netfilter Configuration
+#
+CONFIG_NETFILTER_NETLINK=y
+CONFIG_NETFILTER_NETLINK_QUEUE=y
+CONFIG_NETFILTER_NETLINK_LOG=y
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CT_ACCT=y
+CONFIG_NF_CONNTRACK_MARK=y
+CONFIG_NF_CONNTRACK_EVENTS=y
+CONFIG_NF_CT_PROTO_GRE=m
+CONFIG_NF_CT_PROTO_SCTP=m
+# CONFIG_NF_CT_PROTO_UDPLITE is not set
+# CONFIG_NF_CONNTRACK_AMANDA is not set
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_NETBIOS_NS=m
+CONFIG_NF_CONNTRACK_PPTP=m
+# CONFIG_NF_CONNTRACK_SANE is not set
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_TFTP=m
+CONFIG_NF_CT_NETLINK=m
+CONFIG_NETFILTER_XTABLES=y
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
+CONFIG_NETFILTER_XT_TARGET_DSCP=m
+CONFIG_NETFILTER_XT_TARGET_MARK=y
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y
+CONFIG_NETFILTER_XT_TARGET_NFLOG=m
+CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
+CONFIG_NETFILTER_XT_TARGET_RATEEST=m
+CONFIG_NETFILTER_XT_TARGET_TRACE=m
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
+CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
+CONFIG_NETFILTER_XT_MATCH_COMMENT=y
+CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
+CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
+CONFIG_NETFILTER_XT_MATCH_DCCP=y
+CONFIG_NETFILTER_XT_MATCH_DSCP=m
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_HELPER=m
+CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
+CONFIG_NETFILTER_XT_MATCH_LENGTH=y
+CONFIG_NETFILTER_XT_MATCH_LIMIT=y
+CONFIG_NETFILTER_XT_MATCH_MAC=y
+CONFIG_NETFILTER_XT_MATCH_MARK=y
+CONFIG_NETFILTER_XT_MATCH_OWNER=m
+CONFIG_NETFILTER_XT_MATCH_POLICY=m
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA=m
+CONFIG_NETFILTER_XT_MATCH_RATEEST=m
+CONFIG_NETFILTER_XT_MATCH_REALM=y
+CONFIG_NETFILTER_XT_MATCH_SCTP=y
+CONFIG_NETFILTER_XT_MATCH_STATE=m
+CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
+CONFIG_NETFILTER_XT_MATCH_STRING=y
+CONFIG_NETFILTER_XT_MATCH_TCPMSS=y
+# CONFIG_NETFILTER_XT_MATCH_TIME is not set
+CONFIG_NETFILTER_XT_MATCH_U32=m
+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
+
+#
+# IP: Netfilter Configuration
+#
+CONFIG_NF_CONNTRACK_IPV4=m
+# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set
+CONFIG_IP_NF_QUEUE=y
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MATCH_RECENT=y
+CONFIG_IP_NF_MATCH_ECN=y
+# CONFIG_IP_NF_MATCH_AH is not set
+CONFIG_IP_NF_MATCH_TTL=y
+CONFIG_IP_NF_MATCH_ADDRTYPE=y
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_TARGET_REJECT=y
+CONFIG_IP_NF_TARGET_LOG=y
+CONFIG_IP_NF_TARGET_ULOG=y
+CONFIG_NF_NAT=m
+CONFIG_NF_NAT_NEEDED=y
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_NF_NAT_SNMP_BASIC=m
+CONFIG_NF_NAT_PROTO_GRE=m
+CONFIG_NF_NAT_FTP=m
+CONFIG_NF_NAT_IRC=m
+CONFIG_NF_NAT_TFTP=m
+# CONFIG_NF_NAT_AMANDA is not set
+CONFIG_NF_NAT_PPTP=m
+CONFIG_NF_NAT_H323=m
+CONFIG_NF_NAT_SIP=m
+CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_TARGET_ECN=y
+CONFIG_IP_NF_TARGET_TTL=y
+CONFIG_IP_NF_TARGET_CLUSTERIP=m
+CONFIG_IP_NF_RAW=y
+CONFIG_IP_NF_ARPTABLES=y
+CONFIG_IP_NF_ARPFILTER=y
+CONFIG_IP_NF_ARP_MANGLE=y
+
+#
+# IPv6: Netfilter Configuration
+#
+CONFIG_NF_CONNTRACK_IPV6=m
+CONFIG_IP6_NF_QUEUE=y
+CONFIG_IP6_NF_IPTABLES=y
+CONFIG_IP6_NF_MATCH_RT=y
+CONFIG_IP6_NF_MATCH_OPTS=y
+CONFIG_IP6_NF_MATCH_FRAG=y
+CONFIG_IP6_NF_MATCH_HL=y
+CONFIG_IP6_NF_MATCH_IPV6HEADER=y
+# CONFIG_IP6_NF_MATCH_AH is not set
+CONFIG_IP6_NF_MATCH_MH=m
+CONFIG_IP6_NF_MATCH_EUI64=y
+CONFIG_IP6_NF_FILTER=y
+CONFIG_IP6_NF_TARGET_LOG=y
+CONFIG_IP6_NF_TARGET_REJECT=y
+CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_TARGET_HL=y
+CONFIG_IP6_NF_RAW=y
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+CONFIG_NET_SCHED=y
+
+#
+# Queueing/Scheduling
+#
+# CONFIG_NET_SCH_CBQ is not set
+# CONFIG_NET_SCH_HTB is not set
+# CONFIG_NET_SCH_HFSC is not set
+# CONFIG_NET_SCH_PRIO is not set
+# CONFIG_NET_SCH_RR is not set
+# CONFIG_NET_SCH_RED is not set
+# CONFIG_NET_SCH_SFQ is not set
+# CONFIG_NET_SCH_TEQL is not set
+# CONFIG_NET_SCH_TBF is not set
+# CONFIG_NET_SCH_GRED is not set
+# CONFIG_NET_SCH_DSMARK is not set
+# CONFIG_NET_SCH_NETEM is not set
+
+#
+# Classification
+#
+# CONFIG_NET_CLS_BASIC is not set
+# CONFIG_NET_CLS_TCINDEX is not set
+# CONFIG_NET_CLS_ROUTE4 is not set
+CONFIG_NET_CLS_ROUTE=y
+# CONFIG_NET_CLS_FW is not set
+# CONFIG_NET_CLS_U32 is not set
+# CONFIG_NET_CLS_RSVP is not set
+# CONFIG_NET_CLS_RSVP6 is not set
+# CONFIG_NET_CLS_FLOW is not set
+# CONFIG_NET_EMATCH is not set
+# CONFIG_NET_CLS_ACT is not set
+CONFIG_NET_SCH_FIFO=y
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+# CONFIG_BT_BNEP is not set
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUSB=m
+CONFIG_BT_HCIUSB_SCO=y
+# CONFIG_BT_HCIUART is not set
+# CONFIG_BT_HCIBCM203X is not set
+# CONFIG_BT_HCIBPA10X is not set
+# CONFIG_BT_HCIBFUSB is not set
+# CONFIG_BT_HCIDTL1 is not set
+# CONFIG_BT_HCIBT3C is not set
+# CONFIG_BT_HCIBLUECARD is not set
+# CONFIG_BT_HCIBTUART is not set
+# CONFIG_BT_HCIVHCI is not set
+# CONFIG_AF_RXRPC is not set
+
+#
+# Wireless
+#
+CONFIG_CFG80211=m
+CONFIG_NL80211=y
+CONFIG_WIRELESS_EXT=y
+CONFIG_MAC80211=m
+
+#
+# Rate control algorithm selection
+#
+CONFIG_MAC80211_RC_DEFAULT_PID=y
+# CONFIG_MAC80211_RC_DEFAULT_SIMPLE is not set
+# CONFIG_MAC80211_RC_DEFAULT_NONE is not set
+
+#
+# Selecting 'y' for an algorithm will
+#
+
+#
+# build the algorithm into mac80211.
+#
+CONFIG_MAC80211_RC_DEFAULT="pid"
+CONFIG_MAC80211_RC_PID=y
+# CONFIG_MAC80211_RC_SIMPLE is not set
+CONFIG_MAC80211_LEDS=y
+# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set
+# CONFIG_MAC80211_DEBUG is not set
+CONFIG_IEEE80211=m
+# CONFIG_IEEE80211_DEBUG is not set
+CONFIG_IEEE80211_CRYPT_WEP=m
+CONFIG_IEEE80211_CRYPT_CCMP=m
+CONFIG_IEEE80211_CRYPT_TKIP=m
+CONFIG_IEEE80211_SOFTMAC=m
+# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
+CONFIG_RFKILL=y
+CONFIG_RFKILL_INPUT=y
+CONFIG_RFKILL_LEDS=y
+# CONFIG_NET_9P is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_CONNECTOR is not set
+# CONFIG_MTD is not set
+CONFIG_PARPORT=y
+CONFIG_PARPORT_PC=y
+# CONFIG_PARPORT_SERIAL is not set
+# CONFIG_PARPORT_PC_FIFO is not set
+# CONFIG_PARPORT_PC_SUPERIO is not set
+# CONFIG_PARPORT_PC_PCMCIA is not set
+# CONFIG_PARPORT_GSC is not set
+# CONFIG_PARPORT_AX88796 is not set
+# CONFIG_PARPORT_1284 is not set
+CONFIG_PNP=y
+# CONFIG_PNP_DEBUG is not set
+
+#
+# Protocols
+#
+# CONFIG_ISAPNP is not set
+# CONFIG_PNPBIOS is not set
+CONFIG_PNPACPI=y
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_CRYPTOLOOP=y
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_UB is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_IBM_ASM is not set
+# CONFIG_PHANTOM is not set
+# CONFIG_EEPROM_93CX6 is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+# CONFIG_ACER_WMI is not set
+# CONFIG_ASUS_LAPTOP is not set
+# CONFIG_FUJITSU_LAPTOP is not set
+# CONFIG_TC1100_WMI is not set
+# CONFIG_MSI_LAPTOP is not set
+# CONFIG_SONY_LAPTOP is not set
+CONFIG_THINKPAD_ACPI=m
+# CONFIG_THINKPAD_ACPI_DEBUG is not set
+CONFIG_THINKPAD_ACPI_BAY=y
+# CONFIG_THINKPAD_ACPI_VIDEO is not set
+CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y
+CONFIG_INTEL_MENLOW=m
+CONFIG_ENCLOSURE_SERVICES=y
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+# CONFIG_SCSI_TGT is not set
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=y
+CONFIG_BLK_DEV_SR_VENDOR=y
+CONFIG_CHR_DEV_SG=y
+# CONFIG_CHR_DEV_SCH is not set
+CONFIG_SCSI_ENCLOSURE=y
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+CONFIG_SCSI_WAIT_SCAN=m
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+# CONFIG_SCSI_SRP_ATTRS is not set
+# CONFIG_SCSI_LOWLEVEL is not set
+# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
+CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
+CONFIG_ATA_ACPI=y
+CONFIG_SATA_AHCI=y
+# CONFIG_SATA_SVW is not set
+CONFIG_ATA_PIIX=y
+# CONFIG_SATA_MV is not set
+# CONFIG_SATA_NV is not set
+# CONFIG_PDC_ADMA is not set
+# CONFIG_SATA_QSTOR is not set
+# CONFIG_SATA_PROMISE is not set
+# CONFIG_SATA_SX4 is not set
+# CONFIG_SATA_SIL is not set
+# CONFIG_SATA_SIL24 is not set
+# CONFIG_SATA_SIS is not set
+# CONFIG_SATA_ULI is not set
+# CONFIG_SATA_VIA is not set
+# CONFIG_SATA_VITESSE is not set
+# CONFIG_SATA_INIC162X is not set
+# CONFIG_PATA_ACPI is not set
+# CONFIG_PATA_ALI is not set
+# CONFIG_PATA_AMD is not set
+# CONFIG_PATA_ARTOP is not set
+# CONFIG_PATA_ATIIXP is not set
+# CONFIG_PATA_CMD640_PCI is not set
+# CONFIG_PATA_CMD64X is not set
+# CONFIG_PATA_CS5520 is not set
+# CONFIG_PATA_CS5530 is not set
+# CONFIG_PATA_CS5535 is not set
+# CONFIG_PATA_CS5536 is not set
+# CONFIG_PATA_CYPRESS is not set
+# CONFIG_PATA_EFAR is not set
+# CONFIG_ATA_GENERIC is not set
+# CONFIG_PATA_HPT366 is not set
+# CONFIG_PATA_HPT37X is not set
+# CONFIG_PATA_HPT3X2N is not set
+# CONFIG_PATA_HPT3X3 is not set
+# CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_IT8213 is not set
+# CONFIG_PATA_JMICRON is not set
+# CONFIG_PATA_LEGACY is not set
+# CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_MARVELL is not set
+# CONFIG_PATA_MPIIX is not set
+# CONFIG_PATA_OLDPIIX is not set
+# CONFIG_PATA_NETCELL is not set
+# CONFIG_PATA_NINJA32 is not set
+# CONFIG_PATA_NS87410 is not set
+# CONFIG_PATA_NS87415 is not set
+# CONFIG_PATA_OPTI is not set
+# CONFIG_PATA_OPTIDMA is not set
+# CONFIG_PATA_PCMCIA is not set
+# CONFIG_PATA_PDC_OLD is not set
+# CONFIG_PATA_QDI is not set
+# CONFIG_PATA_RADISYS is not set
+# CONFIG_PATA_RZ1000 is not set
+# CONFIG_PATA_SC1200 is not set
+# CONFIG_PATA_SERVERWORKS is not set
+# CONFIG_PATA_PDC2027X is not set
+# CONFIG_PATA_SIL680 is not set
+# CONFIG_PATA_SIS is not set
+# CONFIG_PATA_VIA is not set
+# CONFIG_PATA_WINBOND is not set
+# CONFIG_PATA_WINBOND_VLB is not set
+# CONFIG_MD is not set
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_FIREWIRE is not set
+# CONFIG_IEEE1394 is not set
+# CONFIG_I2O is not set
+# CONFIG_MACINTOSH_DRIVERS is not set
+CONFIG_NETDEVICES=y
+CONFIG_NETDEVICES_MULTIQUEUE=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+CONFIG_TUN=y
+# CONFIG_VETH is not set
+# CONFIG_NET_SB1000 is not set
+# CONFIG_ARCNET is not set
+# CONFIG_NET_ETHERNET is not set
+CONFIG_MII=m
+CONFIG_NETDEV_1000=y
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+CONFIG_E1000=m
+CONFIG_E1000_NAPI=y
+CONFIG_E1000_DISABLE_PACKET_SPLIT=y
+CONFIG_E1000E=m
+CONFIG_E1000E_ENABLED=y
+# CONFIG_IP1000 is not set
+CONFIG_IGB=m
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SKGE is not set
+# CONFIG_SKY2 is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_VIA_VELOCITY is not set
+# CONFIG_TIGON3 is not set
+# CONFIG_BNX2 is not set
+# CONFIG_QLA3XXX is not set
+# CONFIG_ATL1 is not set
+# CONFIG_NETDEV_10000 is not set
+# CONFIG_TR is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+CONFIG_WLAN_80211=y
+# CONFIG_PCMCIA_RAYCS is not set
+# CONFIG_IPW2100 is not set
+# CONFIG_IPW2200 is not set
+# CONFIG_LIBERTAS is not set
+# CONFIG_AIRO is not set
+# CONFIG_HERMES is not set
+# CONFIG_ATMEL is not set
+# CONFIG_AIRO_CS is not set
+# CONFIG_PCMCIA_WL3501 is not set
+# CONFIG_PRISM54 is not set
+# CONFIG_USB_ZD1201 is not set
+# CONFIG_USB_NET_RNDIS_WLAN is not set
+# CONFIG_RTL8180 is not set
+# CONFIG_RTL8187 is not set
+# CONFIG_ADM8211 is not set
+# CONFIG_P54_COMMON is not set
+CONFIG_ATH5K=m
+# CONFIG_IWL4965 is not set
+CONFIG_IWL3945=m
+CONFIG_IWL3945_QOS=y
+CONFIG_IWL3945_SPECTRUM_MEASUREMENT=y
+# CONFIG_IWL3945_DEBUG is not set
+# CONFIG_HOSTAP is not set
+# CONFIG_BCM43XX is not set
+# CONFIG_B43 is not set
+# CONFIG_B43LEGACY is not set
+# CONFIG_ZD1211RW is not set
+# CONFIG_RT2X00 is not set
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET is not set
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+CONFIG_PCMCIA_3C574=m
+CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PCMCIA_NMCLAN=m
+CONFIG_PCMCIA_SMC91C92=m
+CONFIG_PCMCIA_XIRC2PS=m
+CONFIG_PCMCIA_AXNET=m
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PLIP is not set
+CONFIG_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+CONFIG_PPPOE=m
+CONFIG_PPPOL2TP=m
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# CONFIG_NET_FC is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+CONFIG_INPUT_POLLDEV=m
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1400
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=1050
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+CONFIG_MOUSE_PS2_ALPS=y
+CONFIG_MOUSE_PS2_LOGIPS2PP=y
+CONFIG_MOUSE_PS2_SYNAPTICS=y
+CONFIG_MOUSE_PS2_LIFEBOOK=y
+CONFIG_MOUSE_PS2_TRACKPOINT=y
+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_APPLETOUCH is not set
+# CONFIG_MOUSE_INPORT is not set
+# CONFIG_MOUSE_LOGIBM is not set
+# CONFIG_MOUSE_PC110PAD is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+CONFIG_INPUT_MISC=y
+# CONFIG_INPUT_PCSPKR is not set
+# CONFIG_INPUT_APANEL is not set
+# CONFIG_INPUT_WISTRON_BTNS is not set
+# CONFIG_INPUT_ATLAS_BTNS is not set
+# CONFIG_INPUT_ATI_REMOTE is not set
+# CONFIG_INPUT_ATI_REMOTE2 is not set
+# CONFIG_INPUT_KEYSPAN_REMOTE is not set
+# CONFIG_INPUT_POWERMATE is not set
+# CONFIG_INPUT_YEALINK is not set
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_PARKBD is not set
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_VT_CKO=y
+CONFIG_VT_PRINTK_EMERG_COLOR=0x09
+CONFIG_VT_PRINTK_ALERT_COLOR=0x01
+CONFIG_VT_PRINTK_CRIT_COLOR=0x05
+CONFIG_VT_PRINTK_ERROR_COLOR=0x01
+CONFIG_VT_PRINTK_WARNING_COLOR=0x0B
+CONFIG_VT_PRINTK_NOTICE_COLOR=0x02
+CONFIG_VT_PRINTK_INFO_COLOR=0x04
+CONFIG_VT_PRINTK_DEBUG_COLOR=0x07
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+CONFIG_NOZOMI=m
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+# CONFIG_SERIAL_8250_CONSOLE is not set
+CONFIG_FIX_EARLYCON_MEM=y
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_PNP=y
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+# CONFIG_SERIAL_JSM is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+CONFIG_PRINTER=y
+# CONFIG_LP_CONSOLE is not set
+# CONFIG_PPDEV is not set
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_HW_RANDOM is not set
+CONFIG_NVRAM=y
+CONFIG_RTC=y
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_SONYPI is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
+# CONFIG_IPWIRELESS is not set
+# CONFIG_MWAVE is not set
+# CONFIG_PC8736x_GPIO is not set
+# CONFIG_NSC_GPIO is not set
+# CONFIG_CS5535_GPIO is not set
+# CONFIG_RAW_DRIVER is not set
+CONFIG_HPET=y
+# CONFIG_HPET_RTC_IRQ is not set
+CONFIG_HPET_MMAP=y
+# CONFIG_HANGCHECK_TIMER is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
+CONFIG_DEVPORT=y
+CONFIG_I2C=m
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_CHARDEV=m
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=m
+CONFIG_I2C_ALGOPCF=m
+CONFIG_I2C_ALGOPCA=m
+
+#
+# I2C Hardware Bus support
+#
+# CONFIG_I2C_ALI1535 is not set
+# CONFIG_I2C_ALI1563 is not set
+# CONFIG_I2C_ALI15X3 is not set
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_I801 is not set
+# CONFIG_I2C_I810 is not set
+# CONFIG_I2C_PIIX4 is not set
+# CONFIG_I2C_NFORCE2 is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_PROSAVAGE is not set
+# CONFIG_I2C_SAVAGE4 is not set
+# CONFIG_I2C_SIMTEC is not set
+# CONFIG_SCx200_ACB is not set
+# CONFIG_I2C_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_TAOS_EVM is not set
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_TINY_USB is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+# CONFIG_I2C_VOODOO3 is not set
+# CONFIG_I2C_PCA_ISA is not set
+
+#
+# Miscellaneous I2C Chip support
+#
+# CONFIG_DS1682 is not set
+# CONFIG_SENSORS_EEPROM is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_PCF8575 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_TPS65010 is not set
+# CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_SENSORS_TSL2550 is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# CONFIG_I2C_DEBUG_CHIP is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+# CONFIG_W1 is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+# CONFIG_PDA_POWER is not set
+# CONFIG_BATTERY_DS2760 is not set
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ABITUGURU3 is not set
+# CONFIG_SENSORS_AD7418 is not set
+# CONFIG_SENSORS_ADM1021 is not set
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 is not set
+# CONFIG_SENSORS_ADM1029 is not set
+# CONFIG_SENSORS_ADM1031 is not set
+# CONFIG_SENSORS_ADM9240 is not set
+# CONFIG_SENSORS_ADT7470 is not set
+# CONFIG_SENSORS_ADT7473 is not set
+# CONFIG_SENSORS_K8TEMP is not set
+# CONFIG_SENSORS_ASB100 is not set
+# CONFIG_SENSORS_ATXP1 is not set
+# CONFIG_SENSORS_DS1621 is not set
+# CONFIG_SENSORS_I5K_AMB is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_F71882FG is not set
+# CONFIG_SENSORS_F75375S is not set
+# CONFIG_SENSORS_FSCHER is not set
+# CONFIG_SENSORS_FSCPOS is not set
+# CONFIG_SENSORS_FSCHMD is not set
+# CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
+CONFIG_SENSORS_CORETEMP=y
+# CONFIG_SENSORS_IT87 is not set
+# CONFIG_SENSORS_LM63 is not set
+# CONFIG_SENSORS_LM75 is not set
+# CONFIG_SENSORS_LM77 is not set
+# CONFIG_SENSORS_LM78 is not set
+# CONFIG_SENSORS_LM80 is not set
+# CONFIG_SENSORS_LM83 is not set
+# CONFIG_SENSORS_LM85 is not set
+# CONFIG_SENSORS_LM87 is not set
+# CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
+# CONFIG_SENSORS_LM93 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_MAX6650 is not set
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_SIS5595 is not set
+# CONFIG_SENSORS_DME1737 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_ADS7828 is not set
+# CONFIG_SENSORS_THMC50 is not set
+# CONFIG_SENSORS_VIA686A is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_VT8231 is not set
+# CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83791D is not set
+# CONFIG_SENSORS_W83792D is not set
+# CONFIG_SENSORS_W83793 is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83L786NG is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_SENSORS_W83627EHF is not set
+# CONFIG_SENSORS_HDAPS is not set
+# CONFIG_SENSORS_APPLESMC is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+CONFIG_THERMAL=y
+# CONFIG_WATCHDOG is not set
+
+#
+# Sonics Silicon Backplane
+#
+CONFIG_SSB_POSSIBLE=y
+# CONFIG_SSB is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+
+#
+# Multimedia devices
+#
+CONFIG_VIDEO_DEV=m
+CONFIG_VIDEO_V4L2_COMMON=m
+CONFIG_VIDEO_V4L1=y
+CONFIG_VIDEO_V4L1_COMPAT=y
+CONFIG_VIDEO_V4L2=y
+CONFIG_VIDEO_CAPTURE_DRIVERS=y
+# CONFIG_VIDEO_ADV_DEBUG is not set
+CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
+CONFIG_VIDEO_TVAUDIO=m
+CONFIG_VIDEO_TDA7432=m
+CONFIG_VIDEO_TDA9840=m
+CONFIG_VIDEO_TDA9875=m
+CONFIG_VIDEO_TEA6415C=m
+CONFIG_VIDEO_TEA6420=m
+CONFIG_VIDEO_MSP3400=m
+CONFIG_VIDEO_CS53L32A=m
+CONFIG_VIDEO_WM8775=m
+CONFIG_VIDEO_BT819=m
+CONFIG_VIDEO_BT856=m
+CONFIG_VIDEO_KS0127=m
+CONFIG_VIDEO_OV7670=m
+CONFIG_VIDEO_SAA7110=m
+CONFIG_VIDEO_SAA7111=m
+CONFIG_VIDEO_SAA7114=m
+CONFIG_VIDEO_SAA711X=m
+CONFIG_VIDEO_TVP5150=m
+CONFIG_VIDEO_VPX3220=m
+CONFIG_VIDEO_CX25840=m
+CONFIG_VIDEO_CX2341X=m
+CONFIG_VIDEO_SAA7185=m
+CONFIG_VIDEO_ADV7170=m
+CONFIG_VIDEO_ADV7175=m
+CONFIG_VIDEO_VIVI=m
+CONFIG_VIDEO_BT848=m
+# CONFIG_VIDEO_BT848_DVB is not set
+CONFIG_VIDEO_SAA6588=m
+CONFIG_VIDEO_PMS=m
+CONFIG_VIDEO_BWQCAM=m
+CONFIG_VIDEO_CQCAM=m
+CONFIG_VIDEO_CPIA=m
+CONFIG_VIDEO_CPIA_USB=m
+CONFIG_VIDEO_CPIA2=m
+CONFIG_VIDEO_SAA5246A=m
+CONFIG_VIDEO_SAA5249=m
+CONFIG_TUNER_3036=m
+CONFIG_VIDEO_STRADIS=m
+CONFIG_VIDEO_ZORAN_ZR36060=m
+CONFIG_VIDEO_ZORAN=m
+CONFIG_VIDEO_ZORAN_BUZ=m
+CONFIG_VIDEO_ZORAN_DC10=m
+CONFIG_VIDEO_ZORAN_DC30=m
+CONFIG_VIDEO_ZORAN_LML33=m
+CONFIG_VIDEO_ZORAN_LML33R10=m
+CONFIG_VIDEO_ZORAN_AVS6EYES=m
+CONFIG_VIDEO_SAA7134=m
+# CONFIG_VIDEO_SAA7134_ALSA is not set
+CONFIG_VIDEO_SAA7134_DVB=m
+CONFIG_VIDEO_MXB=m
+CONFIG_VIDEO_DPC=m
+CONFIG_VIDEO_HEXIUM_ORION=m
+CONFIG_VIDEO_HEXIUM_GEMINI=m
+CONFIG_VIDEO_CX88=m
+# CONFIG_VIDEO_CX88_ALSA is not set
+CONFIG_VIDEO_CX88_BLACKBIRD=m
+CONFIG_VIDEO_CX88_DVB=m
+CONFIG_VIDEO_CX88_VP3054=m
+# CONFIG_VIDEO_CX23885 is not set
+# CONFIG_VIDEO_IVTV is not set
+CONFIG_VIDEO_CAFE_CCIC=m
+CONFIG_V4L_USB_DRIVERS=y
+CONFIG_VIDEO_PVRUSB2=m
+CONFIG_VIDEO_PVRUSB2_ONAIR_CREATOR=y
+CONFIG_VIDEO_PVRUSB2_ONAIR_USB2=y
+CONFIG_VIDEO_PVRUSB2_SYSFS=y
+# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set
+CONFIG_VIDEO_EM28XX=m
+CONFIG_VIDEO_EM28XX_ALSA=m
+CONFIG_VIDEO_USBVISION=m
+CONFIG_VIDEO_USBVIDEO=m
+CONFIG_USB_VICAM=m
+CONFIG_USB_IBMCAM=m
+CONFIG_USB_KONICAWC=m
+CONFIG_USB_QUICKCAM_MESSENGER=m
+CONFIG_USB_ET61X251=m
+CONFIG_VIDEO_OVCAMCHIP=m
+CONFIG_USB_W9968CF=m
+CONFIG_USB_OV511=m
+CONFIG_USB_SE401=m
+CONFIG_USB_SN9C102=m
+CONFIG_USB_STV680=m
+CONFIG_USB_ZC0301=m
+CONFIG_USB_PWC=m
+# CONFIG_USB_PWC_DEBUG is not set
+CONFIG_USB_ZR364XX=m
+CONFIG_USB_STKWEBCAM=m
+# CONFIG_RADIO_ADAPTERS is not set
+CONFIG_DVB_CORE=m
+CONFIG_DVB_CORE_ATTACH=y
+CONFIG_DVB_CAPTURE_DRIVERS=y
+
+#
+# Supported SAA7146 based PCI Adapters
+#
+# CONFIG_TTPCI_EEPROM is not set
+# CONFIG_DVB_AV7110 is not set
+# CONFIG_DVB_BUDGET_CORE is not set
+
+#
+# Supported USB Adapters
+#
+CONFIG_DVB_USB=m
+# CONFIG_DVB_USB_DEBUG is not set
+CONFIG_DVB_USB_A800=m
+CONFIG_DVB_USB_DIBUSB_MB=m
+# CONFIG_DVB_USB_DIBUSB_MB_FAULTY is not set
+CONFIG_DVB_USB_DIBUSB_MC=m
+CONFIG_DVB_USB_DIB0700=m
+CONFIG_DVB_USB_UMT_010=m
+CONFIG_DVB_USB_CXUSB=m
+CONFIG_DVB_USB_M920X=m
+CONFIG_DVB_USB_GL861=m
+CONFIG_DVB_USB_AU6610=m
+CONFIG_DVB_USB_DIGITV=m
+CONFIG_DVB_USB_VP7045=m
+CONFIG_DVB_USB_VP702X=m
+CONFIG_DVB_USB_GP8PSK=m
+CONFIG_DVB_USB_NOVA_T_USB2=m
+CONFIG_DVB_USB_TTUSB2=m
+CONFIG_DVB_USB_DTT200U=m
+CONFIG_DVB_USB_OPERA1=m
+CONFIG_DVB_USB_AF9005=m
+CONFIG_DVB_USB_AF9005_REMOTE=m
+CONFIG_DVB_TTUSB_BUDGET=m
+CONFIG_DVB_TTUSB_DEC=m
+CONFIG_DVB_CINERGYT2=m
+# CONFIG_DVB_CINERGYT2_TUNING is not set
+
+#
+# Supported FlexCopII (B2C2) Adapters
+#
+CONFIG_DVB_B2C2_FLEXCOP=m
+CONFIG_DVB_B2C2_FLEXCOP_PCI=m
+CONFIG_DVB_B2C2_FLEXCOP_USB=m
+# CONFIG_DVB_B2C2_FLEXCOP_DEBUG is not set
+
+#
+# Supported BT878 Adapters
+#
+CONFIG_DVB_BT8XX=m
+
+#
+# Supported Pluto2 Adapters
+#
+CONFIG_DVB_PLUTO2=m
+
+#
+# Supported DVB Frontends
+#
+
+#
+# Customise DVB Frontends
+#
+# CONFIG_DVB_FE_CUSTOMISE is not set
+
+#
+# DVB-S (satellite) frontends
+#
+CONFIG_DVB_STV0299=m
+CONFIG_DVB_CX24110=m
+CONFIG_DVB_CX24123=m
+CONFIG_DVB_TDA8083=m
+CONFIG_DVB_MT312=m
+CONFIG_DVB_VES1X93=m
+CONFIG_DVB_S5H1420=m
+CONFIG_DVB_TDA10086=m
+
+#
+# DVB-T (terrestrial) frontends
+#
+CONFIG_DVB_SP8870=m
+CONFIG_DVB_SP887X=m
+CONFIG_DVB_CX22700=m
+CONFIG_DVB_CX22702=m
+CONFIG_DVB_L64781=m
+CONFIG_DVB_TDA1004X=m
+CONFIG_DVB_NXT6000=m
+CONFIG_DVB_MT352=m
+CONFIG_DVB_ZL10353=m
+CONFIG_DVB_DIB3000MB=m
+CONFIG_DVB_DIB3000MC=m
+CONFIG_DVB_DIB7000M=m
+CONFIG_DVB_DIB7000P=m
+
+#
+# DVB-C (cable) frontends
+#
+CONFIG_DVB_VES1820=m
+CONFIG_DVB_TDA10021=m
+CONFIG_DVB_TDA10023=m
+CONFIG_DVB_STV0297=m
+
+#
+# ATSC (North American/Korean Terrestrial/Cable DTV) frontends
+#
+CONFIG_DVB_NXT200X=m
+CONFIG_DVB_OR51211=m
+CONFIG_DVB_OR51132=m
+CONFIG_DVB_BCM3510=m
+CONFIG_DVB_LGDT330X=m
+# CONFIG_DVB_S5H1409 is not set
+
+#
+# Tuners/PLL support
+#
+CONFIG_DVB_PLL=m
+CONFIG_DVB_TDA826X=m
+CONFIG_DVB_TDA827X=m
+CONFIG_DVB_TDA18271=m
+CONFIG_DVB_TUNER_QT1010=m
+CONFIG_DVB_TUNER_MT2060=m
+CONFIG_DVB_TUNER_MT2266=m
+# CONFIG_DVB_TUNER_MT2131 is not set
+CONFIG_DVB_TUNER_DIB0070=m
+CONFIG_DVB_TUNER_XC5000=m
+
+#
+# Miscellaneous devices
+#
+CONFIG_DVB_LNBP21=m
+CONFIG_DVB_ISL6421=m
+CONFIG_DVB_TUA6100=m
+CONFIG_VIDEO_SAA7146=m
+CONFIG_VIDEO_SAA7146_VV=m
+CONFIG_VIDEO_TUNER=m
+# CONFIG_VIDEO_TUNER_CUSTOMIZE is not set
+CONFIG_TUNER_XC2028=m
+CONFIG_TUNER_MT20XX=m
+CONFIG_TUNER_TDA8290=m
+CONFIG_TUNER_TEA5761=m
+CONFIG_TUNER_TEA5767=m
+CONFIG_TUNER_SIMPLE=m
+CONFIG_TUNER_TDA9887=m
+CONFIG_VIDEOBUF_GEN=m
+CONFIG_VIDEOBUF_DMA_SG=m
+CONFIG_VIDEOBUF_VMALLOC=m
+CONFIG_VIDEOBUF_DVB=m
+CONFIG_VIDEO_BTCX=m
+CONFIG_VIDEO_IR_I2C=m
+CONFIG_VIDEO_IR=m
+CONFIG_VIDEO_TVEEPROM=m
+# CONFIG_DAB is not set
+
+#
+# Graphics support
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+# CONFIG_FB is not set
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=m
+# CONFIG_BACKLIGHT_CORGI is not set
+# CONFIG_BACKLIGHT_PROGEAR is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+# CONFIG_VGACON_SOFT_SCROLLBACK is not set
+# CONFIG_VIDEO_SELECT is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=y
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_RAWMIDI=m
+CONFIG_SND_SEQUENCER=m
+# CONFIG_SND_SEQ_DUMMY is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PCM_OSS_PLUGINS=y
+CONFIG_SND_SEQUENCER_OSS=y
+CONFIG_SND_RTCTIMER=m
+CONFIG_SND_SEQ_RTCTIMER_DEFAULT=y
+# CONFIG_SND_DYNAMIC_MINORS is not set
+CONFIG_SND_SUPPORT_OLD_API=y
+CONFIG_SND_VERBOSE_PROCFS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+CONFIG_SND_MPU401_UART=m
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_VIRMIDI is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_MTS64 is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+CONFIG_SND_MPU401=m
+# CONFIG_SND_PORTMAN2X4 is not set
+
+#
+# ISA devices
+#
+# CONFIG_SND_ADLIB is not set
+# CONFIG_SND_AD1816A is not set
+# CONFIG_SND_AD1848 is not set
+# CONFIG_SND_ALS100 is not set
+# CONFIG_SND_AZT2320 is not set
+# CONFIG_SND_CMI8330 is not set
+# CONFIG_SND_CS4231 is not set
+# CONFIG_SND_CS4232 is not set
+# CONFIG_SND_CS4236 is not set
+# CONFIG_SND_DT019X is not set
+# CONFIG_SND_ES968 is not set
+# CONFIG_SND_ES1688 is not set
+# CONFIG_SND_ES18XX is not set
+# CONFIG_SND_SC6000 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_OPL3SA2 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_SGALAXY is not set
+# CONFIG_SND_SSCAPE is not set
+# CONFIG_SND_WAVEFRONT is not set
+
+#
+# PCI devices
+#
+# CONFIG_SND_AD1889 is not set
+# CONFIG_SND_ALS300 is not set
+# CONFIG_SND_ALS4000 is not set
+# CONFIG_SND_ALI5451 is not set
+# CONFIG_SND_ATIIXP is not set
+# CONFIG_SND_ATIIXP_MODEM is not set
+# CONFIG_SND_AU8810 is not set
+# CONFIG_SND_AU8820 is not set
+# CONFIG_SND_AU8830 is not set
+# CONFIG_SND_AZT3328 is not set
+# CONFIG_SND_BT87X is not set
+# CONFIG_SND_CA0106 is not set
+# CONFIG_SND_CMIPCI is not set
+# CONFIG_SND_OXYGEN is not set
+# CONFIG_SND_CS4281 is not set
+# CONFIG_SND_CS46XX is not set
+# CONFIG_SND_CS5530 is not set
+# CONFIG_SND_CS5535AUDIO is not set
+# CONFIG_SND_DARLA20 is not set
+# CONFIG_SND_GINA20 is not set
+# CONFIG_SND_LAYLA20 is not set
+# CONFIG_SND_DARLA24 is not set
+# CONFIG_SND_GINA24 is not set
+# CONFIG_SND_LAYLA24 is not set
+# CONFIG_SND_MONA is not set
+# CONFIG_SND_MIA is not set
+# CONFIG_SND_ECHO3G is not set
+# CONFIG_SND_INDIGO is not set
+# CONFIG_SND_INDIGOIO is not set
+# CONFIG_SND_INDIGODJ is not set
+# CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_EMU10K1X is not set
+# CONFIG_SND_ENS1370 is not set
+# CONFIG_SND_ENS1371 is not set
+# CONFIG_SND_ES1938 is not set
+# CONFIG_SND_ES1968 is not set
+# CONFIG_SND_FM801 is not set
+CONFIG_SND_HDA_INTEL=m
+# CONFIG_SND_HDA_HWDEP is not set
+# CONFIG_SND_HDA_CODEC_REALTEK is not set
+CONFIG_SND_HDA_CODEC_ANALOG=y
+# CONFIG_SND_HDA_CODEC_SIGMATEL is not set
+# CONFIG_SND_HDA_CODEC_VIA is not set
+# CONFIG_SND_HDA_CODEC_ATIHDMI is not set
+# CONFIG_SND_HDA_CODEC_CONEXANT is not set
+# CONFIG_SND_HDA_CODEC_CMEDIA is not set
+# CONFIG_SND_HDA_CODEC_SI3054 is not set
+# CONFIG_SND_HDA_GENERIC is not set
+CONFIG_SND_HDA_POWER_SAVE=y
+CONFIG_SND_HDA_POWER_SAVE_DEFAULT=5
+# CONFIG_SND_HDSP is not set
+# CONFIG_SND_HDSPM is not set
+# CONFIG_SND_HIFIER is not set
+# CONFIG_SND_ICE1712 is not set
+# CONFIG_SND_ICE1724 is not set
+# CONFIG_SND_INTEL8X0 is not set
+# CONFIG_SND_INTEL8X0M is not set
+# CONFIG_SND_KORG1212 is not set
+# CONFIG_SND_MAESTRO3 is not set
+# CONFIG_SND_MIXART is not set
+# CONFIG_SND_NM256 is not set
+# CONFIG_SND_PCXHR is not set
+# CONFIG_SND_RIPTIDE is not set
+# CONFIG_SND_RME32 is not set
+# CONFIG_SND_RME96 is not set
+# CONFIG_SND_RME9652 is not set
+# CONFIG_SND_SIS7019 is not set
+# CONFIG_SND_SONICVIBES is not set
+# CONFIG_SND_TRIDENT is not set
+# CONFIG_SND_VIA82XX is not set
+# CONFIG_SND_VIA82XX_MODEM is not set
+# CONFIG_SND_VIRTUOSO is not set
+# CONFIG_SND_VX222 is not set
+# CONFIG_SND_YMFPCI is not set
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+# CONFIG_SND_USB_USX2Y is not set
+# CONFIG_SND_USB_CAIAQ is not set
+
+#
+# PCMCIA devices
+#
+# CONFIG_SND_VXPOCKET is not set
+# CONFIG_SND_PDAUDIOCF is not set
+
+#
+# System on Chip audio support
+#
+# CONFIG_SND_SOC is not set
+
+#
+# SoC Audio support for SuperH
+#
+
+#
+# ALSA SoC audio for Freescale SOCs
+#
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+CONFIG_HID_SUPPORT=y
+CONFIG_HID=y
+# CONFIG_HID_DEBUG is not set
+# CONFIG_HIDRAW is not set
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=y
+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
+# CONFIG_HID_FF is not set
+CONFIG_USB_HIDDEV=y
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+CONFIG_USB=y
+# CONFIG_USB_DEBUG is not set
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+CONFIG_USB_DEVICE_CLASS=y
+# CONFIG_USB_DYNAMIC_MINORS is not set
+CONFIG_USB_SUSPEND=y
+# CONFIG_USB_PERSIST is not set
+# CONFIG_USB_OTG is not set
+
+#
+# USB Host Controller Drivers
+#
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_EHCI_TT_NEWSCHED=y
+# CONFIG_USB_ISP116X_HCD is not set
+# CONFIG_USB_OHCI_HCD is not set
+CONFIG_USB_UHCI_HCD=m
+# CONFIG_USB_SL811_HCD is not set
+# CONFIG_USB_R8A66597_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_ACM is not set
+CONFIG_USB_PRINTER=y
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
+#
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_LIBUSUAL is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+# CONFIG_USB_MON is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_AUERSWALD is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_BERRY_CHARGE is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGET is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_SISUSBVGA is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_IOWARRIOR is not set
+# CONFIG_USB_TEST is not set
+# CONFIG_USB_GADGET is not set
+# CONFIG_MMC is not set
+# CONFIG_MEMSTICK is not set
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=m
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_CLEVO_MAIL is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=m
+CONFIG_LEDS_TRIGGER_HEARTBEAT=m
+# CONFIG_INFINIBAND is not set
+# CONFIG_EDAC is not set
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+
+#
+# Conflicting RTC option has been selected, check GEN_RTC and RTC
+#
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
+# CONFIG_RTC_DRV_DS1307 is not set
+# CONFIG_RTC_DRV_DS1374 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_MAX6900 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_X1205 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_M41T80 is not set
+# CONFIG_RTC_DRV_S35390A is not set
+
+#
+# SPI RTC drivers
+#
+
+#
+# Platform RTC drivers
+#
+CONFIG_RTC_DRV_CMOS=y
+# CONFIG_RTC_DRV_DS1511 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+CONFIG_DMADEVICES=y
+
+#
+# DMA Devices
+#
+# CONFIG_INTEL_IOATDMA is not set
+CONFIG_AUXDISPLAY=y
+# CONFIG_KS0108 is not set
+
+#
+# Userspace I/O
+#
+# CONFIG_UIO is not set
+
+#
+# Firmware Drivers
+#
+# CONFIG_EDD is not set
+# CONFIG_DELL_RBU is not set
+# CONFIG_DCDBAS is not set
+CONFIG_DMIID=y
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT2_FS_SECURITY=y
+CONFIG_EXT2_FS_XIP=y
+CONFIG_FS_XIP=y
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+# CONFIG_EXT4DEV_FS is not set
+CONFIG_JBD=y
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+CONFIG_FS_POSIX_ACL=y
+CONFIG_XFS_FS=m
+CONFIG_XFS_QUOTA=y
+CONFIG_XFS_SECURITY=y
+CONFIG_XFS_POSIX_ACL=y
+CONFIG_XFS_RT=y
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_QUOTACTL=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=y
+CONFIG_FUSE_FS=y
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_UDF_FS=y
+CONFIG_UDF_NLS=y
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=850
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-15"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+# CONFIG_CONFIGFS_FS is not set
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V3_ACL=y
+CONFIG_NFS_V4=y
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=y
+CONFIG_NFSD_V2_ACL=y
+CONFIG_NFSD_V3=y
+CONFIG_NFSD_V3_ACL=y
+CONFIG_NFSD_V4=y
+CONFIG_NFSD_TCP=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=y
+CONFIG_NFS_ACL_SUPPORT=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+# CONFIG_SUNRPC_BIND34 is not set
+CONFIG_RPCSEC_GSS_KRB5=y
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=y
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=y
+CONFIG_CIFS_STATS=y
+# CONFIG_CIFS_STATS2 is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+CONFIG_CIFS_XATTR=y
+CONFIG_CIFS_POSIX=y
+# CONFIG_CIFS_DEBUG2 is not set
+CONFIG_CIFS_EXPERIMENTAL=y
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf-8"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+CONFIG_NLS_CODEPAGE_850=y
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=y
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+CONFIG_NLS_ISO8859_15=y
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=y
+# CONFIG_DLM is not set
+
+#
+# Kernel hacking
+#
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_UNUSED_SYMBOLS=y
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+# CONFIG_DETECT_SOFTLOCKUP is not set
+# CONFIG_SCHED_DEBUG is not set
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_HIGHMEM is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_FRAME_POINTER is not set
+# CONFIG_BOOT_PRINTK_DELAY is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
+# CONFIG_SAMPLES is not set
+CONFIG_EARLY_PRINTK=y
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_PAGEALLOC is not set
+# CONFIG_DEBUG_RODATA is not set
+# CONFIG_DEBUG_NX_TEST is not set
+# CONFIG_4KSTACKS is not set
+CONFIG_X86_FIND_SMP_CONFIG=y
+CONFIG_X86_MPPARSE=y
+CONFIG_DOUBLEFAULT=y
+CONFIG_IO_DELAY_TYPE_0X80=0
+CONFIG_IO_DELAY_TYPE_0XED=1
+CONFIG_IO_DELAY_TYPE_UDELAY=2
+CONFIG_IO_DELAY_TYPE_NONE=3
+CONFIG_IO_DELAY_0X80=y
+# CONFIG_IO_DELAY_0XED is not set
+# CONFIG_IO_DELAY_UDELAY is not set
+# CONFIG_IO_DELAY_NONE is not set
+CONFIG_DEFAULT_IO_DELAY_TYPE=0
+# CONFIG_CPA_DEBUG is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+# CONFIG_CRYPTO_SEQIV is not set
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_MANAGER=y
+# CONFIG_CRYPTO_HMAC is not set
+CONFIG_CRYPTO_XCBC=y
+# CONFIG_CRYPTO_NULL is not set
+CONFIG_CRYPTO_MD4=y
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_SHA1=y
+CONFIG_CRYPTO_SHA256=y
+CONFIG_CRYPTO_SHA512=y
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+CONFIG_CRYPTO_GF128MUL=m
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_PCBC=y
+CONFIG_CRYPTO_LRW=m
+# CONFIG_CRYPTO_XTS is not set
+# CONFIG_CRYPTO_CTR is not set
+# CONFIG_CRYPTO_GCM is not set
+# CONFIG_CRYPTO_CCM is not set
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_FCRYPT=y
+CONFIG_CRYPTO_BLOWFISH=y
+CONFIG_CRYPTO_TWOFISH=y
+CONFIG_CRYPTO_TWOFISH_COMMON=y
+# CONFIG_CRYPTO_TWOFISH_586 is not set
+CONFIG_CRYPTO_SERPENT=y
+CONFIG_CRYPTO_AES=y
+CONFIG_CRYPTO_AES_586=y
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=y
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_SEED is not set
+# CONFIG_CRYPTO_SALSA20 is not set
+# CONFIG_CRYPTO_SALSA20_586 is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+CONFIG_CRYPTO_LZF=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
+CONFIG_CRYPTO_CRC32C=y
+CONFIG_CRYPTO_CAMELLIA=y
+# CONFIG_CRYPTO_TEST is not set
+# CONFIG_CRYPTO_AUTHENC is not set
+CONFIG_CRYPTO_LZO=y
+# CONFIG_CRYPTO_HW is not set
+CONFIG_HAVE_KVM=y
+# CONFIG_VIRTUALIZATION is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=m
+# CONFIG_CRC16 is not set
+CONFIG_CRC_ITU_T=y
+CONFIG_CRC32=y
+CONFIG_CRC7=y
+CONFIG_LIBCRC32C=y
+CONFIG_AUDIT_GENERIC=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_TEXTSEARCH=y
+CONFIG_TEXTSEARCH_KMP=y
+CONFIG_TEXTSEARCH_BM=y
+CONFIG_TEXTSEARCH_FSM=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
diff --git a/sys-kernel/thinkpad-sources/thinkpad-sources-2.6.24-r3.ebuild b/sys-kernel/thinkpad-sources/thinkpad-sources-2.6.25.ebuild
index 958c774..c55aa5c 100644
--- a/sys-kernel/thinkpad-sources/thinkpad-sources-2.6.24-r3.ebuild
+++ b/sys-kernel/thinkpad-sources/thinkpad-sources-2.6.25.ebuild
@@ -1,10 +1,10 @@
# Copyright 1999-2008 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
-# $Header: sys-kernel/thinkpad-sources/thinkpad-sources-2.6.24-r3.ebuild 2008 02 24
+# $Header: sys-kernel/thinkpad-sources/thinkpad-sources-2.6.25.ebuild 2008 05 14
ETYPE="sources"
K_WANT_GENPATCHES="base extras"
-K_GENPATCHES_VER="3"
+K_GENPATCHES_VER="4"
inherit kernel-2
detect_version
@@ -13,10 +13,10 @@ detect_arch
DESCRIPTION="Software Suspend 2 + Gentoo patchset sources + SCO Flowcontrol + Latest THINKPAD-Acpi + IWLWIFI-LEDs + PCI-E ASPM + Colored Printk"
HOMEPAGE="http://dev.gentoo.org/~dsd/genpatches http://www.tuxonice.net http://bluetooth-alsa.sourceforge.net/ http://ibm-acpi.sourceforge.net/"
-#IUSE="sco_flowcontrol"
+IUSE="sco_flowcontrol"
-TUXONICE_VERSION="3.0-rc5"
-TUXONICE_TARGET="2.6.24"
+TUXONICE_VERSION="3.0-rc7"
+TUXONICE_TARGET="2.6.25"
TUXONICE_SRC="tuxonice-${TUXONICE_VERSION}-for-${TUXONICE_TARGET}"
TUXONICE_URI="http://www.tuxonice.net/downloads/all/${TUXONICE_SRC}.patch.bz2"
@@ -24,8 +24,8 @@ TUXONICE_URI="http://www.tuxonice.net/downloads/all/${TUXONICE_SRC}.patch.bz2"
#SCO_FLOWCONTROL_SRC="sco-flowcontrol-v${SCO_FLOWCONTROL_VERSION}"
#SCO_FLOWCONTROL_URI="http://bluetooth-alsa.cvs.sourceforge.net/*checkout*/bluetooth-alsa/plugz/patches/${SCO_FLOWCONTROL_SRC}.diff"
-THINKPAD_ACPI_VERSION="0.19-20080213"
-THINKPAD_ACPI_TARGET="2.6.24.2"
+THINKPAD_ACPI_VERSION="0.20-20080430"
+THINKPAD_ACPI_TARGET="2.6.25.1"
THINKPAD_ACPI_SRC="thinkpad-acpi-${THINKPAD_ACPI_VERSION}_v${THINKPAD_ACPI_TARGET}.patch.gz"
THINKPAD_ACPI_URI="mirror://sourceforge/ibm-acpi/${THINKPAD_ACPI_SRC}"
@@ -36,14 +36,19 @@ UNIPATCH_LIST=""
# UNIPATCH_LIST="${UNIPATCH_LIST} ${DISTDIR}/${SCO_FLOWCONTROL_SRC}.diff"
#fi
UNIPATCH_LIST="${UNIPATCH_LIST}
- ${FILESDIR}/2.6.24-r1/colored-printk-output-2.6.24.patch
- ${FILESDIR}/2.6.24-r3/disk-protect-fix-for-2.6.24.patch
- ${FILESDIR}/2.6.24/disk-protect-for-2.6.24.patch
+ ${FILESDIR}/2.6.25/vt-fix.patch
+ ${FILESDIR}/2.6.25/colored-printk-2.6.25.part1.patch
+ ${FILESDIR}/2.6.25/colored-printk-2.6.25.part2.patch
+ ${FILESDIR}/2.6.25/colored-printk-2.6.25.part3.patch
+ ${FILESDIR}/2.6.25/02-disk-protect-for-2.6.25.patch
${DISTDIR}/${THINKPAD_ACPI_SRC}
- ${FILESDIR}/2.6.24-r1/iwlwifi-leds-v2-2.6.24-rc4.diff
- ${FILESDIR}/2.6.24/linux-phc-0.3.1-for-2.6.24-rc1.patch
+ ${FILESDIR}/2.6.25/03-ipw2200-inject-for-2.6.25.patch
+ ${FILESDIR}/2.6.25/04-linux-phc-0.3.1-for-2.6.25.patch
${DISTDIR}/${TUXONICE_SRC}.patch.bz2
- ${FILESDIR}/2.6.24-r1/pci-e_aspm_v3.patch"
+ ${FILESDIR}/2.6.25/kernel-2.6.25-export-init_mm.patch
+ ${FILESDIR}/2.6.25/kernel-2.6.25-rcu-license.patch
+ ${FILESDIR}/2.6.25/pci-e_aspm_v3.5.patch"
+# ${FILESDIR}/2.6.24-r1/iwlwifi-leds-v2-2.6.24-rc4.diff
UNIPATCH_STRICTORDER="yes"
@@ -54,7 +59,7 @@ KEYWORDS="~amd64 ~x86"
RDEPEND="${RDEPEND}
>=sys-apps/tuxonice-userui-0.7.2
- >=sys-power/hibernate-script-1.97-r5"
+ >=sys-power/hibernate-script-1.98.1"
pkg_postinst() {
kernel-2_pkg_postinst