[AGPGART] Fix serverworks TLB flush.

Go back to what 2.4 kernels used to do here, as if this hits,
the kernel just hangs indefinitly.

Actually an improvement over 2.4 - we now break; out of the loop
instead of just printing messages on timeouts.

Signed-off-by: Dave Jones <davej@redhat.com>
This commit is contained in:
Dave Jones 2005-09-23 15:59:37 -07:00
parent 32a3658533
commit 0ff541dafd
1 changed files with 16 additions and 2 deletions

View File

@ -242,13 +242,27 @@ static int serverworks_fetch_size(void)
*/ */
static void serverworks_tlbflush(struct agp_memory *temp) static void serverworks_tlbflush(struct agp_memory *temp)
{ {
unsigned long timeout;
writeb(1, serverworks_private.registers+SVWRKS_POSTFLUSH); writeb(1, serverworks_private.registers+SVWRKS_POSTFLUSH);
while (readb(serverworks_private.registers+SVWRKS_POSTFLUSH) == 1) timeout = jiffies + 3*HZ;
while (readb(serverworks_private.registers+SVWRKS_POSTFLUSH) == 1) {
cpu_relax(); cpu_relax();
if (time_after(jiffies, timeout)) {
printk(KERN_ERR PFX "TLB post flush took more than 3 seconds\n");
break;
}
}
writel(1, serverworks_private.registers+SVWRKS_DIRFLUSH); writel(1, serverworks_private.registers+SVWRKS_DIRFLUSH);
while(readl(serverworks_private.registers+SVWRKS_DIRFLUSH) == 1) timeout = jiffies + 3*HZ;
while (readl(serverworks_private.registers+SVWRKS_DIRFLUSH) == 1) {
cpu_relax(); cpu_relax();
if (time_after(jiffies, timeout)) {
printk(KERN_ERR PFX "TLB Dir flush took more than 3 seconds\n");
break;
}
}
} }
static int serverworks_configure(void) static int serverworks_configure(void)