static struct ata_probe_ent *vt6420_init_probe_ent(struct pci_dev *pdev)
{
	struct ata_probe_ent *probe_ent;
	struct ata_port_info *ppi = &svia_port_info;

	probe_ent = ata_pci_init_native_mode(pdev, &ppi);
	if (!probe_ent)
		return NULL;

	probe_ent->port[0].scr_addr =
		svia_scr_addr(pci_resource_start(pdev, 5), 0);
	probe_ent->port[1].scr_addr =
		svia_scr_addr(pci_resource_start(pdev, 5), 1);

	return probe_ent;
}
static struct ata_probe_ent *vt6420_init_probe_ent(struct pci_dev *pdev)
{
	struct ata_probe_ent *probe_ent;
	struct ata_port_info *ppi[2];
	void __iomem *bar5;

	ppi[0] = ppi[1] = &vt6420_port_info;
	probe_ent = ata_pci_init_native_mode(pdev, ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY);
	if (!probe_ent)
		return NULL;

	bar5 = pcim_iomap(pdev, 5, 0);
	if (!bar5) {
		dev_printk(KERN_ERR, &pdev->dev, "failed to iomap PCI BAR 5\n");
		return NULL;
	}

	probe_ent->port[0].scr_addr = svia_scr_addr(bar5, 0);
	probe_ent->port[1].scr_addr = svia_scr_addr(bar5, 1);

