예제 #1
0
static unsigned int pacpi_qc_issue(struct ata_queued_cmd *qc)
{
	struct ata_port *ap = qc->ap;
	struct ata_device *adev = qc->dev;
	struct pata_acpi *acpi = ap->private_data;

	if (acpi->gtm.flags & 0x10)
		return ata_sff_qc_issue(qc);

	if (adev != acpi->last) {
		pacpi_set_piomode(ap, adev);
		if (ata_dma_enabled(adev))
			pacpi_set_dmamode(ap, adev);
		acpi->last = adev;
	}
	return ata_sff_qc_issue(qc);
}
static unsigned int cmd640_qc_issue(struct ata_queued_cmd *qc)
{
	struct ata_port *ap = qc->ap;
	struct ata_device *adev = qc->dev;
	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
	struct cmd640_reg *timing = ap->private_data;

	if (ap->port_no != 0 && adev->devno != timing->last) {
		pci_write_config_byte(pdev, DRWTIM23, timing->reg58[adev->devno]);
		timing->last = adev->devno;
	}
	return ata_sff_qc_issue(qc);
}
예제 #3
0
static unsigned int ns87410_qc_issue(struct ata_queued_cmd *qc)
{
	struct ata_port *ap = qc->ap;
	struct ata_device *adev = qc->dev;

	/* If modes have been configured and the channel data is not loaded
	   then load it. We have to check if pio_mode is set as the core code
	   does not set adev->pio_mode to XFER_PIO_0 while probing as would be
	   logical */

	if (adev->pio_mode && adev != ap->private_data)
		ns87410_set_piomode(ap, adev);

	return ata_sff_qc_issue(qc);
}
예제 #4
0
파일: pata_radisys.c 프로젝트: 274914765/C
static unsigned int radisys_qc_issue(struct ata_queued_cmd *qc)
{
    struct ata_port *ap = qc->ap;
    struct ata_device *adev = qc->dev;

    if (adev != ap->private_data) {
        /* UDMA timing is not shared */
        if (adev->dma_mode < XFER_UDMA_0) {
            if (adev->dma_mode)
                radisys_set_dmamode(ap, adev);
            else if (adev->pio_mode)
                radisys_set_piomode(ap, adev);
        }
    }
    return ata_sff_qc_issue(qc);
}
예제 #5
0
static unsigned int cs5530_qc_issue(struct ata_queued_cmd *qc)
{
	struct ata_port *ap = qc->ap;
	struct ata_device *adev = qc->dev;
	struct ata_device *prev = ap->private_data;

	/* See if the DMA settings could be wrong */
	if (adev->dma_mode != 0 && adev != prev && prev != NULL) {
		/* Maybe, but do the channels match MWDMA/UDMA ? */
		if ((adev->dma_mode >= XFER_UDMA_0 && prev->dma_mode < XFER_UDMA_0) ||
		    (adev->dma_mode < XFER_UDMA_0 && prev->dma_mode >= XFER_UDMA_0))
		    	/* Switch the mode bits */
		    	cs5530_set_dmamode(ap, adev);
	}

	return ata_sff_qc_issue(qc);
}
static unsigned int sata_dwc_qc_issue(struct ata_queued_cmd *qc)
{
    u32 sactive;
    u8 tag = qc->tag;
    struct ata_port *ap = qc->ap;

#ifdef DEBUG_NCQ
    if (qc->tag > 0 || ap->link.sactive > 1)
        dev_info(ap->dev, "%s ap id=%d cmd(0x%02x)=%s qc tag=%d "
                 "prot=%s ap active_tag=0x%08x ap sactive=0x%08x\n",
                 __func__, ap->print_id, qc->tf.command,
                 ata_get_cmd_descript(qc->tf.command),
                 qc->tag, get_prot_descript(qc->tf.protocol),
                 ap->link.active_tag, ap->link.sactive);
#endif

    if (!ata_is_ncq(qc->tf.protocol))
        tag = 0;
    sata_dwc_qc_prep_by_tag(qc, tag);

    if (ata_is_ncq(qc->tf.protocol)) {
        sactive = core_scr_read(SCR_ACTIVE);
        sactive |= (0x00000001 << tag);
        core_scr_write(SCR_ACTIVE, sactive);

        dev_dbg(qc->ap->dev, "%s: tag=%d ap->link.sactive = 0x%08x "
                "sactive=0x%08x\n", __func__, tag, qc->ap->link.sactive,
                sactive);

        ap->ops->sff_tf_load(ap, &qc->tf);
        sata_dwc_exec_command_by_tag(ap, &qc->tf, qc->tag,
                                     SATA_DWC_CMD_ISSUED_PEND);
    } else {
        ata_sff_qc_issue(qc);
    }
    return 0;
}