Commit c0f2ee34 authored by Alan Cox's avatar Alan Cox Committed by Jeff Garzik

pata_sc1200: Activate secondary channel

Implement serialize and turn on slave channel
Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent 140d6fed
...@@ -2,7 +2,6 @@ ...@@ -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) ...@@ -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 = { ...@@ -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) ...@@ -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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment