[PATCH] HPT37x: read f_CNT saved by BIOS from port
authorSergei Shtylyov <sshtylyov@ru.mvista.com>
Wed, 13 Dec 2006 08:35:53 +0000 (00:35 -0800)
committerLinus Torvalds <torvalds@woody.osdl.org>
Wed, 13 Dec 2006 17:05:55 +0000 (09:05 -0800)
The undocumented register BIOS uses for saving f_CNT seems to only be
mapped to I/O space while all the other HPT3xx regs are dual-mapped.  Looks
like another HighPoint's dirty trick.  With this patch, the deadly kernel
oops on the cards having the modern HighPoint BIOSes is now at last gone!

Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Cc: Bartlomiej Zolnierkiewicz <B.Zolnierkiewicz@elka.pw.edu.pl>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/ide/pci/hpt366.c

index 9fd50801d3822e0cd8a2bdbfa186d48be4c76d95..08119da06d54d0dec32b038f1dc5ad23c385a448 100644 (file)
@@ -1035,14 +1035,14 @@ static void __devinit hpt37x_clocking(ide_hwif_t *hwif)
         * First try reading the register in which the HighPoint BIOS
         * saves f_CNT value before  reprogramming the DPLL from its
         * default setting (which differs for the various chips).
+        * NOTE: This register is only accessible via I/O space.
+        *
         * In case the signature check fails, we'll have to resort to
         * reading the f_CNT register itself in hopes that nobody has
         * touched the DPLL yet...
         */
-       pci_read_config_dword(dev, 0x70, &temp);
+       temp = inl(pci_resource_start(dev, 4) + 0x90);
        if ((temp & 0xFFFFF000) != 0xABCDE000) {
-               int i;
-
                printk(KERN_WARNING "HPT37X: no clock data saved by BIOS\n");
 
                /* Calculate the average value of f_CNT */