diff options
9 files changed, 4136 insertions, 0 deletions
diff --git a/sys-kernel/thinkpad-sources/ChangeLog b/sys-kernel/thinkpad-sources/ChangeLog new file mode 100644 index 000000000..3b461f64a --- /dev/null +++ b/sys-kernel/thinkpad-sources/ChangeLog @@ -0,0 +1,11 @@ + + + 08 Nov 2007; Florian Manschwetus (EisNerd) <florianmanschwetus@gmx.de> + +files/2.6.23, +files/2.6.23/linux-phc-0.3.1-for-2.6.23.patch, + +thinkpad-sources-2.6.23-r1.ebuild, + +files/2.6.23/combined-2.6.23-cph.patch, + +files/2.6.23/disk-protect-for-2.6.23.patch, + +files/2.6.23/input-unknown_keycodes-for-2.6.23.patch, +files/config, + +metadata.xml: + New Ebuild for bug 136231 just test it on other centrinos + diff --git a/sys-kernel/thinkpad-sources/Manifest b/sys-kernel/thinkpad-sources/Manifest new file mode 100644 index 000000000..afcb1157d --- /dev/null +++ b/sys-kernel/thinkpad-sources/Manifest @@ -0,0 +1,15 @@ +AUX 2.6.23/combined-2.6.23-cph.patch 19257 RMD160 18be73760b068e279319a73149a2321b01c9a1e6 SHA1 3b76e942e517799d88a1586d0334dbebdc09fccd SHA256 e89db0e631aae0890efa578b45120bacaf404ba235a6b1c268ba32472f6fa1e6 +AUX 2.6.23/disk-protect-for-2.6.23.patch 26537 RMD160 e9d1df866316d10ee7bc2d6967b9858173302de9 SHA1 8ff2eac2cfb635ac14ad742218e0b44224c2a42a SHA256 201d4bc70ebe1cd3d083f4c0d4702df7cc3c2c8f5d02335e2d5e5ba5d6a0af70 +AUX 2.6.23/input-unknown_keycodes-for-2.6.23.patch 367 RMD160 16564310a1007b173da528d71e358b5a73abf962 SHA1 2b1cc17a7b2b3bb87c53fdf5930bdc8ad2030302 SHA256 ab965750c853f193c248abe53bd73327a5aec608e092fbfa89c3aa06a2751122 +AUX 2.6.23/linux-phc-0.3.1-for-2.6.23.patch 15430 RMD160 7cc1ecb9168e255ffc366c2ea2dcbce081ec05c3 SHA1 b1bcedc872636588e3e078196d70dd8f41ade405 SHA256 862bb7eecfd02f71ab0a2b3f093f17a071b59d1c82184dbbeccfc744df543c70 +AUX config 47142 RMD160 78adf8841a9b88e7532da689eb512189df69241f SHA1 40e9afdbec772f86f6a731e44438641e2f7e283d SHA256 755fbbcf216b51754c18a53a04f052594a916326f5b3dec2017c613be060e6c9 +DIST genpatches-2.6.23-2.base.tar.bz2 6134 RMD160 b4d459e06a1a482fb4cfe51e8b693f9c95a6254b SHA1 b851ef449ec34d4331aba47774fe915cc2408e13 SHA256 fa6c34455470c4d57df1d51829a444343f7cbfca44d726843382baeec5ccbaec +DIST genpatches-2.6.23-2.extras.tar.bz2 148061 RMD160 ea133cf3c10e061e3c979a8d12c31e320aa48873 SHA1 4c2318276573133374fb66bbd8f358af1ec1c32c SHA256 9fb3221a449cd8c078b327830111e1fb3af1f289e362c98718289d943834d0a9 +DIST linux-2.6.23.tar.bz2 45488158 RMD160 755690e80751d5de86d260fe05c6eeadde116c4e SHA1 3a186adf13e44415796ab6381aa8979b16a5d5ca SHA256 d4e67c0935ffb2a4158234bff92cc791b83177866009fc9b2214104e0038dbdb +DIST patch-2.6.23-hrt3.patch.bz2 43556 RMD160 3234c8eeb3435e3db1690a2913a6c4daab867292 SHA1 d62cc99e3892af99a4f6b8f975e44846b69a5b51 SHA256 ac64d9423a14d78f9929c885fd499f2308fb2d14e96a37d3da16c35bcee40a59 +DIST sco-flowcontrol-v4.3.diff 14993 RMD160 aa6f41adbe8e6093b251731f107acd5ec6612bde SHA1 166135888810f7327c09ac5af20669ac7773467f SHA256 cacd624768bfd60c75843de625f16342f74e25dfe4a0794d79e1a6e14645c5d4 +DIST thinkpad-acpi-0.18-20071013_v2.6.23.1.patch.gz 16176 RMD160 67b55a21934c8d0b7305024a6a1996dec8da7000 SHA1 892aeacc3ca11830e2c5322d6d3b3d33e914b246 SHA256 b7cd7f1e12a6666d2c591c7fd9f7e81de4a93bdd3e4e6be04f56f05685e0d205 +DIST tuxonice-3.0-rc2-for-2.6.23.1.patch.bz2 104787 RMD160 c6483adbcfa54582f077781884a4d0a0ccf9b858 SHA1 7b2eba961f29d4cba129648a89789cfb11485221 SHA256 ef86267b6f3d7e309221f5173a881afae1dfa57418be5b3963f2380b0633ca1a +EBUILD thinkpad-sources-2.6.23-r1.ebuild 2961 RMD160 60d0478f3415c14f2a10025b918ac63025667268 SHA1 2bce3ac6dd592665503ebbce80a140dba13f219f SHA256 81b413e6d8452f16290bbac9e565fe2ac1ba5088a961b76d5a90852f002396c2 +MISC ChangeLog 418 RMD160 2dab9332e4cca4d7f99343fcda153ac332264432 SHA1 28a887dd69e9b3576a404cd5d35b6b2394d010d6 SHA256 3686e1adf94f577f4789a5aa32476497ba1723364a73495a2109df3fc66e506a +MISC metadata.xml 284 RMD160 5062b08f804b7eaf9e1765c0d38b7fc95bc467e4 SHA1 687ba9103e597aad8a7231ff9a470d841f7121df SHA256 6ca83c8927bd3516baac49bc9ea82ddbeeddbe38a5a98b637d6eb1f1d436c84a diff --git a/sys-kernel/thinkpad-sources/files/2.6.23/combined-2.6.23-cph.patch b/sys-kernel/thinkpad-sources/files/2.6.23/combined-2.6.23-cph.patch new file mode 100644 index 000000000..28af1a623 --- /dev/null +++ b/sys-kernel/thinkpad-sources/files/2.6.23/combined-2.6.23-cph.patch @@ -0,0 +1,620 @@ +diff -ruNp linux-2.6.23.orig/Documentation/scsi/link_power_management_policy.txt linux-2.6.23/Documentation/scsi/link_power_management_policy.txt +--- linux-2.6.23.orig/Documentation/scsi/link_power_management_policy.txt 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.23/Documentation/scsi/link_power_management_policy.txt 2007-10-15 21:34:38.000000000 -0400 +@@ -0,0 +1,19 @@ ++This parameter allows the user to set the link (interface) power management. ++There are 3 possible options: ++ ++Value Effect ++---------------------------------------------------------------------------- ++min_power Tell the controller to try to make the link use the ++ least possible power when possible. This may ++ sacrifice some performance due to increased latency ++ when coming out of lower power states. ++ ++max_performance Generally, this means no power management. Tell ++ the controller to have performance be a priority ++ over power management. ++ ++medium_power Tell the controller to enter a lower power state ++ when possible, but do not enter the lowest power ++ state, thus improving latency over min_power setting. ++ ++ +diff -ruNp linux-2.6.23.orig/drivers/ata/ahci.c linux-2.6.23/drivers/ata/ahci.c +--- linux-2.6.23.orig/drivers/ata/ahci.c 2007-10-09 16:31:38.000000000 -0400 ++++ linux-2.6.23/drivers/ata/ahci.c 2007-10-15 21:35:48.000000000 -0400 +@@ -48,6 +48,9 @@ + #define DRV_NAME "ahci" + #define DRV_VERSION "2.3" + ++static int ahci_enable_alpm(struct ata_port *ap, ++ enum link_pm policy); ++static int ahci_disable_alpm(struct ata_port *ap); + + enum { + AHCI_PCI_BAR = 5, +@@ -98,6 +101,7 @@ enum { + /* HOST_CAP bits */ + HOST_CAP_SSC = (1 << 14), /* Slumber capable */ + HOST_CAP_CLO = (1 << 24), /* Command List Override support */ ++ HOST_CAP_ALPM = (1 << 26), /* Aggressive Link PM support */ + HOST_CAP_SSS = (1 << 27), /* Staggered Spin-up */ + HOST_CAP_SNTF = (1 << 29), /* SNotification register */ + HOST_CAP_NCQ = (1 << 30), /* Native Command Queueing */ +@@ -153,6 +157,8 @@ enum { + PORT_IRQ_PIOS_FIS | PORT_IRQ_D2H_REG_FIS, + + /* PORT_CMD bits */ ++ PORT_CMD_ASP = (1 << 27), /* Aggressive Slumber/Partial */ ++ PORT_CMD_ALPE = (1 << 26), /* Aggressive Link PM enable */ + PORT_CMD_ATAPI = (1 << 24), /* Device is ATAPI */ + PORT_CMD_LIST_ON = (1 << 15), /* cmd list DMA engine running */ + PORT_CMD_FIS_ON = (1 << 14), /* FIS DMA engine running */ +@@ -175,6 +181,7 @@ enum { + AHCI_FLAG_32BIT_ONLY = (1 << 28), /* force 32bit */ + AHCI_FLAG_MV_PATA = (1 << 29), /* PATA port */ + AHCI_FLAG_NO_MSI = (1 << 30), /* no PCI MSI */ ++ AHCI_FLAG_NO_HOTPLUG = (1 << 31), /* ignore PxSERR.DIAG.N */ + + AHCI_FLAG_COMMON = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | + ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | +@@ -215,6 +222,7 @@ struct ahci_port_priv { + unsigned int ncq_saw_d2h:1; + unsigned int ncq_saw_dmas:1; + unsigned int ncq_saw_sdb:1; ++ u32 intr_mask; /* interrupts to enable */ + }; + + static int ahci_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val); +@@ -242,6 +250,11 @@ static int ahci_pci_device_suspend(struc + static int ahci_pci_device_resume(struct pci_dev *pdev); + #endif + ++static struct class_device_attribute *ahci_shost_attrs[] = { ++ &class_device_attr_link_power_management_policy, ++ NULL ++}; ++ + static struct scsi_host_template ahci_sht = { + .module = THIS_MODULE, + .name = DRV_NAME, +@@ -259,6 +272,7 @@ static struct scsi_host_template ahci_sh + .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, + .bios_param = ata_std_bios_param, ++ .shost_attrs = ahci_shost_attrs, + }; + + static const struct ata_port_operations ahci_ops = { +@@ -290,6 +304,8 @@ static const struct ata_port_operations + .port_suspend = ahci_port_suspend, + .port_resume = ahci_port_resume, + #endif ++ .enable_pm = ahci_enable_alpm, ++ .disable_pm = ahci_disable_alpm, + + .port_start = ahci_port_start, + .port_stop = ahci_port_stop, +@@ -778,6 +794,156 @@ static void ahci_power_up(struct ata_por + writel(cmd | PORT_CMD_ICC_ACTIVE, port_mmio + PORT_CMD); + } + ++static int ahci_disable_alpm(struct ata_port *ap) ++{ ++ void __iomem *port_mmio = ahci_port_base(ap); ++ u32 cmd, scontrol; ++ struct ahci_port_priv *pp = ap->private_data; ++ ++ /* ++ * disable Interface Power Management State Transitions ++ * This is accomplished by setting bits 8:11 of the ++ * SATA Control register ++ */ ++ scontrol = readl(port_mmio + PORT_SCR_CTL); ++ scontrol |= (0x3 << 8); ++ writel(scontrol, port_mmio + PORT_SCR_CTL); ++ ++ /* get the existing command bits */ ++ cmd = readl(port_mmio + PORT_CMD); ++ ++ /* disable ALPM and ASP */ ++ cmd &= ~PORT_CMD_ASP; ++ cmd &= ~PORT_CMD_ALPE; ++ ++ /* force the interface back to active */ ++ cmd |= PORT_CMD_ICC_ACTIVE; ++ ++ /* write out new cmd value */ ++ writel(cmd, port_mmio + PORT_CMD); ++ cmd = readl(port_mmio + PORT_CMD); ++ ++ /* wait 10ms to be sure we've come out of any low power state */ ++ msleep(10); ++ ++ /* clear out any PhyRdy stuff from interrupt status */ ++ writel(PORT_IRQ_PHYRDY, port_mmio + PORT_IRQ_STAT); ++ ++ /* go ahead and clean out PhyRdy Change from Serror too */ ++ ahci_scr_write(ap, SCR_ERROR, ((1 << 16) | (1 << 18))); ++ ++ /* ++ * Clear flag to indicate that we should ignore all PhyRdy ++ * state changes ++ */ ++ ap->flags &= ~AHCI_FLAG_NO_HOTPLUG; ++ ++ /* ++ * Enable interrupts on Phy Ready. ++ */ ++ pp->intr_mask |= PORT_IRQ_PHYRDY; ++ writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); ++ ++ /* ++ * don't change the link pm policy - we can be called ++ * just to turn of link pm temporarily ++ */ ++ return 0; ++} ++ ++static int ahci_enable_alpm(struct ata_port *ap, ++ enum link_pm policy) ++{ ++ struct ahci_host_priv *hpriv = ap->host->private_data; ++ void __iomem *port_mmio = ahci_port_base(ap); ++ u32 cmd, scontrol, sstatus; ++ struct ahci_port_priv *pp = ap->private_data; ++ u32 asp; ++ ++ /* Make sure the host is capable of link power management */ ++ if (!(hpriv->cap & HOST_CAP_ALPM)) { ++ ap->pm_policy = NOT_AVAILABLE; ++ return -EINVAL; ++ } ++ ++ /* make sure we have a device attached */ ++ sstatus = readl(port_mmio + PORT_SCR_STAT); ++ if (!(sstatus & 0xf00)) { ++ ap->pm_policy = NOT_AVAILABLE; ++ return -EINVAL; ++ } ++ ++ switch (policy) { ++ case MAX_PERFORMANCE: ++ case NOT_AVAILABLE: ++ /* ++ * if we came here with NOT_AVAILABLE, ++ * it just means this is the first time we ++ * have tried to enable - default to max performance, ++ * and let the user go to lower power modes on request. ++ */ ++ ahci_disable_alpm(ap); ++ ap->pm_policy = MAX_PERFORMANCE; ++ return 0; ++ case MIN_POWER: ++ /* configure HBA to enter SLUMBER */ ++ asp = PORT_CMD_ASP; ++ break; ++ case MEDIUM_POWER: ++ /* configure HBA to enter PARTIAL */ ++ asp = 0; ++ break; ++ default: ++ return -EINVAL; ++ } ++ ap->pm_policy = policy; ++ ++ /* ++ * Disable interrupts on Phy Ready. This keeps us from ++ * getting woken up due to spurious phy ready interrupts ++ * TBD - Hot plug should be done via polling now, is ++ * that even supported? ++ */ ++ pp->intr_mask &= ~PORT_IRQ_PHYRDY; ++ writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); ++ ++ /* ++ * Set a flag to indicate that we should ignore all PhyRdy ++ * state changes since these can happen now whenever we ++ * change link state ++ */ ++ ap->flags |= AHCI_FLAG_NO_HOTPLUG; ++ ++ /* get the existing command bits */ ++ cmd = readl(port_mmio + PORT_CMD); ++ ++ /* ++ * enable Interface Power Management State Transitions ++ * This is accomplished by clearing bits 8:11 of the ++ * SATA Control register ++ */ ++ scontrol = readl(port_mmio + PORT_SCR_CTL); ++ scontrol &= ~(0x3 << 8); ++ writel(scontrol, port_mmio + PORT_SCR_CTL); ++ ++ /* ++ * Set ASP based on Policy ++ */ ++ cmd |= asp; ++ ++ /* ++ * Setting this bit will instruct the HBA to aggressively ++ * enter a lower power link state when it's appropriate and ++ * based on the value set above for ASP ++ */ ++ cmd |= PORT_CMD_ALPE; ++ ++ /* write out new cmd value */ ++ writel(cmd, port_mmio + PORT_CMD); ++ cmd = readl(port_mmio + PORT_CMD); ++ return 0; ++} ++ + #ifdef CONFIG_PM + static void ahci_power_down(struct ata_port *ap) + { +@@ -1355,6 +1521,17 @@ static void ahci_port_intr(struct ata_po + status = readl(port_mmio + PORT_IRQ_STAT); + writel(status, port_mmio + PORT_IRQ_STAT); + ++ /* If we are getting PhyRdy, this is ++ * just a power state change, we should ++ * clear out this, plus the PhyRdy/Comm ++ * Wake bits from Serror ++ */ ++ if ((ap->flags & AHCI_FLAG_NO_HOTPLUG) && ++ (status & PORT_IRQ_PHYRDY)) { ++ status &= ~PORT_IRQ_PHYRDY; ++ ahci_scr_write(ap, SCR_ERROR, ((1 << 16) | (1 << 18))); ++ } ++ + if (unlikely(status & PORT_IRQ_ERROR)) { + ahci_error_intr(ap, status); + return; +@@ -1520,6 +1697,7 @@ static void ahci_thaw(struct ata_port *a + void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR]; + void __iomem *port_mmio = ahci_port_base(ap); + u32 tmp; ++ struct ahci_port_priv *pp = ap->private_data; + + /* clear IRQ */ + tmp = readl(port_mmio + PORT_IRQ_STAT); +@@ -1527,7 +1705,7 @@ static void ahci_thaw(struct ata_port *a + writel(1 << ap->port_no, mmio + HOST_IRQ_STAT); + + /* turn IRQ back on */ +- writel(DEF_PORT_IRQ, port_mmio + PORT_IRQ_MASK); ++ writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); + } + + static void ahci_error_handler(struct ata_port *ap) +@@ -1681,6 +1859,12 @@ static int ahci_port_start(struct ata_po + pp->cmd_tbl = mem; + pp->cmd_tbl_dma = mem_dma; + ++ /* ++ * Save off initial list of interrupts to be enabled. ++ * This could be changed later ++ */ ++ pp->intr_mask = DEF_PORT_IRQ; ++ + ap->private_data = pp; + + /* engage engines, captain */ +@@ -1854,6 +2038,9 @@ static int ahci_init_one(struct pci_dev + struct ata_port *ap = host->ports[i]; + void __iomem *port_mmio = ahci_port_base(ap); + ++ /* set initial link pm policy */ ++ ap->pm_policy = NOT_AVAILABLE; ++ + /* standard SATA port setup */ + if (hpriv->port_map & (1 << i)) + ap->ioaddr.cmd_addr = port_mmio; +diff -ruNp linux-2.6.23.orig/drivers/ata/libata-core.c linux-2.6.23/drivers/ata/libata-core.c +--- linux-2.6.23.orig/drivers/ata/libata-core.c 2007-10-09 16:31:38.000000000 -0400 ++++ linux-2.6.23/drivers/ata/libata-core.c 2007-10-15 21:34:39.000000000 -0400 +@@ -1994,6 +1994,9 @@ int ata_dev_configure(struct ata_device + if (dev->flags & ATA_DFLAG_LBA48) + dev->max_sectors = ATA_MAX_SECTORS_LBA48; + ++ if (ata_id_has_hipm(dev->id) || ata_id_has_dipm(dev->id)) ++ dev->flags |= ATA_DFLAG_IPM; ++ + if (dev->horkage & ATA_HORKAGE_DIAGNOSTIC) { + /* Let the user know. We don't want to disallow opens for + rescue purposes, or in case the vendor is just a blithering +@@ -2019,6 +2022,13 @@ int ata_dev_configure(struct ata_device + dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_128, + dev->max_sectors); + ++ if (ata_dev_blacklisted(dev) & ATA_HORKAGE_IPM) { ++ dev->horkage |= ATA_HORKAGE_IPM; ++ ++ /* reset link pm_policy for this port to no pm */ ++ ap->pm_policy = MAX_PERFORMANCE; ++ } ++ + if (ap->ops->dev_config) + ap->ops->dev_config(dev); + +@@ -5892,6 +5902,27 @@ int ata_flush_cache(struct ata_device *d + return 0; + } + ++static void ata_host_disable_link_pm(struct ata_host *host) ++{ ++ int i; ++ ++ for (i = 0; i < host->n_ports; i++) { ++ struct ata_port *ap = host->ports[i]; ++ if (ap->ops->disable_pm) ++ ap->ops->disable_pm(ap); ++ } ++} ++ ++static void ata_host_enable_link_pm(struct ata_host *host) ++{ ++ int i; ++ ++ for (i = 0; i < host->n_ports; i++) { ++ struct ata_port *ap = host->ports[i]; ++ ata_scsi_set_link_pm_policy(ap, ap->pm_policy); ++ } ++} ++ + #ifdef CONFIG_PM + static int ata_host_request_pm(struct ata_host *host, pm_message_t mesg, + unsigned int action, unsigned int ehi_flags, +@@ -5959,6 +5990,12 @@ int ata_host_suspend(struct ata_host *ho + { + int rc; + ++ /* ++ * disable link pm on all ports before requesting ++ * any pm activity ++ */ ++ ata_host_disable_link_pm(host); ++ + rc = ata_host_request_pm(host, mesg, 0, ATA_EHI_QUIET, 1); + if (rc == 0) + host->dev->power.power_state = mesg; +@@ -5981,6 +6018,9 @@ void ata_host_resume(struct ata_host *ho + ata_host_request_pm(host, PMSG_ON, ATA_EH_SOFTRESET, + ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET, 0); + host->dev->power.power_state = PMSG_ON; ++ ++ /* reenable link pm */ ++ ata_host_enable_link_pm(host); + } + #endif + +@@ -6478,6 +6518,7 @@ int ata_host_register(struct ata_host *h + struct ata_port *ap = host->ports[i]; + + ata_scsi_scan_host(ap, 1); ++ ata_scsi_set_link_pm_policy(ap, ap->pm_policy); + } + + return 0; +diff -ruNp linux-2.6.23.orig/drivers/ata/libata-scsi.c linux-2.6.23/drivers/ata/libata-scsi.c +--- linux-2.6.23.orig/drivers/ata/libata-scsi.c 2007-10-09 16:31:38.000000000 -0400 ++++ linux-2.6.23/drivers/ata/libata-scsi.c 2007-10-15 21:34:39.000000000 -0400 +@@ -111,6 +111,78 @@ static struct scsi_transport_template at + }; + + ++static const struct { ++ enum link_pm value; ++ char *name; ++} link_pm_policy[] = { ++ { NOT_AVAILABLE, "max_performance" }, ++ { MIN_POWER, "min_power" }, ++ { MAX_PERFORMANCE, "max_performance" }, ++ { MEDIUM_POWER, "medium_power" }, ++}; ++ ++const char *ata_scsi_link_pm_policy(enum link_pm policy) ++{ ++ int i; ++ char *name = NULL; ++ ++ for (i = 0; i < ARRAY_SIZE(link_pm_policy); i++) { ++ if (link_pm_policy[i].value == policy) { ++ name = link_pm_policy[i].name; ++ break; ++ } ++ } ++ return name; ++} ++ ++static ssize_t store_link_pm_policy(struct class_device *class_dev, ++ const char *buf, size_t count) ++{ ++ struct Scsi_Host *shost = class_to_shost(class_dev); ++ struct ata_port *ap = ata_shost_to_port(shost); ++ enum link_pm policy = 0; ++ int i; ++ ++ /* ++ * we are skipping array location 0 on purpose - this ++ * is because a value of NOT_AVAILABLE is displayed ++ * to the user as max_performance, but when the user ++ * writes "max_performance", they actually want the ++ * value to match MAX_PERFORMANCE. ++ */ ++ for (i = 1; i < ARRAY_SIZE(link_pm_policy); i++) { ++ const int len = strlen(link_pm_policy[i].name); ++ if (strncmp(link_pm_policy[i].name, buf, len) == 0 && ++ buf[len] == '\n') { ++ policy = link_pm_policy[i].value; ++ break; ++ } ++ } ++ if (!policy) ++ return -EINVAL; ++ ++ if (ata_scsi_set_link_pm_policy(ap, policy)) ++ return -EINVAL; ++ return count; ++} ++ ++static ssize_t ++show_link_pm_policy(struct class_device *class_dev, char *buf) ++{ ++ struct Scsi_Host *shost = class_to_shost(class_dev); ++ struct ata_port *ap = ata_shost_to_port(shost); ++ const char *policy = ++ ata_scsi_link_pm_policy(ap->pm_policy); ++ ++ if (!policy) ++ return -EINVAL; ++ ++ return snprintf(buf, 23, "%s\n", policy); ++} ++CLASS_DEVICE_ATTR(link_power_management_policy, S_IRUGO | S_IWUSR, ++ show_link_pm_policy, store_link_pm_policy); ++EXPORT_SYMBOL_GPL(class_device_attr_link_power_management_policy); ++ + static void ata_scsi_invalid_field(struct scsi_cmnd *cmd, + void (*done)(struct scsi_cmnd *)) + { +@@ -2905,6 +2977,47 @@ void ata_scsi_simulate(struct ata_device + } + } + ++int ata_scsi_set_link_pm_policy(struct ata_port *ap, ++ enum link_pm policy) ++{ ++ int rc = -EINVAL; ++ int i; ++ ++ /* ++ * make sure no broken devices are on this port, ++ * and that all devices support interface power ++ * management ++ */ ++ for (i = 0; i < ATA_MAX_DEVICES; i++) { ++ struct ata_device *dev = &ap->device[i]; ++ ++ /* only check drives which exist */ ++ if (!ata_dev_enabled(dev)) ++ continue; ++ ++ /* ++ * do we need to handle the case where we've hotplugged ++ * a broken drive (since hotplug and ALPM are mutually ++ * exclusive) ? ++ * ++ * If so, if we detect a broken drive on a port with ++ * alpm already enabled, then we should reset the policy ++ * to off for the entire port. ++ */ ++ if ((dev->horkage & ATA_HORKAGE_IPM) || ++ !(dev->flags & ATA_DFLAG_IPM)) { ++ ata_dev_printk(dev, KERN_ERR, ++ "Unable to set Link PM policy\n"); ++ ap->pm_policy = MAX_PERFORMANCE; ++ } ++ } ++ ++ if (ap->ops->enable_pm) ++ rc = ap->ops->enable_pm(ap, policy); ++ return rc; ++} ++EXPORT_SYMBOL_GPL(ata_scsi_set_link_pm_policy); ++ + int ata_scsi_add_hosts(struct ata_host *host, struct scsi_host_template *sht) + { + int i, rc; +diff -ruNp linux-2.6.23.orig/include/linux/ata.h linux-2.6.23/include/linux/ata.h +--- linux-2.6.23.orig/include/linux/ata.h 2007-10-09 16:31:38.000000000 -0400 ++++ linux-2.6.23/include/linux/ata.h 2007-10-15 21:34:39.000000000 -0400 +@@ -368,6 +368,12 @@ struct ata_taskfile { + ((u64) (id)[(n) + 0]) ) + + #define ata_id_cdb_intr(id) (((id)[0] & 0x60) == 0x20) ++#define ata_id_has_hipm(id) \ ++ ( (((id)[76] != 0x0000) && ((id)[76] != 0xffff)) && \ ++ ((id)[76] & (1 << 9)) ) ++#define ata_id_has_dipm(id) \ ++ ( (((id)[76] != 0x0000) && ((id)[76] != 0xffff)) && \ ++ ((id)[78] & (1 << 3)) ) + + static inline unsigned int ata_id_major_version(const u16 *id) + { +diff -ruNp linux-2.6.23.orig/include/linux/libata.h linux-2.6.23/include/linux/libata.h +--- linux-2.6.23.orig/include/linux/libata.h 2007-10-09 16:31:38.000000000 -0400 ++++ linux-2.6.23/include/linux/libata.h 2007-10-15 21:35:14.000000000 -0400 +@@ -139,7 +139,8 @@ enum { + ATA_DFLAG_FLUSH_EXT = (1 << 4), /* do FLUSH_EXT instead of FLUSH */ + ATA_DFLAG_ACPI_PENDING = (1 << 5), /* ACPI resume action pending */ + ATA_DFLAG_ACPI_FAILED = (1 << 6), /* ACPI on devcfg has failed */ +- ATA_DFLAG_CFG_MASK = (1 << 8) - 1, ++ ATA_DFLAG_IPM = (1 << 7), /* device supports IPM */ ++ ATA_DFLAG_CFG_MASK = (1 << 12) - 1, + + ATA_DFLAG_PIO = (1 << 8), /* device limited to PIO mode */ + ATA_DFLAG_NCQ_OFF = (1 << 9), /* device limited to non-NCQ mode */ +@@ -304,6 +305,7 @@ enum { + ATA_HORKAGE_NONCQ = (1 << 2), /* Don't use NCQ */ + ATA_HORKAGE_MAX_SEC_128 = (1 << 3), /* Limit max sects to 128 */ + ATA_HORKAGE_BROKEN_HPA = (1 << 4), /* Broken HPA */ ++ ATA_HORKAGE_IPM = (1 << 5), /* LPM problems */ + }; + + enum hsm_task_states { +@@ -342,6 +344,18 @@ typedef int (*ata_reset_fn_t)(struct ata + unsigned long deadline); + typedef void (*ata_postreset_fn_t)(struct ata_port *ap, unsigned int *classes); + ++/* ++ * host pm policy: If you alter this, you also need to alter scsi_sysfs.c ++ * (for the ascii descriptions) ++ */ ++enum link_pm { ++ NOT_AVAILABLE, ++ MIN_POWER, ++ MAX_PERFORMANCE, ++ MEDIUM_POWER, ++}; ++extern struct class_device_attribute class_device_attr_link_power_management_policy; ++ + struct ata_ioports { + void __iomem *cmd_addr; + void __iomem *data_addr; +@@ -568,6 +582,7 @@ struct ata_port { + + pm_message_t pm_mesg; + int *pm_result; ++ enum link_pm pm_policy; + + struct timer_list fastdrain_timer; + unsigned long fastdrain_cnt; +@@ -633,7 +648,8 @@ struct ata_port_operations { + + int (*port_suspend) (struct ata_port *ap, pm_message_t mesg); + int (*port_resume) (struct ata_port *ap); +- ++ int (*enable_pm) (struct ata_port *ap, enum link_pm policy); ++ int (*disable_pm) (struct ata_port *ap); + int (*port_start) (struct ata_port *ap); + void (*port_stop) (struct ata_port *ap); + +@@ -840,7 +856,7 @@ extern int ata_cable_40wire(struct ata_p + extern int ata_cable_80wire(struct ata_port *ap); + extern int ata_cable_sata(struct ata_port *ap); + extern int ata_cable_unknown(struct ata_port *ap); +- ++extern int ata_scsi_set_link_pm_policy(struct ata_port *ap, enum link_pm); + /* + * Timing helpers + */ +@@ -869,7 +885,6 @@ enum { + ATA_TIMING_CYCLE | ATA_TIMING_UDMA, + }; + +- + #ifdef CONFIG_PCI + struct pci_bits { + unsigned int reg; /* PCI config register to read */ diff --git a/sys-kernel/thinkpad-sources/files/2.6.23/disk-protect-for-2.6.23.patch b/sys-kernel/thinkpad-sources/files/2.6.23/disk-protect-for-2.6.23.patch new file mode 100644 index 000000000..d9d5385c7 --- /dev/null +++ b/sys-kernel/thinkpad-sources/files/2.6.23/disk-protect-for-2.6.23.patch @@ -0,0 +1,850 @@ +diff --git a/Documentation/block/disk-protection.txt b/Documentation/block/disk-protection.txt +new file mode 100644 +index 0000000..508cc5b +--- /dev/null ++++ b/Documentation/block/disk-protection.txt +@@ -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 --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c +index ed39313..cc0e227 100644 +--- a/block/ll_rw_blk.c ++++ b/block/ll_rw_blk.c +@@ -38,10 +38,14 @@ #include <scsi/scsi_cmnd.h> + + static void blk_unplug_work(struct work_struct *work); + static void blk_unplug_timeout(unsigned long data); ++static void blk_unfreeze_work(struct work_struct *work); ++static void blk_unfreeze_timeout(unsigned long data); + static void drive_stat_acct(struct request *rq, int nr_sectors, int new_io); + static void init_request_from_bio(struct request *req, struct bio *bio); + static int __make_request(struct request_queue *q, struct bio *bio); + static struct io_context *current_io_context(gfp_t gfp_flags, int node); ++static int blk_protect_register(struct request_queue *q); ++static void blk_protect_unregister(struct request_queue *q); + + /* + * For the allocated request tables +@@ -227,6 +231,16 @@ void blk_queue_make_request(struct reque + 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 + */ +@@ -318,6 +332,18 @@ void blk_queue_issue_flush_fn(struct req + + EXPORT_SYMBOL(blk_queue_issue_flush_fn); + ++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); ++ + /* + * Cache flushing for ordered writes handling + */ +@@ -1851,6 +1877,7 @@ struct request_queue *blk_alloc_queue_no + return NULL; + + init_timer(&q->unplug_timer); ++ init_timer(&q->unfreeze_timer); + + snprintf(q->kobj.name, KOBJ_NAME_LEN, "%s", "queue"); + q->kobj.ktype = &queue_ktype; +@@ -4116,6 +4143,7 @@ int blk_register_queue(struct gendisk *d + return ret; + } + ++ blk_protect_register(q); + return 0; + } + +@@ -4124,6 +4152,7 @@ void blk_unregister_queue(struct gendisk + 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); +@@ -4131,3 +4160,198 @@ void blk_unregister_queue(struct gendisk + kobject_put(&disk->kobj); + } + } ++ ++/* ++ * Issue lower level unprotect function if no timers are pending. ++ */ ++static 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... ++ */ ++static 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); ++} ++ ++/* ++ * 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 1; ++ ++ /* 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; ++ } ++ kobject_get(&q->kobj); ++ ++ error = sysfs_create_file(&q->kobj, &queue_protect_method_entry.attr); ++ if (error) { ++ 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); ++ kobject_put(&q->kobj); ++ sysfs_remove_file(&q->kobj, &queue_protect_entry.attr); ++ kobject_put(&q->kobj); ++} +diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c +index e836476..c587bf1 100644 +--- a/drivers/ata/libata-scsi.c ++++ b/drivers/ata/libata-scsi.c +@@ -781,6 +781,38 @@ static void ata_scsi_dev_config(struct s + } + } + ++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 +@@ -806,6 +838,10 @@ int ata_scsi_slave_config(struct scsi_de + + if (dev) + 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 0; /* scsi layer doesn't check return value, sigh */ + } +diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c +index 4754769..938408d 100644 +--- a/drivers/ide/ide-disk.c ++++ b/drivers/ide/ide-disk.c +@@ -743,6 +743,145 @@ static int idedisk_issue_flush(struct re + } + + /* ++ * 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 = 0, rc = 0; ++ ide_drive_t *drive = q->queuedata; ++ u8 args[7], *argbuf = args; ++ ++ 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(args, 0, sizeof(args)); ++ argbuf[0] = 0xe5; /* CHECK_POWER_MODE1 */ ++ ide_init_drive_cmd(&rq); ++ rq.cmd_type = REQ_TYPE_ATA_TASK; ++ rq.buffer = argbuf; ++ 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; ++ u8 args[7], *argbuf = args; ++ int ret = 0; ++ DECLARE_COMPLETION(wait); ++ ++ memset(&rq, 0, sizeof(rq)); ++ memset(args, 0, sizeof(args)); ++ ++ if (blk_queue_stopped(q)) ++ return -EIO; ++ ++ if (unload) { ++ argbuf[0] = 0xe1; ++ argbuf[1] = 0x44; ++ argbuf[3] = 0x4c; ++ argbuf[4] = 0x4e; ++ argbuf[5] = 0x55; ++ } else ++ argbuf[0] = 0xe0; ++ ++ /* Issue the park command & freeze */ ++ ide_init_drive_cmd(&rq); ++ ++ rq.cmd_type = REQ_TYPE_ATA_TASK; ++ rq.buffer = argbuf; ++ 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 (args[3] == 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. + */ +@@ -1017,6 +1156,9 @@ static void idedisk_setup (ide_drive_t * + 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 --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c +index aa9f5f0..e664f5c 100644 +--- a/drivers/ide/ide-io.c ++++ b/drivers/ide/ide-io.c +@@ -1276,6 +1276,17 @@ #endif + } + + /* ++ * 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() +@@ -1773,6 +1784,9 @@ int ide_do_drive_cmd (ide_drive_t *drive + 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 --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c +index a417a6f..07d19b3 100644 +--- a/drivers/scsi/scsi_lib.c ++++ b/drivers/scsi/scsi_lib.c +@@ -2273,3 +2273,166 @@ void scsi_kunmap_atomic_sg(void *virt) + 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; ++ ++ 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); ++ 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 --git a/include/linux/ata.h b/include/linux/ata.h +index c043c1c..618906f 100644 +--- a/include/linux/ata.h ++++ b/include/linux/ata.h +@@ -344,6 +344,7 @@ #define ata_id_is_ata(id) (((id)[0] & (1 + #define ata_id_rahead_enabled(id) ((id)[85] & (1 << 6)) + #define ata_id_wcache_enabled(id) ((id)[85] & (1 << 5)) + #define ata_id_hpa_enabled(id) ((id)[85] & (1 << 10)) ++#define ata_id_has_unload(id) ((id)[84] & (1 << 13)) + #define ata_id_has_fua(id) ((id)[84] & (1 << 6)) + #define ata_id_has_flush(id) ((id)[83] & (1 << 12)) + #define ata_id_has_flush_ext(id) ((id)[83] & (1 << 13)) +diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h +index b126c6f..12feccc 100644 +--- a/include/linux/blkdev.h ++++ b/include/linux/blkdev.h +@@ -347,6 +347,8 @@ typedef int (merge_bvec_fn) (struct requ + typedef int (issue_flush_fn) (struct request_queue *, struct gendisk *, sector_t *); + typedef void (prepare_flush_fn) (struct request_queue *, struct request *); + typedef void (softirq_done_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, +@@ -385,6 +387,8 @@ struct request_queue + issue_flush_fn *issue_flush_fn; + prepare_flush_fn *prepare_flush_fn; + softirq_done_fn *softirq_done_fn; ++ issue_protect_fn *issue_protect_fn; ++ issue_unprotect_fn *issue_unprotect_fn; + + /* + * Dispatch queue sorting +@@ -400,6 +404,14 @@ struct request_queue + 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; + + /* +@@ -774,6 +786,8 @@ extern int blk_do_ordered(struct request + 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 --git a/include/linux/ide.h b/include/linux/ide.h +index b9f66c1..8491dcf 100644 +--- a/include/linux/ide.h ++++ b/include/linux/ide.h +@@ -1110,6 +1110,7 @@ extern u64 ide_get_error_location(ide_dr + */ + 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.23/input-unknown_keycodes-for-2.6.23.patch b/sys-kernel/thinkpad-sources/files/2.6.23/input-unknown_keycodes-for-2.6.23.patch new file mode 100644 index 000000000..0737d6f75 --- /dev/null +++ b/sys-kernel/thinkpad-sources/files/2.6.23/input-unknown_keycodes-for-2.6.23.patch @@ -0,0 +1,11 @@ +--- linux/drivers/input/input.c 2006-03-05 20:07:54.000000000 +0100 ++++ linux/drivers/input/input.c 2006-03-02 22:18:37.000000000 +0100 +@@ -71,7 +71,7 @@ + + case EV_KEY: + +- if (code > KEY_MAX || !test_bit(code, dev->keybit) || !!test_bit(code, dev->key) == value) ++ if (code > KEY_MAX || !!test_bit(code, dev->key) == value) + return; + + if (value == 2) diff --git a/sys-kernel/thinkpad-sources/files/2.6.23/linux-phc-0.3.1-for-2.6.23.patch b/sys-kernel/thinkpad-sources/files/2.6.23/linux-phc-0.3.1-for-2.6.23.patch new file mode 100644 index 000000000..db9db5baa --- /dev/null +++ b/sys-kernel/thinkpad-sources/files/2.6.23/linux-phc-0.3.1-for-2.6.23.patch @@ -0,0 +1,530 @@ +diff --new-file -a --unified=5 --recursive linux-2.6.23-rc3/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c linux-source-2.6.23-rc3/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c +--- linux-2.6.23-rc3/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c 2007-08-13 06:25:24.000000000 +0200 ++++ linux-source-2.6.23-rc3/arch/i386/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> +@@ -57,16 +62,22 @@ + }; + + #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" ++ + 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 struct acpi_cpufreq_data *drv_data[NR_CPUS]; + /* acpi_perf_data is a pointer to percpu data. */ + static struct acpi_processor_performance *acpi_perf_data; +@@ -101,17 +112,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); + 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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/config b/sys-kernel/thinkpad-sources/files/config new file mode 100644 index 000000000..e324bd9ef --- /dev/null +++ b/sys-kernel/thinkpad-sources/files/config @@ -0,0 +1,2009 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.23-thinkpad-r1 +# Thu Nov 8 09:48:11 2007 +# +CONFIG_X86_32=y +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_SEMAPHORE_SLEEPERS=y +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_ZONE_DMA=y +CONFIG_QUICKLIST=y +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_IOMAP=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +CONFIG_DMI=y +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# 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_USER_NS is not set +CONFIG_AUDIT=y +CONFIG_AUDITSYSCALL=y +# CONFIG_IKCONFIG is not set +CONFIG_LOG_BUF_SHIFT=15 +# CONFIG_CPUSETS is not set +# CONFIG_SYSFS_DEPRECATED is not set +# CONFIG_RELAY 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_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=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_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" + +# +# 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_PARAVIRT 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_MCORE2=y +# CONFIG_MPENTIUM4 is not set +# CONFIG_MK6 is not set +# CONFIG_MK7 is not set +# CONFIG_MK8 is not set +# CONFIG_MCRUSOE is not set +# CONFIG_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_X86_GENERIC is not set +CONFIG_X86_CMPXCHG=y +CONFIG_X86_L1_CACHE_SHIFT=6 +CONFIG_X86_XADD=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +# CONFIG_ARCH_HAS_ILOG2_U32 is not set +# CONFIG_ARCH_HAS_ILOG2_U64 is not set +CONFIG_GENERIC_CALIBRATE_DELAY=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_TSC=y +CONFIG_X86_MINIMUM_CPU_FAMILY=4 +CONFIG_HPET_TIMER=y +CONFIG_HPET_EMULATE_RTC=y +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_BKL=y +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 + +# +# Firmware Drivers +# +# CONFIG_EDD is not set +# CONFIG_DELL_RBU is not set +# CONFIG_DCDBAS is not set +CONFIG_DMIID=y +# 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_ARCH_POPULATES_NODE_MAP=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_SPLIT_PTLOCK_CPUS=4 +# CONFIG_RESOURCES_64BIT is not set +CONFIG_ZONE_DMA_FLAG=1 +CONFIG_BOUNCE=y +CONFIG_NR_QUICK=1 +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_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 (ACPI, APM) +# +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_SMP_POSSIBLE=y +CONFIG_SUSPEND=y +CONFIG_HIBERNATION_SMP_POSSIBLE=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_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_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_ASUS is not set +# CONFIG_ACPI_TOSHIBA 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=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE 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=y +CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y +# CONFIG_X86_SPEEDSTEP_ICH is not set +# CONFIG_X86_SPEEDSTEP_SMI is not set +# 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 is not set + +# +# CPU idle PM support +# +CONFIG_CPU_IDLE=y + +# +# Governors +# +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_CPU_IDLE_GOV_MENU=y + +# +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# +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_PCIEPORTBUS=y +CONFIG_HOTPLUG_PCI_PCIE=y +# CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set +CONFIG_PCIEAER=y +CONFIG_ARCH_SUPPORTS_MSI=y +CONFIG_PCI_MSI=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 + +# +# PCCARD (PCMCIA/CardBus) support +# +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=y +# CONFIG_HOTPLUG_PCI_CPCI is not set +# CONFIG_HOTPLUG_PCI_SHPC is not set + +# +# Executable file formats +# +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_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_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 + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_NETLINK=y +CONFIG_NETFILTER_NETLINK_QUEUE=y +CONFIG_NETFILTER_NETLINK_LOG=y +CONFIG_NF_CONNTRACK_ENABLED=m +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_TRACE=m +CONFIG_NETFILTER_XT_TARGET_TCPMSS=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_LENGTH=y +CONFIG_NETFILTER_XT_MATCH_LIMIT=y +CONFIG_NETFILTER_XT_MATCH_MAC=y +CONFIG_NETFILTER_XT_MATCH_MARK=y +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_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_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_IPRANGE=y +CONFIG_IP_NF_MATCH_TOS=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_OWNER=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_IP_NF_TARGET_SAME=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_TOS=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 (EXPERIMENTAL) +# +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_OWNER=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 + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_FIFO=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 +# CONFIG_NET_SCH_INGRESS 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_EMATCH is not set +# CONFIG_NET_CLS_ACT is not set +# CONFIG_NET_CLS_POLICE is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO 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=y +CONFIG_WIRELESS_EXT=y +CONFIG_MAC80211=m +CONFIG_MAC80211_LEDS=y +# 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 is not set +CONFIG_RFKILL=y +CONFIG_RFKILL_INPUT=y +# CONFIG_NET_9P is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +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_ASUS_LAPTOP 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_HOTKEY_POLL=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 + +# +# 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_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_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_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_NS87410 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 + +# +# Fusion MPT device support +# +# CONFIG_FUSION is not set +# CONFIG_FUSION_SPI is not set +# CONFIG_FUSION_FC is not set +# CONFIG_FUSION_SAS 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_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_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=m +CONFIG_IPW2100_MONITOR=y +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +CONFIG_IPW2200_MONITOR=y +CONFIG_IPW2200_RADIOTAP=y +CONFIG_IPW2200_PROMISCUOUS=y +CONFIG_IPW2200_QOS=y +# CONFIG_IPW2200_DEBUG 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=m +# CONFIG_USB_ZD1201 is not set +# CONFIG_RTL8187 is not set +# CONFIG_HOSTAP 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_MII 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 is not set +# CONFIG_SLIP is not set +# CONFIG_NET_FC is not set +# CONFIG_SHAPER 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 is not set + +# +# 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_TSDEV 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_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_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# 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 is not set +# CONFIG_PPDEV is not set +# CONFIG_TIPAR is not set +# CONFIG_IPMI_HANDLER is not set +# CONFIG_WATCHDOG 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 +# CONFIG_AGP is not set +# CONFIG_DRM 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_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_SENSORS_DS1337 is not set +# CONFIG_SENSORS_DS1374 is not set +# CONFIG_DS1682 is not set +# CONFIG_SENSORS_EEPROM is not set +# CONFIG_SENSORS_PCF8574 is not set +# CONFIG_SENSORS_PCA9539 is not set +# CONFIG_SENSORS_PCF8591 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 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_K8TEMP is not set +# CONFIG_SENSORS_ASB100 is not set +# CONFIG_SENSORS_ATXP1 is not set +# CONFIG_SENSORS_DS1621 is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_FSCHER is not set +# CONFIG_SENSORS_FSCPOS 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_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_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +CONFIG_SENSORS_HDAPS=m +# CONFIG_SENSORS_APPLESMC is not set +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_SM501 is not set + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=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_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_TUNER_TEA5761 is not set +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_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_BLACKBIRD=m +CONFIG_VIDEO_CX88_DVB=m +CONFIG_VIDEO_CX88_VP3054=m +# CONFIG_VIDEO_IVTV is not set +CONFIG_VIDEO_CAFE_CCIC=m +CONFIG_V4L_USB_DRIVERS=y +CONFIG_VIDEO_PVRUSB2=m +CONFIG_VIDEO_PVRUSB2_29XXX=y +CONFIG_VIDEO_PVRUSB2_24XXX=y +CONFIG_VIDEO_PVRUSB2_SYSFS=y +# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set +CONFIG_VIDEO_EM28XX=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_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_DVB_AV7110 is not set +# CONFIG_DVB_BUDGET is not set +# CONFIG_DVB_BUDGET_CI is not set +# CONFIG_DVB_BUDGET_AV 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 + +# +# Tuners/PLL support +# +CONFIG_DVB_PLL=m +CONFIG_DVB_TDA826X=m +CONFIG_DVB_TDA827X=m +CONFIG_DVB_TUNER_QT1010=m +CONFIG_DVB_TUNER_MT2060=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_BUF=m +CONFIG_VIDEO_BUF_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_BACKLIGHT_LCD_SUPPORT is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=m +# CONFIG_BACKLIGHT_PROGEAR is not set + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set +# CONFIG_VGASTATE is not set +# CONFIG_VIDEO_OUTPUT_CONTROL is not set +# CONFIG_FB 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 is not set + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set +CONFIG_HID_SUPPORT=y +CONFIG_HID=y +# CONFIG_HID_DEBUG 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 + +# +# 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_SPLIT_ISO=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_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 + +# +# USB Serial Converter support +# +# 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 + +# +# USB DSL modem support +# + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set +# CONFIG_MMC is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=m + +# +# LED drivers +# + +# +# 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 +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_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 + +# +# SPI RTC drivers +# + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_DS1742 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 +# + +# +# DMA Engine support +# +# CONFIG_DMA_ENGINE is not set + +# +# DMA Clients +# + +# +# DMA Devices +# +CONFIG_AUXDISPLAY=y +# CONFIG_KS0108 is not set +# CONFIG_VIRTUALIZATION is not set + +# +# Userspace I/O +# +# CONFIG_UIO is not set + +# +# 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_JBD_DEBUG is not set +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_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +CONFIG_QUOTACTL=y +CONFIG_DNOTIFY=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=y +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW 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_RAMFS=y +# 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_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +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 is not set +# 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 + +# +# Native Language Support +# +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 + +# +# Distributed Lock Manager +# +# CONFIG_DLM is not set +# CONFIG_INSTRUMENTATION is not set + +# +# Kernel hacking +# +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +# CONFIG_PRINTK_TIME is not set +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_FRAME_POINTER is not set +CONFIG_FORCED_INLINING=y +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_FAULT_INJECTION is not set +CONFIG_EARLY_PRINTK=y +# CONFIG_DEBUG_STACKOVERFLOW is not set +# CONFIG_DEBUG_STACK_USAGE is not set + +# +# Page alloc debug is incompatible with Software Suspend on i386 +# +# CONFIG_DEBUG_RODATA is not set +# CONFIG_4KSTACKS is not set +CONFIG_X86_FIND_SMP_CONFIG=y +CONFIG_X86_MPPARSE=y +CONFIG_DOUBLEFAULT=y + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set +CONFIG_CRYPTO=y +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_BLKCIPHER=y +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_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_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_HW is not set + +# +# Library routines +# +CONFIG_BITREVERSE=y +# CONFIG_CRC_CCITT is not set +# 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_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 +CONFIG_GENERIC_HARDIRQS=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_PENDING_IRQ=y +CONFIG_X86_SMP=y +CONFIG_X86_HT=y +CONFIG_X86_BIOS_REBOOT=y +CONFIG_X86_TRAMPOLINE=y +CONFIG_KTIME_SCALAR=y diff --git a/sys-kernel/thinkpad-sources/metadata.xml b/sys-kernel/thinkpad-sources/metadata.xml new file mode 100644 index 000000000..53819e486 --- /dev/null +++ b/sys-kernel/thinkpad-sources/metadata.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> +<pkgmetadata> +<herd>mobile</herd> +<herd>kernel</herd> +<maintainer> + <email>florianmanschwetus@gmx.de</email> + <name>Florian Manschwetus</name> +</maintainer> +</pkgmetadata> diff --git a/sys-kernel/thinkpad-sources/thinkpad-sources-2.6.23-r1.ebuild b/sys-kernel/thinkpad-sources/thinkpad-sources-2.6.23-r1.ebuild new file mode 100644 index 000000000..1f48056e1 --- /dev/null +++ b/sys-kernel/thinkpad-sources/thinkpad-sources-2.6.23-r1.ebuild @@ -0,0 +1,80 @@ +# Copyright 1999-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: sys-kernel/thinkpad-sources/thinkpad-sources-2.6.20.ebuild 2007 04 12 + +ETYPE="sources" +K_WANT_GENPATCHES="base extras" +K_GENPATCHES_VER="2" + +inherit kernel-2 +detect_version +detect_arch + +DESCRIPTION="Software Suspend 2 + Gentoo patchset sources + SCO Flowcontrol + Latest THINKPAD-Acpi" +HOMEPAGE="http://dev.gentoo.org/~dsd/genpatches http://www.tuxonice.net http://bluetooth-alsa.sourceforge.net/ http://ibm-acpi.sourceforge.net/" + +IUSE="sco_flowcontrol" + +HRT_VERSION="3" +HRT_TARGET="2.6.23" +HRT_SRC="patch-${HRT_TARGET}-hrt${HRT_VERSION}" +HRT_URI="http://www.kernel.org/pub/linux/kernel/people/tglx/hrtimers/2.6.23/${HRT_SRC}.patch.bz2" + +TUXONICE_VERSION="3.0-rc2" +TUXONICE_TARGET="2.6.23.1" +TUXONICE_SRC="tuxonice-${TUXONICE_VERSION}-for-${TUXONICE_TARGET}" +TUXONICE_URI="http://www.tuxonice.net/downloads/all/${TUXONICE_SRC}.patch.bz2" + +SCO_FLOWCONTROL_VERSION="4.3" +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.18-20071013" +THINKPAD_ACPI_TARGET="2.6.23.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}" + + + +#IEEE80211_VERSION="1.2.17" +#IEEE80211_TARGET="2.6.20" +#IEEE80211_SRC="05-ieee80211-${IEEE80211_VERSION}-for-${IEEE80211_TARGET}.patch" +#IEEE80211_URI="http://whoopie.gmxhome.de/linux/patches/2.6.20/${IEEE80211_SRC}" + +UNIPATCH_LIST="" + +if use sco_flowcontrol; then + UNIPATCH_LIST="${UNIPATCH_LIST} ${DISTDIR}/${SCO_FLOWCONTROL_SRC}.diff" +fi +UNIPATCH_LIST="${UNIPATCH_LIST} + ${FILESDIR}/2.6.23/disk-protect-for-2.6.23.patch + ${DISTDIR}/${THINKPAD_ACPI_SRC} + ${DISTDIR}/${IEEE80211_SRC} + ${FILESDIR}/2.6.23/input-unknown_keycodes-for-2.6.23.patch + ${FILESDIR}/2.6.23/linux-phc-0.3.1-for-2.6.23.patch + ${DISTDIR}/${TUXONICE_SRC}.patch.bz2 + ${FILESDIR}/2.6.23/combined-2.6.23-cph.patch + ${DISTDIR}/${HRT_SRC}.patch.bz2" + + +UNIPATCH_STRICTORDER="yes" +SRC_URI="${KERNEL_URI} ${GENPATCHES_URI} ${ARCH_URI} ${TUXONICE_URI} ${THINKPAD_ACPI_URI} sco_flowcontrol? ( ${SCO_FLOWCONTROL_URI} ) ${IEEE80211_URI} ${HRT_URI}" + +KEYWORDS="~amd64 ~x86" + +RDEPEND="${RDEPEND} + >=sys-apps/tuxonice-userui-0.7.2 + >=sys-power/hibernate-script-1.97" + +#K_EXTRAEINFO="If there are issues with this kernel, please direct any +#queries to the linux-thinkpad mailing list:" + +pkg_postinst() { + kernel-2_pkg_postinst + einfo "For more info on this patchset, and how to report problems, see:" + einfo "${HOMEPAGE}" + einfo "In files dir is an example config suitable for T60" + einfo "and hopefully all pci-express driven Thinkpads" + einfo "but at all you should try for all Thinkpads" + einfo "to NOT alter the given storage device controller configuration" +} |