aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ata/libahci.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
index 7e2a1b38093e..6686dbec4440 100644
--- a/drivers/ata/libahci.c
+++ b/drivers/ata/libahci.c
@@ -1267,9 +1267,11 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class,
1267{ 1267{
1268 struct ata_port *ap = link->ap; 1268 struct ata_port *ap = link->ap;
1269 struct ahci_host_priv *hpriv = ap->host->private_data; 1269 struct ahci_host_priv *hpriv = ap->host->private_data;
1270 struct ahci_port_priv *pp = ap->private_data;
1270 const char *reason = NULL; 1271 const char *reason = NULL;
1271 unsigned long now, msecs; 1272 unsigned long now, msecs;
1272 struct ata_taskfile tf; 1273 struct ata_taskfile tf;
1274 bool fbs_disabled = false;
1273 int rc; 1275 int rc;
1274 1276
1275 DPRINTK("ENTER\n"); 1277 DPRINTK("ENTER\n");
@@ -1279,6 +1281,16 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class,
1279 if (rc && rc != -EOPNOTSUPP) 1281 if (rc && rc != -EOPNOTSUPP)
1280 ata_link_warn(link, "failed to reset engine (errno=%d)\n", rc); 1282 ata_link_warn(link, "failed to reset engine (errno=%d)\n", rc);
1281 1283
1284 /*
1285 * According to AHCI-1.2 9.3.9: if FBS is enable, software shall
1286 * clear PxFBS.EN to '0' prior to issuing software reset to devices
1287 * that is attached to port multiplier.
1288 */
1289 if (!ata_is_host_link(link) && pp->fbs_enabled) {
1290 ahci_disable_fbs(ap);
1291 fbs_disabled = true;
1292 }
1293
1282 ata_tf_init(link->device, &tf); 1294 ata_tf_init(link->device, &tf);
1283 1295
1284 /* issue the first D2H Register FIS */ 1296 /* issue the first D2H Register FIS */
@@ -1319,6 +1331,10 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class,
1319 } else 1331 } else
1320 *class = ahci_dev_classify(ap); 1332 *class = ahci_dev_classify(ap);
1321 1333
1334 /* re-enable FBS if disabled before */
1335 if (fbs_disabled)
1336 ahci_enable_fbs(ap);
1337
1322 DPRINTK("EXIT, class=%u\n", *class); 1338 DPRINTK("EXIT, class=%u\n", *class);
1323 return 0; 1339 return 0;
1324 1340