Synchronize various changes from FreeBSD. This is not exhaustive but gets
authorMatthew Dillon <dillon@dragonflybsd.org>
Mon, 24 Mar 2008 06:41:56 +0000 (06:41 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Mon, 24 Mar 2008 06:41:56 +0000 (06:41 +0000)
the most important patches.

* Better AHCI detection and reporting.
* More robust AHCI chipinit.
* Fixes for additional chipsets which do not support 64K DMA transfers
* VIA8237S support
* Hitachi detection logic.
* Vendor identification for otherwise unidentified chipsets.
* keep ivars intact on atapi-cd reinit.

sys/dev/disk/nata/ata-all.c
sys/dev/disk/nata/ata-all.h
sys/dev/disk/nata/ata-chipset.c
sys/dev/disk/nata/ata-disk.c
sys/dev/disk/nata/ata-pci.c
sys/dev/disk/nata/ata-pci.h
sys/dev/disk/nata/atapi-cd.c

index 40b1bf6..50d6622 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ata/ata-all.c,v 1.279 2007/02/23 16:25:08 jhb Exp $
- * $DragonFly: src/sys/dev/disk/nata/ata-all.c,v 1.13 2007/10/29 12:56:45 tgen Exp $
+ * $DragonFly: src/sys/dev/disk/nata/ata-all.c,v 1.14 2008/03/24 06:41:56 dillon Exp $
  */
 
 #include "opt_ata.h"
@@ -743,7 +743,7 @@ ata_modify_if_48bit(struct ata_request *request)
 
     atadev->flags &= ~ATA_D_48BIT_ACTIVE;
 
-    if ((request->u.ata.lba >= ATA_MAX_28BIT_LBA ||
+    if ((request->u.ata.lba + request->u.ata.count >= ATA_MAX_28BIT_LBA ||
         request->u.ata.count > 256) &&
        atadev->param.support.command2 & ATA_SUPPORT_ADDRESS48) {
 
index 0a31a2b..19ece9e 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ata/ata-all.h,v 1.123 2007/04/08 19:18:51 sos Exp $
- * $DragonFly: src/sys/dev/disk/nata/ata-all.h,v 1.8 2007/07/23 19:26:09 dillon Exp $
+ * $DragonFly: src/sys/dev/disk/nata/ata-all.h,v 1.9 2008/03/24 06:41:56 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -310,6 +310,7 @@ struct ata_ahci_cmd_list {
 #define ATA_DEV(device)                 ((device == ATA_MASTER) ? 0 : 1)
 #define ATA_CFA_MAGIC1                  0x844A
 #define ATA_CFA_MAGIC2                  0x848A
+#define ATA_CFA_MAGIC3                  0x8400
 #define ATAPI_MAGIC_LSB                 0x14
 #define ATAPI_MAGIC_MSB                 0xeb
 #define ATAPI_P_READ                    (ATA_S_DRQ | ATA_I_IN)
index 0ea2a06..82877db 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.196 2007/04/08 19:18:51 sos Exp $
- * $DragonFly: src/sys/dev/disk/nata/ata-chipset.c,v 1.12 2008/01/01 12:16:40 swildner Exp $
+ * $DragonFly: src/sys/dev/disk/nata/ata-chipset.c,v 1.13 2008/03/24 06:41:56 dillon Exp $
  */
 
 #include "opt_ata.h"
@@ -75,7 +75,6 @@ static void ata_ahci_reset(device_t dev);
 static void ata_ahci_dmasetprd(void *xsc, bus_dma_segment_t *segs, int nsegs, int error);
 static void ata_ahci_dmainit(device_t dev);
 static int ata_ahci_setup_fis(struct ata_ahci_cmd_tab *ctp, struct ata_request *request);
-static int ata_genahci_chipinit(device_t dev);
 static int ata_acard_chipinit(device_t dev);
 static int ata_acard_allocate(device_t dev);
 static int ata_acard_status(device_t dev);
@@ -199,8 +198,11 @@ int
 ata_generic_ident(device_t dev)
 {
     struct ata_pci_controller *ctlr = device_get_softc(dev);
+    char buffer[64];
 
-    device_set_desc(dev, "GENERIC ATA controller");
+    ksnprintf(buffer, sizeof(buffer),
+             "%s ATA controller", ata_pcivendor2str(dev));
+    device_set_desc_copy(dev, buffer);
     ctlr->chipinit = ata_generic_chipinit;
     return 0;
 }
@@ -453,16 +455,44 @@ ata_request2fis_h2d(struct ata_request *request, u_int8_t *fis)
 /*
  * AHCI v1.x compliant SATA chipset support functions
  */
-static int
+int
+ata_ahci_ident(device_t dev)
+{
+    struct ata_pci_controller *ctlr = device_get_softc(dev);
+    static struct ata_chip_id id = {0, 0, 0, 0x00, ATA_SA300, "AHCI"};
+    char buffer[64];
+
+    if (pci_read_config(dev, PCIR_PROGIF, 1) != PCIP_STORAGE_SATA_AHCI_1_0)
+       return ENXIO;
+
+    if (bootverbose)
+       ksnprintf(buffer, sizeof(buffer), "%s (ID=%08x) AHCI controller",
+                 ata_pcivendor2str(dev), pci_get_devid(dev));
+    else
+       ksnprintf(buffer, sizeof(buffer), "%s AHCI controller",
+                 ata_pcivendor2str(dev));
+    device_set_desc_copy(dev, buffer);
+    ctlr->chip = &id;
+    ctlr->chipinit = ata_ahci_chipinit;
+    return 0;
+}
+
+
+/*
+ * AHCI v1.x compliant SATA chipset support functions
+ */
+int
 ata_ahci_chipinit(device_t dev)
 {
     struct ata_pci_controller *ctlr = device_get_softc(dev);
     u_int32_t version;
     int unit;
 
+    /* enable AHCI mode */
+    ATA_OUTL(ctlr->r_res2, ATA_AHCI_GHC, ATA_AHCI_GHC_AE);
+
     /* reset AHCI controller */
-    ATA_OUTL(ctlr->r_res2, ATA_AHCI_GHC,
-            ATA_INL(ctlr->r_res2, ATA_AHCI_GHC) | ATA_AHCI_GHC_HR);
+    ATA_OUTL(ctlr->r_res2, ATA_AHCI_GHC, ATA_AHCI_GHC_HR);
     DELAY(1000000);
     if (ATA_INL(ctlr->r_res2, ATA_AHCI_GHC) & ATA_AHCI_GHC_HR) {
        bus_release_resource(dev, ctlr->r_type2, ctlr->r_rid2, ctlr->r_res2);
@@ -470,9 +500,8 @@ ata_ahci_chipinit(device_t dev)
        return ENXIO;
     }
 
-    /* enable AHCI mode */
-    ATA_OUTL(ctlr->r_res2, ATA_AHCI_GHC,
-            ATA_INL(ctlr->r_res2, ATA_AHCI_GHC) | ATA_AHCI_GHC_AE);
+    /* reenable AHCI mode */
+    ATA_OUTL(ctlr->r_res2, ATA_AHCI_GHC, ATA_AHCI_GHC_AE);
 
     /* get the number of HW channels */
     ctlr->channels =
@@ -860,45 +889,6 @@ ata_ahci_setup_fis(struct ata_ahci_cmd_tab *ctp, struct ata_request *request)
     return ata_request2fis_h2d(request, &ctp->cfis[0]);
 }
 
-/*
- * Generic AHCI part support functions.
- */
-int
-ata_genahci_ident(device_t dev)
-{
-    struct ata_pci_controller *ctlr = device_get_softc(dev);
-    static struct ata_chip_id id = {0, 0, 0, 0x00, ATA_SA300, "AHCI"};
-    char buffer[64];
-
-    if(!(pci_read_config(dev, PCIR_PROGIF, 1) == PCIP_STORAGE_SATA_AHCI)) {
-       return ENXIO;
-    }
-
-    ksprintf(buffer, "GENERIC %s %s controller", id.text, ata_mode2str(id.max_dma));
-    device_set_desc_copy(dev, buffer);
-    ctlr->chip = &id;
-    ctlr->chipinit = ata_genahci_chipinit;
-    return 0;
-}
-
-static int
-ata_genahci_chipinit(device_t dev)
-{
-    struct ata_pci_controller *ctlr = device_get_softc(dev);
-
-    if (ata_setup_interrupt(dev))
-       return ENXIO;
-
-    /* Check if the chip has PCI BAR 5 as memory resource. */
-    ctlr->r_type2 = SYS_RES_MEMORY;
-    ctlr->r_rid2 = PCIR_BAR(5);        /* 0x24 */
-    if ((ctlr->r_res2 = bus_alloc_resource_any(dev, ctlr->r_type2,
-                                              &ctlr->r_rid2, RF_ACTIVE))) {
-       return ata_ahci_chipinit(dev);
-    } else
-       return ENXIO;
-}
-
 /*
  * Acard chipset support functions
  */
@@ -1405,7 +1395,7 @@ ata_ati_chipinit(device_t dev)
     if (ctlr->chip->cfg1 & ATIAHCI) {
        /* Check if the chip is configured as an AHCI part. */
        if ((pci_get_subclass(dev) == PCIS_STORAGE_SATA) &&
-           (pci_read_config(dev, PCIR_PROGIF, 1) == PCIP_STORAGE_SATA_AHCI)) {
+           (pci_read_config(dev, PCIR_PROGIF, 1) == PCIP_STORAGE_SATA_AHCI_1_0)) {
            /* Check if the chip has PCI BAR 5 as memory resource. */
            ctlr->r_type2 = SYS_RES_MEMORY;
            ctlr->r_rid2 = PCIR_BAR(5); /* 0x24 */
@@ -3025,6 +3015,9 @@ ata_marvell_edma_dmainit(device_t dev)
 
        if (ATA_INL(ctlr->r_res1, 0x00d00) & 0x00000004)
            ch->dma->max_address = BUS_SPACE_MAXADDR;
+
+       /* chip does not reliably do 64K DMA transfers */
+       ch->dma->max_iosize = 126 * DEV_BSIZE;
     }
 }
 
@@ -4385,6 +4378,11 @@ ata_serverworks_allocate(device_t dev)
 
     ch->flags |= ATA_NO_SLAVE;
     ata_pci_hw(dev);
+
+    /* chip does not reliably do 64K DMA transfers */
+    if (ch->dma)
+       ch->dma->max_iosize = 126 * DEV_BSIZE;
+
     return 0;
 }
 
@@ -5379,6 +5377,7 @@ ata_via_ident(device_t dev)
      { ATA_VIA6420,   0x00, 7,      0x00,    ATA_SA150, "6420" },
      { ATA_VIA6421,   0x00, 6,      VIABAR,  ATA_SA150, "6421" },
      { ATA_VIA8237A,  0x00, 7,      0x00,    ATA_SA150, "8237A" },
+     { ATA_VIA8237S,  0x00, 7,      0x00,    ATA_SA150, "8237S" },
      { ATA_VIA8251,   0x00, 0,      VIAAHCI, ATA_SA300, "8251" },
      { 0, 0, 0, 0, 0, 0 }};
     char buffer[64];
@@ -5496,7 +5495,7 @@ ata_via_allocate(device_t dev)
            ch->r_io[i].offset = (i - ATA_BMCMD_PORT)+(ch->unit * ATA_BMIOSIZE);
        }
        ata_pci_hw(dev);
-       if (ch->unit > 1)
+       if (ch->unit >= 2)
            return 0;
     }
     else {
@@ -5556,7 +5555,7 @@ ata_via_setmode(device_t dev, int mode)
            pci_write_config(gparent, 0xab, pio_timings[ata_mode2idx(mode)], 1);
            if (mode >= ATA_UDMA0)
                pci_write_config(gparent, 0xb3,
-           dma_timings[mode & ATA_MODE_MASK], 1);
+                                dma_timings[mode & ATA_MODE_MASK], 1);
            atadev->mode = mode;
        }
     }
