diff options
| -rw-r--r-- | drivers/scsi/libata-core.c | 48 | ||||
| -rw-r--r-- | include/linux/libata.h | 1 |
2 files changed, 17 insertions, 32 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index ba26c66cc11b..10803f72c57d 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
| @@ -1053,6 +1053,12 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev, | |||
| 1053 | return rc; | 1053 | return rc; |
| 1054 | } | 1054 | } |
| 1055 | 1055 | ||
| 1056 | static inline u8 ata_dev_knobble(const struct ata_port *ap, | ||
| 1057 | struct ata_device *dev) | ||
| 1058 | { | ||
| 1059 | return ((ap->cbl == ATA_CBL_SATA) && (!ata_id_is_sata(dev->id))); | ||
| 1060 | } | ||
| 1061 | |||
| 1056 | /** | 1062 | /** |
| 1057 | * ata_dev_configure - Configure the specified ATA/ATAPI device | 1063 | * ata_dev_configure - Configure the specified ATA/ATAPI device |
| 1058 | * @ap: Port on which target device resides | 1064 | * @ap: Port on which target device resides |
| @@ -1167,6 +1173,17 @@ static int ata_dev_configure(struct ata_port *ap, struct ata_device *dev) | |||
| 1167 | ap->host->max_cmd_len, | 1173 | ap->host->max_cmd_len, |
| 1168 | ap->device[i].cdb_len); | 1174 | ap->device[i].cdb_len); |
| 1169 | 1175 | ||
| 1176 | /* limit bridge transfers to udma5, 200 sectors */ | ||
| 1177 | if (ata_dev_knobble(ap, dev)) { | ||
| 1178 | printk(KERN_INFO "ata%u(%u): applying bridge limits\n", | ||
| 1179 | ap->id, dev->devno); | ||
| 1180 | ap->udma_mask &= ATA_UDMA5; | ||
| 1181 | dev->max_sectors = ATA_MAX_SECTORS; | ||
| 1182 | } | ||
| 1183 | |||
| 1184 | if (ap->ops->dev_config) | ||
| 1185 | ap->ops->dev_config(ap, dev); | ||
| 1186 | |||
| 1170 | DPRINTK("EXIT, drv_stat = 0x%x\n", ata_chk_status(ap)); | 1187 | DPRINTK("EXIT, drv_stat = 0x%x\n", ata_chk_status(ap)); |
| 1171 | return 0; | 1188 | return 0; |
| 1172 | 1189 | ||
| @@ -1177,35 +1194,6 @@ err_out_nosup: | |||
| 1177 | return rc; | 1194 | return rc; |
| 1178 | } | 1195 | } |
| 1179 | 1196 | ||
| 1180 | |||
| 1181 | static inline u8 ata_dev_knobble(const struct ata_port *ap, | ||
| 1182 | struct ata_device *dev) | ||
| 1183 | { | ||
| 1184 | return ((ap->cbl == ATA_CBL_SATA) && (!ata_id_is_sata(dev->id))); | ||
| 1185 | } | ||
| 1186 | |||
| 1187 | /** | ||
| 1188 | * ata_dev_config - Run device specific handlers & check for SATA->PATA bridges | ||
| 1189 | * @ap: Bus | ||
| 1190 | * @i: Device | ||
| 1191 | * | ||
| 1192 | * LOCKING: | ||
| 1193 | */ | ||
| 1194 | |||
| 1195 | void ata_dev_config(struct ata_port *ap, unsigned int i) | ||
| 1196 | { | ||
| 1197 | /* limit bridge transfers to udma5, 200 sectors */ | ||
| 1198 | if (ata_dev_knobble(ap, &ap->device[i])) { | ||
| 1199 | printk(KERN_INFO "ata%u(%u): applying bridge limits\n", | ||
| 1200 | ap->id, i); | ||
| 1201 | ap->udma_mask &= ATA_UDMA5; | ||
| 1202 | ap->device[i].max_sectors = ATA_MAX_SECTORS; | ||
| 1203 | } | ||
| 1204 | |||
| 1205 | if (ap->ops->dev_config) | ||
| 1206 | ap->ops->dev_config(ap, &ap->device[i]); | ||
| 1207 | } | ||
| 1208 | |||
| 1209 | /** | 1197 | /** |
| 1210 | * ata_bus_probe - Reset and probe ATA bus | 1198 | * ata_bus_probe - Reset and probe ATA bus |
| 1211 | * @ap: Bus to probe | 1199 | * @ap: Bus to probe |
| @@ -1266,7 +1254,6 @@ static int ata_bus_probe(struct ata_port *ap) | |||
| 1266 | continue; | 1254 | continue; |
| 1267 | } | 1255 | } |
| 1268 | 1256 | ||
| 1269 | ata_dev_config(ap, i); | ||
| 1270 | found = 1; | 1257 | found = 1; |
| 1271 | } | 1258 | } |
| 1272 | 1259 | ||
| @@ -4967,7 +4954,6 @@ EXPORT_SYMBOL_GPL(ata_host_intr); | |||
| 4967 | EXPORT_SYMBOL_GPL(ata_dev_classify); | 4954 | EXPORT_SYMBOL_GPL(ata_dev_classify); |
| 4968 | EXPORT_SYMBOL_GPL(ata_id_string); | 4955 | EXPORT_SYMBOL_GPL(ata_id_string); |
| 4969 | EXPORT_SYMBOL_GPL(ata_id_c_string); | 4956 | EXPORT_SYMBOL_GPL(ata_id_c_string); |
| 4970 | EXPORT_SYMBOL_GPL(ata_dev_config); | ||
| 4971 | EXPORT_SYMBOL_GPL(ata_scsi_simulate); | 4957 | EXPORT_SYMBOL_GPL(ata_scsi_simulate); |
| 4972 | EXPORT_SYMBOL_GPL(ata_eh_qc_complete); | 4958 | EXPORT_SYMBOL_GPL(ata_eh_qc_complete); |
| 4973 | EXPORT_SYMBOL_GPL(ata_eh_qc_retry); | 4959 | EXPORT_SYMBOL_GPL(ata_eh_qc_retry); |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 9f273dd1958c..86a504f0ef06 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
| @@ -542,7 +542,6 @@ extern void ata_id_string(const u16 *id, unsigned char *s, | |||
| 542 | unsigned int ofs, unsigned int len); | 542 | unsigned int ofs, unsigned int len); |
| 543 | extern void ata_id_c_string(const u16 *id, unsigned char *s, | 543 | extern void ata_id_c_string(const u16 *id, unsigned char *s, |
| 544 | unsigned int ofs, unsigned int len); | 544 | unsigned int ofs, unsigned int len); |
| 545 | extern void ata_dev_config(struct ata_port *ap, unsigned int i); | ||
| 546 | extern void ata_bmdma_setup (struct ata_queued_cmd *qc); | 545 | extern void ata_bmdma_setup (struct ata_queued_cmd *qc); |
| 547 | extern void ata_bmdma_start (struct ata_queued_cmd *qc); | 546 | extern void ata_bmdma_start (struct ata_queued_cmd *qc); |
| 548 | extern void ata_bmdma_stop(struct ata_queued_cmd *qc); | 547 | extern void ata_bmdma_stop(struct ata_queued_cmd *qc); |
