Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=9863be598ed068613996af8da71d9fd976a0ab2d
Commit:     9863be598ed068613996af8da71d9fd976a0ab2d
Parent:     f73ca1b76c6880b934d3ef566c1592efc80bb759
Author:     Jan Beulich <[EMAIL PROTECTED]>
AuthorDate: Wed Jan 10 23:15:41 2007 -0800
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Thu Jan 11 18:18:21 2007 -0800

    [PATCH] intel-rng workarounds
    
    Add a load option to intel-rng to allow skipping the FWH detection,
    necessary in case the BIOS has locked read-only the firmware hub space.
    Also prevent any attempt to write to firmware space if it cannot be write
    enabled (apparently caused hangs on some systems not having an FWH and thus
    also not having a respective RNG).
    
    Signed-off-by: Jan Beulich <[EMAIL PROTECTED]>
    Signed-off-by: Michael Buesch <[EMAIL PROTECTED]>
    Cc: Jeff Garzik <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 drivers/char/hw_random/intel-rng.c |   32 ++++++++++++++++++++++++++++++--
 1 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/drivers/char/hw_random/intel-rng.c 
b/drivers/char/hw_random/intel-rng.c
index 8efbc9c..154ce3e 100644
--- a/drivers/char/hw_random/intel-rng.c
+++ b/drivers/char/hw_random/intel-rng.c
@@ -143,6 +143,11 @@ static const struct pci_device_id pci_tbl[] = {
 };
 MODULE_DEVICE_TABLE(pci, pci_tbl);
 
+static __initdata int no_fwh_detect;
+module_param(no_fwh_detect, int, 0);
+MODULE_PARM_DESC(no_fwh_detect, "Skip FWH detection:\n"
+                                " positive value - skip if FWH space locked 
read-only\n"
+                                " negative value - skip always");
 
 static inline u8 hwstatus_get(void __iomem *mem)
 {
@@ -240,6 +245,11 @@ static int __init mod_init(void)
        if (!dev)
                goto out; /* Device not found. */
 
+       if (no_fwh_detect < 0) {
+               pci_dev_put(dev);
+               goto fwh_done;
+       }
+
        /* Check for Intel 82802 */
        if (dev->device < 0x2640) {
                fwh_dec_en1_off = FWH_DEC_EN1_REG_OLD;
@@ -252,6 +262,23 @@ static int __init mod_init(void)
        pci_read_config_byte(dev, fwh_dec_en1_off, &fwh_dec_en1_val);
        pci_read_config_byte(dev, bios_cntl_off, &bios_cntl_val);
 
+       if ((bios_cntl_val &
+            (BIOS_CNTL_LOCK_ENABLE_MASK|BIOS_CNTL_WRITE_ENABLE_MASK))
+           == BIOS_CNTL_LOCK_ENABLE_MASK) {
+               static __initdata /*const*/ char warning[] =
+                       KERN_WARNING PFX "Firmware space is locked read-only. 
If you can't or\n"
+                       KERN_WARNING PFX "don't want to disable this in 
firmware setup, and if\n"
+                       KERN_WARNING PFX "you are certain that your system has 
a functional\n"
+                       KERN_WARNING PFX "RNG, try using the 'no_fwh_detect' 
option.\n";
+
+               pci_dev_put(dev);
+               if (no_fwh_detect)
+                       goto fwh_done;
+               printk(warning);
+               err = -EBUSY;
+               goto out;
+       }
+
        mem = ioremap_nocache(INTEL_FWH_ADDR, INTEL_FWH_ADDR_LEN);
        if (mem == NULL) {
                pci_dev_put(dev);
@@ -280,8 +307,7 @@ static int __init mod_init(void)
                pci_write_config_byte(dev,
                                      fwh_dec_en1_off,
                                      fwh_dec_en1_val | FWH_F8_EN_MASK);
-       if (!(bios_cntl_val &
-             (BIOS_CNTL_LOCK_ENABLE_MASK|BIOS_CNTL_WRITE_ENABLE_MASK)))
+       if (!(bios_cntl_val & BIOS_CNTL_WRITE_ENABLE_MASK))
                pci_write_config_byte(dev,
                                      bios_cntl_off,
                                      bios_cntl_val | 
BIOS_CNTL_WRITE_ENABLE_MASK);
@@ -315,6 +341,8 @@ static int __init mod_init(void)
                goto out;
        }
 
+fwh_done:
+
        err = -ENOMEM;
        mem = ioremap(INTEL_RNG_ADDR, INTEL_RNG_ADDR_LEN);
        if (!mem)
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to