	return probe_ent;
}
Example #3
0
static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
{
    struct ata_probe_ent *probe_ent;
    struct ata_port_info *ppi;
    int rc;
    unsigned int board_idx = (unsigned int) ent->driver_data;
    int pci_dev_busy = 0;

    rc = pci_enable_device(pdev);
    if (rc)
        return rc;

    rc = pci_request_regions(pdev, DRV_NAME);
    if (rc) {
        pci_dev_busy = 1;
        goto err_out;
    }

    rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
    if (rc)
        goto err_out_regions;
    rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
    if (rc)
        goto err_out_regions;

    ppi = &uli_port_info;
    probe_ent = ata_pci_init_native_mode(pdev, &ppi);
    if (!probe_ent) {
        rc = -ENOMEM;
        goto err_out_regions;
    }

    switch (board_idx) {
    case uli_5287:
        probe_ent->port[0].scr_addr = ULI5287_BASE;
        probe_ent->port[1].scr_addr = ULI5287_BASE + ULI5287_OFFS;
        probe_ent->n_ports = 4;

        probe_ent->port[2].cmd_addr = pci_resource_start(pdev, 0) + 8;
        probe_ent->port[2].altstatus_addr =
            probe_ent->port[2].ctl_addr =
                (pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS) + 4;
        probe_ent->port[2].bmdma_addr = pci_resource_start(pdev, 4) + 16;
        probe_ent->port[2].scr_addr = ULI5287_BASE + ULI5287_OFFS*4;

        probe_ent->port[3].cmd_addr = pci_resource_start(pdev, 2) + 8;
        probe_ent->port[3].altstatus_addr =
            probe_ent->port[3].ctl_addr =
                (pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS) + 4;
        probe_ent->port[3].bmdma_addr = pci_resource_start(pdev, 4) + 24;
        probe_ent->port[3].scr_addr = ULI5287_BASE + ULI5287_OFFS*5;

        ata_std_ports(&probe_ent->port[2]);
        ata_std_ports(&probe_ent->port[3]);
        break;

    case uli_5289:
        probe_ent->port[0].scr_addr = ULI5287_BASE;
        probe_ent->port[1].scr_addr = ULI5287_BASE + ULI5287_OFFS;
        break;

    case uli_5281:
        probe_ent->port[0].scr_addr = ULI5281_BASE;
        probe_ent->port[1].scr_addr = ULI5281_BASE + ULI5281_OFFS;
        break;

    default:
        BUG();
        break;
    }

    pci_set_master(pdev);
    pci_intx(pdev, 1);

    /* FIXME: check ata_device_add return value */
    ata_device_add(probe_ent);
    kfree(probe_ent);

    return 0;

err_out_regions:
    pci_release_regions(pdev);

err_out:
    if (!pci_dev_busy)
        pci_disable_device(pdev);
    return rc;

}
Example #4
0
static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
{
	struct ata_probe_ent *probe_ent = NULL;
	int rc;
	u32 genctl;
	struct ata_port_info *ppi;

	rc = pci_enable_device(pdev);
	if (rc)
		return rc;

	rc = pci_request_regions(pdev, DRV_NAME);
	if (rc)
		goto err_out;

	rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
	if (rc)
		goto err_out_regions;
	rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
	if (rc)
		goto err_out_regions;

	ppi = &sis_port_info;
	probe_ent = ata_pci_init_native_mode(pdev, &ppi);
	if (!probe_ent) {
		rc = -ENOMEM;
		goto err_out_regions;
	}

	/* check and see if the SCRs are in IO space or PCI cfg space */
	pci_read_config_dword(pdev, SIS_GENCTL, &genctl);
	if ((genctl & GENCTL_IOMAPPED_SCR) == 0)
		probe_ent->host_flags |= SIS_FLAG_CFGSCR;
	
	/* if hardware thinks SCRs are in IO space, but there are
	 * no IO resources assigned, change to PCI cfg space.
	 */
	if ((!(probe_ent->host_flags & SIS_FLAG_CFGSCR)) &&
	    ((pci_resource_start(pdev, SIS_SCR_PCI_BAR) == 0) ||
	     (pci_resource_len(pdev, SIS_SCR_PCI_BAR) < 128))) {
		genctl &= ~GENCTL_IOMAPPED_SCR;
		pci_write_config_dword(pdev, SIS_GENCTL, genctl);
		probe_ent->host_flags |= SIS_FLAG_CFGSCR;
	}

	if (!(probe_ent->host_flags & SIS_FLAG_CFGSCR)) {
		probe_ent->port[0].scr_addr =
			pci_resource_start(pdev, SIS_SCR_PCI_BAR);
		probe_ent->port[1].scr_addr =
			pci_resource_start(pdev, SIS_SCR_PCI_BAR) + 64;
	}

	pci_set_master(pdev);
	pci_enable_intx(pdev);

	/* FIXME: check ata_device_add return value */
	ata_device_add(probe_ent);
	kfree(probe_ent);

	return 0;

err_out_regions:
	pci_release_regions(pdev);

err_out:
	pci_disable_device(pdev);
	return rc;

}
Example #5
0
static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
{
	static int printed_version;
	struct ata_probe_ent *probe_ent = NULL;
	int rc;
	u32 genctl, val;
	struct ata_port_info pi = sis_port_info, *ppi[2] = { &pi, &pi };
	int pci_dev_busy = 0;
	u8 pmr;
	u8 port2_start;

	if (!printed_version++)
		dev_printk(KERN_INFO, &pdev->dev, "version " DRV_VERSION "\n");

	rc = pci_enable_device(pdev);
	if (rc)
		return rc;

	rc = pci_request_regions(pdev, DRV_NAME);
	if (rc) {
		pci_dev_busy = 1;
		goto err_out;
	}

	rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
	if (rc)
		goto err_out_regions;
	rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
	if (rc)
		goto err_out_regions;

	/* check and see if the SCRs are in IO space or PCI cfg space */
	pci_read_config_dword(pdev, SIS_GENCTL, &genctl);
	if ((genctl & GENCTL_IOMAPPED_SCR) == 0)
		pi.flags |= SIS_FLAG_CFGSCR;

	/* if hardware thinks SCRs are in IO space, but there are
	 * no IO resources assigned, change to PCI cfg space.
	 */
	if ((!(pi.flags & SIS_FLAG_CFGSCR)) &&
	    ((pci_resource_start(pdev, SIS_SCR_PCI_BAR) == 0) ||
	     (pci_resource_len(pdev, SIS_SCR_PCI_BAR) < 128))) {
		genctl &= ~GENCTL_IOMAPPED_SCR;
		pci_write_config_dword(pdev, SIS_GENCTL, genctl);
		pi.flags |= SIS_FLAG_CFGSCR;
	}

	pci_read_config_byte(pdev, SIS_PMR, &pmr);
	if (ent->device != 0x182) {
		if ((pmr & SIS_PMR_COMBINED) == 0) {
			dev_printk(KERN_INFO, &pdev->dev,
				   "Detected SiS 180/181/964 chipset in SATA mode\n");
			port2_start = 64;
		}
		else {
			dev_printk(KERN_INFO, &pdev->dev,
				   "Detected SiS 180/181 chipset in combined mode\n");
			port2_start=0;
			pi.flags |= ATA_FLAG_SLAVE_POSS;
		}
	}
	else {
		pci_read_config_dword ( pdev, 0x6C, &val);
		if (val & (1L << 31)) {
			dev_printk(KERN_INFO, &pdev->dev, "Detected SiS 182/965 chipset\n");
			pi.flags |= ATA_FLAG_SLAVE_POSS;
		}
		else
			dev_printk(KERN_INFO, &pdev->dev, "Detected SiS 182/965L chipset\n");
		port2_start = 0x20;
	}

	probe_ent = ata_pci_init_native_mode(pdev, ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY);
	if (!probe_ent) {
		rc = -ENOMEM;
		goto err_out_regions;
	}

	if (!(probe_ent->port_flags & SIS_FLAG_CFGSCR)) {
		probe_ent->port[0].scr_addr =
			pci_resource_start(pdev, SIS_SCR_PCI_BAR);
		probe_ent->port[1].scr_addr =
			pci_resource_start(pdev, SIS_SCR_PCI_BAR) + port2_start;
	}

	pci_set_master(pdev);
	pci_intx(pdev, 1);

	/* FIXME: check ata_device_add return value */
	ata_device_add(probe_ent);
	kfree(probe_ent);

	return 0;

err_out_regions:
	pci_release_regions(pdev);

err_out:
	if (!pci_dev_busy)
		pci_disable_device(pdev);
	return rc;

}