> libata certainly didn't when I wrote the driver in 2007. > > int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev) > { > /* Record simplex status. If we selected DMA then the other > * host channels are not permitted to do so. > */ > if (used_dma && (ap->host->flags & ATA_HOST_SIMPLEX)) > ap->host->simplex_claimed = ap; > ... > static void ata_dev_xfermask(struct ata_device *dev) > { > ... > if ((host->flags & ATA_HOST_SIMPLEX) && > host->simplex_claimed && host->simplex_claimed != ap) { > xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA); > ata_dev_printk(dev, KERN_WARNING, "simplex DMA is claimed by " > "other device, disabling DMA\n"); > } > > and apparantly still doesn't. Only one channel of a simplex device is > permitted to be configured for DMA at any one time. Simplex has a specific meaning and we implement it to the meaning of the standard PCI config bits, which is that you have a single channel that can be configured for DMA. There is nothing in the standard that says you can play fast and loose flipping them back and forth. If your controller simply can't handle two DMA transactions (or two transactions in general) at the same time you can provide a private qc_defer function and ask the midlayer to defer commands that don't fit your needs. Ie the simplex handling is like the Simplex bit handling in drivers/ide, and the qc_defer method is akin to the ->serialize flag in drivers/ide, but a bit more flexible. Alan -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html