mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-15 13:22:55 +00:00
pata_sc1200: Activate secondary channel
Implement serialize and turn on slave channel Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
parent
140d6fed71
commit
c0f2ee34a5
@ -2,7 +2,6 @@
|
|||||||
* New ATA layer SC1200 driver Alan Cox <alan@lxorguk.ukuu.org.uk>
|
* New ATA layer SC1200 driver Alan Cox <alan@lxorguk.ukuu.org.uk>
|
||||||
*
|
*
|
||||||
* TODO: Mode selection filtering
|
* TODO: Mode selection filtering
|
||||||
* TODO: Can't enable second channel until ATA core has serialize
|
|
||||||
* TODO: Needs custom DMA cleanup code
|
* TODO: Needs custom DMA cleanup code
|
||||||
*
|
*
|
||||||
* Based very heavily on
|
* Based very heavily on
|
||||||
@ -178,6 +177,31 @@ static unsigned int sc1200_qc_issue(struct ata_queued_cmd *qc)
|
|||||||
return ata_sff_qc_issue(qc);
|
return ata_sff_qc_issue(qc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sc1200_qc_defer - implement serialization
|
||||||
|
* @qc: command
|
||||||
|
*
|
||||||
|
* Serialize command issue on this controller.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int sc1200_qc_defer(struct ata_queued_cmd *qc)
|
||||||
|
{
|
||||||
|
struct ata_host *host = qc->ap->host;
|
||||||
|
struct ata_port *alt = host->ports[1 ^ qc->ap->port_no];
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/* First apply the usual rules */
|
||||||
|
rc = ata_std_qc_defer(qc);
|
||||||
|
if (rc != 0)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
/* Now apply serialization rules. Only allow a command if the
|
||||||
|
other channel state machine is idle */
|
||||||
|
if (alt && alt->qc_active)
|
||||||
|
return ATA_DEFER_PORT;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static struct scsi_host_template sc1200_sht = {
|
static struct scsi_host_template sc1200_sht = {
|
||||||
ATA_BMDMA_SHT(DRV_NAME),
|
ATA_BMDMA_SHT(DRV_NAME),
|
||||||
.sg_tablesize = LIBATA_DUMB_MAX_PRD,
|
.sg_tablesize = LIBATA_DUMB_MAX_PRD,
|
||||||
@ -187,6 +211,7 @@ static struct ata_port_operations sc1200_port_ops = {
|
|||||||
.inherits = &ata_bmdma_port_ops,
|
.inherits = &ata_bmdma_port_ops,
|
||||||
.qc_prep = ata_sff_dumb_qc_prep,
|
.qc_prep = ata_sff_dumb_qc_prep,
|
||||||
.qc_issue = sc1200_qc_issue,
|
.qc_issue = sc1200_qc_issue,
|
||||||
|
.qc_defer = sc1200_qc_defer,
|
||||||
.cable_detect = ata_cable_40wire,
|
.cable_detect = ata_cable_40wire,
|
||||||
.set_piomode = sc1200_set_piomode,
|
.set_piomode = sc1200_set_piomode,
|
||||||
.set_dmamode = sc1200_set_dmamode,
|
.set_dmamode = sc1200_set_dmamode,
|
||||||
@ -211,7 +236,7 @@ static int sc1200_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
|||||||
.port_ops = &sc1200_port_ops
|
.port_ops = &sc1200_port_ops
|
||||||
};
|
};
|
||||||
/* Can't enable port 2 yet, see top comments */
|
/* Can't enable port 2 yet, see top comments */
|
||||||
const struct ata_port_info *ppi[] = { &info, &ata_dummy_port_info };
|
const struct ata_port_info *ppi[] = { &info, };
|
||||||
|
|
||||||
return ata_pci_sff_init_one(dev, ppi, &sc1200_sht, NULL);
|
return ata_pci_sff_init_one(dev, ppi, &sc1200_sht, NULL);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user