diff options
author | Hannes Reinecke <hare@suse.de> | 2014-11-24 15:37:23 +0100 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2014-11-24 16:10:24 +0100 |
commit | 9535fff3c5f9382b46f656c46a80bc190645dd32 (patch) | |
tree | 958780776ed5f164ad854d9fc7daf38b934fe6b9 /drivers/scsi | |
parent | 1af6f60368b3f5be6a89350ccd23e218120fd3d1 (diff) |
esp_scsi: read status registers
A read to ESP_INTRPT will clear ESP_STATUS and ESP_SSTEP. So read
all status registers in one go to avoid losing information.
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/esp_scsi.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/scsi/esp_scsi.c b/drivers/scsi/esp_scsi.c index 800ff3ea501d..7ebf2c7d17a4 100644 --- a/drivers/scsi/esp_scsi.c +++ b/drivers/scsi/esp_scsi.c @@ -982,7 +982,6 @@ static int esp_check_spur_intr(struct esp *esp) default: if (!(esp->sreg & ESP_STAT_INTR)) { - esp->ireg = esp_read8(ESP_INTRPT); if (esp->ireg & ESP_INTR_SR) return 1; @@ -2056,7 +2055,12 @@ static void __esp_interrupt(struct esp *esp) int finish_reset, intr_done; u8 phase; + /* + * Once INTRPT is read STATUS and SSTEP are cleared. + */ esp->sreg = esp_read8(ESP_STATUS); + esp->seqreg = esp_read8(ESP_SSTEP); + esp->ireg = esp_read8(ESP_INTRPT); if (esp->flags & ESP_FLAG_RESETTING) { finish_reset = 1; @@ -2069,8 +2073,6 @@ static void __esp_interrupt(struct esp *esp) return; } - esp->ireg = esp_read8(ESP_INTRPT); - if (esp->ireg & ESP_INTR_SR) finish_reset = 1; |