From: Tejun Heo <htejun@gmail.com>
To: jgarzik@pobox.com, alan@lxorguk.ukuu.org.uk, davej@redhat.com,
linux-ide@vger.kernel.org
Cc: Tejun Heo <htejun@gmail.com>
Subject: [PATCH 3/9] libata: implement per-dev xfermask
Date: Sat, 5 Aug 2006 06:01:33 +0900 [thread overview]
Message-ID: <11547252932391-git-send-email-htejun@gmail.com> (raw)
In-Reply-To: <11547252923301-git-send-email-htejun@gmail.com>
Implement per-dev xfermask. libata used to determine xfermask
per-port - the fastest mode of the slowest device on the port. This
patch enables per-dev xfermask.
Original patch is from Alan Cox <alan@redhat.com>. The following
changes are made by me.
* simplex warning message is added
* fix port-wide PIO mode selection to aovid violating device selection
timing.
Cc: Alan Cox <alan@redhat.com>
Signed-off-by: Tejun Heo <htejun@gmail.com>
---
drivers/scsi/libata-core.c | 49 +++++++++++++++++++-------------------------
1 files changed, 21 insertions(+), 28 deletions(-)
fd045a27aab1d64997f30a97f64e7aac355dd14d
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
index 1810bb2..7e1f3ee 100644
--- a/drivers/scsi/libata-core.c
+++ b/drivers/scsi/libata-core.c
@@ -3040,10 +3040,6 @@ static int ata_dma_blacklisted(const str
* known limits including host controller limits, device
* blacklist, etc...
*
- * FIXME: The current implementation limits all transfer modes to
- * the fastest of the lowested device on the port. This is not
- * required on most controllers.
- *
* LOCKING:
* None.
*/
@@ -3054,6 +3050,7 @@ static void ata_dev_xfermask(struct ata_
unsigned long xfer_mask;
int i;
+ /* controller modes available */
xfer_mask = ata_pack_xfermask(ap->pio_mask,
ap->mwdma_mask, ap->udma_mask);
@@ -3063,34 +3060,30 @@ static void ata_dev_xfermask(struct ata_
if (ap->cbl == ATA_CBL_PATA40)
xfer_mask &= ~(0xF8 << ATA_SHIFT_UDMA);
- /* FIXME: Use port-wide xfermask for now */
- for (i = 0; i < ATA_MAX_DEVICES; i++) {
- struct ata_device *d = &ap->device[i];
-
- if (ata_dev_absent(d))
- continue;
-
- if (ata_dev_disabled(d)) {
- /* to avoid violating device selection timing */
- xfer_mask &= ata_pack_xfermask(d->pio_mask,
- UINT_MAX, UINT_MAX);
- continue;
- }
-
- xfer_mask &= ata_pack_xfermask(d->pio_mask,
- d->mwdma_mask, d->udma_mask);
- xfer_mask &= ata_id_xfermask(d->id);
- if (ata_dma_blacklisted(d))
- xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
- }
+ xfer_mask &= ata_pack_xfermask(dev->pio_mask,
+ dev->mwdma_mask, dev->udma_mask);
+ xfer_mask &= ata_id_xfermask(dev->id);
- if (ata_dma_blacklisted(dev))
+ if (ata_dma_blacklisted(dev)) {
+ xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
ata_dev_printk(dev, KERN_WARNING,
"device is on DMA blacklist, disabling DMA\n");
+ }
+
+ if ((hs->flags & ATA_HOST_SIMPLEX) && hs->simplex_claimed) {
+ xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
+ ata_dev_printk(dev, KERN_WARNING, "simplex DMA is claimed by "
+ "other device, disabling DMA\n");
+ }
- if (hs->flags & ATA_HOST_SIMPLEX) {
- if (hs->simplex_claimed)
- xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
+ /* Use the lowest common PIO mode to avoid violating device
+ * selection timing.
+ */
+ for (i = 0; i < ATA_MAX_DEVICES; i++) {
+ struct ata_device *d = &ap->device[i];
+ if (!ata_dev_absent(d))
+ xfer_mask &= ata_pack_xfermask(d->pio_mask,
+ UINT_MAX, UINT_MAX);
}
if (ap->ops->mode_filter)
--
1.3.2
next prev parent reply other threads:[~2006-08-04 21:01 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-08-04 21:01 [PATCHSET] libata: improve initialization and legacy handling, take#2 Tejun Heo
2006-08-04 21:01 ` [PATCH 1/9] [libata] some function renaming Tejun Heo
2006-08-09 4:24 ` Jeff Garzik
2006-08-09 4:25 ` Jeff Garzik
2006-08-04 21:01 ` [PATCH 7/9] libata: use dummy port for stolen legacy ports Tejun Heo
2006-08-04 21:01 ` [PATCH 5/9] libata: fix several bugs in reworked legacy handling Tejun Heo
2006-08-09 4:28 ` Jeff Garzik
2006-08-04 21:01 ` Tejun Heo [this message]
2006-08-05 13:38 ` [PATCH 3/9] libata: implement per-dev xfermask Alan Cox
2006-08-06 14:41 ` Tejun Heo
2006-08-06 15:56 ` Alan Cox
2006-08-06 16:08 ` Tejun Heo
2006-08-09 4:30 ` Jeff Garzik
2006-08-04 21:01 ` [PATCH 4/9] libata: rework legacy handling to remove much of the cruft Tejun Heo
2006-08-09 4:27 ` Jeff Garzik
2006-08-04 21:01 ` [PATCH 2/9] [libata] Kill 'count' var in ata_device_add() Tejun Heo
2006-08-04 21:01 ` [PATCH 6/9] libata: implement dummy port Tejun Heo
2006-08-04 21:01 ` [PATCH 8/9] libata: replace ap->hard_port_no with ap->port_no Tejun Heo
2006-08-04 21:01 ` [PATCH 9/9] libata: kill unused hard_port_no and legacy_mode Tejun Heo
2006-08-09 4:29 ` Jeff Garzik
2006-08-04 21:05 ` [PATCHSET] libata: improve initialization and legacy handling, take#2 Dave Jones
2006-08-04 21:13 ` Tejun Heo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=11547252932391-git-send-email-htejun@gmail.com \
--to=htejun@gmail.com \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=davej@redhat.com \
--cc=jgarzik@pobox.com \
--cc=linux-ide@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.