]> err.no Git - linux-2.6/commitdiff
[SCSI] esp: Correct chip ID probing sequence.
authorDavid S. Miller <davem@sunset.davemloft.net>
Mon, 1 Oct 2007 00:10:42 +0000 (17:10 -0700)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Sat, 12 Jul 2008 13:22:30 +0000 (08:22 -0500)
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>
drivers/scsi/esp_scsi.c

index a0b6d414953dda3128acc7477827a7dcfbdd429b..3d5ad243e77fcb5927c99571c810fc843988e656 100644 (file)
@@ -219,19 +219,10 @@ static void esp_reset_esp(struct esp *esp)
        /* Now reset the ESP chip */
        scsi_esp_cmd(esp, ESP_CMD_RC);
        scsi_esp_cmd(esp, ESP_CMD_NULL | ESP_CMD_DMA);
+       if (esp->rev == FAST)
+               esp_write8(ESP_CONFIG2_FENAB, ESP_CFG2);
        scsi_esp_cmd(esp, ESP_CMD_NULL | ESP_CMD_DMA);
 
-       /* Reload the configuration registers */
-       esp_write8(esp->cfact, ESP_CFACT);
-
-       esp->prev_stp = 0;
-       esp_write8(esp->prev_stp, ESP_STP);
-
-       esp->prev_soff = 0;
-       esp_write8(esp->prev_soff, ESP_SOFF);
-
-       esp_write8(esp->neg_defp, ESP_TIMEO);
-
        /* This is the only point at which it is reliable to read
         * the ID-code for a fast ESP chip variants.
         */
@@ -316,6 +307,17 @@ static void esp_reset_esp(struct esp *esp)
                break;
        }
 
+       /* Reload the configuration registers */
+       esp_write8(esp->cfact, ESP_CFACT);
+
+       esp->prev_stp = 0;
+       esp_write8(esp->prev_stp, ESP_STP);
+
+       esp->prev_soff = 0;
+       esp_write8(esp->prev_soff, ESP_SOFF);
+
+       esp_write8(esp->neg_defp, ESP_TIMEO);
+
        /* Eat any bitrot in the chip */
        esp_read8(ESP_INTRPT);
        udelay(100);