Esempio n. 1
0
/*
 * generic PCI ATA device probe
 */
int
ata_pci_probe(device_t dev)
{
    if (resource_disabled("atapci", device_get_unit(dev)))
	 return (ENXIO);

    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))
	    return ATA_PROBE_OK;
	break;
    case ATA_ACER_LABS_ID:
	if (!ata_ali_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_ADAPTEC_ID:
	if (!ata_adaptec_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_AMD_ID:
	if (!ata_amd_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_ATI_ID:
	if (!ata_ati_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_CYRIX_ID:
	if (!ata_cyrix_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_CYPRESS_ID:
	if (!ata_cypress_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_HIGHPOINT_ID:
	if (!ata_highpoint_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_INTEL_ID:
	if (!ata_intel_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_ITE_ID:
	if (!ata_ite_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_JMICRON_ID:
	if (!ata_jmicron_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_MARVELL_ID:
	if (!ata_marvell_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_NATIONAL_ID:
	if (!ata_national_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_NETCELL_ID:
	if (!ata_netcell_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_NVIDIA_ID:
	if (!ata_nvidia_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_PROMISE_ID:
	if (!ata_promise_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_SERVERWORKS_ID:
	if (!ata_serverworks_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_SILICON_IMAGE_ID:
	if (!ata_sii_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_SIS_ID:
	if (!ata_sis_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_VIA_ID:
	if (!ata_via_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_CENATEK_ID:
	if (!ata_cenatek_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_MICRON_ID:
	if (!ata_micron_ident(dev))
	    return ATA_PROBE_OK;
	break;
    }

    /* unknown chipset, try generic AHCI or DMA if it seems possible */
    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;
    }
    return ENXIO;
}
int
ata_pci_probe(device_t dev)
{
    if (pci_get_class(dev) != PCIC_STORAGE)
	return ENXIO;

    /* run through the vendor specific drivers */
    switch (pci_get_vendor(dev)) {
    case ATA_ACARD_ID: 
	if (!ata_acard_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_ACER_LABS_ID:
	if (!ata_ali_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_AMD_ID:
	if (!ata_amd_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_ADAPTEC_ID:
	if (!ata_adaptec_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_ATI_ID:
	if (!ata_ati_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_CYRIX_ID:
	if (!ata_cyrix_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_CYPRESS_ID:
	if (!ata_cypress_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_HIGHPOINT_ID: 
	if (!ata_highpoint_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_INTEL_ID:
	if (!ata_intel_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_ITE_ID:
	if (!ata_ite_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_JMICRON_ID:
	if (!ata_jmicron_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_MARVELL_ID:
	if (!ata_marvell_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_NATIONAL_ID:
	if (!ata_national_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_NETCELL_ID:
	if (!ata_netcell_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_NVIDIA_ID:
	if (!ata_nvidia_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_PROMISE_ID:
	if (!ata_promise_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_SERVERWORKS_ID: 
	if (!ata_serverworks_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_SILICON_IMAGE_ID:
	if (!ata_sii_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_SIS_ID:
	if (!ata_sis_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_VIA_ID: 
	if (!ata_via_ident(dev))
	    return ATA_PROBE_OK;
	break;
    case ATA_CENATEK_ID:
	if (pci_get_devid(dev) == ATA_CENATEK_ROCKET) {
	    ata_generic_ident(dev);
	    device_set_desc(dev, "Cenatek Rocket Drive controller");
	    return ATA_PROBE_OK;
	}
	break;
    case ATA_MICRON_ID:
	if (pci_get_devid(dev) == ATA_MICRON_RZ1000 ||
	    pci_get_devid(dev) == ATA_MICRON_RZ1001) {
	    ata_generic_ident(dev);
	    device_set_desc(dev, 
		"RZ 100? ATA controller !WARNING! data loss/corruption risk");
	    return ATA_PROBE_OK;
	}
	break;
    }

    /* 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;
    }

    /* unknown chipset, try generic DMA if it seems possible */
    if (pci_get_subclass(dev) == PCIS_STORAGE_IDE) {
	if (!ata_generic_ident(dev))
	    return ATA_PROBE_OK;
    }
    return ENXIO;
}