ahci: disable SNotification capability for ich8
I obseved there is a sata_async_notification() for every ahci interrupt. But the async notification does nothing (this is hard disk drive and no pmp). This cause cpu wastes some time on sntf register access. It appears ICH AHCI doesn't support SNotification register, but the controller reports it does. After quirking it, the async notification disappears. PS. it appears all ICH don't support SNotification register from ICH manual, don't know if we need quirk all ICH. I don't have machines with all kinds of ICH. Signed-off-by: Shaohua Li <shaohua.li@intel.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>hifive-unleashed-5.1
parent
dae77214fa
commit
1b677afda4
|
@ -113,6 +113,7 @@ enum {
|
||||||
board_ahci_mcp65 = 6,
|
board_ahci_mcp65 = 6,
|
||||||
board_ahci_nopmp = 7,
|
board_ahci_nopmp = 7,
|
||||||
board_ahci_yesncq = 8,
|
board_ahci_yesncq = 8,
|
||||||
|
board_ahci_nosntf = 9,
|
||||||
|
|
||||||
/* global controller registers */
|
/* global controller registers */
|
||||||
HOST_CAP = 0x00, /* host capabilities */
|
HOST_CAP = 0x00, /* host capabilities */
|
||||||
|
@ -235,6 +236,7 @@ enum {
|
||||||
AHCI_HFLAG_NO_SUSPEND = (1 << 10), /* don't suspend */
|
AHCI_HFLAG_NO_SUSPEND = (1 << 10), /* don't suspend */
|
||||||
AHCI_HFLAG_SRST_TOUT_IS_OFFLINE = (1 << 11), /* treat SRST timeout as
|
AHCI_HFLAG_SRST_TOUT_IS_OFFLINE = (1 << 11), /* treat SRST timeout as
|
||||||
link offline */
|
link offline */
|
||||||
|
AHCI_HFLAG_NO_SNTF = (1 << 12), /* no sntf */
|
||||||
|
|
||||||
/* ap->flags bits */
|
/* ap->flags bits */
|
||||||
|
|
||||||
|
@ -508,7 +510,7 @@ static const struct ata_port_info ahci_port_info[] = {
|
||||||
.udma_mask = ATA_UDMA6,
|
.udma_mask = ATA_UDMA6,
|
||||||
.port_ops = &ahci_ops,
|
.port_ops = &ahci_ops,
|
||||||
},
|
},
|
||||||
/* board_ahci_yesncq */
|
[board_ahci_yesncq] =
|
||||||
{
|
{
|
||||||
AHCI_HFLAGS (AHCI_HFLAG_YES_NCQ),
|
AHCI_HFLAGS (AHCI_HFLAG_YES_NCQ),
|
||||||
.flags = AHCI_FLAG_COMMON,
|
.flags = AHCI_FLAG_COMMON,
|
||||||
|
@ -516,6 +518,14 @@ static const struct ata_port_info ahci_port_info[] = {
|
||||||
.udma_mask = ATA_UDMA6,
|
.udma_mask = ATA_UDMA6,
|
||||||
.port_ops = &ahci_ops,
|
.port_ops = &ahci_ops,
|
||||||
},
|
},
|
||||||
|
[board_ahci_nosntf] =
|
||||||
|
{
|
||||||
|
AHCI_HFLAGS (AHCI_HFLAG_NO_SNTF),
|
||||||
|
.flags = AHCI_FLAG_COMMON,
|
||||||
|
.pio_mask = ATA_PIO4,
|
||||||
|
.udma_mask = ATA_UDMA6,
|
||||||
|
.port_ops = &ahci_ops,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct pci_device_id ahci_pci_tbl[] = {
|
static const struct pci_device_id ahci_pci_tbl[] = {
|
||||||
|
@ -531,7 +541,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||||
{ PCI_VDEVICE(INTEL, 0x2683), board_ahci }, /* ESB2 */
|
{ PCI_VDEVICE(INTEL, 0x2683), board_ahci }, /* ESB2 */
|
||||||
{ PCI_VDEVICE(INTEL, 0x27c6), board_ahci }, /* ICH7-M DH */
|
{ PCI_VDEVICE(INTEL, 0x27c6), board_ahci }, /* ICH7-M DH */
|
||||||
{ PCI_VDEVICE(INTEL, 0x2821), board_ahci }, /* ICH8 */
|
{ PCI_VDEVICE(INTEL, 0x2821), board_ahci }, /* ICH8 */
|
||||||
{ PCI_VDEVICE(INTEL, 0x2822), board_ahci }, /* ICH8 */
|
{ PCI_VDEVICE(INTEL, 0x2822), board_ahci_nosntf }, /* ICH8 */
|
||||||
{ PCI_VDEVICE(INTEL, 0x2824), board_ahci }, /* ICH8 */
|
{ PCI_VDEVICE(INTEL, 0x2824), board_ahci }, /* ICH8 */
|
||||||
{ PCI_VDEVICE(INTEL, 0x2829), board_ahci }, /* ICH8M */
|
{ PCI_VDEVICE(INTEL, 0x2829), board_ahci }, /* ICH8M */
|
||||||
{ PCI_VDEVICE(INTEL, 0x282a), board_ahci }, /* ICH8M */
|
{ PCI_VDEVICE(INTEL, 0x282a), board_ahci }, /* ICH8M */
|
||||||
|
@ -849,6 +859,12 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
|
||||||
cap &= ~HOST_CAP_PMP;
|
cap &= ~HOST_CAP_PMP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((cap & HOST_CAP_SNTF) && (hpriv->flags & AHCI_HFLAG_NO_SNTF)) {
|
||||||
|
dev_printk(KERN_INFO, &pdev->dev,
|
||||||
|
"controller can't do SNTF, turning off CAP_SNTF\n");
|
||||||
|
cap &= ~HOST_CAP_SNTF;
|
||||||
|
}
|
||||||
|
|
||||||
if (pdev->vendor == PCI_VENDOR_ID_JMICRON && pdev->device == 0x2361 &&
|
if (pdev->vendor == PCI_VENDOR_ID_JMICRON && pdev->device == 0x2361 &&
|
||||||
port_map != 1) {
|
port_map != 1) {
|
||||||
dev_printk(KERN_INFO, &pdev->dev,
|
dev_printk(KERN_INFO, &pdev->dev,
|
||||||
|
|
Loading…
Reference in New Issue