diff options
| author | Dave Jones <davej@redhat.com> | 2005-09-23 18:59:37 -0400 |
|---|---|---|
| committer | Dave Jones <davej@redhat.com> | 2005-09-23 18:59:37 -0400 |
| commit | 0ff541dafdcb9bc8933e7e4881e5924a408b5335 (patch) | |
| tree | 8467dffd0c09b5a32085b72a4a348af5adafa62d | |
| parent | 32a3658533c6f4c6bf370dd730213e802464ef9b (diff) | |
[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>
| -rw-r--r-- | drivers/char/agp/sworks-agp.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/char/agp/sworks-agp.c b/drivers/char/agp/sworks-agp.c index a9fb12c20eb7..53968973f890 100644 --- a/drivers/char/agp/sworks-agp.c +++ b/drivers/char/agp/sworks-agp.c | |||
| @@ -242,13 +242,27 @@ static int serverworks_fetch_size(void) | |||
| 242 | */ | 242 | */ |
| 243 | static void serverworks_tlbflush(struct agp_memory *temp) | 243 | static void serverworks_tlbflush(struct agp_memory *temp) |
| 244 | { | 244 | { |
| 245 | unsigned long timeout; | ||
| 246 | |||
| 245 | writeb(1, serverworks_private.registers+SVWRKS_POSTFLUSH); | 247 | writeb(1, serverworks_private.registers+SVWRKS_POSTFLUSH); |
| 246 | while (readb(serverworks_private.registers+SVWRKS_POSTFLUSH) == 1) | 248 | timeout = jiffies + 3*HZ; |
| 249 | while (readb(serverworks_private.registers+SVWRKS_POSTFLUSH) == 1) { | ||
| 247 | cpu_relax(); | 250 | cpu_relax(); |
| 251 | if (time_after(jiffies, timeout)) { | ||
| 252 | printk(KERN_ERR PFX "TLB post flush took more than 3 seconds\n"); | ||
| 253 | break; | ||
| 254 | } | ||
| 255 | } | ||
| 248 | 256 | ||
| 249 | writel(1, serverworks_private.registers+SVWRKS_DIRFLUSH); | 257 | writel(1, serverworks_private.registers+SVWRKS_DIRFLUSH); |
| 250 | while(readl(serverworks_private.registers+SVWRKS_DIRFLUSH) == 1) | 258 | timeout = jiffies + 3*HZ; |
| 259 | while (readl(serverworks_private.registers+SVWRKS_DIRFLUSH) == 1) { | ||
| 251 | cpu_relax(); | 260 | cpu_relax(); |
| 261 | if (time_after(jiffies, timeout)) { | ||
| 262 | printk(KERN_ERR PFX "TLB Dir flush took more than 3 seconds\n"); | ||
| 263 | break; | ||
| 264 | } | ||
| 265 | } | ||
| 252 | } | 266 | } |
| 253 | 267 | ||
| 254 | static int serverworks_configure(void) | 268 | static int serverworks_configure(void) |
