Skip to content
  • Guenter Roeck's avatar
    c2d6eeda
    esp-pci: Fix status register write erase control · c2d6eeda
    Guenter Roeck authored
    
    
    Per AM53C974 datasheet, definition of "SCSI Bus and Control (SBAC)"
    register:
    
    Bit 24 'STATUS' Write Erase Control
    
    This bit controls the Write Erase feature on bits 3:1 and bit 6 of the DMA
    Status Register ((B)+54h). When this bit is programmed to '1', the state
    of bits 3:1 are preserved when read. Bits 3:1 are only cleared when a '1'
    is written to the corresponding bit location. For example, to clear bit 1,
    the value of '0000_0010b' should be written to the register. When the DMA
    Status Preserve bit is '0', bits 3:1 are cleared when read.
    
    The status register is currently defined to bit 12, not bit 24.
    Also, its implementation is reversed: The status is auto-cleared if
    the bit is set to 1, and must be cleared explicitly when the bit is
    set to 0. This results in spurious interrupts reported by the Linux
    kernel, and in some cases even results in stalled SCSI operations.
    
    Set SBAC_STATUS to bit 24 and reverse the logic to fix the problem.
    
    Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
    Message-Id: <1543442171-24863-1-git-send-email-linux@roeck-us.net>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    c2d6eeda
    esp-pci: Fix status register write erase control
    Guenter Roeck authored
    
    
    Per AM53C974 datasheet, definition of "SCSI Bus and Control (SBAC)"
    register:
    
    Bit 24 'STATUS' Write Erase Control
    
    This bit controls the Write Erase feature on bits 3:1 and bit 6 of the DMA
    Status Register ((B)+54h). When this bit is programmed to '1', the state
    of bits 3:1 are preserved when read. Bits 3:1 are only cleared when a '1'
    is written to the corresponding bit location. For example, to clear bit 1,
    the value of '0000_0010b' should be written to the register. When the DMA
    Status Preserve bit is '0', bits 3:1 are cleared when read.
    
    The status register is currently defined to bit 12, not bit 24.
    Also, its implementation is reversed: The status is auto-cleared if
    the bit is set to 1, and must be cleared explicitly when the bit is
    set to 0. This results in spurious interrupts reported by the Linux
    kernel, and in some cases even results in stalled SCSI operations.
    
    Set SBAC_STATUS to bit 24 and reverse the logic to fix the problem.
    
    Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
    Message-Id: <1543442171-24863-1-git-send-email-linux@roeck-us.net>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Loading