|
@@ -80,6 +80,7 @@ enum {
|
|
|
board_ahci_pi = 1,
|
|
|
board_ahci_vt8251 = 2,
|
|
|
board_ahci_ign_iferr = 3,
|
|
|
+ board_ahci_sb600 = 4,
|
|
|
|
|
|
/* global controller registers */
|
|
|
HOST_CAP = 0x00, /* host capabilities */
|
|
@@ -168,6 +169,7 @@ enum {
|
|
|
AHCI_FLAG_NO_NCQ = (1 << 24),
|
|
|
AHCI_FLAG_IGN_IRQ_IF_ERR = (1 << 25), /* ignore IRQ_IF_ERR */
|
|
|
AHCI_FLAG_HONOR_PI = (1 << 26), /* honor PORTS_IMPL */
|
|
|
+ AHCI_FLAG_IGN_SERR_INTERNAL = (1 << 27), /* ignore SERR_INTERNAL */
|
|
|
};
|
|
|
|
|
|
struct ahci_cmd_hdr {
|
|
@@ -362,6 +364,18 @@ static const struct ata_port_info ahci_port_info[] = {
|
|
|
.udma_mask = 0x7f, /* udma0-6 ; FIXME */
|
|
|
.port_ops = &ahci_ops,
|
|
|
},
|
|
|
+ /* board_ahci_sb600 */
|
|
|
+ {
|
|
|
+ .sht = &ahci_sht,
|
|
|
+ .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
|
|
+ ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
|
|
|
+ ATA_FLAG_SKIP_D2H_BSY |
|
|
|
+ AHCI_FLAG_IGN_SERR_INTERNAL,
|
|
|
+ .pio_mask = 0x1f, /* pio0-4 */
|
|
|
+ .udma_mask = 0x7f, /* udma0-6 ; FIXME */
|
|
|
+ .port_ops = &ahci_ops,
|
|
|
+ },
|
|
|
+
|
|
|
};
|
|
|
|
|
|
static const struct pci_device_id ahci_pci_tbl[] = {
|
|
@@ -399,7 +413,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
|
|
PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci_ign_iferr },
|
|
|
|
|
|
/* ATI */
|
|
|
- { PCI_VDEVICE(ATI, 0x4380), board_ahci }, /* ATI SB600 non-raid */
|
|
|
+ { PCI_VDEVICE(ATI, 0x4380), board_ahci_sb600 }, /* ATI SB600 non-raid */
|
|
|
{ PCI_VDEVICE(ATI, 0x4381), board_ahci }, /* ATI SB600 raid */
|
|
|
|
|
|
/* VIA */
|
|
@@ -1067,8 +1081,11 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
|
|
|
if (ap->flags & AHCI_FLAG_IGN_IRQ_IF_ERR)
|
|
|
irq_stat &= ~PORT_IRQ_IF_ERR;
|
|
|
|
|
|
- if (irq_stat & PORT_IRQ_TF_ERR)
|
|
|
+ if (irq_stat & PORT_IRQ_TF_ERR) {
|
|
|
err_mask |= AC_ERR_DEV;
|
|
|
+ if (ap->flags & AHCI_FLAG_IGN_SERR_INTERNAL)
|
|
|
+ serror &= ~SERR_INTERNAL;
|
|
|
+ }
|
|
|
|
|
|
if (irq_stat & (PORT_IRQ_HBUS_ERR | PORT_IRQ_HBUS_DATA_ERR)) {
|
|
|
err_mask |= AC_ERR_HOST_BUS;
|