]> Pileus Git - ~andy/sunrise/commitdiff
sys-kernel/thinkpad-sources: New Ebuild for bug 136231 just test it on other centrinos
authorEisNerd <FlorianManschwetus@gmx.de>
Thu, 8 Nov 2007 11:21:41 +0000 (11:21 +0000)
committerEisNerd <FlorianManschwetus@gmx.de>
Thu, 8 Nov 2007 11:21:41 +0000 (11:21 +0000)
svn path=/sunrise/; revision=5009

sys-kernel/thinkpad-sources/ChangeLog [new file with mode: 0644]
sys-kernel/thinkpad-sources/Manifest [new file with mode: 0644]
sys-kernel/thinkpad-sources/files/2.6.23/combined-2.6.23-cph.patch [new file with mode: 0644]
sys-kernel/thinkpad-sources/files/2.6.23/disk-protect-for-2.6.23.patch [new file with mode: 0644]
sys-kernel/thinkpad-sources/files/2.6.23/input-unknown_keycodes-for-2.6.23.patch [new file with mode: 0644]
sys-kernel/thinkpad-sources/files/2.6.23/linux-phc-0.3.1-for-2.6.23.patch [new file with mode: 0644]
sys-kernel/thinkpad-sources/files/config [new file with mode: 0644]
sys-kernel/thinkpad-sources/metadata.xml [new file with mode: 0644]
sys-kernel/thinkpad-sources/thinkpad-sources-2.6.23-r1.ebuild [new file with mode: 0644]

diff --git a/sys-kernel/thinkpad-sources/ChangeLog b/sys-kernel/thinkpad-sources/ChangeLog
new file mode 100644 (file)
index 0000000..3b461f6
--- /dev/null
@@ -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 (file)
index 0000000..afcb115
--- /dev/null
@@ -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 (file)
index 0000000..28af1a6
--- /dev/null
@@ -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 (file)
index 0000000..d9d5385
--- /dev/null
@@ -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 (file)
index 0000000..0737d6f
--- /dev/null
@@ -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 (file)
index 0000000..db9db5b
--- /dev/null
@@ -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 (file)
index 0000000..e324bd9
--- /dev/null
@@ -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 (file)
index 0000000..53819e4
--- /dev/null
@@ -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 (file)
index 0000000..1f48056
--- /dev/null
@@ -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"
+}