index f481a2f..7b1a9d4 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ata/ata-disk.c,v 1.199 2006/09/14 19:12:29 sos Exp $
- * $DragonFly: src/sys/dev/disk/nata/ata-disk.c,v 1.6 2007/06/05 18:30:40 swildner Exp $
+ * $DragonFly: src/sys/dev/disk/nata/ata-disk.c,v 1.7 2008/03/24 06:41:56 dillon Exp $
  */
 
 #include "opt_ata.h"
@@ -83,7 +83,8 @@ ad_probe(device_t dev)
 
     if (!(atadev->param.config & ATA_PROTO_ATAPI) ||
        (atadev->param.config == ATA_CFA_MAGIC1) ||
-       (atadev->param.config == ATA_CFA_MAGIC2))
+       (atadev->param.config == ATA_CFA_MAGIC2) ||
+       (atadev->param.config == ATA_CFA_MAGIC3))
        return 0;
     else
        return ENXIO;
@@ -486,6 +487,8 @@ ad_describe(device_t dev)
     else {
        if (!strncmp(atadev->param.model, "ST", 2))
            strcpy(vendor, "Seagate ");
+       else if (!strncmp(atadev->param.model, "HDS", 3))
+           strcpy(vendor, "Hitachi ");
        else
            strcpy(vendor, "");
        strncpy(product, atadev->param.model, 40);
index 09f9d04..3bd12a8 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ata/ata-pci.c,v 1.121 2007/02/23 12:18:33 piso Exp $
- * $DragonFly: src/sys/dev/disk/nata/ata-pci.c,v 1.8 2007/12/09 22:32:16 tgen Exp $
+ * $DragonFly: src/sys/dev/disk/nata/ata-pci.c,v 1.9 2008/03/24 06:41:56 dillon Exp $
  */
 
 #include "opt_ata.h"
@@ -73,8 +73,8 @@ ata_legacy(device_t dev)
            (!pci_read_config(dev, PCIR_BAR(0), 4) &&
             !pci_read_config(dev, PCIR_BAR(1), 4) &&
             !pci_read_config(dev, PCIR_BAR(2), 4) &&
-            !pci_read_config(dev, PCIR_BAR(3), 4)));
-
+            !pci_read_config(dev, PCIR_BAR(3), 4) &&
+            !pci_read_config(dev, PCIR_BAR(5), 4)));
 }
 
 int
