summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2009-02-20 08:49:56 +0000
committermav <mav@FreeBSD.org>2009-02-20 08:49:56 +0000
commit0b676e2d8dacf066307947ff3bb7348bee6d86dc (patch)
treee357f5abe5552344df5e604cc86f53d5cce0df23
parent25970e49c4c8500f9265a55502d2cdb1b530d455 (diff)
downloadFreeBSD-src-0b676e2d8dacf066307947ff3bb7348bee6d86dc.zip
FreeBSD-src-0b676e2d8dacf066307947ff3bb7348bee6d86dc.tar.gz
Handle nForce MCP67 and MCP73 SATA controllers as AHCI. They report itself
as ATA RAID, but generic ATAPCI driver unable to detect drives there. AHCI driver reported to handle them fine. Linux does the same. Submitted by: Andrey V. Elsukov on stable@
-rw-r--r--sys/dev/ata/ata-pci.h24
-rw-r--r--sys/dev/ata/chipsets/ata-nvidia.c30
2 files changed, 53 insertions, 1 deletions
diff --git a/sys/dev/ata/ata-pci.h b/sys/dev/ata/ata-pci.h
index 26a4798..35de93a 100644
--- a/sys/dev/ata/ata-pci.h
+++ b/sys/dev/ata/ata-pci.h
@@ -258,8 +258,32 @@ struct ata_connect_task {
#define ATA_NFORCE_MCP61_S2 0x03f610de
#define ATA_NFORCE_MCP61_S3 0x03f710de
#define ATA_NFORCE_MCP65 0x044810de
+#define ATA_NFORCE_MCP67_A0 0x055010de
+#define ATA_NFORCE_MCP67_A1 0x055110de
+#define ATA_NFORCE_MCP67_A2 0x055210de
+#define ATA_NFORCE_MCP67_A3 0x055310de
+#define ATA_NFORCE_MCP67_A4 0x055410de
+#define ATA_NFORCE_MCP67_A5 0x055510de
+#define ATA_NFORCE_MCP67_A6 0x055610de
+#define ATA_NFORCE_MCP67_A7 0x055710de
+#define ATA_NFORCE_MCP67_A8 0x055810de
+#define ATA_NFORCE_MCP67_A9 0x055910de
+#define ATA_NFORCE_MCP67_AA 0x055A10de
+#define ATA_NFORCE_MCP67_AB 0x055B10de
#define ATA_NFORCE_MCP67 0x056010de
#define ATA_NFORCE_MCP73 0x056c10de
+#define ATA_NFORCE_MCP73_A0 0x07f010de
+#define ATA_NFORCE_MCP73_A1 0x07f110de
+#define ATA_NFORCE_MCP73_A2 0x07f210de
+#define ATA_NFORCE_MCP73_A3 0x07f310de
+#define ATA_NFORCE_MCP73_A4 0x07f410de
+#define ATA_NFORCE_MCP73_A5 0x07f510de
+#define ATA_NFORCE_MCP73_A6 0x07f610de
+#define ATA_NFORCE_MCP73_A7 0x07f710de
+#define ATA_NFORCE_MCP73_A8 0x07f810de
+#define ATA_NFORCE_MCP73_A9 0x07f910de
+#define ATA_NFORCE_MCP73_AA 0x07fa10de
+#define ATA_NFORCE_MCP73_AB 0x07fb10de
#define ATA_NFORCE_MCP77 0x075910de
#define ATA_PROMISE_ID 0x105a
diff --git a/sys/dev/ata/chipsets/ata-nvidia.c b/sys/dev/ata/chipsets/ata-nvidia.c
index bc2e11a..70c0678 100644
--- a/sys/dev/ata/chipsets/ata-nvidia.c
+++ b/sys/dev/ata/chipsets/ata-nvidia.c
@@ -61,6 +61,7 @@ static void ata_nvidia_setmode(device_t dev, int mode);
/* misc defines */
#define NV4 0x01
#define NVQ 0x02
+#define NVAHCI 0x04
/*
@@ -97,7 +98,31 @@ ata_nvidia_probe(device_t dev)
{ ATA_NFORCE_MCP61_S3, 0, NV4|NVQ, 0, ATA_SA300, "nForce MCP61" },
{ ATA_NFORCE_MCP65, 0, 0, 0, ATA_UDMA6, "nForce MCP65" },
{ ATA_NFORCE_MCP67, 0, 0, 0, ATA_UDMA6, "nForce MCP67" },
+ { ATA_NFORCE_MCP67_A0, 0, NVAHCI, 0, ATA_SA300, "nForce MCP67" },
+ { ATA_NFORCE_MCP67_A1, 0, NVAHCI, 0, ATA_SA300, "nForce MCP67" },
+ { ATA_NFORCE_MCP67_A2, 0, NVAHCI, 0, ATA_SA300, "nForce MCP67" },
+ { ATA_NFORCE_MCP67_A3, 0, NVAHCI, 0, ATA_SA300, "nForce MCP67" },
+ { ATA_NFORCE_MCP67_A4, 0, NVAHCI, 0, ATA_SA300, "nForce MCP67" },
+ { ATA_NFORCE_MCP67_A5, 0, NVAHCI, 0, ATA_SA300, "nForce MCP67" },
+ { ATA_NFORCE_MCP67_A6, 0, NVAHCI, 0, ATA_SA300, "nForce MCP67" },
+ { ATA_NFORCE_MCP67_A7, 0, NVAHCI, 0, ATA_SA300, "nForce MCP67" },
+ { ATA_NFORCE_MCP67_A8, 0, NVAHCI, 0, ATA_SA300, "nForce MCP67" },
+ { ATA_NFORCE_MCP67_A9, 0, NVAHCI, 0, ATA_SA300, "nForce MCP67" },
+ { ATA_NFORCE_MCP67_AA, 0, NVAHCI, 0, ATA_SA300, "nForce MCP67" },
+ { ATA_NFORCE_MCP67_AB, 0, NVAHCI, 0, ATA_SA300, "nForce MCP67" },
{ ATA_NFORCE_MCP73, 0, 0, 0, ATA_UDMA6, "nForce MCP73" },
+ { ATA_NFORCE_MCP73_A0, 0, NVAHCI, 0, ATA_SA300, "nForce MCP73" },
+ { ATA_NFORCE_MCP73_A1, 0, NVAHCI, 0, ATA_SA300, "nForce MCP73" },
+ { ATA_NFORCE_MCP73_A2, 0, NVAHCI, 0, ATA_SA300, "nForce MCP73" },
+ { ATA_NFORCE_MCP73_A3, 0, NVAHCI, 0, ATA_SA300, "nForce MCP73" },
+ { ATA_NFORCE_MCP73_A4, 0, NVAHCI, 0, ATA_SA300, "nForce MCP73" },
+ { ATA_NFORCE_MCP73_A5, 0, NVAHCI, 0, ATA_SA300, "nForce MCP73" },
+ { ATA_NFORCE_MCP73_A6, 0, NVAHCI, 0, ATA_SA300, "nForce MCP73" },
+ { ATA_NFORCE_MCP73_A7, 0, NVAHCI, 0, ATA_SA300, "nForce MCP73" },
+ { ATA_NFORCE_MCP73_A8, 0, NVAHCI, 0, ATA_SA300, "nForce MCP73" },
+ { ATA_NFORCE_MCP73_A9, 0, NVAHCI, 0, ATA_SA300, "nForce MCP73" },
+ { ATA_NFORCE_MCP73_AA, 0, NVAHCI, 0, ATA_SA300, "nForce MCP73" },
+ { ATA_NFORCE_MCP73_AB, 0, NVAHCI, 0, ATA_SA300, "nForce MCP73" },
{ ATA_NFORCE_MCP77, 0, 0, 0, ATA_UDMA6, "nForce MCP77" },
{ 0, 0, 0, 0, 0, 0}} ;
@@ -108,7 +133,10 @@ ata_nvidia_probe(device_t dev)
return ENXIO;
ata_set_desc(dev);
- ctlr->chipinit = ata_nvidia_chipinit;
+ if (ctlr->chip->cfg1 & NVAHCI)
+ ctlr->chipinit = ata_ahci_chipinit;
+ else
+ ctlr->chipinit = ata_nvidia_chipinit;
return 0;
}
OpenPOWER on IntegriCloud