aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/ahci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata/ahci.c')
-rw-r--r--drivers/ata/ahci.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index 6e5f69a3a0c2..e38ae12d0148 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -1042,9 +1042,10 @@ static int ahci_exec_polled_cmd(struct ata_port *ap, int pmp,
1042 return 0; 1042 return 0;
1043} 1043}
1044 1044
1045static int ahci_do_softreset(struct ata_port *ap, unsigned int *class, 1045static int ahci_do_softreset(struct ata_link *link, unsigned int *class,
1046 int pmp, unsigned long deadline) 1046 int pmp, unsigned long deadline)
1047{ 1047{
1048 struct ata_port *ap = link->ap;
1048 const char *reason = NULL; 1049 const char *reason = NULL;
1049 unsigned long now, msecs; 1050 unsigned long now, msecs;
1050 struct ata_taskfile tf; 1051 struct ata_taskfile tf;
@@ -1052,7 +1053,7 @@ static int ahci_do_softreset(struct ata_port *ap, unsigned int *class,
1052 1053
1053 DPRINTK("ENTER\n"); 1054 DPRINTK("ENTER\n");
1054 1055
1055 if (ata_link_offline(&ap->link)) { 1056 if (ata_link_offline(link)) {
1056 DPRINTK("PHY reports no device\n"); 1057 DPRINTK("PHY reports no device\n");
1057 *class = ATA_DEV_NONE; 1058 *class = ATA_DEV_NONE;
1058 return 0; 1059 return 0;
@@ -1061,10 +1062,10 @@ static int ahci_do_softreset(struct ata_port *ap, unsigned int *class,
1061 /* prepare for SRST (AHCI-1.1 10.4.1) */ 1062 /* prepare for SRST (AHCI-1.1 10.4.1) */
1062 rc = ahci_kick_engine(ap, 1); 1063 rc = ahci_kick_engine(ap, 1);
1063 if (rc) 1064 if (rc)
1064 ata_port_printk(ap, KERN_WARNING, 1065 ata_link_printk(link, KERN_WARNING,
1065 "failed to reset engine (errno=%d)", rc); 1066 "failed to reset engine (errno=%d)", rc);
1066 1067
1067 ata_tf_init(ap->link.device, &tf); 1068 ata_tf_init(link->device, &tf);
1068 1069
1069 /* issue the first D2H Register FIS */ 1070 /* issue the first D2H Register FIS */
1070 msecs = 0; 1071 msecs = 0;
@@ -1109,19 +1110,20 @@ static int ahci_do_softreset(struct ata_port *ap, unsigned int *class,
1109 return 0; 1110 return 0;
1110 1111
1111 fail: 1112 fail:
1112 ata_port_printk(ap, KERN_ERR, "softreset failed (%s)\n", reason); 1113 ata_link_printk(link, KERN_ERR, "softreset failed (%s)\n", reason);
1113 return rc; 1114 return rc;
1114} 1115}
1115 1116
1116static int ahci_softreset(struct ata_port *ap, unsigned int *class, 1117static int ahci_softreset(struct ata_link *link, unsigned int *class,
1117 unsigned long deadline) 1118 unsigned long deadline)
1118{ 1119{
1119 return ahci_do_softreset(ap, class, 0, deadline); 1120 return ahci_do_softreset(link, class, 0, deadline);
1120} 1121}
1121 1122
1122static int ahci_hardreset(struct ata_port *ap, unsigned int *class, 1123static int ahci_hardreset(struct ata_link *link, unsigned int *class,
1123 unsigned long deadline) 1124 unsigned long deadline)
1124{ 1125{
1126 struct ata_port *ap = link->ap;
1125 struct ahci_port_priv *pp = ap->private_data; 1127 struct ahci_port_priv *pp = ap->private_data;
1126 u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG; 1128 u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG;
1127 struct ata_taskfile tf; 1129 struct ata_taskfile tf;
@@ -1132,15 +1134,15 @@ static int ahci_hardreset(struct ata_port *ap, unsigned int *class,
1132 ahci_stop_engine(ap); 1134 ahci_stop_engine(ap);
1133 1135
1134 /* clear D2H reception area to properly wait for D2H FIS */ 1136 /* clear D2H reception area to properly wait for D2H FIS */
1135 ata_tf_init(ap->link.device, &tf); 1137 ata_tf_init(link->device, &tf);
1136 tf.command = 0x80; 1138 tf.command = 0x80;
1137 ata_tf_to_fis(&tf, 0, 0, d2h_fis); 1139 ata_tf_to_fis(&tf, 0, 0, d2h_fis);
1138 1140
1139 rc = sata_std_hardreset(ap, class, deadline); 1141 rc = sata_std_hardreset(link, class, deadline);
1140 1142
1141 ahci_start_engine(ap); 1143 ahci_start_engine(ap);
1142 1144
1143 if (rc == 0 && ata_link_online(&ap->link)) 1145 if (rc == 0 && ata_link_online(link))
1144 *class = ahci_dev_classify(ap); 1146 *class = ahci_dev_classify(ap);
1145 if (*class == ATA_DEV_UNKNOWN) 1147 if (*class == ATA_DEV_UNKNOWN)
1146 *class = ATA_DEV_NONE; 1148 *class = ATA_DEV_NONE;
@@ -1149,9 +1151,10 @@ static int ahci_hardreset(struct ata_port *ap, unsigned int *class,
1149 return rc; 1151 return rc;
1150} 1152}
1151 1153
1152static int ahci_vt8251_hardreset(struct ata_port *ap, unsigned int *class, 1154static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
1153 unsigned long deadline) 1155 unsigned long deadline)
1154{ 1156{
1157 struct ata_port *ap = link->ap;
1155 u32 serror; 1158 u32 serror;
1156 int rc; 1159 int rc;
1157 1160
@@ -1159,7 +1162,7 @@ static int ahci_vt8251_hardreset(struct ata_port *ap, unsigned int *class,
1159 1162
1160 ahci_stop_engine(ap); 1163 ahci_stop_engine(ap);
1161 1164
1162 rc = sata_port_hardreset(ap, sata_ehc_deb_timing(&ap->link.eh_context), 1165 rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
1163 deadline); 1166 deadline);
1164 1167
1165 /* vt8251 needs SError cleared for the port to operate */ 1168 /* vt8251 needs SError cleared for the port to operate */
@@ -1176,12 +1179,13 @@ static int ahci_vt8251_hardreset(struct ata_port *ap, unsigned int *class,
1176 return rc ?: -EAGAIN; 1179 return rc ?: -EAGAIN;
1177} 1180}
1178 1181
1179static void ahci_postreset(struct ata_port *ap, unsigned int *class) 1182static void ahci_postreset(struct ata_link *link, unsigned int *class)
1180{ 1183{
1184 struct ata_port *ap = link->ap;
1181 void __iomem *port_mmio = ahci_port_base(ap); 1185 void __iomem *port_mmio = ahci_port_base(ap);
1182 u32 new_tmp, tmp; 1186 u32 new_tmp, tmp;
1183 1187
1184 ata_std_postreset(ap, class); 1188 ata_std_postreset(link, class);
1185 1189
1186 /* Make sure port's ATAPI bit is set appropriately */ 1190 /* Make sure port's ATAPI bit is set appropriately */
1187 new_tmp = tmp = readl(port_mmio + PORT_CMD); 1191 new_tmp = tmp = readl(port_mmio + PORT_CMD);