@@ -83,6 +83,13 @@ ata_pci_probe(device_t dev)
     if (pci_get_class(dev) != PCIC_STORAGE)
        return ENXIO;
 
+    /* if this is an AHCI chipset grab it */
+    if (pci_get_subclass(dev) == PCIS_STORAGE_SATA) {
+       if (!ata_ahci_ident(dev))
+           return ATA_PROBE_OK;
+    }
+
+    /* run through the vendor specific drivers */
     switch (pci_get_vendor(dev)) {
     case ATA_ACARD_ID: 
        if (!ata_acard_ident(dev))
@@ -179,27 +186,9 @@ ata_pci_probe(device_t dev)
     }
 
     /* unknown chipset, try generic AHCI or DMA if it seems possible */
-    if (pci_get_class(dev) == PCIC_STORAGE) {
-       if (pci_get_subclass(dev) == PCIS_STORAGE_SATA) {
-           if (!ata_genahci_ident(dev))
-               return ATA_PROBE_OK;
-       } else if (pci_get_subclass(dev) == PCIS_STORAGE_IDE) {
-           uint16_t vendor, device, subvendor, subdevice;
-           const struct none_atapci *e;
-
-           vendor = pci_get_vendor(dev);
-           device = pci_get_device(dev);
-           subvendor = pci_get_subvendor(dev);
-           subdevice = pci_get_subdevice(dev);
-           for (e = none_atapci_table; e->vendor != 0xffff; ++e) {
-               if (e->vendor == vendor && e->device == device &&
-                   e->subvendor == subvendor && e->subdevice == subdevice)
-                   return ENXIO;
-           }
-
-           if (!ata_generic_ident(dev))
-               return ATA_PROBE_OK;
-       }
+    if (pci_get_subclass(dev) == PCIS_STORAGE_IDE) {
+       if (!ata_generic_ident(dev))
+           return ATA_PROBE_OK;
     }
     return ENXIO;
 }
