diff options
author | Finn Thain <fthain@telegraphics.com.au> | 2009-12-04 20:30:42 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2010-01-18 11:48:10 -0500 |
commit | 02507a80b35edd720480540d917e9f92cc371009 (patch) | |
tree | 0da90f4cc680093926073f34fb9ddcb84f4a1aea /drivers/scsi/esp_scsi.c | |
parent | f2818663c82b7297ff4aa38cbddb870dc02f7104 (diff) |
[SCSI] mac_esp: fix PIO mode, take 2
The mac_esp PIO algorithm no longer works in 2.6.31 and crashes my Centris
660av. So here's a better one.
Also, force async with esp_set_offset() rather than esp_slave_configure().
One of the SCSI drives I tested still doesn't like the PIO mode and fails
with "esp: esp0: Reconnect IRQ2 timeout" (the same drive works fine in
PDMA mode).
This failure happens when esp_reconnect_with_tag() tries to read in two
tag bytes but the chip only provides one (0x20). I don't know what causes
this. I decided not to waste any more time trying to fix it because the
best solution is to rip out the PIO mode altogether and use the DMA
engine.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/esp_scsi.c')
-rw-r--r-- | drivers/scsi/esp_scsi.c | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/drivers/scsi/esp_scsi.c b/drivers/scsi/esp_scsi.c index a680e18b5f3b..e2bc779f86c1 100644 --- a/drivers/scsi/esp_scsi.c +++ b/drivers/scsi/esp_scsi.c | |||
@@ -1449,9 +1449,6 @@ static void esp_msgin_sdtr(struct esp *esp, struct esp_target_data *tp) | |||
1449 | if (offset > 15) | 1449 | if (offset > 15) |
1450 | goto do_reject; | 1450 | goto do_reject; |
1451 | 1451 | ||
1452 | if (esp->flags & ESP_FLAG_DISABLE_SYNC) | ||
1453 | offset = 0; | ||
1454 | |||
1455 | if (offset) { | 1452 | if (offset) { |
1456 | int one_clock; | 1453 | int one_clock; |
1457 | 1454 | ||
@@ -2405,12 +2402,6 @@ static int esp_slave_configure(struct scsi_device *dev) | |||
2405 | struct esp_target_data *tp = &esp->target[dev->id]; | 2402 | struct esp_target_data *tp = &esp->target[dev->id]; |
2406 | int goal_tags, queue_depth; | 2403 | int goal_tags, queue_depth; |
2407 | 2404 | ||
2408 | if (esp->flags & ESP_FLAG_DISABLE_SYNC) { | ||
2409 | /* Bypass async domain validation */ | ||
2410 | dev->ppr = 0; | ||
2411 | dev->sdtr = 0; | ||
2412 | } | ||
2413 | |||
2414 | goal_tags = 0; | 2405 | goal_tags = 0; |
2415 | 2406 | ||
2416 | if (dev->tagged_supported) { | 2407 | if (dev->tagged_supported) { |
@@ -2660,7 +2651,10 @@ static void esp_set_offset(struct scsi_target *target, int offset) | |||
2660 | struct esp *esp = shost_priv(host); | 2651 | struct esp *esp = shost_priv(host); |
2661 | struct esp_target_data *tp = &esp->target[target->id]; | 2652 | struct esp_target_data *tp = &esp->target[target->id]; |
2662 | 2653 | ||
2663 | tp->nego_goal_offset = offset; | 2654 | if (esp->flags & ESP_FLAG_DISABLE_SYNC) |
2655 | tp->nego_goal_offset = 0; | ||
2656 | else | ||
2657 | tp->nego_goal_offset = offset; | ||
2664 | tp->flags |= ESP_TGT_CHECK_NEGO; | 2658 | tp->flags |= ESP_TGT_CHECK_NEGO; |
2665 | } | 2659 | } |
2666 | 2660 | ||