diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2007-09-30 20:10:42 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-07-12 09:22:30 -0400 |
commit | a793804f25fb2c0fe2b784450092699ea3475332 (patch) | |
tree | dac36e68129d2d903cba1353f74d3aa9a38fce59 /drivers | |
parent | eac6e8e449647cbb9efee53977c8bfee0aa7d69e (diff) |
[SCSI] esp: Correct chip ID probing sequence.
The features enable bit has to be set in the config2 register
before we can be absolutely sure we will probe a correct
part unique ID and family code from the transfer-count-high
register.
Also, reload the CFACT, STP, SOFF, and TIMEO near the end of
esp_reset_esp().
From a patch by Maciej W. Rozycki.
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/esp_scsi.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/scsi/esp_scsi.c b/drivers/scsi/esp_scsi.c index a0b6d414953d..3d5ad243e77f 100644 --- a/drivers/scsi/esp_scsi.c +++ b/drivers/scsi/esp_scsi.c | |||
@@ -219,19 +219,10 @@ static void esp_reset_esp(struct esp *esp) | |||
219 | /* Now reset the ESP chip */ | 219 | /* Now reset the ESP chip */ |
220 | scsi_esp_cmd(esp, ESP_CMD_RC); | 220 | scsi_esp_cmd(esp, ESP_CMD_RC); |
221 | scsi_esp_cmd(esp, ESP_CMD_NULL | ESP_CMD_DMA); | 221 | scsi_esp_cmd(esp, ESP_CMD_NULL | ESP_CMD_DMA); |
222 | if (esp->rev == FAST) | ||
223 | esp_write8(ESP_CONFIG2_FENAB, ESP_CFG2); | ||
222 | scsi_esp_cmd(esp, ESP_CMD_NULL | ESP_CMD_DMA); | 224 | scsi_esp_cmd(esp, ESP_CMD_NULL | ESP_CMD_DMA); |
223 | 225 | ||
224 | /* Reload the configuration registers */ | ||
225 | esp_write8(esp->cfact, ESP_CFACT); | ||
226 | |||
227 | esp->prev_stp = 0; | ||
228 | esp_write8(esp->prev_stp, ESP_STP); | ||
229 | |||
230 | esp->prev_soff = 0; | ||
231 | esp_write8(esp->prev_soff, ESP_SOFF); | ||
232 | |||
233 | esp_write8(esp->neg_defp, ESP_TIMEO); | ||
234 | |||
235 | /* This is the only point at which it is reliable to read | 226 | /* This is the only point at which it is reliable to read |
236 | * the ID-code for a fast ESP chip variants. | 227 | * the ID-code for a fast ESP chip variants. |
237 | */ | 228 | */ |
@@ -316,6 +307,17 @@ static void esp_reset_esp(struct esp *esp) | |||
316 | break; | 307 | break; |
317 | } | 308 | } |
318 | 309 | ||
310 | /* Reload the configuration registers */ | ||
311 | esp_write8(esp->cfact, ESP_CFACT); | ||
312 | |||
313 | esp->prev_stp = 0; | ||
314 | esp_write8(esp->prev_stp, ESP_STP); | ||
315 | |||
316 | esp->prev_soff = 0; | ||
317 | esp_write8(esp->prev_soff, ESP_SOFF); | ||
318 | |||
319 | esp_write8(esp->neg_defp, ESP_TIMEO); | ||
320 | |||
319 | /* Eat any bitrot in the chip */ | 321 | /* Eat any bitrot in the chip */ |
320 | esp_read8(ESP_INTRPT); | 322 | esp_read8(ESP_INTRPT); |
321 | udelay(100); | 323 | udelay(100); |