From: Prarit Bhargava <prarit@redhat.com> Subject: [RHEL5.1 PATCH] BZ 238570: Fix bogus warnings from SB600 DVD drive Date: Mon, 7 May 2007 12:06:29 -0400 Bugzilla: 238570 Message-Id: <20070507160629.5615.43450.sendpatchset@prarit.boston.redhat.com> Changelog: [scsi] Fix bogus warnings from SB600 DVD drive Backport of http://lkml.org/lkml/2007/4/11/356 One minor change made to ahci board enumeration (upstream board_ahci_sb600 has a value of 4). Resolves BZ 238570. Successfully tested by me on HP5750 (which has an SB600 DVD). diff -urNp -X linux-2.6.18.x86_64/Documentation/dontdiff linux-2.6.18.x86_64.orig/drivers/scsi/ahci.c linux-2.6.18.x86_64/drivers/scsi/ahci.c --- linux-2.6.18.x86_64.orig/drivers/scsi/ahci.c 2007-05-07 06:47:57.000000000 -0400 +++ linux-2.6.18.x86_64/drivers/scsi/ahci.c 2007-05-07 06:38:07.000000000 -0400 @@ -78,6 +78,7 @@ enum { board_ahci = 0, board_ahci_vt8251 = 1, + board_ahci_sb600 = 2, /* global controller registers */ HOST_CAP = 0x00, /* host capabilities */ @@ -168,6 +169,7 @@ enum { /* ap->flags bits */ AHCI_FLAG_RESET_NEEDS_CLO = (1 << 24), AHCI_FLAG_NO_NCQ = (1 << 25), + AHCI_FLAG_IGN_SERR_INTERNAL = (1 << 27), /* ignore SERR_INTERNAL */ }; struct ahci_cmd_hdr { @@ -295,6 +297,18 @@ static const struct ata_port_info ahci_p .udma_mask = 0x7f, /* udma0-6 ; FIXME */ .port_ops = &ahci_ops, }, + /* board_ahci_sb600 */ + { + .sht = &ahci_sht, + .host_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[] = { @@ -368,7 +382,7 @@ static const struct pci_device_id ahci_p /* ATI */ { PCI_VENDOR_ID_ATI, 0x4380, PCI_ANY_ID, PCI_ANY_ID, 0, 0, - board_ahci }, /* ATI SB600 non-raid */ + board_ahci_sb600 }, /* ATI SB600 non-raid */ { PCI_VENDOR_ID_ATI, 0x4381, PCI_ANY_ID, PCI_ANY_ID, 0, 0, board_ahci }, /* ATI SB600 raid */ @@ -1013,8 +1027,11 @@ static void ahci_error_intr(struct ata_p /* analyze @irq_stat */ ata_ehi_push_desc(ehi, "irq_stat 0x%08x", irq_stat); - 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;