|
@@ -950,8 +950,8 @@ unsigned int ata_dev_try_classify(struct ata_device *dev, int present,
|
|
if (r_err)
|
|
if (r_err)
|
|
*r_err = err;
|
|
*r_err = err;
|
|
|
|
|
|
- /* see if device passed diags: if master then continue and warn later */
|
|
|
|
- if (err == 0 && dev->devno == 0)
|
|
|
|
|
|
+ /* see if device passed diags: continue and warn later */
|
|
|
|
+ if (err == 0)
|
|
/* diagnostic fail : do nothing _YET_ */
|
|
/* diagnostic fail : do nothing _YET_ */
|
|
dev->horkage |= ATA_HORKAGE_DIAGNOSTIC;
|
|
dev->horkage |= ATA_HORKAGE_DIAGNOSTIC;
|
|
else if (err == 1)
|
|
else if (err == 1)
|
|
@@ -2262,19 +2262,8 @@ int ata_dev_configure(struct ata_device *dev)
|
|
dev->flags |= ATA_DFLAG_DIPM;
|
|
dev->flags |= ATA_DFLAG_DIPM;
|
|
}
|
|
}
|
|
|
|
|
|
- if (dev->horkage & ATA_HORKAGE_DIAGNOSTIC) {
|
|
|
|
- /* Let the user know. We don't want to disallow opens for
|
|
|
|
- rescue purposes, or in case the vendor is just a blithering
|
|
|
|
- idiot */
|
|
|
|
- if (print_info) {
|
|
|
|
- ata_dev_printk(dev, KERN_WARNING,
|
|
|
|
-"Drive reports diagnostics failure. This may indicate a drive\n");
|
|
|
|
- ata_dev_printk(dev, KERN_WARNING,
|
|
|
|
-"fault or invalid emulation. Contact drive vendor for information.\n");
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /* limit bridge transfers to udma5, 200 sectors */
|
|
|
|
|
|
+ /* Limit PATA drive on SATA cable bridge transfers to udma5,
|
|
|
|
+ 200 sectors */
|
|
if (ata_dev_knobble(dev)) {
|
|
if (ata_dev_knobble(dev)) {
|
|
if (ata_msg_drv(ap) && print_info)
|
|
if (ata_msg_drv(ap) && print_info)
|
|
ata_dev_printk(dev, KERN_INFO,
|
|
ata_dev_printk(dev, KERN_INFO,
|
|
@@ -2303,6 +2292,21 @@ int ata_dev_configure(struct ata_device *dev)
|
|
if (ap->ops->dev_config)
|
|
if (ap->ops->dev_config)
|
|
ap->ops->dev_config(dev);
|
|
ap->ops->dev_config(dev);
|
|
|
|
|
|
|
|
+ if (dev->horkage & ATA_HORKAGE_DIAGNOSTIC) {
|
|
|
|
+ /* Let the user know. We don't want to disallow opens for
|
|
|
|
+ rescue purposes, or in case the vendor is just a blithering
|
|
|
|
+ idiot. Do this after the dev_config call as some controllers
|
|
|
|
+ with buggy firmware may want to avoid reporting false device
|
|
|
|
+ bugs */
|
|
|
|
+
|
|
|
|
+ if (print_info) {
|
|
|
|
+ ata_dev_printk(dev, KERN_WARNING,
|
|
|
|
+"Drive reports diagnostics failure. This may indicate a drive\n");
|
|
|
|
+ ata_dev_printk(dev, KERN_WARNING,
|
|
|
|
+"fault or invalid emulation. Contact drive vendor for information.\n");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
if (ata_msg_probe(ap))
|
|
if (ata_msg_probe(ap))
|
|
ata_dev_printk(dev, KERN_DEBUG, "%s: EXIT, drv_stat = 0x%x\n",
|
|
ata_dev_printk(dev, KERN_DEBUG, "%s: EXIT, drv_stat = 0x%x\n",
|
|
__FUNCTION__, ata_chk_status(ap));
|
|
__FUNCTION__, ata_chk_status(ap));
|
|
@@ -3066,7 +3070,7 @@ static int ata_dev_set_mode(struct ata_device *dev)
|
|
|
|
|
|
/* Early MWDMA devices do DMA but don't allow DMA mode setting.
|
|
/* Early MWDMA devices do DMA but don't allow DMA mode setting.
|
|
Don't fail an MWDMA0 set IFF the device indicates it is in MWDMA0 */
|
|
Don't fail an MWDMA0 set IFF the device indicates it is in MWDMA0 */
|
|
- if (dev->xfer_shift == ATA_SHIFT_MWDMA &&
|
|
|
|
|
|
+ if (dev->xfer_shift == ATA_SHIFT_MWDMA &&
|
|
dev->dma_mode == XFER_MW_DMA_0 &&
|
|
dev->dma_mode == XFER_MW_DMA_0 &&
|
|
(dev->id[63] >> 8) & 1)
|
|
(dev->id[63] >> 8) & 1)
|
|
err_mask &= ~AC_ERR_DEV;
|
|
err_mask &= ~AC_ERR_DEV;
|