Form the ATA and SATA spec, NCQ is per device. It is possible to assign the same tag on different port, the disks and PMP will not care. However, today, we assign tag on a port basis [see __ata_qc_from_tag()], therefore only 32 commands can be inflight to all devices behind a given port. Being able to a do a mapping qc <---> {pmp port, tag} instead of just qc <---> {tag} will provide a performance boost when disks supporting NCQ are connected behind a PMP. Maybe it can be done, by moving qcmd from ata_port to ata_link. As Tejun said, the patch needs more work to be able to support same tag used on 2 different links behind the same port. Also, given we are changing the amount of commands we sent to the controller, we would have to change can_queue from ATA_MAX_QUEUE to ATA_MAX_QUEUE*n, where n is the number of ports supported by the controller [max SATA_PMP_MAX_PORTS, but some controller, like SiI3132 only supports 5 devices, and other may only support n = 1] When done, the patch will require a great amount of testing, given we will exercise the controllers in a brand new way. A white list might be necessary. Jens, using SCSI tagging for ata commands is a great idea, but it is no small feat... Gwendal. On Wed, May 20, 2009 at 10:10 AM, Grant Grundler <grundler@xxxxxxxxxx> wrote: > On Wed, May 20, 2009 at 12:00 AM, Jens Axboe <jens.axboe@xxxxxxxxxx> wrote: >> libata currently has a pretty dumb ATA_MAX_QUEUE loop for finding >> a free tag to use. Instead of fixing that up, convert libata to >> using block layer tagging - gets rid of code in libata, and is also >> much faster. > ... >> @@ -1137,7 +1141,17 @@ static int ata_scsi_dev_config(struct scsi_device *sdev, >> >> depth = min(sdev->host->can_queue, ata_id_queue_depth(dev->id)); >> depth = min(ATA_MAX_QUEUE - 1, depth); >> - scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, depth); >> + >> + /* >> + * If this device is behind a port multiplier, we have >> + * to share the tag map between all devices on that PMP. >> + * Set up the shared tag map here and we get automatic. > > Automatic what? > >> + */ >> + if (dev->link->ap->pmp_link) >> + scsi_init_shared_tag_map(sdev->host, ATA_MAX_QUEUE - 1); >> + >> + scsi_set_tag_type(sdev, MSG_SIMPLE_TAG); >> + scsi_activate_tcq(sdev, depth); > > I just read Tejun's reply and it sounds right what he's saying. > But can SATA controllers handle NCQ and !NCQ devices on the same port? > Can the PMP handle it? > > If both can, I don't understand how a mixed config works today. > > TBH, this isn't something I'm very worried about since most commercial configs > will be homogenous (think HW replacement/support costs). > > hth, > grant > -- > 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 > -- 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