diff options
| -rw-r--r-- | drivers/ata/ahci.c | 40 | ||||
| -rw-r--r-- | drivers/ata/libata-core.c | 9 | ||||
| -rw-r--r-- | drivers/ata/sata_via.c | 1 |
3 files changed, 41 insertions, 9 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index a06f5d6375a8..a3241a1a710b 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -2718,6 +2718,30 @@ static bool ahci_sb600_enable_64bit(struct pci_dev *pdev) | |||
| 2718 | }, | 2718 | }, |
| 2719 | .driver_data = "20071026", /* yyyymmdd */ | 2719 | .driver_data = "20071026", /* yyyymmdd */ |
| 2720 | }, | 2720 | }, |
| 2721 | /* | ||
| 2722 | * All BIOS versions for the MSI K9A2 Platinum (MS-7376) | ||
| 2723 | * support 64bit DMA. | ||
| 2724 | * | ||
| 2725 | * BIOS versions earlier than 1.5 had the Manufacturer DMI | ||
| 2726 | * fields as "MICRO-STAR INTERANTIONAL CO.,LTD". | ||
| 2727 | * This spelling mistake was fixed in BIOS version 1.5, so | ||
| 2728 | * 1.5 and later have the Manufacturer as | ||
| 2729 | * "MICRO-STAR INTERNATIONAL CO.,LTD". | ||
| 2730 | * So try to match on DMI_BOARD_VENDOR of "MICRO-STAR INTER". | ||
| 2731 | * | ||
| 2732 | * BIOS versions earlier than 1.9 had a Board Product Name | ||
| 2733 | * DMI field of "MS-7376". This was changed to be | ||
| 2734 | * "K9A2 Platinum (MS-7376)" in version 1.9, but we can still | ||
| 2735 | * match on DMI_BOARD_NAME of "MS-7376". | ||
| 2736 | */ | ||
| 2737 | { | ||
| 2738 | .ident = "MSI K9A2 Platinum", | ||
| 2739 | .matches = { | ||
| 2740 | DMI_MATCH(DMI_BOARD_VENDOR, | ||
| 2741 | "MICRO-STAR INTER"), | ||
| 2742 | DMI_MATCH(DMI_BOARD_NAME, "MS-7376"), | ||
| 2743 | }, | ||
| 2744 | }, | ||
| 2721 | { } | 2745 | { } |
| 2722 | }; | 2746 | }; |
| 2723 | const struct dmi_system_id *match; | 2747 | const struct dmi_system_id *match; |
| @@ -2729,18 +2753,24 @@ static bool ahci_sb600_enable_64bit(struct pci_dev *pdev) | |||
| 2729 | !match) | 2753 | !match) |
| 2730 | return false; | 2754 | return false; |
| 2731 | 2755 | ||
| 2756 | if (!match->driver_data) | ||
| 2757 | goto enable_64bit; | ||
| 2758 | |||
| 2732 | dmi_get_date(DMI_BIOS_DATE, &year, &month, &date); | 2759 | dmi_get_date(DMI_BIOS_DATE, &year, &month, &date); |
| 2733 | snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date); | 2760 | snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date); |
| 2734 | 2761 | ||
| 2735 | if (strcmp(buf, match->driver_data) >= 0) { | 2762 | if (strcmp(buf, match->driver_data) >= 0) |
| 2736 | dev_printk(KERN_WARNING, &pdev->dev, "%s: enabling 64bit DMA\n", | 2763 | goto enable_64bit; |
| 2737 | match->ident); | 2764 | else { |
| 2738 | return true; | ||
| 2739 | } else { | ||
| 2740 | dev_printk(KERN_WARNING, &pdev->dev, "%s: BIOS too old, " | 2765 | dev_printk(KERN_WARNING, &pdev->dev, "%s: BIOS too old, " |
| 2741 | "forcing 32bit DMA, update BIOS\n", match->ident); | 2766 | "forcing 32bit DMA, update BIOS\n", match->ident); |
| 2742 | return false; | 2767 | return false; |
| 2743 | } | 2768 | } |
| 2769 | |||
| 2770 | enable_64bit: | ||
| 2771 | dev_printk(KERN_WARNING, &pdev->dev, "%s: enabling 64bit DMA\n", | ||
| 2772 | match->ident); | ||
| 2773 | return true; | ||
| 2744 | } | 2774 | } |
| 2745 | 2775 | ||
| 2746 | static bool ahci_broken_system_poweroff(struct pci_dev *pdev) | 2776 | static bool ahci_broken_system_poweroff(struct pci_dev *pdev) |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index d7f0f1b1ae3e..dc72690ed5db 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -4919,10 +4919,11 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev) | |||
| 4919 | */ | 4919 | */ |
| 4920 | void ata_qc_free(struct ata_queued_cmd *qc) | 4920 | void ata_qc_free(struct ata_queued_cmd *qc) |
| 4921 | { | 4921 | { |
| 4922 | struct ata_port *ap = qc->ap; | 4922 | struct ata_port *ap; |
| 4923 | unsigned int tag; | 4923 | unsigned int tag; |
| 4924 | 4924 | ||
| 4925 | WARN_ON_ONCE(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ | 4925 | WARN_ON_ONCE(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ |
| 4926 | ap = qc->ap; | ||
| 4926 | 4927 | ||
| 4927 | qc->flags = 0; | 4928 | qc->flags = 0; |
| 4928 | tag = qc->tag; | 4929 | tag = qc->tag; |
| @@ -4934,11 +4935,13 @@ void ata_qc_free(struct ata_queued_cmd *qc) | |||
| 4934 | 4935 | ||
| 4935 | void __ata_qc_complete(struct ata_queued_cmd *qc) | 4936 | void __ata_qc_complete(struct ata_queued_cmd *qc) |
| 4936 | { | 4937 | { |
| 4937 | struct ata_port *ap = qc->ap; | 4938 | struct ata_port *ap; |
| 4938 | struct ata_link *link = qc->dev->link; | 4939 | struct ata_link *link; |
| 4939 | 4940 | ||
| 4940 | WARN_ON_ONCE(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ | 4941 | WARN_ON_ONCE(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ |
| 4941 | WARN_ON_ONCE(!(qc->flags & ATA_QCFLAG_ACTIVE)); | 4942 | WARN_ON_ONCE(!(qc->flags & ATA_QCFLAG_ACTIVE)); |
| 4943 | ap = qc->ap; | ||
| 4944 | link = qc->dev->link; | ||
| 4942 | 4945 | ||
| 4943 | if (likely(qc->flags & ATA_QCFLAG_DMAMAP)) | 4946 | if (likely(qc->flags & ATA_QCFLAG_DMAMAP)) |
| 4944 | ata_sg_clean(qc); | 4947 | ata_sg_clean(qc); |
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index bdd43c7f432e..02efd9a83d26 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c | |||
| @@ -93,7 +93,6 @@ static const struct pci_device_id svia_pci_tbl[] = { | |||
| 93 | { PCI_VDEVICE(VIA, 0x7372), vt6420 }, | 93 | { PCI_VDEVICE(VIA, 0x7372), vt6420 }, |
| 94 | { PCI_VDEVICE(VIA, 0x5287), vt8251 }, /* 2 sata chnls (Master/Slave) */ | 94 | { PCI_VDEVICE(VIA, 0x5287), vt8251 }, /* 2 sata chnls (Master/Slave) */ |
| 95 | { PCI_VDEVICE(VIA, 0x9000), vt8251 }, | 95 | { PCI_VDEVICE(VIA, 0x9000), vt8251 }, |
| 96 | { PCI_VDEVICE(VIA, 0x9040), vt8251 }, | ||
| 97 | 96 | ||
| 98 | { } /* terminate list */ | 97 | { } /* terminate list */ |
| 99 | }; | 98 | }; |
