pata_sl82c105: dual channel support
PATCH 1/1 pata_sl82c105: dual channel support
Use qc_defer to serialize the two channels
Signed-off-by Alan Cox <[email protected]>
drivers/ata/pata_sl82c105.c +31 -2
@@ -26,7 +26,7 @@#include <linux/libata.h> #define DRV_NAME "pata_sl82c105" -#define DRV_VERSION "0.3.2" +#define DRV_VERSION "0.3.3"enum {/*
@@ -206,6 +206,34 @@sl82c105_set_piomode (ap, qc->dev); } +/** +* sl82c105_qc_defer - implement serialization +* @qc: command +* +* We must issue one command per host not per channel because +* of the reset bug. +* +* Q: is the scsi host lock sufficient ? +*/ + +static int sl82c105_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 sl82c105_sht = { .module =THIS_MODULE , .name =DRV_NAME ,
@@ -245,6 +273,7 @@ .bmdma_stop = sl82c105_bmdma_stop, .bmdma_status = ata_bmdma_status, + .qc_defer = sl82c105_qc_defer, .qc_prep = ata_qc_prep, .qc_issue = ata_qc_issue_prot,
@@ -312,7 +341,7 @@ };/* for now use only the first port */ const struct ata_port_info *ppi[] = { &info_early, - &ata_dummy_port_info }; +NULL };u32 val;int rev;
Jeff Garzik
AppliedQuoted 3 lines · Alan Cox
Use
qc_deferto serialize the two channelsSigned-off-by Alan Cox <[email protected]>
applied... nice!