diff options
author | Dimitri Sivanich <sivanich@sgi.com> | 2011-05-06 11:33:44 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2011-05-26 20:11:24 -0400 |
commit | 19d78a61be6dd707dcec298c486303d4ba2c840a (patch) | |
tree | 57c0bc50540ec0f49b7b972f14cee51bc4f22e60 /drivers/dma | |
parent | 5dbd05d46fb7d849570c8fa09d48591aa7ce1766 (diff) |
x86: poll waiting for I/OAT DMA channel status
For certain system configurations a 5 usec udelay before checking I/OAT DMA
channel status is sometimes not sufficient, resulting in a false failure
status and unnecessary freeing of channel resources. Conversely, for many
configurations 5 usec is longer than necessary.
Loop for up to 20 usec waiting for successful status before failing.
Signed-off-by: Dimitri Sivanich <sivanich@sgi.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/dma')
-rw-r--r-- | drivers/dma/ioat/dma_v2.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/dma/ioat/dma_v2.c b/drivers/dma/ioat/dma_v2.c index effd140fc042..54d1a3c24e9c 100644 --- a/drivers/dma/ioat/dma_v2.c +++ b/drivers/dma/ioat/dma_v2.c | |||
@@ -507,6 +507,7 @@ int ioat2_alloc_chan_resources(struct dma_chan *c) | |||
507 | struct ioat_ring_ent **ring; | 507 | struct ioat_ring_ent **ring; |
508 | u64 status; | 508 | u64 status; |
509 | int order; | 509 | int order; |
510 | int i = 0; | ||
510 | 511 | ||
511 | /* have we already been set up? */ | 512 | /* have we already been set up? */ |
512 | if (ioat->ring) | 513 | if (ioat->ring) |
@@ -547,8 +548,11 @@ int ioat2_alloc_chan_resources(struct dma_chan *c) | |||
547 | ioat2_start_null_desc(ioat); | 548 | ioat2_start_null_desc(ioat); |
548 | 549 | ||
549 | /* check that we got off the ground */ | 550 | /* check that we got off the ground */ |
550 | udelay(5); | 551 | do { |
551 | status = ioat_chansts(chan); | 552 | udelay(1); |
553 | status = ioat_chansts(chan); | ||
554 | } while (i++ < 20 && !is_ioat_active(status) && !is_ioat_idle(status)); | ||
555 | |||
552 | if (is_ioat_active(status) || is_ioat_idle(status)) { | 556 | if (is_ioat_active(status) || is_ioat_idle(status)) { |
553 | set_bit(IOAT_RUN, &chan->state); | 557 | set_bit(IOAT_RUN, &chan->state); |
554 | return 1 << ioat->alloc_order; | 558 | return 1 << ioat->alloc_order; |