pata_hpt3x2n: calculate average f_CNT
Sergei Shtylyov [Tue, 28 Dec 2010 19:54:54 +0000 (22:54 +0300)]
Allow hpt3x2n_pci_clock() to calculate the average f_CNT register value iff
HighPoint BIOS hasn't saved one, just like the 'pata_hpt37x' driver (reading
the full 16-bit register, unlike what that driver does), so that this driver
would work correctly on e.g. non-x86 machine with 66 MHz PCI.

I'm not sure why Alan has only done this in one driver and not the other...

Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>

drivers/ata/pata_hpt3x2n.c

index 87b735a..809a4b4 100644 (file)
@@ -25,7 +25,7 @@
 #include <linux/libata.h>
 
 #define DRV_NAME       "pata_hpt3x2n"
-#define DRV_VERSION    "0.3.11"
+#define DRV_VERSION    "0.3.12"
 
 enum {
        HPT_PCI_FAST    =       (1 << 31),
@@ -413,8 +413,19 @@ static int hpt3x2n_pci_clock(struct pci_dev *pdev)
 
        fcnt = inl(iobase + 0x90);      /* Not PCI readable for some chips */
        if ((fcnt >> 12) != 0xABCDE) {
-               printk(KERN_WARNING "hpt3xn: BIOS clock data not set.\n");
-               return 33;      /* Not BIOS set */
+               int i;
+               u16 sr;
+               u32 total = 0;
+
+               printk(KERN_WARNING "pata_hpt3x2n: BIOS clock data not set.\n");
+
+               /* This is the process the HPT371 BIOS is reported to use */
+               for (i = 0; i < 128; i++) {
+                       pci_read_config_word(pdev, 0x78, &sr);
+                       total += sr & 0x1FF;
+                       udelay(15);
+               }
+               fcnt = total / 128;
        }
        fcnt &= 0x1FF;