@@ -540,6 +529,35 @@ ata_pci_dmainit(device_t dev)
     }
 }
 
+char *
+ata_pcivendor2str(device_t dev)
+{
+    switch (pci_get_vendor(dev)) {
+    case ATA_ACARD_ID:         return "Acard";
+    case ATA_ACER_LABS_ID:     return "AcerLabs";
+    case ATA_AMD_ID:           return "AMD";
+    case ATA_ATI_ID:           return "ATI";
+    case ATA_CYRIX_ID:         return "Cyrix";
+    case ATA_CYPRESS_ID:       return "Cypress";
+    case ATA_HIGHPOINT_ID:     return "HighPoint";
+    case ATA_INTEL_ID:         return "Intel";
+    case ATA_ITE_ID:           return "ITE";
+    case ATA_JMICRON_ID:       return "JMicron";
+    case ATA_MARVELL_ID:       return "Marvell";
+    case ATA_NATIONAL_ID:      return "National";
+    case ATA_NETCELL_ID:       return "Netcell";
+    case ATA_NVIDIA_ID:                return "nVidia";
+    case ATA_PROMISE_ID:       return "Promise";
+    case ATA_SERVERWORKS_ID:   return "ServerWorks";
+    case ATA_SILICON_IMAGE_ID: return "SiI";
+    case ATA_SIS_ID:           return "SiS";
+    case ATA_VIA_ID:           return "VIA";
+    case ATA_CENATEK_ID:       return "Cenatek";
+    case ATA_MICRON_ID:                return "Micron";
+    default:                   return "Generic";
+    }
+}
+
 static device_method_t ata_pci_methods[] = {
     /* device interface */
     DEVMETHOD(device_probe,             ata_pci_probe),
index b4af1a5..6b3580a 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ata/ata-pci.h,v 1.76 2007/03/09 22:23:39 sos Exp $
- * $DragonFly: src/sys/dev/disk/nata/ata-pci.h,v 1.7 2008/01/01 12:16:40 swildner Exp $
+ * $DragonFly: src/sys/dev/disk/nata/ata-pci.h,v 1.8 2008/03/24 06:41:56 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -364,6 +364,7 @@ struct ata_connect_task {
 #define ATA_VIA8235             0x31771106
 #define ATA_VIA8237             0x32271106
 #define ATA_VIA8237A           0x05911106
+#define ATA_VIA8237S           0x53371106
 #define ATA_VIA8251             0x33491106
 #define ATA_VIA8361             0x31121106
 #define ATA_VIA8363             0x03051106
@@ -455,10 +456,11 @@ int ata_pci_allocate(device_t dev);
 void ata_pci_hw(device_t dev);
 int ata_pci_status(device_t dev);
 void ata_pci_dmainit(device_t);
+char *ata_pcivendor2str(device_t dev);
 
 /* global prototypes ata-chipset.c */
 int ata_generic_ident(device_t);
-int ata_genahci_ident(device_t);
+int ata_ahci_ident(device_t);
 int ata_acard_ident(device_t);
 int ata_ali_ident(device_t);
 int ata_amd_ident(device_t);
index 9a6d955..5451237 100644 (file)
@@ -23,8 +23,8 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/ata/atapi-cd.c,v 1.189 2006/06/28 15:04:10 sos Exp $
- * $DragonFly: src/sys/dev/disk/nata/atapi-cd.c,v 1.10 2008/01/18 13:53:46 matthias Exp $
+ * $FreeBSD: src/sys/dev/ata/atapi-cd.c,v 1.196 2007/11/19 21:11:26 sos Exp $
+ * $DragonFly: src/sys/dev/disk/nata/atapi-cd.c,v 1.11 2008/03/24 06:41:56 dillon Exp $
  */
 
 #include "opt_ata.h"
@@ -206,12 +206,9 @@ acd_reinit(device_t dev)
 {
     struct ata_channel *ch = device_get_softc(device_get_parent(dev));
     struct ata_device *atadev = device_get_softc(dev);
-    struct acd_softc *cdp = device_get_ivars(dev);
 
     if (((atadev->unit == ATA_MASTER) && !(ch->devices & ATA_ATAPI_MASTER)) ||
        ((atadev->unit == ATA_SLAVE) && !(ch->devices & ATA_ATAPI_SLAVE))) {
-       device_set_ivars(dev, NULL);
-       kfree(cdp, M_ACD);
        return 1;   
     }
     ATA_SETMODE(device_get_parent(dev), dev);