Commit 8343f889 authored by Robert Hancock's avatar Robert Hancock Committed by Jeff Garzik

libata: warn if speed limited due to 40-wire cable

Warn the user if a drive's transfer rate is limited because of a 40-wire
cable detection.
Signed-off-by: default avatarRobert Hancock <hancockr@shaw.ca>
Cc: Jeff Garzik <jeff@garzik.org>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent f0ef88ed
...@@ -3425,19 +3425,7 @@ static void ata_dev_xfermask(struct ata_device *dev) ...@@ -3425,19 +3425,7 @@ static void ata_dev_xfermask(struct ata_device *dev)
xfer_mask = ata_pack_xfermask(ap->pio_mask, xfer_mask = ata_pack_xfermask(ap->pio_mask,
ap->mwdma_mask, ap->udma_mask); ap->mwdma_mask, ap->udma_mask);
/* Apply cable rule here. Don't apply it early because when /* drive modes available */
* we handle hot plug the cable type can itself change.
*/
if (ap->cbl == ATA_CBL_PATA40)
xfer_mask &= ~(0xF8 << ATA_SHIFT_UDMA);
/* Apply drive side cable rule. Unknown or 80 pin cables reported
* host side are checked drive side as well. Cases where we know a
* 40wire cable is used safely for 80 are not checked here.
*/
if (ata_drive_40wire(dev->id) && (ap->cbl == ATA_CBL_PATA_UNK || ap->cbl == ATA_CBL_PATA80))
xfer_mask &= ~(0xF8 << ATA_SHIFT_UDMA);
xfer_mask &= ata_pack_xfermask(dev->pio_mask, xfer_mask &= ata_pack_xfermask(dev->pio_mask,
dev->mwdma_mask, dev->udma_mask); dev->mwdma_mask, dev->udma_mask);
xfer_mask &= ata_id_xfermask(dev->id); xfer_mask &= ata_id_xfermask(dev->id);
...@@ -3469,6 +3457,25 @@ static void ata_dev_xfermask(struct ata_device *dev) ...@@ -3469,6 +3457,25 @@ static void ata_dev_xfermask(struct ata_device *dev)
if (ap->ops->mode_filter) if (ap->ops->mode_filter)
xfer_mask = ap->ops->mode_filter(ap, dev, xfer_mask); xfer_mask = ap->ops->mode_filter(ap, dev, xfer_mask);
/* Apply cable rule here. Don't apply it early because when
* we handle hot plug the cable type can itself change.
* Check this last so that we know if the transfer rate was
* solely limited by the cable.
* Unknown or 80 wire cables reported host side are checked
* drive side as well. Cases where we know a 40wire cable
* is used safely for 80 are not checked here.
*/
if (xfer_mask & (0xF8 << ATA_SHIFT_UDMA))
/* UDMA/44 or higher would be available */
if((ap->cbl == ATA_CBL_PATA40) ||
(ata_drive_40wire(dev->id) &&
(ap->cbl == ATA_CBL_PATA_UNK ||
ap->cbl == ATA_CBL_PATA80))) {
ata_dev_printk(dev, KERN_WARNING,
"limited to UDMA/33 due to 40-wire cable\n");
xfer_mask &= ~(0xF8 << ATA_SHIFT_UDMA);
}
ata_unpack_xfermask(xfer_mask, &dev->pio_mask, ata_unpack_xfermask(xfer_mask, &dev->pio_mask,
&dev->mwdma_mask, &dev->udma_mask); &dev->mwdma_mask, &dev->udma_mask);
} }
......
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