blob: 9e18cc9be0d37f910345582a180dc4909ad34abb [file] [log] [blame]
Tejun Heoece1d632006-04-02 18:51:53 +09001/*
2 * libata-eh.c - libata error handling
3 *
4 * Maintained by: Jeff Garzik <jgarzik@pobox.com>
5 * Please ALWAYS copy linux-ide@vger.kernel.org
6 * on emails.
7 *
8 * Copyright 2006 Tejun Heo <htejun@gmail.com>
9 *
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License as
13 * published by the Free Software Foundation; either version 2, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; see the file COPYING. If not, write to
23 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
24 * USA.
25 *
26 *
27 * libata documentation is available via 'make {ps|pdf}docs',
28 * as Documentation/DocBook/libata.*
29 *
30 * Hardware documentation available from http://www.t13.org/ and
31 * http://www.sata-io.org/
32 *
33 */
34
Tejun Heoece1d632006-04-02 18:51:53 +090035#include <linux/kernel.h>
Jens Axboe242f9dc2008-09-14 05:55:09 -070036#include <linux/blkdev.h>
Jeff Garzik28555682007-10-11 17:12:35 -040037#include <linux/pci.h>
Tejun Heoece1d632006-04-02 18:51:53 +090038#include <scsi/scsi.h>
39#include <scsi/scsi_host.h>
40#include <scsi/scsi_eh.h>
41#include <scsi/scsi_device.h>
42#include <scsi/scsi_cmnd.h>
Robert Hancock65211482009-07-14 20:43:39 -060043#include <scsi/scsi_dbg.h>
Jeff Garzikc6fd2802006-08-10 07:31:37 -040044#include "../scsi/scsi_transport_api.h"
Tejun Heoece1d632006-04-02 18:51:53 +090045
46#include <linux/libata.h>
47
48#include "libata.h"
49
Tejun Heo7d47e8d2007-02-02 16:22:31 +090050enum {
Tejun Heo3884f7b2007-11-27 19:28:56 +090051 /* speed down verdicts */
Tejun Heo7d47e8d2007-02-02 16:22:31 +090052 ATA_EH_SPDN_NCQ_OFF = (1 << 0),
53 ATA_EH_SPDN_SPEED_DOWN = (1 << 1),
54 ATA_EH_SPDN_FALLBACK_TO_PIO = (1 << 2),
Tejun Heo76326ac2007-11-27 19:28:59 +090055 ATA_EH_SPDN_KEEP_ERRORS = (1 << 3),
Tejun Heo3884f7b2007-11-27 19:28:56 +090056
57 /* error flags */
58 ATA_EFLAG_IS_IO = (1 << 0),
Tejun Heo76326ac2007-11-27 19:28:59 +090059 ATA_EFLAG_DUBIOUS_XFER = (1 << 1),
Tejun Heo3884f7b2007-11-27 19:28:56 +090060
61 /* error categories */
62 ATA_ECAT_NONE = 0,
63 ATA_ECAT_ATA_BUS = 1,
64 ATA_ECAT_TOUT_HSM = 2,
65 ATA_ECAT_UNK_DEV = 3,
Tejun Heo75f9caf2008-01-03 01:21:14 +090066 ATA_ECAT_DUBIOUS_NONE = 4,
67 ATA_ECAT_DUBIOUS_ATA_BUS = 5,
68 ATA_ECAT_DUBIOUS_TOUT_HSM = 6,
69 ATA_ECAT_DUBIOUS_UNK_DEV = 7,
70 ATA_ECAT_NR = 8,
Tejun Heo7d47e8d2007-02-02 16:22:31 +090071
Tejun Heo87fbc5a2008-05-20 02:17:54 +090072 ATA_EH_CMD_DFL_TIMEOUT = 5000,
73
Tejun Heo0a2c0f52008-05-20 02:17:52 +090074 /* always put at least this amount of time between resets */
75 ATA_EH_RESET_COOL_DOWN = 5000,
76
Tejun Heo341c2c92008-05-20 02:17:51 +090077 /* Waiting in ->prereset can never be reliable. It's
78 * sometimes nice to wait there but it can't be depended upon;
79 * otherwise, we wouldn't be resetting. Just give it enough
80 * time for most drives to spin up.
81 */
82 ATA_EH_PRERESET_TIMEOUT = 10000,
83 ATA_EH_FASTDRAIN_INTERVAL = 3000,
Tejun Heo11fc33d2008-08-30 14:20:01 +020084
85 ATA_EH_UA_TRIES = 5,
Tejun Heoc2c7a892009-01-29 20:31:34 +090086
87 /* probe speed down parameters, see ata_eh_schedule_probe() */
88 ATA_EH_PROBE_TRIAL_INTERVAL = 60000, /* 1 min */
89 ATA_EH_PROBE_TRIALS = 2,
Tejun Heo31daabd2007-02-02 16:50:52 +090090};
91
92/* The following table determines how we sequence resets. Each entry
93 * represents timeout for that try. The first try can be soft or
94 * hardreset. All others are hardreset if available. In most cases
95 * the first reset w/ 10sec timeout should succeed. Following entries
96 * are mostly for error handling, hotplug and retarded devices.
97 */
98static const unsigned long ata_eh_reset_timeouts[] = {
Tejun Heo341c2c92008-05-20 02:17:51 +090099 10000, /* most drives spin up by 10sec */
100 10000, /* > 99% working drives spin up before 20sec */
101 35000, /* give > 30 secs of idleness for retarded devices */
102 5000, /* and sweet one last chance */
Tejun Heod8af0eb2008-05-20 02:17:53 +0900103 ULONG_MAX, /* > 1 min has elapsed, give up */
Tejun Heo31daabd2007-02-02 16:50:52 +0900104};
105
Tejun Heo87fbc5a2008-05-20 02:17:54 +0900106static const unsigned long ata_eh_identify_timeouts[] = {
107 5000, /* covers > 99% of successes and not too boring on failures */
108 10000, /* combined time till here is enough even for media access */
109 30000, /* for true idiots */
110 ULONG_MAX,
111};
112
Tejun Heo6013efd2009-11-19 15:36:45 +0900113static const unsigned long ata_eh_flush_timeouts[] = {
114 15000, /* be generous with flush */
115 15000, /* ditto */
116 30000, /* and even more generous */
117 ULONG_MAX,
118};
119
Tejun Heo87fbc5a2008-05-20 02:17:54 +0900120static const unsigned long ata_eh_other_timeouts[] = {
121 5000, /* same rationale as identify timeout */
122 10000, /* ditto */
123 /* but no merciful 30sec for other commands, it just isn't worth it */
124 ULONG_MAX,
125};
126
127struct ata_eh_cmd_timeout_ent {
128 const u8 *commands;
129 const unsigned long *timeouts;
130};
131
132/* The following table determines timeouts to use for EH internal
133 * commands. Each table entry is a command class and matches the
134 * commands the entry applies to and the timeout table to use.
135 *
136 * On the retry after a command timed out, the next timeout value from
137 * the table is used. If the table doesn't contain further entries,
138 * the last value is used.
139 *
140 * ehc->cmd_timeout_idx keeps track of which timeout to use per
141 * command class, so if SET_FEATURES times out on the first try, the
142 * next try will use the second timeout value only for that class.
143 */
144#define CMDS(cmds...) (const u8 []){ cmds, 0 }
145static const struct ata_eh_cmd_timeout_ent
146ata_eh_cmd_timeout_table[ATA_EH_CMD_TIMEOUT_TABLE_SIZE] = {
147 { .commands = CMDS(ATA_CMD_ID_ATA, ATA_CMD_ID_ATAPI),
148 .timeouts = ata_eh_identify_timeouts, },
149 { .commands = CMDS(ATA_CMD_READ_NATIVE_MAX, ATA_CMD_READ_NATIVE_MAX_EXT),
150 .timeouts = ata_eh_other_timeouts, },
151 { .commands = CMDS(ATA_CMD_SET_MAX, ATA_CMD_SET_MAX_EXT),
152 .timeouts = ata_eh_other_timeouts, },
153 { .commands = CMDS(ATA_CMD_SET_FEATURES),
154 .timeouts = ata_eh_other_timeouts, },
155 { .commands = CMDS(ATA_CMD_INIT_DEV_PARAMS),
156 .timeouts = ata_eh_other_timeouts, },
Tejun Heo6013efd2009-11-19 15:36:45 +0900157 { .commands = CMDS(ATA_CMD_FLUSH, ATA_CMD_FLUSH_EXT),
158 .timeouts = ata_eh_flush_timeouts },
Tejun Heo87fbc5a2008-05-20 02:17:54 +0900159};
160#undef CMDS
161
Tejun Heoad9e2762006-05-15 20:58:12 +0900162static void __ata_port_freeze(struct ata_port *ap);
Tejun Heo6ffa01d2007-03-02 17:32:47 +0900163#ifdef CONFIG_PM
Tejun Heo500530f2006-07-03 16:07:27 +0900164static void ata_eh_handle_port_suspend(struct ata_port *ap);
165static void ata_eh_handle_port_resume(struct ata_port *ap);
Tejun Heo6ffa01d2007-03-02 17:32:47 +0900166#else /* CONFIG_PM */
167static void ata_eh_handle_port_suspend(struct ata_port *ap)
168{ }
169
170static void ata_eh_handle_port_resume(struct ata_port *ap)
171{ }
Tejun Heo6ffa01d2007-03-02 17:32:47 +0900172#endif /* CONFIG_PM */
Tejun Heoad9e2762006-05-15 20:58:12 +0900173
Tejun Heob64bbc32007-07-16 14:29:39 +0900174static void __ata_ehi_pushv_desc(struct ata_eh_info *ehi, const char *fmt,
175 va_list args)
176{
177 ehi->desc_len += vscnprintf(ehi->desc + ehi->desc_len,
178 ATA_EH_DESC_LEN - ehi->desc_len,
179 fmt, args);
180}
181
182/**
183 * __ata_ehi_push_desc - push error description without adding separator
184 * @ehi: target EHI
185 * @fmt: printf format string
186 *
187 * Format string according to @fmt and append it to @ehi->desc.
188 *
189 * LOCKING:
190 * spin_lock_irqsave(host lock)
191 */
192void __ata_ehi_push_desc(struct ata_eh_info *ehi, const char *fmt, ...)
193{
194 va_list args;
195
196 va_start(args, fmt);
197 __ata_ehi_pushv_desc(ehi, fmt, args);
198 va_end(args);
199}
200
201/**
202 * ata_ehi_push_desc - push error description with separator
203 * @ehi: target EHI
204 * @fmt: printf format string
205 *
206 * Format string according to @fmt and append it to @ehi->desc.
207 * If @ehi->desc is not empty, ", " is added in-between.
208 *
209 * LOCKING:
210 * spin_lock_irqsave(host lock)
211 */
212void ata_ehi_push_desc(struct ata_eh_info *ehi, const char *fmt, ...)
213{
214 va_list args;
215
216 if (ehi->desc_len)
217 __ata_ehi_push_desc(ehi, ", ");
218
219 va_start(args, fmt);
220 __ata_ehi_pushv_desc(ehi, fmt, args);
221 va_end(args);
222}
223
224/**
225 * ata_ehi_clear_desc - clean error description
226 * @ehi: target EHI
227 *
228 * Clear @ehi->desc.
229 *
230 * LOCKING:
231 * spin_lock_irqsave(host lock)
232 */
233void ata_ehi_clear_desc(struct ata_eh_info *ehi)
234{
235 ehi->desc[0] = '\0';
236 ehi->desc_len = 0;
237}
238
Tejun Heocbcdd872007-08-18 13:14:55 +0900239/**
240 * ata_port_desc - append port description
241 * @ap: target ATA port
242 * @fmt: printf format string
243 *
244 * Format string according to @fmt and append it to port
245 * description. If port description is not empty, " " is added
246 * in-between. This function is to be used while initializing
247 * ata_host. The description is printed on host registration.
248 *
249 * LOCKING:
250 * None.
251 */
252void ata_port_desc(struct ata_port *ap, const char *fmt, ...)
253{
254 va_list args;
255
256 WARN_ON(!(ap->pflags & ATA_PFLAG_INITIALIZING));
257
258 if (ap->link.eh_info.desc_len)
259 __ata_ehi_push_desc(&ap->link.eh_info, " ");
260
261 va_start(args, fmt);
262 __ata_ehi_pushv_desc(&ap->link.eh_info, fmt, args);
263 va_end(args);
264}
265
266#ifdef CONFIG_PCI
267
268/**
269 * ata_port_pbar_desc - append PCI BAR description
270 * @ap: target ATA port
271 * @bar: target PCI BAR
272 * @offset: offset into PCI BAR
273 * @name: name of the area
274 *
275 * If @offset is negative, this function formats a string which
276 * contains the name, address, size and type of the BAR and
277 * appends it to the port description. If @offset is zero or
278 * positive, only name and offsetted address is appended.
279 *
280 * LOCKING:
281 * None.
282 */
283void ata_port_pbar_desc(struct ata_port *ap, int bar, ssize_t offset,
284 const char *name)
285{
286 struct pci_dev *pdev = to_pci_dev(ap->host->dev);
287 char *type = "";
288 unsigned long long start, len;
289
290 if (pci_resource_flags(pdev, bar) & IORESOURCE_MEM)
291 type = "m";
292 else if (pci_resource_flags(pdev, bar) & IORESOURCE_IO)
293 type = "i";
294
295 start = (unsigned long long)pci_resource_start(pdev, bar);
296 len = (unsigned long long)pci_resource_len(pdev, bar);
297
298 if (offset < 0)
299 ata_port_desc(ap, "%s %s%llu@0x%llx", name, type, len, start);
300 else
Andrew Mortone6a73ab2007-12-13 16:01:37 -0800301 ata_port_desc(ap, "%s 0x%llx", name,
302 start + (unsigned long long)offset);
Tejun Heocbcdd872007-08-18 13:14:55 +0900303}
304
305#endif /* CONFIG_PCI */
306
Tejun Heo87fbc5a2008-05-20 02:17:54 +0900307static int ata_lookup_timeout_table(u8 cmd)
308{
309 int i;
310
311 for (i = 0; i < ATA_EH_CMD_TIMEOUT_TABLE_SIZE; i++) {
312 const u8 *cur;
313
314 for (cur = ata_eh_cmd_timeout_table[i].commands; *cur; cur++)
315 if (*cur == cmd)
316 return i;
317 }
318
319 return -1;
320}
321
322/**
323 * ata_internal_cmd_timeout - determine timeout for an internal command
324 * @dev: target device
325 * @cmd: internal command to be issued
326 *
327 * Determine timeout for internal command @cmd for @dev.
328 *
329 * LOCKING:
330 * EH context.
331 *
332 * RETURNS:
333 * Determined timeout.
334 */
335unsigned long ata_internal_cmd_timeout(struct ata_device *dev, u8 cmd)
336{
337 struct ata_eh_context *ehc = &dev->link->eh_context;
338 int ent = ata_lookup_timeout_table(cmd);
339 int idx;
340
341 if (ent < 0)
342 return ATA_EH_CMD_DFL_TIMEOUT;
343
344 idx = ehc->cmd_timeout_idx[dev->devno][ent];
345 return ata_eh_cmd_timeout_table[ent].timeouts[idx];
346}
347
348/**
349 * ata_internal_cmd_timed_out - notification for internal command timeout
350 * @dev: target device
351 * @cmd: internal command which timed out
352 *
353 * Notify EH that internal command @cmd for @dev timed out. This
354 * function should be called only for commands whose timeouts are
355 * determined using ata_internal_cmd_timeout().
356 *
357 * LOCKING:
358 * EH context.
359 */
360void ata_internal_cmd_timed_out(struct ata_device *dev, u8 cmd)
361{
362 struct ata_eh_context *ehc = &dev->link->eh_context;
363 int ent = ata_lookup_timeout_table(cmd);
364 int idx;
365
366 if (ent < 0)
367 return;
368
369 idx = ehc->cmd_timeout_idx[dev->devno][ent];
370 if (ata_eh_cmd_timeout_table[ent].timeouts[idx + 1] != ULONG_MAX)
371 ehc->cmd_timeout_idx[dev->devno][ent]++;
372}
373
Tejun Heo3884f7b2007-11-27 19:28:56 +0900374static void ata_ering_record(struct ata_ering *ering, unsigned int eflags,
Tejun Heo0c247c52006-05-15 20:58:19 +0900375 unsigned int err_mask)
376{
377 struct ata_ering_entry *ent;
378
379 WARN_ON(!err_mask);
380
381 ering->cursor++;
382 ering->cursor %= ATA_ERING_SIZE;
383
384 ent = &ering->ring[ering->cursor];
Tejun Heo3884f7b2007-11-27 19:28:56 +0900385 ent->eflags = eflags;
Tejun Heo0c247c52006-05-15 20:58:19 +0900386 ent->err_mask = err_mask;
387 ent->timestamp = get_jiffies_64();
388}
389
Tejun Heo76326ac2007-11-27 19:28:59 +0900390static struct ata_ering_entry *ata_ering_top(struct ata_ering *ering)
391{
392 struct ata_ering_entry *ent = &ering->ring[ering->cursor];
393
394 if (ent->err_mask)
395 return ent;
396 return NULL;
397}
398
Tejun Heo7d47e8d2007-02-02 16:22:31 +0900399static void ata_ering_clear(struct ata_ering *ering)
Tejun Heo0c247c52006-05-15 20:58:19 +0900400{
Tejun Heo7d47e8d2007-02-02 16:22:31 +0900401 memset(ering, 0, sizeof(*ering));
Tejun Heo0c247c52006-05-15 20:58:19 +0900402}
403
404static int ata_ering_map(struct ata_ering *ering,
405 int (*map_fn)(struct ata_ering_entry *, void *),
406 void *arg)
407{
408 int idx, rc = 0;
409 struct ata_ering_entry *ent;
410
411 idx = ering->cursor;
412 do {
413 ent = &ering->ring[idx];
414 if (!ent->err_mask)
415 break;
416 rc = map_fn(ent, arg);
417 if (rc)
418 break;
419 idx = (idx - 1 + ATA_ERING_SIZE) % ATA_ERING_SIZE;
420 } while (idx != ering->cursor);
421
422 return rc;
423}
424
Tejun Heo64f65ca2006-06-24 20:30:18 +0900425static unsigned int ata_eh_dev_action(struct ata_device *dev)
426{
Tejun Heo9af5c9c2007-08-06 18:36:22 +0900427 struct ata_eh_context *ehc = &dev->link->eh_context;
Tejun Heo64f65ca2006-06-24 20:30:18 +0900428
429 return ehc->i.action | ehc->i.dev_action[dev->devno];
430}
431
Tejun Heof58229f2007-08-06 18:36:23 +0900432static void ata_eh_clear_action(struct ata_link *link, struct ata_device *dev,
Tejun Heoaf181c22006-06-24 20:30:18 +0900433 struct ata_eh_info *ehi, unsigned int action)
434{
Tejun Heof58229f2007-08-06 18:36:23 +0900435 struct ata_device *tdev;
Tejun Heoaf181c22006-06-24 20:30:18 +0900436
437 if (!dev) {
438 ehi->action &= ~action;
Tejun Heo1eca4362008-11-03 20:03:17 +0900439 ata_for_each_dev(tdev, link, ALL)
Tejun Heof58229f2007-08-06 18:36:23 +0900440 ehi->dev_action[tdev->devno] &= ~action;
Tejun Heoaf181c22006-06-24 20:30:18 +0900441 } else {
442 /* doesn't make sense for port-wide EH actions */
443 WARN_ON(!(action & ATA_EH_PERDEV_MASK));
444
445 /* break ehi->action into ehi->dev_action */
446 if (ehi->action & action) {
Tejun Heo1eca4362008-11-03 20:03:17 +0900447 ata_for_each_dev(tdev, link, ALL)
Tejun Heof58229f2007-08-06 18:36:23 +0900448 ehi->dev_action[tdev->devno] |=
449 ehi->action & action;
Tejun Heoaf181c22006-06-24 20:30:18 +0900450 ehi->action &= ~action;
451 }
452
453 /* turn off the specified per-dev action */
454 ehi->dev_action[dev->devno] &= ~action;
455 }
456}
457
Tejun Heoece1d632006-04-02 18:51:53 +0900458/**
459 * ata_scsi_timed_out - SCSI layer time out callback
460 * @cmd: timed out SCSI command
461 *
462 * Handles SCSI layer timeout. We race with normal completion of
463 * the qc for @cmd. If the qc is already gone, we lose and let
464 * the scsi command finish (EH_HANDLED). Otherwise, the qc has
465 * timed out and EH should be invoked. Prevent ata_qc_complete()
466 * from finishing it by setting EH_SCHEDULED and return
467 * EH_NOT_HANDLED.
468 *
Tejun Heoad9e2762006-05-15 20:58:12 +0900469 * TODO: kill this function once old EH is gone.
470 *
Tejun Heoece1d632006-04-02 18:51:53 +0900471 * LOCKING:
472 * Called from timer context
473 *
474 * RETURNS:
475 * EH_HANDLED or EH_NOT_HANDLED
476 */
Jens Axboe242f9dc2008-09-14 05:55:09 -0700477enum blk_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd)
Tejun Heoece1d632006-04-02 18:51:53 +0900478{
479 struct Scsi_Host *host = cmd->device->host;
Jeff Garzik35bb94b2006-04-11 13:12:34 -0400480 struct ata_port *ap = ata_shost_to_port(host);
Tejun Heoece1d632006-04-02 18:51:53 +0900481 unsigned long flags;
482 struct ata_queued_cmd *qc;
Jens Axboe242f9dc2008-09-14 05:55:09 -0700483 enum blk_eh_timer_return ret;
Tejun Heoece1d632006-04-02 18:51:53 +0900484
485 DPRINTK("ENTER\n");
486
Tejun Heoad9e2762006-05-15 20:58:12 +0900487 if (ap->ops->error_handler) {
Jens Axboe242f9dc2008-09-14 05:55:09 -0700488 ret = BLK_EH_NOT_HANDLED;
Tejun Heoad9e2762006-05-15 20:58:12 +0900489 goto out;
490 }
491
Jens Axboe242f9dc2008-09-14 05:55:09 -0700492 ret = BLK_EH_HANDLED;
Jeff Garzikba6a1302006-06-22 23:46:10 -0400493 spin_lock_irqsave(ap->lock, flags);
Tejun Heo9af5c9c2007-08-06 18:36:22 +0900494 qc = ata_qc_from_tag(ap, ap->link.active_tag);
Tejun Heoece1d632006-04-02 18:51:53 +0900495 if (qc) {
496 WARN_ON(qc->scsicmd != cmd);
497 qc->flags |= ATA_QCFLAG_EH_SCHEDULED;
498 qc->err_mask |= AC_ERR_TIMEOUT;
Jens Axboe242f9dc2008-09-14 05:55:09 -0700499 ret = BLK_EH_NOT_HANDLED;
Tejun Heoece1d632006-04-02 18:51:53 +0900500 }
Jeff Garzikba6a1302006-06-22 23:46:10 -0400501 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoece1d632006-04-02 18:51:53 +0900502
Tejun Heoad9e2762006-05-15 20:58:12 +0900503 out:
Tejun Heoece1d632006-04-02 18:51:53 +0900504 DPRINTK("EXIT, ret=%d\n", ret);
505 return ret;
506}
507
Tejun Heoece180d2008-11-03 20:04:37 +0900508static void ata_eh_unload(struct ata_port *ap)
509{
510 struct ata_link *link;
511 struct ata_device *dev;
512 unsigned long flags;
513
514 /* Restore SControl IPM and SPD for the next driver and
515 * disable attached devices.
516 */
517 ata_for_each_link(link, ap, PMP_FIRST) {
518 sata_scr_write(link, SCR_CONTROL, link->saved_scontrol & 0xff0);
519 ata_for_each_dev(dev, link, ALL)
520 ata_dev_disable(dev);
521 }
522
523 /* freeze and set UNLOADED */
524 spin_lock_irqsave(ap->lock, flags);
525
526 ata_port_freeze(ap); /* won't be thawed */
527 ap->pflags &= ~ATA_PFLAG_EH_PENDING; /* clear pending from freeze */
528 ap->pflags |= ATA_PFLAG_UNLOADED;
529
530 spin_unlock_irqrestore(ap->lock, flags);
531}
532
Tejun Heoece1d632006-04-02 18:51:53 +0900533/**
534 * ata_scsi_error - SCSI layer error handler callback
535 * @host: SCSI host on which error occurred
536 *
537 * Handles SCSI-layer-thrown error events.
538 *
539 * LOCKING:
540 * Inherited from SCSI layer (none, can sleep)
541 *
542 * RETURNS:
543 * Zero.
544 */
Jeff Garzik381544b2006-04-11 13:04:39 -0400545void ata_scsi_error(struct Scsi_Host *host)
Tejun Heoece1d632006-04-02 18:51:53 +0900546{
Jeff Garzik35bb94b2006-04-11 13:12:34 -0400547 struct ata_port *ap = ata_shost_to_port(host);
Tejun Heoa1e10f72007-08-18 13:28:49 +0900548 int i;
Tejun Heoad9e2762006-05-15 20:58:12 +0900549 unsigned long flags;
Tejun Heoece1d632006-04-02 18:51:53 +0900550
551 DPRINTK("ENTER\n");
552
Tejun Heoad9e2762006-05-15 20:58:12 +0900553 /* synchronize with port task */
Tejun Heoece1d632006-04-02 18:51:53 +0900554 ata_port_flush_task(ap);
555
Jeff Garzikcca39742006-08-24 03:19:22 -0400556 /* synchronize with host lock and sort out timeouts */
Tejun Heoece1d632006-04-02 18:51:53 +0900557
Tejun Heoad9e2762006-05-15 20:58:12 +0900558 /* For new EH, all qcs are finished in one of three ways -
559 * normal completion, error completion, and SCSI timeout.
Alan Coxc96f1732009-03-24 10:23:46 +0000560 * Both completions can race against SCSI timeout. When normal
Tejun Heoad9e2762006-05-15 20:58:12 +0900561 * completion wins, the qc never reaches EH. When error
562 * completion wins, the qc has ATA_QCFLAG_FAILED set.
563 *
564 * When SCSI timeout wins, things are a bit more complex.
565 * Normal or error completion can occur after the timeout but
566 * before this point. In such cases, both types of
567 * completions are honored. A scmd is determined to have
568 * timed out iff its associated qc is active and not failed.
569 */
570 if (ap->ops->error_handler) {
571 struct scsi_cmnd *scmd, *tmp;
572 int nr_timedout = 0;
Tejun Heoece1d632006-04-02 18:51:53 +0900573
Tejun Heoe30349d2006-07-03 03:02:15 +0900574 spin_lock_irqsave(ap->lock, flags);
Alan Coxc96f1732009-03-24 10:23:46 +0000575
576 /* This must occur under the ap->lock as we don't want
577 a polled recovery to race the real interrupt handler
578
579 The lost_interrupt handler checks for any completed but
580 non-notified command and completes much like an IRQ handler.
581
582 We then fall into the error recovery code which will treat
583 this as if normal completion won the race */
Tejun Heoad9e2762006-05-15 20:58:12 +0900584
Alan Coxc96f1732009-03-24 10:23:46 +0000585 if (ap->ops->lost_interrupt)
586 ap->ops->lost_interrupt(ap);
587
Tejun Heoad9e2762006-05-15 20:58:12 +0900588 list_for_each_entry_safe(scmd, tmp, &host->eh_cmd_q, eh_entry) {
589 struct ata_queued_cmd *qc;
590
591 for (i = 0; i < ATA_MAX_QUEUE; i++) {
592 qc = __ata_qc_from_tag(ap, i);
593 if (qc->flags & ATA_QCFLAG_ACTIVE &&
594 qc->scsicmd == scmd)
595 break;
596 }
597
598 if (i < ATA_MAX_QUEUE) {
599 /* the scmd has an associated qc */
600 if (!(qc->flags & ATA_QCFLAG_FAILED)) {
601 /* which hasn't failed yet, timeout */
602 qc->err_mask |= AC_ERR_TIMEOUT;
603 qc->flags |= ATA_QCFLAG_FAILED;
604 nr_timedout++;
605 }
606 } else {
607 /* Normal completion occurred after
608 * SCSI timeout but before this point.
609 * Successfully complete it.
610 */
611 scmd->retries = scmd->allowed;
612 scsi_eh_finish_cmd(scmd, &ap->eh_done_q);
613 }
614 }
615
616 /* If we have timed out qcs. They belong to EH from
617 * this point but the state of the controller is
618 * unknown. Freeze the port to make sure the IRQ
619 * handler doesn't diddle with those qcs. This must
620 * be done atomically w.r.t. setting QCFLAG_FAILED.
621 */
622 if (nr_timedout)
623 __ata_port_freeze(ap);
624
Tejun Heoe30349d2006-07-03 03:02:15 +0900625 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoa1e10f72007-08-18 13:28:49 +0900626
627 /* initialize eh_tries */
628 ap->eh_tries = ATA_EH_MAX_TRIES;
Tejun Heoad9e2762006-05-15 20:58:12 +0900629 } else
Tejun Heoe30349d2006-07-03 03:02:15 +0900630 spin_unlock_wait(ap->lock);
Alan Coxc96f1732009-03-24 10:23:46 +0000631
632 /* If we timed raced normal completion and there is nothing to
633 recover nr_timedout == 0 why exactly are we doing error recovery ? */
Tejun Heoad9e2762006-05-15 20:58:12 +0900634
635 repeat:
636 /* invoke error handler */
637 if (ap->ops->error_handler) {
Tejun Heocf1b86c2007-08-06 18:36:23 +0900638 struct ata_link *link;
639
Tejun Heo5ddf24c2007-07-16 14:29:41 +0900640 /* kill fast drain timer */
641 del_timer_sync(&ap->fastdrain_timer);
642
Tejun Heo500530f2006-07-03 16:07:27 +0900643 /* process port resume request */
644 ata_eh_handle_port_resume(ap);
645
Tejun Heof3e81b12006-05-15 20:58:21 +0900646 /* fetch & clear EH info */
Tejun Heoe30349d2006-07-03 03:02:15 +0900647 spin_lock_irqsave(ap->lock, flags);
Tejun Heof3e81b12006-05-15 20:58:21 +0900648
Tejun Heo1eca4362008-11-03 20:03:17 +0900649 ata_for_each_link(link, ap, HOST_FIRST) {
Tejun Heo00115e02007-11-27 19:28:58 +0900650 struct ata_eh_context *ehc = &link->eh_context;
651 struct ata_device *dev;
652
Tejun Heocf1b86c2007-08-06 18:36:23 +0900653 memset(&link->eh_context, 0, sizeof(link->eh_context));
654 link->eh_context.i = link->eh_info;
655 memset(&link->eh_info, 0, sizeof(link->eh_info));
Tejun Heo00115e02007-11-27 19:28:58 +0900656
Tejun Heo1eca4362008-11-03 20:03:17 +0900657 ata_for_each_dev(dev, link, ENABLED) {
Tejun Heo00115e02007-11-27 19:28:58 +0900658 int devno = dev->devno;
659
660 ehc->saved_xfer_mode[devno] = dev->xfer_mode;
661 if (ata_ncq_enabled(dev))
662 ehc->saved_ncq_enabled |= 1 << devno;
663 }
Tejun Heocf1b86c2007-08-06 18:36:23 +0900664 }
Tejun Heof3e81b12006-05-15 20:58:21 +0900665
Tejun Heob51e9e52006-06-29 01:29:30 +0900666 ap->pflags |= ATA_PFLAG_EH_IN_PROGRESS;
667 ap->pflags &= ~ATA_PFLAG_EH_PENDING;
Tejun Heoda917d62007-09-23 13:14:12 +0900668 ap->excl_link = NULL; /* don't maintain exclusion over EH */
Tejun Heof3e81b12006-05-15 20:58:21 +0900669
Tejun Heoe30349d2006-07-03 03:02:15 +0900670 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoad9e2762006-05-15 20:58:12 +0900671
Tejun Heo500530f2006-07-03 16:07:27 +0900672 /* invoke EH, skip if unloading or suspended */
673 if (!(ap->pflags & (ATA_PFLAG_UNLOADING | ATA_PFLAG_SUSPENDED)))
Tejun Heo720ba122006-05-31 18:28:13 +0900674 ap->ops->error_handler(ap);
Tejun Heoece180d2008-11-03 20:04:37 +0900675 else {
676 /* if unloading, commence suicide */
677 if ((ap->pflags & ATA_PFLAG_UNLOADING) &&
678 !(ap->pflags & ATA_PFLAG_UNLOADED))
679 ata_eh_unload(ap);
Tejun Heo720ba122006-05-31 18:28:13 +0900680 ata_eh_finish(ap);
Tejun Heoece180d2008-11-03 20:04:37 +0900681 }
Tejun Heoad9e2762006-05-15 20:58:12 +0900682
Tejun Heo500530f2006-07-03 16:07:27 +0900683 /* process port suspend request */
684 ata_eh_handle_port_suspend(ap);
685
Tejun Heoad9e2762006-05-15 20:58:12 +0900686 /* Exception might have happend after ->error_handler
687 * recovered the port but before this point. Repeat
688 * EH in such case.
689 */
Tejun Heoe30349d2006-07-03 03:02:15 +0900690 spin_lock_irqsave(ap->lock, flags);
Tejun Heoad9e2762006-05-15 20:58:12 +0900691
Tejun Heob51e9e52006-06-29 01:29:30 +0900692 if (ap->pflags & ATA_PFLAG_EH_PENDING) {
Tejun Heoa1e10f72007-08-18 13:28:49 +0900693 if (--ap->eh_tries) {
Tejun Heoe30349d2006-07-03 03:02:15 +0900694 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoad9e2762006-05-15 20:58:12 +0900695 goto repeat;
696 }
697 ata_port_printk(ap, KERN_ERR, "EH pending after %d "
Tejun Heoa1e10f72007-08-18 13:28:49 +0900698 "tries, giving up\n", ATA_EH_MAX_TRIES);
Tejun Heo914616a2007-06-25 21:47:11 +0900699 ap->pflags &= ~ATA_PFLAG_EH_PENDING;
Tejun Heoad9e2762006-05-15 20:58:12 +0900700 }
701
Tejun Heof3e81b12006-05-15 20:58:21 +0900702 /* this run is complete, make sure EH info is clear */
Tejun Heo1eca4362008-11-03 20:03:17 +0900703 ata_for_each_link(link, ap, HOST_FIRST)
Tejun Heocf1b86c2007-08-06 18:36:23 +0900704 memset(&link->eh_info, 0, sizeof(link->eh_info));
Tejun Heof3e81b12006-05-15 20:58:21 +0900705
Tejun Heoe30349d2006-07-03 03:02:15 +0900706 /* Clear host_eh_scheduled while holding ap->lock such
Tejun Heoad9e2762006-05-15 20:58:12 +0900707 * that if exception occurs after this point but
708 * before EH completion, SCSI midlayer will
709 * re-initiate EH.
710 */
711 host->host_eh_scheduled = 0;
712
Tejun Heoe30349d2006-07-03 03:02:15 +0900713 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoad9e2762006-05-15 20:58:12 +0900714 } else {
Tejun Heo9af5c9c2007-08-06 18:36:22 +0900715 WARN_ON(ata_qc_from_tag(ap, ap->link.active_tag) == NULL);
Tejun Heoad9e2762006-05-15 20:58:12 +0900716 ap->ops->eng_timeout(ap);
717 }
718
719 /* finish or retry handled scmd's and clean up */
Tejun Heoece1d632006-04-02 18:51:53 +0900720 WARN_ON(host->host_failed || !list_empty(&host->eh_cmd_q));
721
722 scsi_eh_flush_done_q(&ap->eh_done_q);
723
Tejun Heoad9e2762006-05-15 20:58:12 +0900724 /* clean up */
Tejun Heoe30349d2006-07-03 03:02:15 +0900725 spin_lock_irqsave(ap->lock, flags);
Tejun Heoad9e2762006-05-15 20:58:12 +0900726
Tejun Heo1cdaf532006-07-03 16:07:26 +0900727 if (ap->pflags & ATA_PFLAG_LOADING)
Tejun Heob51e9e52006-06-29 01:29:30 +0900728 ap->pflags &= ~ATA_PFLAG_LOADING;
Tejun Heo1cdaf532006-07-03 16:07:26 +0900729 else if (ap->pflags & ATA_PFLAG_SCSI_HOTPLUG)
David Howells52bad642006-11-22 14:54:01 +0000730 queue_delayed_work(ata_aux_wq, &ap->hotplug_task, 0);
Tejun Heo1cdaf532006-07-03 16:07:26 +0900731
732 if (ap->pflags & ATA_PFLAG_RECOVERED)
733 ata_port_printk(ap, KERN_INFO, "EH complete\n");
Tejun Heo580b2102006-05-31 18:28:05 +0900734
Tejun Heob51e9e52006-06-29 01:29:30 +0900735 ap->pflags &= ~(ATA_PFLAG_SCSI_HOTPLUG | ATA_PFLAG_RECOVERED);
Tejun Heoad9e2762006-05-15 20:58:12 +0900736
Tejun Heoc6cf9e92006-05-31 18:27:27 +0900737 /* tell wait_eh that we're done */
Tejun Heob51e9e52006-06-29 01:29:30 +0900738 ap->pflags &= ~ATA_PFLAG_EH_IN_PROGRESS;
Tejun Heoc6cf9e92006-05-31 18:27:27 +0900739 wake_up_all(&ap->eh_wait_q);
740
Tejun Heoe30349d2006-07-03 03:02:15 +0900741 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoad9e2762006-05-15 20:58:12 +0900742
Tejun Heoece1d632006-04-02 18:51:53 +0900743 DPRINTK("EXIT\n");
Tejun Heoece1d632006-04-02 18:51:53 +0900744}
745
746/**
Tejun Heoc6cf9e92006-05-31 18:27:27 +0900747 * ata_port_wait_eh - Wait for the currently pending EH to complete
748 * @ap: Port to wait EH for
749 *
750 * Wait until the currently pending EH is complete.
751 *
752 * LOCKING:
753 * Kernel thread context (may sleep).
754 */
755void ata_port_wait_eh(struct ata_port *ap)
756{
757 unsigned long flags;
758 DEFINE_WAIT(wait);
759
760 retry:
Jeff Garzikba6a1302006-06-22 23:46:10 -0400761 spin_lock_irqsave(ap->lock, flags);
Tejun Heoc6cf9e92006-05-31 18:27:27 +0900762
Tejun Heob51e9e52006-06-29 01:29:30 +0900763 while (ap->pflags & (ATA_PFLAG_EH_PENDING | ATA_PFLAG_EH_IN_PROGRESS)) {
Tejun Heoc6cf9e92006-05-31 18:27:27 +0900764 prepare_to_wait(&ap->eh_wait_q, &wait, TASK_UNINTERRUPTIBLE);
Jeff Garzikba6a1302006-06-22 23:46:10 -0400765 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoc6cf9e92006-05-31 18:27:27 +0900766 schedule();
Jeff Garzikba6a1302006-06-22 23:46:10 -0400767 spin_lock_irqsave(ap->lock, flags);
Tejun Heoc6cf9e92006-05-31 18:27:27 +0900768 }
Tejun Heo0a1b6222006-06-11 11:01:38 +0900769 finish_wait(&ap->eh_wait_q, &wait);
Tejun Heoc6cf9e92006-05-31 18:27:27 +0900770
Jeff Garzikba6a1302006-06-22 23:46:10 -0400771 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoc6cf9e92006-05-31 18:27:27 +0900772
773 /* make sure SCSI EH is complete */
Jeff Garzikcca39742006-08-24 03:19:22 -0400774 if (scsi_host_in_recovery(ap->scsi_host)) {
Tejun Heoc6cf9e92006-05-31 18:27:27 +0900775 msleep(10);
776 goto retry;
777 }
778}
779
Tejun Heo5ddf24c2007-07-16 14:29:41 +0900780static int ata_eh_nr_in_flight(struct ata_port *ap)
781{
782 unsigned int tag;
783 int nr = 0;
784
785 /* count only non-internal commands */
786 for (tag = 0; tag < ATA_MAX_QUEUE - 1; tag++)
787 if (ata_qc_from_tag(ap, tag))
788 nr++;
789
790 return nr;
791}
792
793void ata_eh_fastdrain_timerfn(unsigned long arg)
794{
795 struct ata_port *ap = (void *)arg;
796 unsigned long flags;
797 int cnt;
798
799 spin_lock_irqsave(ap->lock, flags);
800
801 cnt = ata_eh_nr_in_flight(ap);
802
803 /* are we done? */
804 if (!cnt)
805 goto out_unlock;
806
807 if (cnt == ap->fastdrain_cnt) {
808 unsigned int tag;
809
810 /* No progress during the last interval, tag all
811 * in-flight qcs as timed out and freeze the port.
812 */
813 for (tag = 0; tag < ATA_MAX_QUEUE - 1; tag++) {
814 struct ata_queued_cmd *qc = ata_qc_from_tag(ap, tag);
815 if (qc)
816 qc->err_mask |= AC_ERR_TIMEOUT;
817 }
818
819 ata_port_freeze(ap);
820 } else {
821 /* some qcs have finished, give it another chance */
822 ap->fastdrain_cnt = cnt;
823 ap->fastdrain_timer.expires =
Tejun Heo341c2c92008-05-20 02:17:51 +0900824 ata_deadline(jiffies, ATA_EH_FASTDRAIN_INTERVAL);
Tejun Heo5ddf24c2007-07-16 14:29:41 +0900825 add_timer(&ap->fastdrain_timer);
826 }
827
828 out_unlock:
829 spin_unlock_irqrestore(ap->lock, flags);
830}
831
832/**
833 * ata_eh_set_pending - set ATA_PFLAG_EH_PENDING and activate fast drain
834 * @ap: target ATA port
835 * @fastdrain: activate fast drain
836 *
837 * Set ATA_PFLAG_EH_PENDING and activate fast drain if @fastdrain
838 * is non-zero and EH wasn't pending before. Fast drain ensures
839 * that EH kicks in in timely manner.
840 *
841 * LOCKING:
842 * spin_lock_irqsave(host lock)
843 */
844static void ata_eh_set_pending(struct ata_port *ap, int fastdrain)
845{
846 int cnt;
847
848 /* already scheduled? */
849 if (ap->pflags & ATA_PFLAG_EH_PENDING)
850 return;
851
852 ap->pflags |= ATA_PFLAG_EH_PENDING;
853
854 if (!fastdrain)
855 return;
856
857 /* do we have in-flight qcs? */
858 cnt = ata_eh_nr_in_flight(ap);
859 if (!cnt)
860 return;
861
862 /* activate fast drain */
863 ap->fastdrain_cnt = cnt;
Tejun Heo341c2c92008-05-20 02:17:51 +0900864 ap->fastdrain_timer.expires =
865 ata_deadline(jiffies, ATA_EH_FASTDRAIN_INTERVAL);
Tejun Heo5ddf24c2007-07-16 14:29:41 +0900866 add_timer(&ap->fastdrain_timer);
867}
868
Tejun Heof686bcb2006-05-15 20:58:05 +0900869/**
870 * ata_qc_schedule_eh - schedule qc for error handling
871 * @qc: command to schedule error handling for
872 *
873 * Schedule error handling for @qc. EH will kick in as soon as
874 * other commands are drained.
875 *
876 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -0400877 * spin_lock_irqsave(host lock)
Tejun Heof686bcb2006-05-15 20:58:05 +0900878 */
879void ata_qc_schedule_eh(struct ata_queued_cmd *qc)
880{
881 struct ata_port *ap = qc->ap;
Tejun Heofa41efd2010-04-15 08:57:37 +0900882 struct request_queue *q = qc->scsicmd->device->request_queue;
883 unsigned long flags;
Tejun Heof686bcb2006-05-15 20:58:05 +0900884
885 WARN_ON(!ap->ops->error_handler);
886
887 qc->flags |= ATA_QCFLAG_FAILED;
Tejun Heo5ddf24c2007-07-16 14:29:41 +0900888 ata_eh_set_pending(ap, 1);
Tejun Heof686bcb2006-05-15 20:58:05 +0900889
890 /* The following will fail if timeout has already expired.
891 * ata_scsi_error() takes care of such scmds on EH entry.
892 * Note that ATA_QCFLAG_FAILED is unconditionally set after
893 * this function completes.
894 */
Tejun Heofa41efd2010-04-15 08:57:37 +0900895 spin_lock_irqsave(q->queue_lock, flags);
Jens Axboe242f9dc2008-09-14 05:55:09 -0700896 blk_abort_request(qc->scsicmd->request);
Tejun Heofa41efd2010-04-15 08:57:37 +0900897 spin_unlock_irqrestore(q->queue_lock, flags);
Tejun Heof686bcb2006-05-15 20:58:05 +0900898}
899
Tejun Heo7b70fc02006-05-15 20:58:07 +0900900/**
901 * ata_port_schedule_eh - schedule error handling without a qc
902 * @ap: ATA port to schedule EH for
903 *
904 * Schedule error handling for @ap. EH will kick in as soon as
905 * all commands are drained.
906 *
907 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -0400908 * spin_lock_irqsave(host lock)
Tejun Heo7b70fc02006-05-15 20:58:07 +0900909 */
910void ata_port_schedule_eh(struct ata_port *ap)
911{
912 WARN_ON(!ap->ops->error_handler);
913
Tejun Heof4d6d002007-05-01 11:50:15 +0200914 if (ap->pflags & ATA_PFLAG_INITIALIZING)
915 return;
916
Tejun Heo5ddf24c2007-07-16 14:29:41 +0900917 ata_eh_set_pending(ap, 1);
Jeff Garzikcca39742006-08-24 03:19:22 -0400918 scsi_schedule_eh(ap->scsi_host);
Tejun Heo7b70fc02006-05-15 20:58:07 +0900919
920 DPRINTK("port EH scheduled\n");
921}
922
Tejun Heodbd82612007-08-06 18:36:23 +0900923static int ata_do_link_abort(struct ata_port *ap, struct ata_link *link)
Tejun Heo7b70fc02006-05-15 20:58:07 +0900924{
925 int tag, nr_aborted = 0;
926
927 WARN_ON(!ap->ops->error_handler);
928
Tejun Heo5ddf24c2007-07-16 14:29:41 +0900929 /* we're gonna abort all commands, no need for fast drain */
930 ata_eh_set_pending(ap, 0);
931
Tejun Heo7b70fc02006-05-15 20:58:07 +0900932 for (tag = 0; tag < ATA_MAX_QUEUE; tag++) {
933 struct ata_queued_cmd *qc = ata_qc_from_tag(ap, tag);
934
Tejun Heodbd82612007-08-06 18:36:23 +0900935 if (qc && (!link || qc->dev->link == link)) {
Tejun Heo7b70fc02006-05-15 20:58:07 +0900936 qc->flags |= ATA_QCFLAG_FAILED;
937 ata_qc_complete(qc);
938 nr_aborted++;
939 }
940 }
941
942 if (!nr_aborted)
943 ata_port_schedule_eh(ap);
944
945 return nr_aborted;
946}
947
Tejun Heoe3180492006-05-15 20:58:09 +0900948/**
Tejun Heodbd82612007-08-06 18:36:23 +0900949 * ata_link_abort - abort all qc's on the link
950 * @link: ATA link to abort qc's for
951 *
952 * Abort all active qc's active on @link and schedule EH.
953 *
954 * LOCKING:
955 * spin_lock_irqsave(host lock)
956 *
957 * RETURNS:
958 * Number of aborted qc's.
959 */
960int ata_link_abort(struct ata_link *link)
961{
962 return ata_do_link_abort(link->ap, link);
963}
964
965/**
966 * ata_port_abort - abort all qc's on the port
967 * @ap: ATA port to abort qc's for
968 *
969 * Abort all active qc's of @ap and schedule EH.
970 *
971 * LOCKING:
972 * spin_lock_irqsave(host_set lock)
973 *
974 * RETURNS:
975 * Number of aborted qc's.
976 */
977int ata_port_abort(struct ata_port *ap)
978{
979 return ata_do_link_abort(ap, NULL);
980}
981
982/**
Tejun Heoe3180492006-05-15 20:58:09 +0900983 * __ata_port_freeze - freeze port
984 * @ap: ATA port to freeze
985 *
986 * This function is called when HSM violation or some other
987 * condition disrupts normal operation of the port. Frozen port
988 * is not allowed to perform any operation until the port is
989 * thawed, which usually follows a successful reset.
990 *
991 * ap->ops->freeze() callback can be used for freezing the port
992 * hardware-wise (e.g. mask interrupt and stop DMA engine). If a
993 * port cannot be frozen hardware-wise, the interrupt handler
994 * must ack and clear interrupts unconditionally while the port
995 * is frozen.
996 *
997 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -0400998 * spin_lock_irqsave(host lock)
Tejun Heoe3180492006-05-15 20:58:09 +0900999 */
1000static void __ata_port_freeze(struct ata_port *ap)
1001{
1002 WARN_ON(!ap->ops->error_handler);
1003
1004 if (ap->ops->freeze)
1005 ap->ops->freeze(ap);
1006
Tejun Heob51e9e52006-06-29 01:29:30 +09001007 ap->pflags |= ATA_PFLAG_FROZEN;
Tejun Heoe3180492006-05-15 20:58:09 +09001008
Tejun Heo44877b42007-02-21 01:06:51 +09001009 DPRINTK("ata%u port frozen\n", ap->print_id);
Tejun Heoe3180492006-05-15 20:58:09 +09001010}
1011
1012/**
1013 * ata_port_freeze - abort & freeze port
1014 * @ap: ATA port to freeze
1015 *
Jeff Garzik54c38442009-04-07 19:13:15 -04001016 * Abort and freeze @ap. The freeze operation must be called
1017 * first, because some hardware requires special operations
1018 * before the taskfile registers are accessible.
Tejun Heoe3180492006-05-15 20:58:09 +09001019 *
1020 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04001021 * spin_lock_irqsave(host lock)
Tejun Heoe3180492006-05-15 20:58:09 +09001022 *
1023 * RETURNS:
1024 * Number of aborted commands.
1025 */
1026int ata_port_freeze(struct ata_port *ap)
1027{
1028 int nr_aborted;
1029
1030 WARN_ON(!ap->ops->error_handler);
1031
Tejun Heoe3180492006-05-15 20:58:09 +09001032 __ata_port_freeze(ap);
Jeff Garzik54c38442009-04-07 19:13:15 -04001033 nr_aborted = ata_port_abort(ap);
Tejun Heoe3180492006-05-15 20:58:09 +09001034
1035 return nr_aborted;
1036}
1037
1038/**
Tejun Heo7d77b242007-09-23 13:14:13 +09001039 * sata_async_notification - SATA async notification handler
1040 * @ap: ATA port where async notification is received
1041 *
1042 * Handler to be called when async notification via SDB FIS is
1043 * received. This function schedules EH if necessary.
1044 *
1045 * LOCKING:
1046 * spin_lock_irqsave(host lock)
1047 *
1048 * RETURNS:
1049 * 1 if EH is scheduled, 0 otherwise.
1050 */
1051int sata_async_notification(struct ata_port *ap)
1052{
1053 u32 sntf;
1054 int rc;
1055
1056 if (!(ap->flags & ATA_FLAG_AN))
1057 return 0;
1058
1059 rc = sata_scr_read(&ap->link, SCR_NOTIFICATION, &sntf);
1060 if (rc == 0)
1061 sata_scr_write(&ap->link, SCR_NOTIFICATION, sntf);
1062
Tejun Heo071f44b2008-04-07 22:47:22 +09001063 if (!sata_pmp_attached(ap) || rc) {
Tejun Heo7d77b242007-09-23 13:14:13 +09001064 /* PMP is not attached or SNTF is not available */
Tejun Heo071f44b2008-04-07 22:47:22 +09001065 if (!sata_pmp_attached(ap)) {
Tejun Heo7d77b242007-09-23 13:14:13 +09001066 /* PMP is not attached. Check whether ATAPI
1067 * AN is configured. If so, notify media
1068 * change.
1069 */
1070 struct ata_device *dev = ap->link.device;
1071
1072 if ((dev->class == ATA_DEV_ATAPI) &&
1073 (dev->flags & ATA_DFLAG_AN))
1074 ata_scsi_media_change_notify(dev);
1075 return 0;
1076 } else {
1077 /* PMP is attached but SNTF is not available.
1078 * ATAPI async media change notification is
1079 * not used. The PMP must be reporting PHY
1080 * status change, schedule EH.
1081 */
1082 ata_port_schedule_eh(ap);
1083 return 1;
1084 }
1085 } else {
1086 /* PMP is attached and SNTF is available */
1087 struct ata_link *link;
1088
1089 /* check and notify ATAPI AN */
Tejun Heo1eca4362008-11-03 20:03:17 +09001090 ata_for_each_link(link, ap, EDGE) {
Tejun Heo7d77b242007-09-23 13:14:13 +09001091 if (!(sntf & (1 << link->pmp)))
1092 continue;
1093
1094 if ((link->device->class == ATA_DEV_ATAPI) &&
1095 (link->device->flags & ATA_DFLAG_AN))
1096 ata_scsi_media_change_notify(link->device);
1097 }
1098
1099 /* If PMP is reporting that PHY status of some
1100 * downstream ports has changed, schedule EH.
1101 */
1102 if (sntf & (1 << SATA_PMP_CTRL_PORT)) {
1103 ata_port_schedule_eh(ap);
1104 return 1;
1105 }
1106
1107 return 0;
1108 }
1109}
1110
1111/**
Tejun Heoe3180492006-05-15 20:58:09 +09001112 * ata_eh_freeze_port - EH helper to freeze port
1113 * @ap: ATA port to freeze
1114 *
1115 * Freeze @ap.
1116 *
1117 * LOCKING:
1118 * None.
1119 */
1120void ata_eh_freeze_port(struct ata_port *ap)
1121{
1122 unsigned long flags;
1123
1124 if (!ap->ops->error_handler)
1125 return;
1126
Jeff Garzikba6a1302006-06-22 23:46:10 -04001127 spin_lock_irqsave(ap->lock, flags);
Tejun Heoe3180492006-05-15 20:58:09 +09001128 __ata_port_freeze(ap);
Jeff Garzikba6a1302006-06-22 23:46:10 -04001129 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoe3180492006-05-15 20:58:09 +09001130}
1131
1132/**
1133 * ata_port_thaw_port - EH helper to thaw port
1134 * @ap: ATA port to thaw
1135 *
1136 * Thaw frozen port @ap.
1137 *
1138 * LOCKING:
1139 * None.
1140 */
1141void ata_eh_thaw_port(struct ata_port *ap)
1142{
1143 unsigned long flags;
1144
1145 if (!ap->ops->error_handler)
1146 return;
1147
Jeff Garzikba6a1302006-06-22 23:46:10 -04001148 spin_lock_irqsave(ap->lock, flags);
Tejun Heoe3180492006-05-15 20:58:09 +09001149
Tejun Heob51e9e52006-06-29 01:29:30 +09001150 ap->pflags &= ~ATA_PFLAG_FROZEN;
Tejun Heoe3180492006-05-15 20:58:09 +09001151
1152 if (ap->ops->thaw)
1153 ap->ops->thaw(ap);
1154
Jeff Garzikba6a1302006-06-22 23:46:10 -04001155 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoe3180492006-05-15 20:58:09 +09001156
Tejun Heo44877b42007-02-21 01:06:51 +09001157 DPRINTK("ata%u port thawed\n", ap->print_id);
Tejun Heoe3180492006-05-15 20:58:09 +09001158}
1159
Tejun Heoece1d632006-04-02 18:51:53 +09001160static void ata_eh_scsidone(struct scsi_cmnd *scmd)
1161{
1162 /* nada */
1163}
1164
1165static void __ata_eh_qc_complete(struct ata_queued_cmd *qc)
1166{
1167 struct ata_port *ap = qc->ap;
1168 struct scsi_cmnd *scmd = qc->scsicmd;
1169 unsigned long flags;
1170
Jeff Garzikba6a1302006-06-22 23:46:10 -04001171 spin_lock_irqsave(ap->lock, flags);
Tejun Heoece1d632006-04-02 18:51:53 +09001172 qc->scsidone = ata_eh_scsidone;
1173 __ata_qc_complete(qc);
1174 WARN_ON(ata_tag_valid(qc->tag));
Jeff Garzikba6a1302006-06-22 23:46:10 -04001175 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoece1d632006-04-02 18:51:53 +09001176
1177 scsi_eh_finish_cmd(scmd, &ap->eh_done_q);
1178}
1179
1180/**
1181 * ata_eh_qc_complete - Complete an active ATA command from EH
1182 * @qc: Command to complete
1183 *
1184 * Indicate to the mid and upper layers that an ATA command has
1185 * completed. To be used from EH.
1186 */
1187void ata_eh_qc_complete(struct ata_queued_cmd *qc)
1188{
1189 struct scsi_cmnd *scmd = qc->scsicmd;
1190 scmd->retries = scmd->allowed;
1191 __ata_eh_qc_complete(qc);
1192}
1193
1194/**
1195 * ata_eh_qc_retry - Tell midlayer to retry an ATA command after EH
1196 * @qc: Command to retry
1197 *
1198 * Indicate to the mid and upper layers that an ATA command
1199 * should be retried. To be used from EH.
1200 *
1201 * SCSI midlayer limits the number of retries to scmd->allowed.
1202 * scmd->retries is decremented for commands which get retried
1203 * due to unrelated failures (qc->err_mask is zero).
1204 */
1205void ata_eh_qc_retry(struct ata_queued_cmd *qc)
1206{
1207 struct scsi_cmnd *scmd = qc->scsicmd;
1208 if (!qc->err_mask && scmd->retries)
1209 scmd->retries--;
1210 __ata_eh_qc_complete(qc);
1211}
Tejun Heo022bdb02006-05-15 20:58:22 +09001212
1213/**
Tejun Heo678afac2009-01-29 20:31:30 +09001214 * ata_dev_disable - disable ATA device
1215 * @dev: ATA device to disable
1216 *
1217 * Disable @dev.
1218 *
1219 * Locking:
1220 * EH context.
1221 */
1222void ata_dev_disable(struct ata_device *dev)
1223{
1224 if (!ata_dev_enabled(dev))
1225 return;
1226
1227 if (ata_msg_drv(dev->link->ap))
1228 ata_dev_printk(dev, KERN_WARNING, "disabled\n");
1229 ata_acpi_on_disable(dev);
1230 ata_down_xfermask_limit(dev, ATA_DNXFER_FORCE_PIO0 | ATA_DNXFER_QUIET);
1231 dev->class++;
Tejun Heo99cf6102009-01-29 20:31:32 +09001232
1233 /* From now till the next successful probe, ering is used to
1234 * track probe failures. Clear accumulated device error info.
1235 */
1236 ata_ering_clear(&dev->ering);
Tejun Heo678afac2009-01-29 20:31:30 +09001237}
1238
1239/**
Tejun Heo0ea035a2006-05-31 18:28:01 +09001240 * ata_eh_detach_dev - detach ATA device
1241 * @dev: ATA device to detach
1242 *
1243 * Detach @dev.
1244 *
1245 * LOCKING:
1246 * None.
1247 */
Tejun Heofb7fd612007-09-23 13:14:12 +09001248void ata_eh_detach_dev(struct ata_device *dev)
Tejun Heo0ea035a2006-05-31 18:28:01 +09001249{
Tejun Heof58229f2007-08-06 18:36:23 +09001250 struct ata_link *link = dev->link;
1251 struct ata_port *ap = link->ap;
Tejun Heo90484eb2008-10-26 15:43:03 +09001252 struct ata_eh_context *ehc = &link->eh_context;
Tejun Heo0ea035a2006-05-31 18:28:01 +09001253 unsigned long flags;
1254
1255 ata_dev_disable(dev);
1256
Jeff Garzikba6a1302006-06-22 23:46:10 -04001257 spin_lock_irqsave(ap->lock, flags);
Tejun Heo0ea035a2006-05-31 18:28:01 +09001258
1259 dev->flags &= ~ATA_DFLAG_DETACH;
1260
1261 if (ata_scsi_offline_dev(dev)) {
1262 dev->flags |= ATA_DFLAG_DETACHED;
Tejun Heob51e9e52006-06-29 01:29:30 +09001263 ap->pflags |= ATA_PFLAG_SCSI_HOTPLUG;
Tejun Heo0ea035a2006-05-31 18:28:01 +09001264 }
1265
Tejun Heo90484eb2008-10-26 15:43:03 +09001266 /* clear per-dev EH info */
Tejun Heof58229f2007-08-06 18:36:23 +09001267 ata_eh_clear_action(link, dev, &link->eh_info, ATA_EH_PERDEV_MASK);
1268 ata_eh_clear_action(link, dev, &link->eh_context.i, ATA_EH_PERDEV_MASK);
Tejun Heo90484eb2008-10-26 15:43:03 +09001269 ehc->saved_xfer_mode[dev->devno] = 0;
1270 ehc->saved_ncq_enabled &= ~(1 << dev->devno);
Tejun Heobeb07c12006-06-24 20:30:19 +09001271
Jeff Garzikba6a1302006-06-22 23:46:10 -04001272 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo0ea035a2006-05-31 18:28:01 +09001273}
1274
1275/**
Tejun Heo022bdb02006-05-15 20:58:22 +09001276 * ata_eh_about_to_do - about to perform eh_action
Tejun Heo955e57d2007-08-06 18:36:23 +09001277 * @link: target ATA link
Tejun Heo47005f22006-06-19 18:27:23 +09001278 * @dev: target ATA dev for per-dev action (can be NULL)
Tejun Heo022bdb02006-05-15 20:58:22 +09001279 * @action: action about to be performed
1280 *
1281 * Called just before performing EH actions to clear related bits
Tejun Heo955e57d2007-08-06 18:36:23 +09001282 * in @link->eh_info such that eh actions are not unnecessarily
1283 * repeated.
Tejun Heo022bdb02006-05-15 20:58:22 +09001284 *
1285 * LOCKING:
1286 * None.
1287 */
Tejun Heofb7fd612007-09-23 13:14:12 +09001288void ata_eh_about_to_do(struct ata_link *link, struct ata_device *dev,
1289 unsigned int action)
Tejun Heo022bdb02006-05-15 20:58:22 +09001290{
Tejun Heo955e57d2007-08-06 18:36:23 +09001291 struct ata_port *ap = link->ap;
1292 struct ata_eh_info *ehi = &link->eh_info;
1293 struct ata_eh_context *ehc = &link->eh_context;
Tejun Heo022bdb02006-05-15 20:58:22 +09001294 unsigned long flags;
1295
Jeff Garzikba6a1302006-06-22 23:46:10 -04001296 spin_lock_irqsave(ap->lock, flags);
Tejun Heo1cdaf532006-07-03 16:07:26 +09001297
Tejun Heo955e57d2007-08-06 18:36:23 +09001298 ata_eh_clear_action(link, dev, ehi, action);
Tejun Heo13abf502006-07-10 23:18:46 +09001299
Tejun Heoa568d1d2008-10-21 20:37:21 +09001300 /* About to take EH action, set RECOVERED. Ignore actions on
1301 * slave links as master will do them again.
1302 */
1303 if (!(ehc->i.flags & ATA_EHI_QUIET) && link != ap->slave_link)
Tejun Heo1cdaf532006-07-03 16:07:26 +09001304 ap->pflags |= ATA_PFLAG_RECOVERED;
1305
Jeff Garzikba6a1302006-06-22 23:46:10 -04001306 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo022bdb02006-05-15 20:58:22 +09001307}
1308
1309/**
Tejun Heo47005f22006-06-19 18:27:23 +09001310 * ata_eh_done - EH action complete
Tejun Heo955e57d2007-08-06 18:36:23 +09001311* @ap: target ATA port
Tejun Heo47005f22006-06-19 18:27:23 +09001312 * @dev: target ATA dev for per-dev action (can be NULL)
1313 * @action: action just completed
1314 *
1315 * Called right after performing EH actions to clear related bits
Tejun Heo955e57d2007-08-06 18:36:23 +09001316 * in @link->eh_context.
Tejun Heo47005f22006-06-19 18:27:23 +09001317 *
1318 * LOCKING:
1319 * None.
1320 */
Tejun Heofb7fd612007-09-23 13:14:12 +09001321void ata_eh_done(struct ata_link *link, struct ata_device *dev,
1322 unsigned int action)
Tejun Heo47005f22006-06-19 18:27:23 +09001323{
Tejun Heo955e57d2007-08-06 18:36:23 +09001324 struct ata_eh_context *ehc = &link->eh_context;
Tejun Heo9af5c9c2007-08-06 18:36:22 +09001325
Tejun Heo955e57d2007-08-06 18:36:23 +09001326 ata_eh_clear_action(link, dev, &ehc->i, action);
Tejun Heo47005f22006-06-19 18:27:23 +09001327}
1328
1329/**
Tejun Heo022bdb02006-05-15 20:58:22 +09001330 * ata_err_string - convert err_mask to descriptive string
1331 * @err_mask: error mask to convert to string
1332 *
1333 * Convert @err_mask to descriptive string. Errors are
1334 * prioritized according to severity and only the most severe
1335 * error is reported.
1336 *
1337 * LOCKING:
1338 * None.
1339 *
1340 * RETURNS:
1341 * Descriptive string for @err_mask
1342 */
Jeff Garzik2dcb4072007-10-19 06:42:56 -04001343static const char *ata_err_string(unsigned int err_mask)
Tejun Heo022bdb02006-05-15 20:58:22 +09001344{
1345 if (err_mask & AC_ERR_HOST_BUS)
1346 return "host bus error";
1347 if (err_mask & AC_ERR_ATA_BUS)
1348 return "ATA bus error";
1349 if (err_mask & AC_ERR_TIMEOUT)
1350 return "timeout";
1351 if (err_mask & AC_ERR_HSM)
1352 return "HSM violation";
1353 if (err_mask & AC_ERR_SYSTEM)
1354 return "internal error";
1355 if (err_mask & AC_ERR_MEDIA)
1356 return "media error";
1357 if (err_mask & AC_ERR_INVALID)
1358 return "invalid argument";
1359 if (err_mask & AC_ERR_DEV)
1360 return "device error";
1361 return "unknown error";
1362}
1363
1364/**
Tejun Heoe8ee8452006-05-15 21:03:46 +09001365 * ata_read_log_page - read a specific log page
1366 * @dev: target device
1367 * @page: page to read
1368 * @buf: buffer to store read page
1369 * @sectors: number of sectors to read
1370 *
1371 * Read log page using READ_LOG_EXT command.
1372 *
1373 * LOCKING:
1374 * Kernel thread context (may sleep).
1375 *
1376 * RETURNS:
1377 * 0 on success, AC_ERR_* mask otherwise.
1378 */
1379static unsigned int ata_read_log_page(struct ata_device *dev,
1380 u8 page, void *buf, unsigned int sectors)
1381{
1382 struct ata_taskfile tf;
1383 unsigned int err_mask;
1384
1385 DPRINTK("read log page - page %d\n", page);
1386
1387 ata_tf_init(dev, &tf);
1388 tf.command = ATA_CMD_READ_LOG_EXT;
1389 tf.lbal = page;
1390 tf.nsect = sectors;
1391 tf.hob_nsect = sectors >> 8;
1392 tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_LBA48 | ATA_TFLAG_DEVICE;
1393 tf.protocol = ATA_PROT_PIO;
1394
1395 err_mask = ata_exec_internal(dev, &tf, NULL, DMA_FROM_DEVICE,
Tejun Heo2b789102007-10-09 15:05:44 +09001396 buf, sectors * ATA_SECT_SIZE, 0);
Tejun Heoe8ee8452006-05-15 21:03:46 +09001397
1398 DPRINTK("EXIT, err_mask=%x\n", err_mask);
1399 return err_mask;
1400}
1401
1402/**
1403 * ata_eh_read_log_10h - Read log page 10h for NCQ error details
1404 * @dev: Device to read log page 10h from
1405 * @tag: Resulting tag of the failed command
1406 * @tf: Resulting taskfile registers of the failed command
1407 *
1408 * Read log page 10h to obtain NCQ error details and clear error
1409 * condition.
1410 *
1411 * LOCKING:
1412 * Kernel thread context (may sleep).
1413 *
1414 * RETURNS:
1415 * 0 on success, -errno otherwise.
1416 */
1417static int ata_eh_read_log_10h(struct ata_device *dev,
1418 int *tag, struct ata_taskfile *tf)
1419{
Tejun Heo9af5c9c2007-08-06 18:36:22 +09001420 u8 *buf = dev->link->ap->sector_buf;
Tejun Heoe8ee8452006-05-15 21:03:46 +09001421 unsigned int err_mask;
1422 u8 csum;
1423 int i;
1424
1425 err_mask = ata_read_log_page(dev, ATA_LOG_SATA_NCQ, buf, 1);
1426 if (err_mask)
1427 return -EIO;
1428
1429 csum = 0;
1430 for (i = 0; i < ATA_SECT_SIZE; i++)
1431 csum += buf[i];
1432 if (csum)
1433 ata_dev_printk(dev, KERN_WARNING,
1434 "invalid checksum 0x%x on log page 10h\n", csum);
1435
1436 if (buf[0] & 0x80)
1437 return -ENOENT;
1438
1439 *tag = buf[0] & 0x1f;
1440
1441 tf->command = buf[2];
1442 tf->feature = buf[3];
1443 tf->lbal = buf[4];
1444 tf->lbam = buf[5];
1445 tf->lbah = buf[6];
1446 tf->device = buf[7];
1447 tf->hob_lbal = buf[8];
1448 tf->hob_lbam = buf[9];
1449 tf->hob_lbah = buf[10];
1450 tf->nsect = buf[12];
1451 tf->hob_nsect = buf[13];
1452
1453 return 0;
1454}
1455
1456/**
Tejun Heo11fc33d2008-08-30 14:20:01 +02001457 * atapi_eh_tur - perform ATAPI TEST_UNIT_READY
1458 * @dev: target ATAPI device
1459 * @r_sense_key: out parameter for sense_key
1460 *
1461 * Perform ATAPI TEST_UNIT_READY.
1462 *
1463 * LOCKING:
1464 * EH context (may sleep).
1465 *
1466 * RETURNS:
1467 * 0 on success, AC_ERR_* mask on failure.
1468 */
1469static unsigned int atapi_eh_tur(struct ata_device *dev, u8 *r_sense_key)
1470{
1471 u8 cdb[ATAPI_CDB_LEN] = { TEST_UNIT_READY, 0, 0, 0, 0, 0 };
1472 struct ata_taskfile tf;
1473 unsigned int err_mask;
1474
1475 ata_tf_init(dev, &tf);
1476
1477 tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
1478 tf.command = ATA_CMD_PACKET;
1479 tf.protocol = ATAPI_PROT_NODATA;
1480
1481 err_mask = ata_exec_internal(dev, &tf, cdb, DMA_NONE, NULL, 0, 0);
1482 if (err_mask == AC_ERR_DEV)
1483 *r_sense_key = tf.feature >> 4;
1484 return err_mask;
1485}
1486
1487/**
Tejun Heo022bdb02006-05-15 20:58:22 +09001488 * atapi_eh_request_sense - perform ATAPI REQUEST_SENSE
1489 * @dev: device to perform REQUEST_SENSE to
1490 * @sense_buf: result sense data buffer (SCSI_SENSE_BUFFERSIZE bytes long)
Tejun Heo3eabddb2008-06-10 18:28:05 +09001491 * @dfl_sense_key: default sense key to use
Tejun Heo022bdb02006-05-15 20:58:22 +09001492 *
1493 * Perform ATAPI REQUEST_SENSE after the device reported CHECK
1494 * SENSE. This function is EH helper.
1495 *
1496 * LOCKING:
1497 * Kernel thread context (may sleep).
1498 *
1499 * RETURNS:
1500 * 0 on success, AC_ERR_* mask on failure
1501 */
Tejun Heo3eabddb2008-06-10 18:28:05 +09001502static unsigned int atapi_eh_request_sense(struct ata_device *dev,
1503 u8 *sense_buf, u8 dfl_sense_key)
Tejun Heo022bdb02006-05-15 20:58:22 +09001504{
Tejun Heo3eabddb2008-06-10 18:28:05 +09001505 u8 cdb[ATAPI_CDB_LEN] =
1506 { REQUEST_SENSE, 0, 0, 0, SCSI_SENSE_BUFFERSIZE, 0 };
Tejun Heo9af5c9c2007-08-06 18:36:22 +09001507 struct ata_port *ap = dev->link->ap;
Tejun Heo022bdb02006-05-15 20:58:22 +09001508 struct ata_taskfile tf;
Tejun Heo022bdb02006-05-15 20:58:22 +09001509
1510 DPRINTK("ATAPI request sense\n");
1511
Tejun Heo022bdb02006-05-15 20:58:22 +09001512 /* FIXME: is this needed? */
1513 memset(sense_buf, 0, SCSI_SENSE_BUFFERSIZE);
1514
Albert Lee56287762007-04-02 11:30:46 +08001515 /* initialize sense_buf with the error register,
1516 * for the case where they are -not- overwritten
1517 */
Tejun Heo022bdb02006-05-15 20:58:22 +09001518 sense_buf[0] = 0x70;
Tejun Heo3eabddb2008-06-10 18:28:05 +09001519 sense_buf[2] = dfl_sense_key;
Albert Lee56287762007-04-02 11:30:46 +08001520
Jeff Garzika617c092007-05-21 20:14:23 -04001521 /* some devices time out if garbage left in tf */
Albert Lee56287762007-04-02 11:30:46 +08001522 ata_tf_init(dev, &tf);
Tejun Heo022bdb02006-05-15 20:58:22 +09001523
Tejun Heo022bdb02006-05-15 20:58:22 +09001524 tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
1525 tf.command = ATA_CMD_PACKET;
1526
1527 /* is it pointless to prefer PIO for "safety reasons"? */
1528 if (ap->flags & ATA_FLAG_PIO_DMA) {
Tejun Heo0dc36882007-12-18 16:34:43 -05001529 tf.protocol = ATAPI_PROT_DMA;
Tejun Heo022bdb02006-05-15 20:58:22 +09001530 tf.feature |= ATAPI_PKT_DMA;
1531 } else {
Tejun Heo0dc36882007-12-18 16:34:43 -05001532 tf.protocol = ATAPI_PROT_PIO;
Tejun Heof2dfc1a2007-12-12 12:12:46 +09001533 tf.lbam = SCSI_SENSE_BUFFERSIZE;
1534 tf.lbah = 0;
Tejun Heo022bdb02006-05-15 20:58:22 +09001535 }
1536
1537 return ata_exec_internal(dev, &tf, cdb, DMA_FROM_DEVICE,
Tejun Heo2b789102007-10-09 15:05:44 +09001538 sense_buf, SCSI_SENSE_BUFFERSIZE, 0);
Tejun Heo022bdb02006-05-15 20:58:22 +09001539}
1540
1541/**
1542 * ata_eh_analyze_serror - analyze SError for a failed port
Tejun Heo02607312007-08-06 18:36:23 +09001543 * @link: ATA link to analyze SError for
Tejun Heo022bdb02006-05-15 20:58:22 +09001544 *
1545 * Analyze SError if available and further determine cause of
1546 * failure.
1547 *
1548 * LOCKING:
1549 * None.
1550 */
Tejun Heo02607312007-08-06 18:36:23 +09001551static void ata_eh_analyze_serror(struct ata_link *link)
Tejun Heo022bdb02006-05-15 20:58:22 +09001552{
Tejun Heo02607312007-08-06 18:36:23 +09001553 struct ata_eh_context *ehc = &link->eh_context;
Tejun Heo022bdb02006-05-15 20:58:22 +09001554 u32 serror = ehc->i.serror;
1555 unsigned int err_mask = 0, action = 0;
Tejun Heof9df58c2007-09-23 13:14:13 +09001556 u32 hotplug_mask;
Tejun Heo022bdb02006-05-15 20:58:22 +09001557
Tejun Heoe0614db2008-05-19 01:15:09 +09001558 if (serror & (SERR_PERSISTENT | SERR_DATA)) {
Tejun Heo022bdb02006-05-15 20:58:22 +09001559 err_mask |= AC_ERR_ATA_BUS;
Tejun Heocf480622008-01-24 00:05:14 +09001560 action |= ATA_EH_RESET;
Tejun Heo022bdb02006-05-15 20:58:22 +09001561 }
1562 if (serror & SERR_PROTOCOL) {
1563 err_mask |= AC_ERR_HSM;
Tejun Heocf480622008-01-24 00:05:14 +09001564 action |= ATA_EH_RESET;
Tejun Heo022bdb02006-05-15 20:58:22 +09001565 }
1566 if (serror & SERR_INTERNAL) {
1567 err_mask |= AC_ERR_SYSTEM;
Tejun Heocf480622008-01-24 00:05:14 +09001568 action |= ATA_EH_RESET;
Tejun Heo022bdb02006-05-15 20:58:22 +09001569 }
Tejun Heof9df58c2007-09-23 13:14:13 +09001570
1571 /* Determine whether a hotplug event has occurred. Both
1572 * SError.N/X are considered hotplug events for enabled or
1573 * host links. For disabled PMP links, only N bit is
1574 * considered as X bit is left at 1 for link plugging.
1575 */
1576 hotplug_mask = 0;
1577
1578 if (!(link->flags & ATA_LFLAG_DISABLED) || ata_is_host_link(link))
1579 hotplug_mask = SERR_PHYRDY_CHG | SERR_DEV_XCHG;
1580 else
1581 hotplug_mask = SERR_PHYRDY_CHG;
1582
1583 if (serror & hotplug_mask)
Tejun Heo084fe632006-05-31 18:28:03 +09001584 ata_ehi_hotplugged(&ehc->i);
Tejun Heo022bdb02006-05-15 20:58:22 +09001585
1586 ehc->i.err_mask |= err_mask;
1587 ehc->i.action |= action;
1588}
1589
1590/**
Tejun Heoe8ee8452006-05-15 21:03:46 +09001591 * ata_eh_analyze_ncq_error - analyze NCQ error
Tejun Heo02607312007-08-06 18:36:23 +09001592 * @link: ATA link to analyze NCQ error for
Tejun Heoe8ee8452006-05-15 21:03:46 +09001593 *
1594 * Read log page 10h, determine the offending qc and acquire
1595 * error status TF. For NCQ device errors, all LLDDs have to do
1596 * is setting AC_ERR_DEV in ehi->err_mask. This function takes
1597 * care of the rest.
1598 *
1599 * LOCKING:
1600 * Kernel thread context (may sleep).
1601 */
Mark Lord10acf3b2008-05-02 02:14:53 -04001602void ata_eh_analyze_ncq_error(struct ata_link *link)
Tejun Heoe8ee8452006-05-15 21:03:46 +09001603{
Tejun Heo02607312007-08-06 18:36:23 +09001604 struct ata_port *ap = link->ap;
1605 struct ata_eh_context *ehc = &link->eh_context;
1606 struct ata_device *dev = link->device;
Tejun Heoe8ee8452006-05-15 21:03:46 +09001607 struct ata_queued_cmd *qc;
1608 struct ata_taskfile tf;
1609 int tag, rc;
1610
1611 /* if frozen, we can't do much */
Tejun Heob51e9e52006-06-29 01:29:30 +09001612 if (ap->pflags & ATA_PFLAG_FROZEN)
Tejun Heoe8ee8452006-05-15 21:03:46 +09001613 return;
1614
1615 /* is it NCQ device error? */
Tejun Heo02607312007-08-06 18:36:23 +09001616 if (!link->sactive || !(ehc->i.err_mask & AC_ERR_DEV))
Tejun Heoe8ee8452006-05-15 21:03:46 +09001617 return;
1618
1619 /* has LLDD analyzed already? */
1620 for (tag = 0; tag < ATA_MAX_QUEUE; tag++) {
1621 qc = __ata_qc_from_tag(ap, tag);
1622
1623 if (!(qc->flags & ATA_QCFLAG_FAILED))
1624 continue;
1625
1626 if (qc->err_mask)
1627 return;
1628 }
1629
1630 /* okay, this error is ours */
1631 rc = ata_eh_read_log_10h(dev, &tag, &tf);
1632 if (rc) {
Tejun Heo02607312007-08-06 18:36:23 +09001633 ata_link_printk(link, KERN_ERR, "failed to read log page 10h "
Tejun Heoe8ee8452006-05-15 21:03:46 +09001634 "(errno=%d)\n", rc);
1635 return;
1636 }
1637
Tejun Heo02607312007-08-06 18:36:23 +09001638 if (!(link->sactive & (1 << tag))) {
1639 ata_link_printk(link, KERN_ERR, "log page 10h reported "
Tejun Heoe8ee8452006-05-15 21:03:46 +09001640 "inactive tag %d\n", tag);
1641 return;
1642 }
1643
1644 /* we've got the perpetrator, condemn it */
1645 qc = __ata_qc_from_tag(ap, tag);
1646 memcpy(&qc->result_tf, &tf, sizeof(tf));
Mark Lorda6116c92008-04-23 22:36:25 -04001647 qc->result_tf.flags = ATA_TFLAG_ISADDR | ATA_TFLAG_LBA | ATA_TFLAG_LBA48;
Tejun Heo5335b722007-07-16 14:29:40 +09001648 qc->err_mask |= AC_ERR_DEV | AC_ERR_NCQ;
Tejun Heoe8ee8452006-05-15 21:03:46 +09001649 ehc->i.err_mask &= ~AC_ERR_DEV;
1650}
1651
1652/**
Tejun Heo022bdb02006-05-15 20:58:22 +09001653 * ata_eh_analyze_tf - analyze taskfile of a failed qc
1654 * @qc: qc to analyze
1655 * @tf: Taskfile registers to analyze
1656 *
1657 * Analyze taskfile of @qc and further determine cause of
1658 * failure. This function also requests ATAPI sense data if
1659 * avaliable.
1660 *
1661 * LOCKING:
1662 * Kernel thread context (may sleep).
1663 *
1664 * RETURNS:
1665 * Determined recovery action
1666 */
1667static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc,
1668 const struct ata_taskfile *tf)
1669{
1670 unsigned int tmp, action = 0;
1671 u8 stat = tf->command, err = tf->feature;
1672
1673 if ((stat & (ATA_BUSY | ATA_DRQ | ATA_DRDY)) != ATA_DRDY) {
1674 qc->err_mask |= AC_ERR_HSM;
Tejun Heocf480622008-01-24 00:05:14 +09001675 return ATA_EH_RESET;
Tejun Heo022bdb02006-05-15 20:58:22 +09001676 }
1677
Tejun Heoa51d6442007-03-20 15:24:11 +09001678 if (stat & (ATA_ERR | ATA_DF))
1679 qc->err_mask |= AC_ERR_DEV;
1680 else
Tejun Heo022bdb02006-05-15 20:58:22 +09001681 return 0;
1682
1683 switch (qc->dev->class) {
1684 case ATA_DEV_ATA:
1685 if (err & ATA_ICRC)
1686 qc->err_mask |= AC_ERR_ATA_BUS;
1687 if (err & ATA_UNC)
1688 qc->err_mask |= AC_ERR_MEDIA;
1689 if (err & ATA_IDNF)
1690 qc->err_mask |= AC_ERR_INVALID;
1691 break;
1692
1693 case ATA_DEV_ATAPI:
Tejun Heoa569a302006-11-21 10:40:51 +09001694 if (!(qc->ap->pflags & ATA_PFLAG_FROZEN)) {
Tejun Heo3eabddb2008-06-10 18:28:05 +09001695 tmp = atapi_eh_request_sense(qc->dev,
1696 qc->scsicmd->sense_buffer,
1697 qc->result_tf.feature >> 4);
Tejun Heoa569a302006-11-21 10:40:51 +09001698 if (!tmp) {
1699 /* ATA_QCFLAG_SENSE_VALID is used to
1700 * tell atapi_qc_complete() that sense
1701 * data is already valid.
1702 *
1703 * TODO: interpret sense data and set
1704 * appropriate err_mask.
1705 */
1706 qc->flags |= ATA_QCFLAG_SENSE_VALID;
1707 } else
1708 qc->err_mask |= tmp;
1709 }
Tejun Heo022bdb02006-05-15 20:58:22 +09001710 }
1711
1712 if (qc->err_mask & (AC_ERR_HSM | AC_ERR_TIMEOUT | AC_ERR_ATA_BUS))
Tejun Heocf480622008-01-24 00:05:14 +09001713 action |= ATA_EH_RESET;
Tejun Heo022bdb02006-05-15 20:58:22 +09001714
1715 return action;
1716}
1717
Tejun Heo76326ac2007-11-27 19:28:59 +09001718static int ata_eh_categorize_error(unsigned int eflags, unsigned int err_mask,
1719 int *xfer_ok)
Tejun Heo022bdb02006-05-15 20:58:22 +09001720{
Tejun Heo76326ac2007-11-27 19:28:59 +09001721 int base = 0;
1722
1723 if (!(eflags & ATA_EFLAG_DUBIOUS_XFER))
1724 *xfer_ok = 1;
1725
1726 if (!*xfer_ok)
Tejun Heo75f9caf2008-01-03 01:21:14 +09001727 base = ATA_ECAT_DUBIOUS_NONE;
Tejun Heo76326ac2007-11-27 19:28:59 +09001728
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001729 if (err_mask & AC_ERR_ATA_BUS)
Tejun Heo76326ac2007-11-27 19:28:59 +09001730 return base + ATA_ECAT_ATA_BUS;
Tejun Heo022bdb02006-05-15 20:58:22 +09001731
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001732 if (err_mask & AC_ERR_TIMEOUT)
Tejun Heo76326ac2007-11-27 19:28:59 +09001733 return base + ATA_ECAT_TOUT_HSM;
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001734
Tejun Heo3884f7b2007-11-27 19:28:56 +09001735 if (eflags & ATA_EFLAG_IS_IO) {
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001736 if (err_mask & AC_ERR_HSM)
Tejun Heo76326ac2007-11-27 19:28:59 +09001737 return base + ATA_ECAT_TOUT_HSM;
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001738 if ((err_mask &
1739 (AC_ERR_DEV|AC_ERR_MEDIA|AC_ERR_INVALID)) == AC_ERR_DEV)
Tejun Heo76326ac2007-11-27 19:28:59 +09001740 return base + ATA_ECAT_UNK_DEV;
Tejun Heo022bdb02006-05-15 20:58:22 +09001741 }
1742
1743 return 0;
1744}
1745
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001746struct speed_down_verdict_arg {
Tejun Heo022bdb02006-05-15 20:58:22 +09001747 u64 since;
Tejun Heo76326ac2007-11-27 19:28:59 +09001748 int xfer_ok;
Tejun Heo3884f7b2007-11-27 19:28:56 +09001749 int nr_errors[ATA_ECAT_NR];
Tejun Heo022bdb02006-05-15 20:58:22 +09001750};
1751
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001752static int speed_down_verdict_cb(struct ata_ering_entry *ent, void *void_arg)
Tejun Heo022bdb02006-05-15 20:58:22 +09001753{
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001754 struct speed_down_verdict_arg *arg = void_arg;
Tejun Heo76326ac2007-11-27 19:28:59 +09001755 int cat;
Tejun Heo022bdb02006-05-15 20:58:22 +09001756
1757 if (ent->timestamp < arg->since)
1758 return -1;
1759
Tejun Heo76326ac2007-11-27 19:28:59 +09001760 cat = ata_eh_categorize_error(ent->eflags, ent->err_mask,
1761 &arg->xfer_ok);
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001762 arg->nr_errors[cat]++;
Tejun Heo76326ac2007-11-27 19:28:59 +09001763
Tejun Heo022bdb02006-05-15 20:58:22 +09001764 return 0;
1765}
1766
1767/**
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001768 * ata_eh_speed_down_verdict - Determine speed down verdict
Tejun Heo022bdb02006-05-15 20:58:22 +09001769 * @dev: Device of interest
1770 *
1771 * This function examines error ring of @dev and determines
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001772 * whether NCQ needs to be turned off, transfer speed should be
1773 * stepped down, or falling back to PIO is necessary.
Tejun Heo022bdb02006-05-15 20:58:22 +09001774 *
Tejun Heo3884f7b2007-11-27 19:28:56 +09001775 * ECAT_ATA_BUS : ATA_BUS error for any command
Tejun Heo022bdb02006-05-15 20:58:22 +09001776 *
Tejun Heo3884f7b2007-11-27 19:28:56 +09001777 * ECAT_TOUT_HSM : TIMEOUT for any command or HSM violation for
1778 * IO commands
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001779 *
Tejun Heo3884f7b2007-11-27 19:28:56 +09001780 * ECAT_UNK_DEV : Unknown DEV error for IO commands
Tejun Heo022bdb02006-05-15 20:58:22 +09001781 *
Tejun Heo76326ac2007-11-27 19:28:59 +09001782 * ECAT_DUBIOUS_* : Identical to above three but occurred while
1783 * data transfer hasn't been verified.
1784 *
Tejun Heo3884f7b2007-11-27 19:28:56 +09001785 * Verdicts are
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001786 *
Tejun Heo3884f7b2007-11-27 19:28:56 +09001787 * NCQ_OFF : Turn off NCQ.
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001788 *
Tejun Heo3884f7b2007-11-27 19:28:56 +09001789 * SPEED_DOWN : Speed down transfer speed but don't fall back
1790 * to PIO.
1791 *
1792 * FALLBACK_TO_PIO : Fall back to PIO.
1793 *
1794 * Even if multiple verdicts are returned, only one action is
Tejun Heo76326ac2007-11-27 19:28:59 +09001795 * taken per error. An action triggered by non-DUBIOUS errors
1796 * clears ering, while one triggered by DUBIOUS_* errors doesn't.
1797 * This is to expedite speed down decisions right after device is
1798 * initially configured.
Tejun Heo3884f7b2007-11-27 19:28:56 +09001799 *
Tejun Heo76326ac2007-11-27 19:28:59 +09001800 * The followings are speed down rules. #1 and #2 deal with
1801 * DUBIOUS errors.
1802 *
1803 * 1. If more than one DUBIOUS_ATA_BUS or DUBIOUS_TOUT_HSM errors
1804 * occurred during last 5 mins, SPEED_DOWN and FALLBACK_TO_PIO.
1805 *
1806 * 2. If more than one DUBIOUS_TOUT_HSM or DUBIOUS_UNK_DEV errors
1807 * occurred during last 5 mins, NCQ_OFF.
1808 *
1809 * 3. If more than 8 ATA_BUS, TOUT_HSM or UNK_DEV errors
Tejun Heo3884f7b2007-11-27 19:28:56 +09001810 * ocurred during last 5 mins, FALLBACK_TO_PIO
1811 *
Tejun Heo76326ac2007-11-27 19:28:59 +09001812 * 4. If more than 3 TOUT_HSM or UNK_DEV errors occurred
Tejun Heo3884f7b2007-11-27 19:28:56 +09001813 * during last 10 mins, NCQ_OFF.
1814 *
Tejun Heo76326ac2007-11-27 19:28:59 +09001815 * 5. If more than 3 ATA_BUS or TOUT_HSM errors, or more than 6
Tejun Heo3884f7b2007-11-27 19:28:56 +09001816 * UNK_DEV errors occurred during last 10 mins, SPEED_DOWN.
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001817 *
Tejun Heo022bdb02006-05-15 20:58:22 +09001818 * LOCKING:
1819 * Inherited from caller.
1820 *
1821 * RETURNS:
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001822 * OR of ATA_EH_SPDN_* flags.
Tejun Heo022bdb02006-05-15 20:58:22 +09001823 */
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001824static unsigned int ata_eh_speed_down_verdict(struct ata_device *dev)
Tejun Heo022bdb02006-05-15 20:58:22 +09001825{
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001826 const u64 j5mins = 5LLU * 60 * HZ, j10mins = 10LLU * 60 * HZ;
1827 u64 j64 = get_jiffies_64();
1828 struct speed_down_verdict_arg arg;
1829 unsigned int verdict = 0;
Tejun Heo022bdb02006-05-15 20:58:22 +09001830
Tejun Heo3884f7b2007-11-27 19:28:56 +09001831 /* scan past 5 mins of error history */
1832 memset(&arg, 0, sizeof(arg));
1833 arg.since = j64 - min(j64, j5mins);
1834 ata_ering_map(&dev->ering, speed_down_verdict_cb, &arg);
1835
Tejun Heo76326ac2007-11-27 19:28:59 +09001836 if (arg.nr_errors[ATA_ECAT_DUBIOUS_ATA_BUS] +
1837 arg.nr_errors[ATA_ECAT_DUBIOUS_TOUT_HSM] > 1)
1838 verdict |= ATA_EH_SPDN_SPEED_DOWN |
1839 ATA_EH_SPDN_FALLBACK_TO_PIO | ATA_EH_SPDN_KEEP_ERRORS;
1840
1841 if (arg.nr_errors[ATA_ECAT_DUBIOUS_TOUT_HSM] +
1842 arg.nr_errors[ATA_ECAT_DUBIOUS_UNK_DEV] > 1)
1843 verdict |= ATA_EH_SPDN_NCQ_OFF | ATA_EH_SPDN_KEEP_ERRORS;
1844
Tejun Heo3884f7b2007-11-27 19:28:56 +09001845 if (arg.nr_errors[ATA_ECAT_ATA_BUS] +
1846 arg.nr_errors[ATA_ECAT_TOUT_HSM] +
Tejun Heo663f99b2007-11-27 19:28:57 +09001847 arg.nr_errors[ATA_ECAT_UNK_DEV] > 6)
Tejun Heo3884f7b2007-11-27 19:28:56 +09001848 verdict |= ATA_EH_SPDN_FALLBACK_TO_PIO;
1849
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001850 /* scan past 10 mins of error history */
Tejun Heo022bdb02006-05-15 20:58:22 +09001851 memset(&arg, 0, sizeof(arg));
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001852 arg.since = j64 - min(j64, j10mins);
1853 ata_ering_map(&dev->ering, speed_down_verdict_cb, &arg);
Tejun Heo022bdb02006-05-15 20:58:22 +09001854
Tejun Heo3884f7b2007-11-27 19:28:56 +09001855 if (arg.nr_errors[ATA_ECAT_TOUT_HSM] +
1856 arg.nr_errors[ATA_ECAT_UNK_DEV] > 3)
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001857 verdict |= ATA_EH_SPDN_NCQ_OFF;
Tejun Heo3884f7b2007-11-27 19:28:56 +09001858
1859 if (arg.nr_errors[ATA_ECAT_ATA_BUS] +
1860 arg.nr_errors[ATA_ECAT_TOUT_HSM] > 3 ||
Tejun Heo663f99b2007-11-27 19:28:57 +09001861 arg.nr_errors[ATA_ECAT_UNK_DEV] > 6)
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001862 verdict |= ATA_EH_SPDN_SPEED_DOWN;
Tejun Heo022bdb02006-05-15 20:58:22 +09001863
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001864 return verdict;
Tejun Heo022bdb02006-05-15 20:58:22 +09001865}
1866
1867/**
1868 * ata_eh_speed_down - record error and speed down if necessary
1869 * @dev: Failed device
Tejun Heo3884f7b2007-11-27 19:28:56 +09001870 * @eflags: mask of ATA_EFLAG_* flags
Tejun Heo022bdb02006-05-15 20:58:22 +09001871 * @err_mask: err_mask of the error
1872 *
1873 * Record error and examine error history to determine whether
1874 * adjusting transmission speed is necessary. It also sets
1875 * transmission limits appropriately if such adjustment is
1876 * necessary.
1877 *
1878 * LOCKING:
1879 * Kernel thread context (may sleep).
1880 *
1881 * RETURNS:
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001882 * Determined recovery action.
Tejun Heo022bdb02006-05-15 20:58:22 +09001883 */
Tejun Heo3884f7b2007-11-27 19:28:56 +09001884static unsigned int ata_eh_speed_down(struct ata_device *dev,
1885 unsigned int eflags, unsigned int err_mask)
Tejun Heo022bdb02006-05-15 20:58:22 +09001886{
Tejun Heob1c72912008-07-31 17:02:43 +09001887 struct ata_link *link = ata_dev_phys_link(dev);
Tejun Heo76326ac2007-11-27 19:28:59 +09001888 int xfer_ok = 0;
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001889 unsigned int verdict;
1890 unsigned int action = 0;
1891
1892 /* don't bother if Cat-0 error */
Tejun Heo76326ac2007-11-27 19:28:59 +09001893 if (ata_eh_categorize_error(eflags, err_mask, &xfer_ok) == 0)
Tejun Heo022bdb02006-05-15 20:58:22 +09001894 return 0;
1895
1896 /* record error and determine whether speed down is necessary */
Tejun Heo3884f7b2007-11-27 19:28:56 +09001897 ata_ering_record(&dev->ering, eflags, err_mask);
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001898 verdict = ata_eh_speed_down_verdict(dev);
Tejun Heo022bdb02006-05-15 20:58:22 +09001899
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001900 /* turn off NCQ? */
1901 if ((verdict & ATA_EH_SPDN_NCQ_OFF) &&
1902 (dev->flags & (ATA_DFLAG_PIO | ATA_DFLAG_NCQ |
1903 ATA_DFLAG_NCQ_OFF)) == ATA_DFLAG_NCQ) {
1904 dev->flags |= ATA_DFLAG_NCQ_OFF;
1905 ata_dev_printk(dev, KERN_WARNING,
1906 "NCQ disabled due to excessive errors\n");
1907 goto done;
1908 }
Tejun Heo022bdb02006-05-15 20:58:22 +09001909
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001910 /* speed down? */
1911 if (verdict & ATA_EH_SPDN_SPEED_DOWN) {
1912 /* speed down SATA link speed if possible */
Tejun Heoa07d4992009-01-29 20:31:33 +09001913 if (sata_down_spd_limit(link, 0) == 0) {
Tejun Heocf480622008-01-24 00:05:14 +09001914 action |= ATA_EH_RESET;
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001915 goto done;
1916 }
Tejun Heo022bdb02006-05-15 20:58:22 +09001917
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001918 /* lower transfer mode */
1919 if (dev->spdn_cnt < 2) {
1920 static const int dma_dnxfer_sel[] =
1921 { ATA_DNXFER_DMA, ATA_DNXFER_40C };
1922 static const int pio_dnxfer_sel[] =
1923 { ATA_DNXFER_PIO, ATA_DNXFER_FORCE_PIO0 };
1924 int sel;
Tejun Heo022bdb02006-05-15 20:58:22 +09001925
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001926 if (dev->xfer_shift != ATA_SHIFT_PIO)
1927 sel = dma_dnxfer_sel[dev->spdn_cnt];
1928 else
1929 sel = pio_dnxfer_sel[dev->spdn_cnt];
1930
1931 dev->spdn_cnt++;
1932
1933 if (ata_down_xfermask_limit(dev, sel) == 0) {
Tejun Heocf480622008-01-24 00:05:14 +09001934 action |= ATA_EH_RESET;
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001935 goto done;
1936 }
1937 }
1938 }
1939
1940 /* Fall back to PIO? Slowing down to PIO is meaningless for
Tejun Heo663f99b2007-11-27 19:28:57 +09001941 * SATA ATA devices. Consider it only for PATA and SATAPI.
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001942 */
1943 if ((verdict & ATA_EH_SPDN_FALLBACK_TO_PIO) && (dev->spdn_cnt >= 2) &&
Tejun Heo663f99b2007-11-27 19:28:57 +09001944 (link->ap->cbl != ATA_CBL_SATA || dev->class == ATA_DEV_ATAPI) &&
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001945 (dev->xfer_shift != ATA_SHIFT_PIO)) {
1946 if (ata_down_xfermask_limit(dev, ATA_DNXFER_FORCE_PIO) == 0) {
1947 dev->spdn_cnt = 0;
Tejun Heocf480622008-01-24 00:05:14 +09001948 action |= ATA_EH_RESET;
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001949 goto done;
1950 }
1951 }
1952
Tejun Heo022bdb02006-05-15 20:58:22 +09001953 return 0;
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001954 done:
1955 /* device has been slowed down, blow error history */
Tejun Heo76326ac2007-11-27 19:28:59 +09001956 if (!(verdict & ATA_EH_SPDN_KEEP_ERRORS))
1957 ata_ering_clear(&dev->ering);
Tejun Heo7d47e8d2007-02-02 16:22:31 +09001958 return action;
Tejun Heo022bdb02006-05-15 20:58:22 +09001959}
1960
1961/**
Tejun Heo9b1e2652007-08-06 18:36:24 +09001962 * ata_eh_link_autopsy - analyze error and determine recovery action
1963 * @link: host link to perform autopsy on
Tejun Heo022bdb02006-05-15 20:58:22 +09001964 *
Tejun Heo02607312007-08-06 18:36:23 +09001965 * Analyze why @link failed and determine which recovery actions
1966 * are needed. This function also sets more detailed AC_ERR_*
1967 * values and fills sense data for ATAPI CHECK SENSE.
Tejun Heo022bdb02006-05-15 20:58:22 +09001968 *
1969 * LOCKING:
1970 * Kernel thread context (may sleep).
1971 */
Tejun Heo9b1e2652007-08-06 18:36:24 +09001972static void ata_eh_link_autopsy(struct ata_link *link)
Tejun Heo022bdb02006-05-15 20:58:22 +09001973{
Tejun Heo02607312007-08-06 18:36:23 +09001974 struct ata_port *ap = link->ap;
Tejun Heo936fd732007-08-06 18:36:23 +09001975 struct ata_eh_context *ehc = &link->eh_context;
Tejun Heodfcc1732007-10-31 10:17:05 +09001976 struct ata_device *dev;
Tejun Heo3884f7b2007-11-27 19:28:56 +09001977 unsigned int all_err_mask = 0, eflags = 0;
1978 int tag;
Tejun Heo022bdb02006-05-15 20:58:22 +09001979 u32 serror;
1980 int rc;
1981
1982 DPRINTK("ENTER\n");
1983
Tejun Heo1cdaf532006-07-03 16:07:26 +09001984 if (ehc->i.flags & ATA_EHI_NO_AUTOPSY)
1985 return;
1986
Tejun Heo022bdb02006-05-15 20:58:22 +09001987 /* obtain and analyze SError */
Tejun Heo936fd732007-08-06 18:36:23 +09001988 rc = sata_scr_read(link, SCR_ERROR, &serror);
Tejun Heo022bdb02006-05-15 20:58:22 +09001989 if (rc == 0) {
1990 ehc->i.serror |= serror;
Tejun Heo02607312007-08-06 18:36:23 +09001991 ata_eh_analyze_serror(link);
Tejun Heo4e57c512007-07-16 14:29:41 +09001992 } else if (rc != -EOPNOTSUPP) {
Tejun Heocf480622008-01-24 00:05:14 +09001993 /* SError read failed, force reset and probing */
Tejun Heob558edd2008-01-24 00:05:14 +09001994 ehc->i.probe_mask |= ATA_ALL_DEVICES;
Tejun Heocf480622008-01-24 00:05:14 +09001995 ehc->i.action |= ATA_EH_RESET;
Tejun Heo4e57c512007-07-16 14:29:41 +09001996 ehc->i.err_mask |= AC_ERR_OTHER;
1997 }
Tejun Heo022bdb02006-05-15 20:58:22 +09001998
Tejun Heoe8ee8452006-05-15 21:03:46 +09001999 /* analyze NCQ failure */
Tejun Heo02607312007-08-06 18:36:23 +09002000 ata_eh_analyze_ncq_error(link);
Tejun Heoe8ee8452006-05-15 21:03:46 +09002001
Tejun Heo022bdb02006-05-15 20:58:22 +09002002 /* any real error trumps AC_ERR_OTHER */
2003 if (ehc->i.err_mask & ~AC_ERR_OTHER)
2004 ehc->i.err_mask &= ~AC_ERR_OTHER;
2005
2006 all_err_mask |= ehc->i.err_mask;
2007
2008 for (tag = 0; tag < ATA_MAX_QUEUE; tag++) {
2009 struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag);
2010
Tejun Heob1c72912008-07-31 17:02:43 +09002011 if (!(qc->flags & ATA_QCFLAG_FAILED) ||
2012 ata_dev_phys_link(qc->dev) != link)
Tejun Heo022bdb02006-05-15 20:58:22 +09002013 continue;
2014
2015 /* inherit upper level err_mask */
2016 qc->err_mask |= ehc->i.err_mask;
2017
Tejun Heo022bdb02006-05-15 20:58:22 +09002018 /* analyze TF */
Tejun Heo4528e4d2006-07-08 20:17:26 +09002019 ehc->i.action |= ata_eh_analyze_tf(qc, &qc->result_tf);
Tejun Heo022bdb02006-05-15 20:58:22 +09002020
2021 /* DEV errors are probably spurious in case of ATA_BUS error */
2022 if (qc->err_mask & AC_ERR_ATA_BUS)
2023 qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_MEDIA |
2024 AC_ERR_INVALID);
2025
2026 /* any real error trumps unknown error */
2027 if (qc->err_mask & ~AC_ERR_OTHER)
2028 qc->err_mask &= ~AC_ERR_OTHER;
2029
2030 /* SENSE_VALID trumps dev/unknown error and revalidation */
Tejun Heof90f0822007-10-26 16:12:41 +09002031 if (qc->flags & ATA_QCFLAG_SENSE_VALID)
Tejun Heo022bdb02006-05-15 20:58:22 +09002032 qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_OTHER);
Tejun Heo022bdb02006-05-15 20:58:22 +09002033
Tejun Heo03faab72008-03-27 19:14:24 +09002034 /* determine whether the command is worth retrying */
Tejun Heo534ead72010-01-14 16:18:09 +09002035 if (qc->flags & ATA_QCFLAG_IO ||
2036 (!(qc->err_mask & AC_ERR_INVALID) &&
2037 qc->err_mask != AC_ERR_DEV))
Tejun Heo03faab72008-03-27 19:14:24 +09002038 qc->flags |= ATA_QCFLAG_RETRY;
2039
Tejun Heo022bdb02006-05-15 20:58:22 +09002040 /* accumulate error info */
Tejun Heo4528e4d2006-07-08 20:17:26 +09002041 ehc->i.dev = qc->dev;
Tejun Heo022bdb02006-05-15 20:58:22 +09002042 all_err_mask |= qc->err_mask;
2043 if (qc->flags & ATA_QCFLAG_IO)
Tejun Heo3884f7b2007-11-27 19:28:56 +09002044 eflags |= ATA_EFLAG_IS_IO;
Tejun Heo022bdb02006-05-15 20:58:22 +09002045 }
2046
Tejun Heoa20f33f2006-05-16 12:58:24 +09002047 /* enforce default EH actions */
Tejun Heob51e9e52006-06-29 01:29:30 +09002048 if (ap->pflags & ATA_PFLAG_FROZEN ||
Tejun Heoa20f33f2006-05-16 12:58:24 +09002049 all_err_mask & (AC_ERR_HSM | AC_ERR_TIMEOUT))
Tejun Heocf480622008-01-24 00:05:14 +09002050 ehc->i.action |= ATA_EH_RESET;
Tejun Heo3884f7b2007-11-27 19:28:56 +09002051 else if (((eflags & ATA_EFLAG_IS_IO) && all_err_mask) ||
2052 (!(eflags & ATA_EFLAG_IS_IO) && (all_err_mask & ~AC_ERR_DEV)))
Tejun Heo4528e4d2006-07-08 20:17:26 +09002053 ehc->i.action |= ATA_EH_REVALIDATE;
Tejun Heo022bdb02006-05-15 20:58:22 +09002054
Tejun Heodfcc1732007-10-31 10:17:05 +09002055 /* If we have offending qcs and the associated failed device,
2056 * perform per-dev EH action only on the offending device.
2057 */
Tejun Heo4528e4d2006-07-08 20:17:26 +09002058 if (ehc->i.dev) {
Tejun Heo4528e4d2006-07-08 20:17:26 +09002059 ehc->i.dev_action[ehc->i.dev->devno] |=
2060 ehc->i.action & ATA_EH_PERDEV_MASK;
2061 ehc->i.action &= ~ATA_EH_PERDEV_MASK;
Tejun Heo47005f22006-06-19 18:27:23 +09002062 }
2063
Tejun Heo2695e362008-01-10 13:41:23 +09002064 /* propagate timeout to host link */
2065 if ((all_err_mask & AC_ERR_TIMEOUT) && !ata_is_host_link(link))
2066 ap->link.eh_context.i.err_mask |= AC_ERR_TIMEOUT;
2067
2068 /* record error and consider speeding down */
Tejun Heodfcc1732007-10-31 10:17:05 +09002069 dev = ehc->i.dev;
Tejun Heo2695e362008-01-10 13:41:23 +09002070 if (!dev && ((ata_link_max_devices(link) == 1 &&
2071 ata_dev_enabled(link->device))))
2072 dev = link->device;
Tejun Heodfcc1732007-10-31 10:17:05 +09002073
Tejun Heo76326ac2007-11-27 19:28:59 +09002074 if (dev) {
2075 if (dev->flags & ATA_DFLAG_DUBIOUS_XFER)
2076 eflags |= ATA_EFLAG_DUBIOUS_XFER;
Tejun Heo3884f7b2007-11-27 19:28:56 +09002077 ehc->i.action |= ata_eh_speed_down(dev, eflags, all_err_mask);
Tejun Heo76326ac2007-11-27 19:28:59 +09002078 }
Tejun Heodfcc1732007-10-31 10:17:05 +09002079
Tejun Heo022bdb02006-05-15 20:58:22 +09002080 DPRINTK("EXIT\n");
2081}
2082
2083/**
Tejun Heo9b1e2652007-08-06 18:36:24 +09002084 * ata_eh_autopsy - analyze error and determine recovery action
2085 * @ap: host port to perform autopsy on
2086 *
2087 * Analyze all links of @ap and determine why they failed and
2088 * which recovery actions are needed.
2089 *
2090 * LOCKING:
2091 * Kernel thread context (may sleep).
2092 */
Tejun Heofb7fd612007-09-23 13:14:12 +09002093void ata_eh_autopsy(struct ata_port *ap)
Tejun Heo9b1e2652007-08-06 18:36:24 +09002094{
2095 struct ata_link *link;
2096
Tejun Heo1eca4362008-11-03 20:03:17 +09002097 ata_for_each_link(link, ap, EDGE)
Tejun Heo9b1e2652007-08-06 18:36:24 +09002098 ata_eh_link_autopsy(link);
Tejun Heo2695e362008-01-10 13:41:23 +09002099
Tejun Heob1c72912008-07-31 17:02:43 +09002100 /* Handle the frigging slave link. Autopsy is done similarly
2101 * but actions and flags are transferred over to the master
2102 * link and handled from there.
2103 */
2104 if (ap->slave_link) {
2105 struct ata_eh_context *mehc = &ap->link.eh_context;
2106 struct ata_eh_context *sehc = &ap->slave_link->eh_context;
2107
Tejun Heo848e4c62008-10-21 14:26:39 +09002108 /* transfer control flags from master to slave */
2109 sehc->i.flags |= mehc->i.flags & ATA_EHI_TO_SLAVE_MASK;
2110
2111 /* perform autopsy on the slave link */
Tejun Heob1c72912008-07-31 17:02:43 +09002112 ata_eh_link_autopsy(ap->slave_link);
2113
Tejun Heo848e4c62008-10-21 14:26:39 +09002114 /* transfer actions from slave to master and clear slave */
Tejun Heob1c72912008-07-31 17:02:43 +09002115 ata_eh_about_to_do(ap->slave_link, NULL, ATA_EH_ALL_ACTIONS);
2116 mehc->i.action |= sehc->i.action;
2117 mehc->i.dev_action[1] |= sehc->i.dev_action[1];
2118 mehc->i.flags |= sehc->i.flags;
2119 ata_eh_done(ap->slave_link, NULL, ATA_EH_ALL_ACTIONS);
2120 }
2121
Tejun Heo2695e362008-01-10 13:41:23 +09002122 /* Autopsy of fanout ports can affect host link autopsy.
2123 * Perform host link autopsy last.
2124 */
Tejun Heo071f44b2008-04-07 22:47:22 +09002125 if (sata_pmp_attached(ap))
Tejun Heo2695e362008-01-10 13:41:23 +09002126 ata_eh_link_autopsy(&ap->link);
Tejun Heo9b1e2652007-08-06 18:36:24 +09002127}
2128
2129/**
Robert Hancock65211482009-07-14 20:43:39 -06002130 * ata_get_cmd_descript - get description for ATA command
2131 * @command: ATA command code to get description for
2132 *
2133 * Return a textual description of the given command, or NULL if the
2134 * command is not known.
2135 *
2136 * LOCKING:
2137 * None
2138 */
2139const char *ata_get_cmd_descript(u8 command)
2140{
2141#ifdef CONFIG_ATA_VERBOSE_ERROR
2142 static const struct
2143 {
2144 u8 command;
2145 const char *text;
2146 } cmd_descr[] = {
2147 { ATA_CMD_DEV_RESET, "DEVICE RESET" },
2148 { ATA_CMD_CHK_POWER, "CHECK POWER MODE" },
2149 { ATA_CMD_STANDBY, "STANDBY" },
2150 { ATA_CMD_IDLE, "IDLE" },
2151 { ATA_CMD_EDD, "EXECUTE DEVICE DIAGNOSTIC" },
2152 { ATA_CMD_DOWNLOAD_MICRO, "DOWNLOAD MICROCODE" },
2153 { ATA_CMD_NOP, "NOP" },
2154 { ATA_CMD_FLUSH, "FLUSH CACHE" },
2155 { ATA_CMD_FLUSH_EXT, "FLUSH CACHE EXT" },
2156 { ATA_CMD_ID_ATA, "IDENTIFY DEVICE" },
2157 { ATA_CMD_ID_ATAPI, "IDENTIFY PACKET DEVICE" },
2158 { ATA_CMD_SERVICE, "SERVICE" },
2159 { ATA_CMD_READ, "READ DMA" },
2160 { ATA_CMD_READ_EXT, "READ DMA EXT" },
2161 { ATA_CMD_READ_QUEUED, "READ DMA QUEUED" },
2162 { ATA_CMD_READ_STREAM_EXT, "READ STREAM EXT" },
2163 { ATA_CMD_READ_STREAM_DMA_EXT, "READ STREAM DMA EXT" },
2164 { ATA_CMD_WRITE, "WRITE DMA" },
2165 { ATA_CMD_WRITE_EXT, "WRITE DMA EXT" },
2166 { ATA_CMD_WRITE_QUEUED, "WRITE DMA QUEUED EXT" },
2167 { ATA_CMD_WRITE_STREAM_EXT, "WRITE STREAM EXT" },
2168 { ATA_CMD_WRITE_STREAM_DMA_EXT, "WRITE STREAM DMA EXT" },
2169 { ATA_CMD_WRITE_FUA_EXT, "WRITE DMA FUA EXT" },
2170 { ATA_CMD_WRITE_QUEUED_FUA_EXT, "WRITE DMA QUEUED FUA EXT" },
2171 { ATA_CMD_FPDMA_READ, "READ FPDMA QUEUED" },
2172 { ATA_CMD_FPDMA_WRITE, "WRITE FPDMA QUEUED" },
2173 { ATA_CMD_PIO_READ, "READ SECTOR(S)" },
2174 { ATA_CMD_PIO_READ_EXT, "READ SECTOR(S) EXT" },
2175 { ATA_CMD_PIO_WRITE, "WRITE SECTOR(S)" },
2176 { ATA_CMD_PIO_WRITE_EXT, "WRITE SECTOR(S) EXT" },
2177 { ATA_CMD_READ_MULTI, "READ MULTIPLE" },
2178 { ATA_CMD_READ_MULTI_EXT, "READ MULTIPLE EXT" },
2179 { ATA_CMD_WRITE_MULTI, "WRITE MULTIPLE" },
2180 { ATA_CMD_WRITE_MULTI_EXT, "WRITE MULTIPLE EXT" },
2181 { ATA_CMD_WRITE_MULTI_FUA_EXT, "WRITE MULTIPLE FUA EXT" },
2182 { ATA_CMD_SET_FEATURES, "SET FEATURES" },
2183 { ATA_CMD_SET_MULTI, "SET MULTIPLE MODE" },
2184 { ATA_CMD_VERIFY, "READ VERIFY SECTOR(S)" },
2185 { ATA_CMD_VERIFY_EXT, "READ VERIFY SECTOR(S) EXT" },
2186 { ATA_CMD_WRITE_UNCORR_EXT, "WRITE UNCORRECTABLE EXT" },
2187 { ATA_CMD_STANDBYNOW1, "STANDBY IMMEDIATE" },
2188 { ATA_CMD_IDLEIMMEDIATE, "IDLE IMMEDIATE" },
2189 { ATA_CMD_SLEEP, "SLEEP" },
2190 { ATA_CMD_INIT_DEV_PARAMS, "INITIALIZE DEVICE PARAMETERS" },
2191 { ATA_CMD_READ_NATIVE_MAX, "READ NATIVE MAX ADDRESS" },
2192 { ATA_CMD_READ_NATIVE_MAX_EXT, "READ NATIVE MAX ADDRESS EXT" },
2193 { ATA_CMD_SET_MAX, "SET MAX ADDRESS" },
2194 { ATA_CMD_SET_MAX_EXT, "SET MAX ADDRESS EXT" },
2195 { ATA_CMD_READ_LOG_EXT, "READ LOG EXT" },
2196 { ATA_CMD_WRITE_LOG_EXT, "WRITE LOG EXT" },
2197 { ATA_CMD_READ_LOG_DMA_EXT, "READ LOG DMA EXT" },
2198 { ATA_CMD_WRITE_LOG_DMA_EXT, "WRITE LOG DMA EXT" },
2199 { ATA_CMD_TRUSTED_RCV, "TRUSTED RECEIVE" },
2200 { ATA_CMD_TRUSTED_RCV_DMA, "TRUSTED RECEIVE DMA" },
2201 { ATA_CMD_TRUSTED_SND, "TRUSTED SEND" },
2202 { ATA_CMD_TRUSTED_SND_DMA, "TRUSTED SEND DMA" },
2203 { ATA_CMD_PMP_READ, "READ BUFFER" },
2204 { ATA_CMD_PMP_WRITE, "WRITE BUFFER" },
2205 { ATA_CMD_CONF_OVERLAY, "DEVICE CONFIGURATION OVERLAY" },
2206 { ATA_CMD_SEC_SET_PASS, "SECURITY SET PASSWORD" },
2207 { ATA_CMD_SEC_UNLOCK, "SECURITY UNLOCK" },
2208 { ATA_CMD_SEC_ERASE_PREP, "SECURITY ERASE PREPARE" },
2209 { ATA_CMD_SEC_ERASE_UNIT, "SECURITY ERASE UNIT" },
2210 { ATA_CMD_SEC_FREEZE_LOCK, "SECURITY FREEZE LOCK" },
2211 { ATA_CMD_SEC_DISABLE_PASS, "SECURITY DISABLE PASSWORD" },
2212 { ATA_CMD_CONFIG_STREAM, "CONFIGURE STREAM" },
2213 { ATA_CMD_SMART, "SMART" },
2214 { ATA_CMD_MEDIA_LOCK, "DOOR LOCK" },
2215 { ATA_CMD_MEDIA_UNLOCK, "DOOR UNLOCK" },
2216 { ATA_CMD_CHK_MED_CRD_TYP, "CHECK MEDIA CARD TYPE" },
2217 { ATA_CMD_CFA_REQ_EXT_ERR, "CFA REQUEST EXTENDED ERROR" },
2218 { ATA_CMD_CFA_WRITE_NE, "CFA WRITE SECTORS WITHOUT ERASE" },
2219 { ATA_CMD_CFA_TRANS_SECT, "CFA TRANSLATE SECTOR" },
2220 { ATA_CMD_CFA_ERASE, "CFA ERASE SECTORS" },
2221 { ATA_CMD_CFA_WRITE_MULT_NE, "CFA WRITE MULTIPLE WITHOUT ERASE" },
2222 { ATA_CMD_READ_LONG, "READ LONG (with retries)" },
2223 { ATA_CMD_READ_LONG_ONCE, "READ LONG (without retries)" },
2224 { ATA_CMD_WRITE_LONG, "WRITE LONG (with retries)" },
2225 { ATA_CMD_WRITE_LONG_ONCE, "WRITE LONG (without retries)" },
2226 { ATA_CMD_RESTORE, "RECALIBRATE" },
2227 { 0, NULL } /* terminate list */
2228 };
2229
2230 unsigned int i;
2231 for (i = 0; cmd_descr[i].text; i++)
2232 if (cmd_descr[i].command == command)
2233 return cmd_descr[i].text;
2234#endif
2235
2236 return NULL;
2237}
2238
2239/**
Tejun Heo9b1e2652007-08-06 18:36:24 +09002240 * ata_eh_link_report - report error handling to user
Tejun Heo02607312007-08-06 18:36:23 +09002241 * @link: ATA link EH is going on
Tejun Heo022bdb02006-05-15 20:58:22 +09002242 *
2243 * Report EH to user.
2244 *
2245 * LOCKING:
2246 * None.
2247 */
Tejun Heo9b1e2652007-08-06 18:36:24 +09002248static void ata_eh_link_report(struct ata_link *link)
Tejun Heo022bdb02006-05-15 20:58:22 +09002249{
Tejun Heo02607312007-08-06 18:36:23 +09002250 struct ata_port *ap = link->ap;
2251 struct ata_eh_context *ehc = &link->eh_context;
Tejun Heo022bdb02006-05-15 20:58:22 +09002252 const char *frozen, *desc;
Tejun Heoa1e10f72007-08-18 13:28:49 +09002253 char tries_buf[6];
Tejun Heo022bdb02006-05-15 20:58:22 +09002254 int tag, nr_failed = 0;
2255
Tejun Heo94ff3d52007-10-09 14:57:56 +09002256 if (ehc->i.flags & ATA_EHI_QUIET)
2257 return;
2258
Tejun Heo022bdb02006-05-15 20:58:22 +09002259 desc = NULL;
2260 if (ehc->i.desc[0] != '\0')
2261 desc = ehc->i.desc;
2262
2263 for (tag = 0; tag < ATA_MAX_QUEUE; tag++) {
2264 struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag);
2265
Tejun Heob1c72912008-07-31 17:02:43 +09002266 if (!(qc->flags & ATA_QCFLAG_FAILED) ||
2267 ata_dev_phys_link(qc->dev) != link ||
Tejun Heoe027bd32007-10-26 16:19:26 +09002268 ((qc->flags & ATA_QCFLAG_QUIET) &&
2269 qc->err_mask == AC_ERR_DEV))
Tejun Heo022bdb02006-05-15 20:58:22 +09002270 continue;
2271 if (qc->flags & ATA_QCFLAG_SENSE_VALID && !qc->err_mask)
2272 continue;
2273
2274 nr_failed++;
2275 }
2276
2277 if (!nr_failed && !ehc->i.err_mask)
2278 return;
2279
2280 frozen = "";
Tejun Heob51e9e52006-06-29 01:29:30 +09002281 if (ap->pflags & ATA_PFLAG_FROZEN)
Tejun Heo022bdb02006-05-15 20:58:22 +09002282 frozen = " frozen";
2283
Tejun Heoa1e10f72007-08-18 13:28:49 +09002284 memset(tries_buf, 0, sizeof(tries_buf));
2285 if (ap->eh_tries < ATA_EH_MAX_TRIES)
2286 snprintf(tries_buf, sizeof(tries_buf) - 1, " t%d",
2287 ap->eh_tries);
2288
Tejun Heo022bdb02006-05-15 20:58:22 +09002289 if (ehc->i.dev) {
Tejun Heoe8ee8452006-05-15 21:03:46 +09002290 ata_dev_printk(ehc->i.dev, KERN_ERR, "exception Emask 0x%x "
Tejun Heoa1e10f72007-08-18 13:28:49 +09002291 "SAct 0x%x SErr 0x%x action 0x%x%s%s\n",
2292 ehc->i.err_mask, link->sactive, ehc->i.serror,
2293 ehc->i.action, frozen, tries_buf);
Tejun Heo022bdb02006-05-15 20:58:22 +09002294 if (desc)
Tejun Heob64bbc32007-07-16 14:29:39 +09002295 ata_dev_printk(ehc->i.dev, KERN_ERR, "%s\n", desc);
Tejun Heo022bdb02006-05-15 20:58:22 +09002296 } else {
Tejun Heo02607312007-08-06 18:36:23 +09002297 ata_link_printk(link, KERN_ERR, "exception Emask 0x%x "
Tejun Heoa1e10f72007-08-18 13:28:49 +09002298 "SAct 0x%x SErr 0x%x action 0x%x%s%s\n",
2299 ehc->i.err_mask, link->sactive, ehc->i.serror,
2300 ehc->i.action, frozen, tries_buf);
Tejun Heo022bdb02006-05-15 20:58:22 +09002301 if (desc)
Tejun Heo02607312007-08-06 18:36:23 +09002302 ata_link_printk(link, KERN_ERR, "%s\n", desc);
Tejun Heo022bdb02006-05-15 20:58:22 +09002303 }
2304
Robert Hancock65211482009-07-14 20:43:39 -06002305#ifdef CONFIG_ATA_VERBOSE_ERROR
Robert Hancock1333e192007-10-02 11:22:02 -04002306 if (ehc->i.serror)
Tejun Heoda0e21d2008-07-31 16:08:38 +09002307 ata_link_printk(link, KERN_ERR,
Robert Hancock1333e192007-10-02 11:22:02 -04002308 "SError: { %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s}\n",
2309 ehc->i.serror & SERR_DATA_RECOVERED ? "RecovData " : "",
2310 ehc->i.serror & SERR_COMM_RECOVERED ? "RecovComm " : "",
2311 ehc->i.serror & SERR_DATA ? "UnrecovData " : "",
2312 ehc->i.serror & SERR_PERSISTENT ? "Persist " : "",
2313 ehc->i.serror & SERR_PROTOCOL ? "Proto " : "",
2314 ehc->i.serror & SERR_INTERNAL ? "HostInt " : "",
2315 ehc->i.serror & SERR_PHYRDY_CHG ? "PHYRdyChg " : "",
2316 ehc->i.serror & SERR_PHY_INT_ERR ? "PHYInt " : "",
2317 ehc->i.serror & SERR_COMM_WAKE ? "CommWake " : "",
2318 ehc->i.serror & SERR_10B_8B_ERR ? "10B8B " : "",
2319 ehc->i.serror & SERR_DISPARITY ? "Dispar " : "",
2320 ehc->i.serror & SERR_CRC ? "BadCRC " : "",
2321 ehc->i.serror & SERR_HANDSHAKE ? "Handshk " : "",
2322 ehc->i.serror & SERR_LINK_SEQ_ERR ? "LinkSeq " : "",
2323 ehc->i.serror & SERR_TRANS_ST_ERROR ? "TrStaTrns " : "",
2324 ehc->i.serror & SERR_UNRECOG_FIS ? "UnrecFIS " : "",
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002325 ehc->i.serror & SERR_DEV_XCHG ? "DevExch " : "");
Robert Hancock65211482009-07-14 20:43:39 -06002326#endif
Robert Hancock1333e192007-10-02 11:22:02 -04002327
Tejun Heo022bdb02006-05-15 20:58:22 +09002328 for (tag = 0; tag < ATA_MAX_QUEUE; tag++) {
2329 struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag);
Tejun Heo8a937582006-11-14 22:36:12 +09002330 struct ata_taskfile *cmd = &qc->tf, *res = &qc->result_tf;
Tejun Heoabb6a882007-11-28 23:16:09 +09002331 const u8 *cdb = qc->cdb;
2332 char data_buf[20] = "";
2333 char cdb_buf[70] = "";
Tejun Heo022bdb02006-05-15 20:58:22 +09002334
Tejun Heo02607312007-08-06 18:36:23 +09002335 if (!(qc->flags & ATA_QCFLAG_FAILED) ||
Tejun Heob1c72912008-07-31 17:02:43 +09002336 ata_dev_phys_link(qc->dev) != link || !qc->err_mask)
Tejun Heo022bdb02006-05-15 20:58:22 +09002337 continue;
2338
Tejun Heoabb6a882007-11-28 23:16:09 +09002339 if (qc->dma_dir != DMA_NONE) {
2340 static const char *dma_str[] = {
2341 [DMA_BIDIRECTIONAL] = "bidi",
2342 [DMA_TO_DEVICE] = "out",
2343 [DMA_FROM_DEVICE] = "in",
2344 };
2345 static const char *prot_str[] = {
2346 [ATA_PROT_PIO] = "pio",
2347 [ATA_PROT_DMA] = "dma",
2348 [ATA_PROT_NCQ] = "ncq",
Tejun Heo0dc36882007-12-18 16:34:43 -05002349 [ATAPI_PROT_PIO] = "pio",
2350 [ATAPI_PROT_DMA] = "dma",
Tejun Heoabb6a882007-11-28 23:16:09 +09002351 };
2352
2353 snprintf(data_buf, sizeof(data_buf), " %s %u %s",
2354 prot_str[qc->tf.protocol], qc->nbytes,
2355 dma_str[qc->dma_dir]);
2356 }
2357
Robert Hancock65211482009-07-14 20:43:39 -06002358 if (ata_is_atapi(qc->tf.protocol)) {
2359 if (qc->scsicmd)
2360 scsi_print_command(qc->scsicmd);
2361 else
2362 snprintf(cdb_buf, sizeof(cdb_buf),
Tejun Heoabb6a882007-11-28 23:16:09 +09002363 "cdb %02x %02x %02x %02x %02x %02x %02x %02x "
2364 "%02x %02x %02x %02x %02x %02x %02x %02x\n ",
2365 cdb[0], cdb[1], cdb[2], cdb[3],
2366 cdb[4], cdb[5], cdb[6], cdb[7],
2367 cdb[8], cdb[9], cdb[10], cdb[11],
2368 cdb[12], cdb[13], cdb[14], cdb[15]);
Robert Hancock65211482009-07-14 20:43:39 -06002369 } else {
2370 const char *descr = ata_get_cmd_descript(cmd->command);
2371 if (descr)
2372 ata_dev_printk(qc->dev, KERN_ERR,
2373 "failed command: %s\n", descr);
2374 }
Tejun Heoabb6a882007-11-28 23:16:09 +09002375
Tejun Heo8a937582006-11-14 22:36:12 +09002376 ata_dev_printk(qc->dev, KERN_ERR,
2377 "cmd %02x/%02x:%02x:%02x:%02x:%02x/%02x:%02x:%02x:%02x:%02x/%02x "
Tejun Heoabb6a882007-11-28 23:16:09 +09002378 "tag %d%s\n %s"
Tejun Heo8a937582006-11-14 22:36:12 +09002379 "res %02x/%02x:%02x:%02x:%02x:%02x/%02x:%02x:%02x:%02x:%02x/%02x "
Tejun Heo5335b722007-07-16 14:29:40 +09002380 "Emask 0x%x (%s)%s\n",
Tejun Heo8a937582006-11-14 22:36:12 +09002381 cmd->command, cmd->feature, cmd->nsect,
2382 cmd->lbal, cmd->lbam, cmd->lbah,
2383 cmd->hob_feature, cmd->hob_nsect,
2384 cmd->hob_lbal, cmd->hob_lbam, cmd->hob_lbah,
Tejun Heoabb6a882007-11-28 23:16:09 +09002385 cmd->device, qc->tag, data_buf, cdb_buf,
Tejun Heo8a937582006-11-14 22:36:12 +09002386 res->command, res->feature, res->nsect,
2387 res->lbal, res->lbam, res->lbah,
2388 res->hob_feature, res->hob_nsect,
2389 res->hob_lbal, res->hob_lbam, res->hob_lbah,
Tejun Heo5335b722007-07-16 14:29:40 +09002390 res->device, qc->err_mask, ata_err_string(qc->err_mask),
2391 qc->err_mask & AC_ERR_NCQ ? " <F>" : "");
Robert Hancock1333e192007-10-02 11:22:02 -04002392
Robert Hancock65211482009-07-14 20:43:39 -06002393#ifdef CONFIG_ATA_VERBOSE_ERROR
Robert Hancock1333e192007-10-02 11:22:02 -04002394 if (res->command & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ |
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002395 ATA_ERR)) {
Robert Hancock1333e192007-10-02 11:22:02 -04002396 if (res->command & ATA_BUSY)
2397 ata_dev_printk(qc->dev, KERN_ERR,
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002398 "status: { Busy }\n");
Robert Hancock1333e192007-10-02 11:22:02 -04002399 else
2400 ata_dev_printk(qc->dev, KERN_ERR,
2401 "status: { %s%s%s%s}\n",
2402 res->command & ATA_DRDY ? "DRDY " : "",
2403 res->command & ATA_DF ? "DF " : "",
2404 res->command & ATA_DRQ ? "DRQ " : "",
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002405 res->command & ATA_ERR ? "ERR " : "");
Robert Hancock1333e192007-10-02 11:22:02 -04002406 }
2407
2408 if (cmd->command != ATA_CMD_PACKET &&
2409 (res->feature & (ATA_ICRC | ATA_UNC | ATA_IDNF |
2410 ATA_ABORTED)))
2411 ata_dev_printk(qc->dev, KERN_ERR,
2412 "error: { %s%s%s%s}\n",
2413 res->feature & ATA_ICRC ? "ICRC " : "",
2414 res->feature & ATA_UNC ? "UNC " : "",
2415 res->feature & ATA_IDNF ? "IDNF " : "",
Jeff Garzik2dcb4072007-10-19 06:42:56 -04002416 res->feature & ATA_ABORTED ? "ABRT " : "");
Robert Hancock65211482009-07-14 20:43:39 -06002417#endif
Tejun Heo022bdb02006-05-15 20:58:22 +09002418 }
2419}
2420
Tejun Heo9b1e2652007-08-06 18:36:24 +09002421/**
2422 * ata_eh_report - report error handling to user
2423 * @ap: ATA port to report EH about
2424 *
2425 * Report EH to user.
2426 *
2427 * LOCKING:
2428 * None.
2429 */
Tejun Heofb7fd612007-09-23 13:14:12 +09002430void ata_eh_report(struct ata_port *ap)
Tejun Heo9b1e2652007-08-06 18:36:24 +09002431{
2432 struct ata_link *link;
2433
Tejun Heo1eca4362008-11-03 20:03:17 +09002434 ata_for_each_link(link, ap, HOST_FIRST)
Tejun Heo9b1e2652007-08-06 18:36:24 +09002435 ata_eh_link_report(link);
2436}
2437
Tejun Heocc0680a2007-08-06 18:36:23 +09002438static int ata_do_reset(struct ata_link *link, ata_reset_fn_t reset,
Tejun Heob1c72912008-07-31 17:02:43 +09002439 unsigned int *classes, unsigned long deadline,
2440 bool clear_classes)
Tejun Heod87fa382006-05-31 18:28:24 +09002441{
Tejun Heof58229f2007-08-06 18:36:23 +09002442 struct ata_device *dev;
Tejun Heod87fa382006-05-31 18:28:24 +09002443
Tejun Heob1c72912008-07-31 17:02:43 +09002444 if (clear_classes)
Tejun Heo1eca4362008-11-03 20:03:17 +09002445 ata_for_each_dev(dev, link, ALL)
Tejun Heob1c72912008-07-31 17:02:43 +09002446 classes[dev->devno] = ATA_DEV_UNKNOWN;
Tejun Heod87fa382006-05-31 18:28:24 +09002447
Tejun Heof0465192008-05-19 01:15:08 +09002448 return reset(link, classes, deadline);
Tejun Heod87fa382006-05-31 18:28:24 +09002449}
2450
Tejun Heoae791c02007-09-23 13:14:12 +09002451static int ata_eh_followup_srst_needed(struct ata_link *link,
Tejun Heo5dbfc9c2008-07-31 16:08:02 +09002452 int rc, const unsigned int *classes)
Tejun Heo664faf02006-05-31 18:27:50 +09002453{
Tejun Heo45db2f62008-04-08 01:46:56 +09002454 if ((link->flags & ATA_LFLAG_NO_SRST) || ata_link_offline(link))
Tejun Heoae791c02007-09-23 13:14:12 +09002455 return 0;
Tejun Heo5dbfc9c2008-07-31 16:08:02 +09002456 if (rc == -EAGAIN)
2457 return 1;
Tejun Heo071f44b2008-04-07 22:47:22 +09002458 if (sata_pmp_supported(link->ap) && ata_is_host_link(link))
Tejun Heo3495de72007-09-23 13:19:53 +09002459 return 1;
Tejun Heo664faf02006-05-31 18:27:50 +09002460 return 0;
2461}
2462
Tejun Heofb7fd612007-09-23 13:14:12 +09002463int ata_eh_reset(struct ata_link *link, int classify,
2464 ata_prereset_fn_t prereset, ata_reset_fn_t softreset,
2465 ata_reset_fn_t hardreset, ata_postreset_fn_t postreset)
Tejun Heo022bdb02006-05-15 20:58:22 +09002466{
Tejun Heoafaa5c32007-10-09 15:06:10 +09002467 struct ata_port *ap = link->ap;
Tejun Heob1c72912008-07-31 17:02:43 +09002468 struct ata_link *slave = ap->slave_link;
Tejun Heo936fd732007-08-06 18:36:23 +09002469 struct ata_eh_context *ehc = &link->eh_context;
Bartlomiej Zolnierkiewicz705d2012009-07-26 16:21:01 +02002470 struct ata_eh_context *sehc = slave ? &slave->eh_context : NULL;
Tejun Heo664faf02006-05-31 18:27:50 +09002471 unsigned int *classes = ehc->classes;
Tejun Heo416dc9e2007-10-31 10:17:03 +09002472 unsigned int lflags = link->flags;
Tejun Heo1cdaf532006-07-03 16:07:26 +09002473 int verbose = !(ehc->i.flags & ATA_EHI_QUIET);
Tejun Heod8af0eb2008-05-20 02:17:53 +09002474 int max_tries = 0, try = 0;
Tejun Heob1c72912008-07-31 17:02:43 +09002475 struct ata_link *failed_link;
Tejun Heof58229f2007-08-06 18:36:23 +09002476 struct ata_device *dev;
Tejun Heo416dc9e2007-10-31 10:17:03 +09002477 unsigned long deadline, now;
Tejun Heo022bdb02006-05-15 20:58:22 +09002478 ata_reset_fn_t reset;
Tejun Heoafaa5c32007-10-09 15:06:10 +09002479 unsigned long flags;
Tejun Heo416dc9e2007-10-31 10:17:03 +09002480 u32 sstatus;
Tejun Heob1c72912008-07-31 17:02:43 +09002481 int nr_unknown, rc;
Tejun Heo022bdb02006-05-15 20:58:22 +09002482
Tejun Heo932648b2008-05-19 01:15:06 +09002483 /*
2484 * Prepare to reset
2485 */
Tejun Heod8af0eb2008-05-20 02:17:53 +09002486 while (ata_eh_reset_timeouts[max_tries] != ULONG_MAX)
2487 max_tries++;
Tejun Heo05944bd2008-08-13 20:19:09 +09002488 if (link->flags & ATA_LFLAG_NO_HRST)
2489 hardreset = NULL;
2490 if (link->flags & ATA_LFLAG_NO_SRST)
2491 softreset = NULL;
Tejun Heod8af0eb2008-05-20 02:17:53 +09002492
Tejun Heo19b72322008-11-04 17:08:40 +09002493 /* make sure each reset attemp is at least COOL_DOWN apart */
2494 if (ehc->i.flags & ATA_EHI_DID_RESET) {
2495 now = jiffies;
2496 WARN_ON(time_after(ehc->last_reset, now));
2497 deadline = ata_deadline(ehc->last_reset,
2498 ATA_EH_RESET_COOL_DOWN);
2499 if (time_before(now, deadline))
2500 schedule_timeout_uninterruptible(deadline - now);
2501 }
Tejun Heo0a2c0f52008-05-20 02:17:52 +09002502
Tejun Heoafaa5c32007-10-09 15:06:10 +09002503 spin_lock_irqsave(ap->lock, flags);
2504 ap->pflags |= ATA_PFLAG_RESETTING;
2505 spin_unlock_irqrestore(ap->lock, flags);
2506
Tejun Heocf480622008-01-24 00:05:14 +09002507 ata_eh_about_to_do(link, NULL, ATA_EH_RESET);
Tejun Heo13abf502006-07-10 23:18:46 +09002508
Tejun Heo1eca4362008-11-03 20:03:17 +09002509 ata_for_each_dev(dev, link, ALL) {
Tejun Heocdeab112007-10-29 16:41:09 +09002510 /* If we issue an SRST then an ATA drive (not ATAPI)
2511 * may change configuration and be in PIO0 timing. If
2512 * we do a hard reset (or are coming from power on)
2513 * this is true for ATA or ATAPI. Until we've set a
2514 * suitable controller mode we should not touch the
2515 * bus as we may be talking too fast.
2516 */
2517 dev->pio_mode = XFER_PIO_0;
2518
2519 /* If the controller has a pio mode setup function
2520 * then use it to set the chipset to rights. Don't
2521 * touch the DMA setup as that will be dealt with when
2522 * configuring devices.
2523 */
2524 if (ap->ops->set_piomode)
2525 ap->ops->set_piomode(ap, dev);
2526 }
2527
Tejun Heocf480622008-01-24 00:05:14 +09002528 /* prefer hardreset */
Tejun Heo932648b2008-05-19 01:15:06 +09002529 reset = NULL;
Tejun Heocf480622008-01-24 00:05:14 +09002530 ehc->i.action &= ~ATA_EH_RESET;
2531 if (hardreset) {
2532 reset = hardreset;
Tejun Heoa6740502008-07-31 16:07:04 +09002533 ehc->i.action |= ATA_EH_HARDRESET;
Tejun Heo4f7faa32008-01-30 18:18:26 +09002534 } else if (softreset) {
Tejun Heocf480622008-01-24 00:05:14 +09002535 reset = softreset;
Tejun Heoa6740502008-07-31 16:07:04 +09002536 ehc->i.action |= ATA_EH_SOFTRESET;
Tejun Heocf480622008-01-24 00:05:14 +09002537 }
Tejun Heof5914a42006-05-31 18:27:48 +09002538
2539 if (prereset) {
Tejun Heob1c72912008-07-31 17:02:43 +09002540 unsigned long deadline = ata_deadline(jiffies,
2541 ATA_EH_PRERESET_TIMEOUT);
2542
2543 if (slave) {
2544 sehc->i.action &= ~ATA_EH_RESET;
2545 sehc->i.action |= ehc->i.action;
2546 }
2547
2548 rc = prereset(link, deadline);
2549
2550 /* If present, do prereset on slave link too. Reset
2551 * is skipped iff both master and slave links report
2552 * -ENOENT or clear ATA_EH_RESET.
2553 */
2554 if (slave && (rc == 0 || rc == -ENOENT)) {
2555 int tmp;
2556
2557 tmp = prereset(slave, deadline);
2558 if (tmp != -ENOENT)
2559 rc = tmp;
2560
2561 ehc->i.action |= sehc->i.action;
2562 }
2563
Tejun Heof5914a42006-05-31 18:27:48 +09002564 if (rc) {
Alan Coxc9619222006-09-26 17:53:38 +01002565 if (rc == -ENOENT) {
Tejun Heocc0680a2007-08-06 18:36:23 +09002566 ata_link_printk(link, KERN_DEBUG,
Tejun Heo4aa9ab62007-03-12 17:24:08 +09002567 "port disabled. ignoring.\n");
Tejun Heocf480622008-01-24 00:05:14 +09002568 ehc->i.action &= ~ATA_EH_RESET;
Tejun Heo4aa9ab62007-03-12 17:24:08 +09002569
Tejun Heo1eca4362008-11-03 20:03:17 +09002570 ata_for_each_dev(dev, link, ALL)
Tejun Heof58229f2007-08-06 18:36:23 +09002571 classes[dev->devno] = ATA_DEV_NONE;
Tejun Heo4aa9ab62007-03-12 17:24:08 +09002572
2573 rc = 0;
Alan Coxc9619222006-09-26 17:53:38 +01002574 } else
Tejun Heocc0680a2007-08-06 18:36:23 +09002575 ata_link_printk(link, KERN_ERR,
Tejun Heof5914a42006-05-31 18:27:48 +09002576 "prereset failed (errno=%d)\n", rc);
Tejun Heofccb6ea2007-07-16 14:29:41 +09002577 goto out;
Tejun Heof5914a42006-05-31 18:27:48 +09002578 }
Tejun Heof5914a42006-05-31 18:27:48 +09002579
Tejun Heo932648b2008-05-19 01:15:06 +09002580 /* prereset() might have cleared ATA_EH_RESET. If so,
Tejun Heod6515e62009-03-04 15:59:30 +09002581 * bang classes, thaw and return.
Tejun Heo932648b2008-05-19 01:15:06 +09002582 */
2583 if (reset && !(ehc->i.action & ATA_EH_RESET)) {
Tejun Heo1eca4362008-11-03 20:03:17 +09002584 ata_for_each_dev(dev, link, ALL)
Tejun Heo932648b2008-05-19 01:15:06 +09002585 classes[dev->devno] = ATA_DEV_NONE;
Tejun Heod6515e62009-03-04 15:59:30 +09002586 if ((ap->pflags & ATA_PFLAG_FROZEN) &&
2587 ata_is_host_link(link))
2588 ata_eh_thaw_port(ap);
Tejun Heo932648b2008-05-19 01:15:06 +09002589 rc = 0;
2590 goto out;
2591 }
Tejun Heof5914a42006-05-31 18:27:48 +09002592 }
2593
Tejun Heo022bdb02006-05-15 20:58:22 +09002594 retry:
Tejun Heo932648b2008-05-19 01:15:06 +09002595 /*
2596 * Perform reset
2597 */
Tejun Heodc98c322008-05-19 01:15:07 +09002598 if (ata_is_host_link(link))
2599 ata_eh_freeze_port(ap);
2600
Tejun Heo341c2c92008-05-20 02:17:51 +09002601 deadline = ata_deadline(jiffies, ata_eh_reset_timeouts[try++]);
Tejun Heo31daabd2007-02-02 16:50:52 +09002602
Tejun Heo932648b2008-05-19 01:15:06 +09002603 if (reset) {
2604 if (verbose)
2605 ata_link_printk(link, KERN_INFO, "%s resetting link\n",
2606 reset == softreset ? "soft" : "hard");
Tejun Heo022bdb02006-05-15 20:58:22 +09002607
Tejun Heo932648b2008-05-19 01:15:06 +09002608 /* mark that this EH session started with reset */
Tejun Heo19b72322008-11-04 17:08:40 +09002609 ehc->last_reset = jiffies;
Tejun Heo932648b2008-05-19 01:15:06 +09002610 if (reset == hardreset)
2611 ehc->i.flags |= ATA_EHI_DID_HARDRESET;
2612 else
2613 ehc->i.flags |= ATA_EHI_DID_SOFTRESET;
Tejun Heo022bdb02006-05-15 20:58:22 +09002614
Tejun Heob1c72912008-07-31 17:02:43 +09002615 rc = ata_do_reset(link, reset, classes, deadline, true);
2616 if (rc && rc != -EAGAIN) {
2617 failed_link = link;
Tejun Heo5dbfc9c2008-07-31 16:08:02 +09002618 goto fail;
Tejun Heob1c72912008-07-31 17:02:43 +09002619 }
Tejun Heo022bdb02006-05-15 20:58:22 +09002620
Tejun Heob1c72912008-07-31 17:02:43 +09002621 /* hardreset slave link if existent */
2622 if (slave && reset == hardreset) {
2623 int tmp;
2624
2625 if (verbose)
2626 ata_link_printk(slave, KERN_INFO,
2627 "hard resetting link\n");
2628
2629 ata_eh_about_to_do(slave, NULL, ATA_EH_RESET);
2630 tmp = ata_do_reset(slave, reset, classes, deadline,
2631 false);
2632 switch (tmp) {
2633 case -EAGAIN:
2634 rc = -EAGAIN;
2635 case 0:
2636 break;
2637 default:
2638 failed_link = slave;
2639 rc = tmp;
2640 goto fail;
2641 }
2642 }
2643
2644 /* perform follow-up SRST if necessary */
Tejun Heo932648b2008-05-19 01:15:06 +09002645 if (reset == hardreset &&
Tejun Heo5dbfc9c2008-07-31 16:08:02 +09002646 ata_eh_followup_srst_needed(link, rc, classes)) {
Tejun Heo932648b2008-05-19 01:15:06 +09002647 reset = softreset;
Tejun Heo664faf02006-05-31 18:27:50 +09002648
Tejun Heo932648b2008-05-19 01:15:06 +09002649 if (!reset) {
2650 ata_link_printk(link, KERN_ERR,
2651 "follow-up softreset required "
2652 "but no softreset avaliable\n");
Tejun Heob1c72912008-07-31 17:02:43 +09002653 failed_link = link;
Tejun Heo932648b2008-05-19 01:15:06 +09002654 rc = -EINVAL;
2655 goto fail;
2656 }
2657
2658 ata_eh_about_to_do(link, NULL, ATA_EH_RESET);
Tejun Heob1c72912008-07-31 17:02:43 +09002659 rc = ata_do_reset(link, reset, classes, deadline, true);
Tejun Heofe2c4d02009-07-08 12:16:37 +09002660 if (rc) {
2661 failed_link = link;
2662 goto fail;
2663 }
Tejun Heo664faf02006-05-31 18:27:50 +09002664 }
Tejun Heo932648b2008-05-19 01:15:06 +09002665 } else {
2666 if (verbose)
2667 ata_link_printk(link, KERN_INFO, "no reset method "
2668 "available, skipping reset\n");
2669 if (!(lflags & ATA_LFLAG_ASSUME_CLASS))
2670 lflags |= ATA_LFLAG_ASSUME_ATA;
Tejun Heo664faf02006-05-31 18:27:50 +09002671 }
2672
Tejun Heo932648b2008-05-19 01:15:06 +09002673 /*
2674 * Post-reset processing
2675 */
Tejun Heo1eca4362008-11-03 20:03:17 +09002676 ata_for_each_dev(dev, link, ALL) {
Tejun Heo416dc9e2007-10-31 10:17:03 +09002677 /* After the reset, the device state is PIO 0 and the
2678 * controller state is undefined. Reset also wakes up
2679 * drives from sleeping mode.
2680 */
2681 dev->pio_mode = XFER_PIO_0;
2682 dev->flags &= ~ATA_DFLAG_SLEEPING;
Tejun Heo664faf02006-05-31 18:27:50 +09002683
Tejun Heo3b761d32009-10-06 17:08:40 +09002684 if (ata_phys_link_offline(ata_dev_phys_link(dev)))
2685 continue;
2686
2687 /* apply class override */
2688 if (lflags & ATA_LFLAG_ASSUME_ATA)
2689 classes[dev->devno] = ATA_DEV_ATA;
2690 else if (lflags & ATA_LFLAG_ASSUME_SEMB)
2691 classes[dev->devno] = ATA_DEV_SEMB_UNSUP;
Tejun Heo022bdb02006-05-15 20:58:22 +09002692 }
2693
Tejun Heo416dc9e2007-10-31 10:17:03 +09002694 /* record current link speed */
2695 if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0)
2696 link->sata_spd = (sstatus >> 4) & 0xf;
Tejun Heob1c72912008-07-31 17:02:43 +09002697 if (slave && sata_scr_read(slave, SCR_STATUS, &sstatus) == 0)
2698 slave->sata_spd = (sstatus >> 4) & 0xf;
Tejun Heo008a7892007-07-16 14:29:40 +09002699
Tejun Heodc98c322008-05-19 01:15:07 +09002700 /* thaw the port */
2701 if (ata_is_host_link(link))
2702 ata_eh_thaw_port(ap);
2703
Tejun Heof0465192008-05-19 01:15:08 +09002704 /* postreset() should clear hardware SError. Although SError
2705 * is cleared during link resume, clearing SError here is
2706 * necessary as some PHYs raise hotplug events after SRST.
2707 * This introduces race condition where hotplug occurs between
2708 * reset and here. This race is mediated by cross checking
2709 * link onlineness and classification result later.
2710 */
Tejun Heob1c72912008-07-31 17:02:43 +09002711 if (postreset) {
Tejun Heo416dc9e2007-10-31 10:17:03 +09002712 postreset(link, classes);
Tejun Heob1c72912008-07-31 17:02:43 +09002713 if (slave)
2714 postreset(slave, classes);
2715 }
Tejun Heo20952b62006-05-31 18:27:23 +09002716
Tejun Heo1e641062009-07-17 11:58:33 +09002717 /*
2718 * Some controllers can't be frozen very well and may set
2719 * spuruious error conditions during reset. Clear accumulated
2720 * error information. As reset is the final recovery action,
2721 * nothing is lost by doing this.
2722 */
Tejun Heof0465192008-05-19 01:15:08 +09002723 spin_lock_irqsave(link->ap->lock, flags);
Tejun Heo1e641062009-07-17 11:58:33 +09002724 memset(&link->eh_info, 0, sizeof(link->eh_info));
Tejun Heob1c72912008-07-31 17:02:43 +09002725 if (slave)
Tejun Heo1e641062009-07-17 11:58:33 +09002726 memset(&slave->eh_info, 0, sizeof(link->eh_info));
2727 ap->pflags &= ~ATA_PFLAG_EH_PENDING;
Tejun Heof0465192008-05-19 01:15:08 +09002728 spin_unlock_irqrestore(link->ap->lock, flags);
2729
Tejun Heo3b761d32009-10-06 17:08:40 +09002730 /*
2731 * Make sure onlineness and classification result correspond.
Tejun Heof0465192008-05-19 01:15:08 +09002732 * Hotplug could have happened during reset and some
2733 * controllers fail to wait while a drive is spinning up after
2734 * being hotplugged causing misdetection. By cross checking
Tejun Heo3b761d32009-10-06 17:08:40 +09002735 * link on/offlineness and classification result, those
2736 * conditions can be reliably detected and retried.
Tejun Heof0465192008-05-19 01:15:08 +09002737 */
Tejun Heob1c72912008-07-31 17:02:43 +09002738 nr_unknown = 0;
Tejun Heo1eca4362008-11-03 20:03:17 +09002739 ata_for_each_dev(dev, link, ALL) {
Tejun Heo3b761d32009-10-06 17:08:40 +09002740 if (ata_phys_link_online(ata_dev_phys_link(dev))) {
2741 if (classes[dev->devno] == ATA_DEV_UNKNOWN) {
2742 ata_dev_printk(dev, KERN_DEBUG, "link online "
2743 "but device misclassifed\n");
2744 classes[dev->devno] = ATA_DEV_NONE;
Tejun Heob1c72912008-07-31 17:02:43 +09002745 nr_unknown++;
Tejun Heo3b761d32009-10-06 17:08:40 +09002746 }
2747 } else if (ata_phys_link_offline(ata_dev_phys_link(dev))) {
2748 if (ata_class_enabled(classes[dev->devno]))
2749 ata_dev_printk(dev, KERN_DEBUG, "link offline, "
2750 "clearing class %d to NONE\n",
2751 classes[dev->devno]);
2752 classes[dev->devno] = ATA_DEV_NONE;
2753 } else if (classes[dev->devno] == ATA_DEV_UNKNOWN) {
2754 ata_dev_printk(dev, KERN_DEBUG, "link status unknown, "
2755 "clearing UNKNOWN to NONE\n");
2756 classes[dev->devno] = ATA_DEV_NONE;
Tejun Heob1c72912008-07-31 17:02:43 +09002757 }
Tejun Heof0465192008-05-19 01:15:08 +09002758 }
2759
Tejun Heob1c72912008-07-31 17:02:43 +09002760 if (classify && nr_unknown) {
Tejun Heof0465192008-05-19 01:15:08 +09002761 if (try < max_tries) {
2762 ata_link_printk(link, KERN_WARNING, "link online but "
Tejun Heo3b761d32009-10-06 17:08:40 +09002763 "%d devices misclassified, retrying\n",
2764 nr_unknown);
Tejun Heob1c72912008-07-31 17:02:43 +09002765 failed_link = link;
Tejun Heof0465192008-05-19 01:15:08 +09002766 rc = -EAGAIN;
2767 goto fail;
2768 }
2769 ata_link_printk(link, KERN_WARNING,
Tejun Heo3b761d32009-10-06 17:08:40 +09002770 "link online but %d devices misclassified, "
2771 "device detection might fail\n", nr_unknown);
Tejun Heof0465192008-05-19 01:15:08 +09002772 }
2773
Tejun Heo416dc9e2007-10-31 10:17:03 +09002774 /* reset successful, schedule revalidation */
Tejun Heocf480622008-01-24 00:05:14 +09002775 ata_eh_done(link, NULL, ATA_EH_RESET);
Tejun Heob1c72912008-07-31 17:02:43 +09002776 if (slave)
2777 ata_eh_done(slave, NULL, ATA_EH_RESET);
Tejun Heo19b72322008-11-04 17:08:40 +09002778 ehc->last_reset = jiffies; /* update to completion time */
Tejun Heo416dc9e2007-10-31 10:17:03 +09002779 ehc->i.action |= ATA_EH_REVALIDATE;
Tejun Heoae791c02007-09-23 13:14:12 +09002780
Tejun Heo416dc9e2007-10-31 10:17:03 +09002781 rc = 0;
Tejun Heofccb6ea2007-07-16 14:29:41 +09002782 out:
2783 /* clear hotplug flag */
2784 ehc->i.flags &= ~ATA_EHI_HOTPLUGGED;
Tejun Heob1c72912008-07-31 17:02:43 +09002785 if (slave)
2786 sehc->i.flags &= ~ATA_EHI_HOTPLUGGED;
Tejun Heoafaa5c32007-10-09 15:06:10 +09002787
2788 spin_lock_irqsave(ap->lock, flags);
2789 ap->pflags &= ~ATA_PFLAG_RESETTING;
2790 spin_unlock_irqrestore(ap->lock, flags);
2791
Tejun Heo022bdb02006-05-15 20:58:22 +09002792 return rc;
Tejun Heo416dc9e2007-10-31 10:17:03 +09002793
2794 fail:
Tejun Heo5958e302008-04-07 22:47:20 +09002795 /* if SCR isn't accessible on a fan-out port, PMP needs to be reset */
2796 if (!ata_is_host_link(link) &&
2797 sata_scr_read(link, SCR_STATUS, &sstatus))
2798 rc = -ERESTART;
2799
Tejun Heo416dc9e2007-10-31 10:17:03 +09002800 if (rc == -ERESTART || try >= max_tries)
2801 goto out;
2802
2803 now = jiffies;
2804 if (time_before(now, deadline)) {
2805 unsigned long delta = deadline - now;
2806
Tejun Heob1c72912008-07-31 17:02:43 +09002807 ata_link_printk(failed_link, KERN_WARNING,
Tejun Heo0a2c0f52008-05-20 02:17:52 +09002808 "reset failed (errno=%d), retrying in %u secs\n",
2809 rc, DIV_ROUND_UP(jiffies_to_msecs(delta), 1000));
Tejun Heo416dc9e2007-10-31 10:17:03 +09002810
2811 while (delta)
2812 delta = schedule_timeout_uninterruptible(delta);
2813 }
2814
Tejun Heob1c72912008-07-31 17:02:43 +09002815 if (try == max_tries - 1) {
Tejun Heoa07d4992009-01-29 20:31:33 +09002816 sata_down_spd_limit(link, 0);
Tejun Heob1c72912008-07-31 17:02:43 +09002817 if (slave)
Tejun Heoa07d4992009-01-29 20:31:33 +09002818 sata_down_spd_limit(slave, 0);
Tejun Heob1c72912008-07-31 17:02:43 +09002819 } else if (rc == -EPIPE)
Tejun Heoa07d4992009-01-29 20:31:33 +09002820 sata_down_spd_limit(failed_link, 0);
Tejun Heob1c72912008-07-31 17:02:43 +09002821
Tejun Heo416dc9e2007-10-31 10:17:03 +09002822 if (hardreset)
2823 reset = hardreset;
2824 goto retry;
Tejun Heo022bdb02006-05-15 20:58:22 +09002825}
2826
Elias Oltmanns45fabbb2008-09-21 11:54:08 +02002827static inline void ata_eh_pull_park_action(struct ata_port *ap)
2828{
2829 struct ata_link *link;
2830 struct ata_device *dev;
2831 unsigned long flags;
2832
2833 /*
2834 * This function can be thought of as an extended version of
2835 * ata_eh_about_to_do() specially crafted to accommodate the
2836 * requirements of ATA_EH_PARK handling. Since the EH thread
2837 * does not leave the do {} while () loop in ata_eh_recover as
2838 * long as the timeout for a park request to *one* device on
2839 * the port has not expired, and since we still want to pick
2840 * up park requests to other devices on the same port or
2841 * timeout updates for the same device, we have to pull
2842 * ATA_EH_PARK actions from eh_info into eh_context.i
2843 * ourselves at the beginning of each pass over the loop.
2844 *
2845 * Additionally, all write accesses to &ap->park_req_pending
2846 * through INIT_COMPLETION() (see below) or complete_all()
2847 * (see ata_scsi_park_store()) are protected by the host lock.
2848 * As a result we have that park_req_pending.done is zero on
2849 * exit from this function, i.e. when ATA_EH_PARK actions for
2850 * *all* devices on port ap have been pulled into the
2851 * respective eh_context structs. If, and only if,
2852 * park_req_pending.done is non-zero by the time we reach
2853 * wait_for_completion_timeout(), another ATA_EH_PARK action
2854 * has been scheduled for at least one of the devices on port
2855 * ap and we have to cycle over the do {} while () loop in
2856 * ata_eh_recover() again.
2857 */
2858
2859 spin_lock_irqsave(ap->lock, flags);
2860 INIT_COMPLETION(ap->park_req_pending);
Tejun Heo1eca4362008-11-03 20:03:17 +09002861 ata_for_each_link(link, ap, EDGE) {
2862 ata_for_each_dev(dev, link, ALL) {
Elias Oltmanns45fabbb2008-09-21 11:54:08 +02002863 struct ata_eh_info *ehi = &link->eh_info;
2864
2865 link->eh_context.i.dev_action[dev->devno] |=
2866 ehi->dev_action[dev->devno] & ATA_EH_PARK;
2867 ata_eh_clear_action(link, dev, ehi, ATA_EH_PARK);
2868 }
2869 }
2870 spin_unlock_irqrestore(ap->lock, flags);
2871}
2872
2873static void ata_eh_park_issue_cmd(struct ata_device *dev, int park)
2874{
2875 struct ata_eh_context *ehc = &dev->link->eh_context;
2876 struct ata_taskfile tf;
2877 unsigned int err_mask;
2878
2879 ata_tf_init(dev, &tf);
2880 if (park) {
2881 ehc->unloaded_mask |= 1 << dev->devno;
2882 tf.command = ATA_CMD_IDLEIMMEDIATE;
2883 tf.feature = 0x44;
2884 tf.lbal = 0x4c;
2885 tf.lbam = 0x4e;
2886 tf.lbah = 0x55;
2887 } else {
2888 ehc->unloaded_mask &= ~(1 << dev->devno);
2889 tf.command = ATA_CMD_CHK_POWER;
2890 }
2891
2892 tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR;
2893 tf.protocol |= ATA_PROT_NODATA;
2894 err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0);
2895 if (park && (err_mask || tf.lbal != 0xc4)) {
2896 ata_dev_printk(dev, KERN_ERR, "head unload failed!\n");
2897 ehc->unloaded_mask &= ~(1 << dev->devno);
2898 }
2899}
2900
Tejun Heo02607312007-08-06 18:36:23 +09002901static int ata_eh_revalidate_and_attach(struct ata_link *link,
Tejun Heo084fe632006-05-31 18:28:03 +09002902 struct ata_device **r_failed_dev)
Tejun Heo022bdb02006-05-15 20:58:22 +09002903{
Tejun Heo02607312007-08-06 18:36:23 +09002904 struct ata_port *ap = link->ap;
2905 struct ata_eh_context *ehc = &link->eh_context;
Tejun Heo022bdb02006-05-15 20:58:22 +09002906 struct ata_device *dev;
Tejun Heo8c3c52a2007-03-22 22:24:19 +09002907 unsigned int new_mask = 0;
Tejun Heo084fe632006-05-31 18:28:03 +09002908 unsigned long flags;
Tejun Heof58229f2007-08-06 18:36:23 +09002909 int rc = 0;
Tejun Heo022bdb02006-05-15 20:58:22 +09002910
2911 DPRINTK("ENTER\n");
2912
Tejun Heo8c3c52a2007-03-22 22:24:19 +09002913 /* For PATA drive side cable detection to work, IDENTIFY must
2914 * be done backwards such that PDIAG- is released by the slave
2915 * device before the master device is identified.
2916 */
Tejun Heo1eca4362008-11-03 20:03:17 +09002917 ata_for_each_dev(dev, link, ALL_REVERSE) {
Tejun Heof58229f2007-08-06 18:36:23 +09002918 unsigned int action = ata_eh_dev_action(dev);
2919 unsigned int readid_flags = 0;
Tejun Heo47005f22006-06-19 18:27:23 +09002920
Tejun Heobff04642006-11-10 18:08:10 +09002921 if (ehc->i.flags & ATA_EHI_DID_RESET)
2922 readid_flags |= ATA_READID_POSTRESET;
2923
Tejun Heo9666f402007-05-04 21:27:47 +02002924 if ((action & ATA_EH_REVALIDATE) && ata_dev_enabled(dev)) {
Tejun Heo633273a2007-09-23 13:19:54 +09002925 WARN_ON(dev->class == ATA_DEV_PMP);
2926
Tejun Heob1c72912008-07-31 17:02:43 +09002927 if (ata_phys_link_offline(ata_dev_phys_link(dev))) {
Tejun Heo022bdb02006-05-15 20:58:22 +09002928 rc = -EIO;
Tejun Heo8c3c52a2007-03-22 22:24:19 +09002929 goto err;
Tejun Heo022bdb02006-05-15 20:58:22 +09002930 }
2931
Tejun Heo02607312007-08-06 18:36:23 +09002932 ata_eh_about_to_do(link, dev, ATA_EH_REVALIDATE);
Tejun Heo422c9da2007-09-23 13:14:12 +09002933 rc = ata_dev_revalidate(dev, ehc->classes[dev->devno],
2934 readid_flags);
Tejun Heo022bdb02006-05-15 20:58:22 +09002935 if (rc)
Tejun Heo8c3c52a2007-03-22 22:24:19 +09002936 goto err;
Tejun Heo022bdb02006-05-15 20:58:22 +09002937
Tejun Heo02607312007-08-06 18:36:23 +09002938 ata_eh_done(link, dev, ATA_EH_REVALIDATE);
Tejun Heo47005f22006-06-19 18:27:23 +09002939
Tejun Heobaa1e782006-11-01 18:39:27 +09002940 /* Configuration may have changed, reconfigure
2941 * transfer mode.
2942 */
2943 ehc->i.flags |= ATA_EHI_SETMODE;
2944
zhao, forrest3057ac32006-06-12 12:01:34 +08002945 /* schedule the scsi_rescan_device() here */
2946 queue_work(ata_aux_wq, &(ap->scsi_rescan_task));
Tejun Heo084fe632006-05-31 18:28:03 +09002947 } else if (dev->class == ATA_DEV_UNKNOWN &&
2948 ehc->tries[dev->devno] &&
2949 ata_class_enabled(ehc->classes[dev->devno])) {
Tejun Heo842faa62009-05-10 01:06:54 +09002950 /* Temporarily set dev->class, it will be
2951 * permanently set once all configurations are
2952 * complete. This is necessary because new
2953 * device configuration is done in two
2954 * separate loops.
2955 */
Tejun Heo084fe632006-05-31 18:28:03 +09002956 dev->class = ehc->classes[dev->devno];
2957
Tejun Heo633273a2007-09-23 13:19:54 +09002958 if (dev->class == ATA_DEV_PMP)
2959 rc = sata_pmp_attach(dev);
2960 else
2961 rc = ata_dev_read_id(dev, &dev->class,
2962 readid_flags, dev->id);
Tejun Heo842faa62009-05-10 01:06:54 +09002963
2964 /* read_id might have changed class, store and reset */
2965 ehc->classes[dev->devno] = dev->class;
2966 dev->class = ATA_DEV_UNKNOWN;
2967
Tejun Heo8c3c52a2007-03-22 22:24:19 +09002968 switch (rc) {
2969 case 0:
Tejun Heo99cf6102009-01-29 20:31:32 +09002970 /* clear error info accumulated during probe */
2971 ata_ering_clear(&dev->ering);
Tejun Heof58229f2007-08-06 18:36:23 +09002972 new_mask |= 1 << dev->devno;
Tejun Heo8c3c52a2007-03-22 22:24:19 +09002973 break;
2974 case -ENOENT:
Tejun Heo55a8e2c2006-11-10 18:08:10 +09002975 /* IDENTIFY was issued to non-existent
2976 * device. No need to reset. Just
Tejun Heo842faa62009-05-10 01:06:54 +09002977 * thaw and ignore the device.
Tejun Heo55a8e2c2006-11-10 18:08:10 +09002978 */
2979 ata_eh_thaw_port(ap);
Tejun Heo084fe632006-05-31 18:28:03 +09002980 break;
Tejun Heo8c3c52a2007-03-22 22:24:19 +09002981 default:
Tejun Heo8c3c52a2007-03-22 22:24:19 +09002982 goto err;
Tejun Heo55a8e2c2006-11-10 18:08:10 +09002983 }
Tejun Heo022bdb02006-05-15 20:58:22 +09002984 }
2985 }
2986
Tejun Heoc1c4e8d2007-04-23 02:05:53 +09002987 /* PDIAG- should have been released, ask cable type if post-reset */
Tejun Heo33267322008-02-13 09:15:09 +09002988 if ((ehc->i.flags & ATA_EHI_DID_RESET) && ata_is_host_link(link)) {
2989 if (ap->ops->cable_detect)
2990 ap->cbl = ap->ops->cable_detect(ap);
2991 ata_force_cbl(ap);
2992 }
Tejun Heoc1c4e8d2007-04-23 02:05:53 +09002993
Tejun Heo8c3c52a2007-03-22 22:24:19 +09002994 /* Configure new devices forward such that user doesn't see
2995 * device detection messages backwards.
2996 */
Tejun Heo1eca4362008-11-03 20:03:17 +09002997 ata_for_each_dev(dev, link, ALL) {
Tejun Heo4f7c2872009-10-15 23:37:32 +09002998 if (!(new_mask & (1 << dev->devno)))
Tejun Heo8c3c52a2007-03-22 22:24:19 +09002999 continue;
3000
Tejun Heo842faa62009-05-10 01:06:54 +09003001 dev->class = ehc->classes[dev->devno];
3002
Tejun Heo4f7c2872009-10-15 23:37:32 +09003003 if (dev->class == ATA_DEV_PMP)
3004 continue;
3005
Tejun Heo8c3c52a2007-03-22 22:24:19 +09003006 ehc->i.flags |= ATA_EHI_PRINTINFO;
3007 rc = ata_dev_configure(dev);
3008 ehc->i.flags &= ~ATA_EHI_PRINTINFO;
Tejun Heo842faa62009-05-10 01:06:54 +09003009 if (rc) {
3010 dev->class = ATA_DEV_UNKNOWN;
Tejun Heo8c3c52a2007-03-22 22:24:19 +09003011 goto err;
Tejun Heo842faa62009-05-10 01:06:54 +09003012 }
Tejun Heo8c3c52a2007-03-22 22:24:19 +09003013
3014 spin_lock_irqsave(ap->lock, flags);
3015 ap->pflags |= ATA_PFLAG_SCSI_HOTPLUG;
3016 spin_unlock_irqrestore(ap->lock, flags);
3017
3018 /* new device discovered, configure xfermode */
3019 ehc->i.flags |= ATA_EHI_SETMODE;
3020 }
3021
3022 return 0;
3023
3024 err:
3025 *r_failed_dev = dev;
3026 DPRINTK("EXIT rc=%d\n", rc);
Tejun Heo022bdb02006-05-15 20:58:22 +09003027 return rc;
3028}
3029
Tejun Heo6f1d1e32007-11-27 19:28:55 +09003030/**
3031 * ata_set_mode - Program timings and issue SET FEATURES - XFER
3032 * @link: link on which timings will be programmed
Martin Olsson98a17082009-04-22 18:21:29 +02003033 * @r_failed_dev: out parameter for failed device
Tejun Heo6f1d1e32007-11-27 19:28:55 +09003034 *
3035 * Set ATA device disk transfer mode (PIO3, UDMA6, etc.). If
3036 * ata_set_mode() fails, pointer to the failing device is
3037 * returned in @r_failed_dev.
3038 *
3039 * LOCKING:
3040 * PCI/etc. bus probe sem.
3041 *
3042 * RETURNS:
3043 * 0 on success, negative errno otherwise
3044 */
3045int ata_set_mode(struct ata_link *link, struct ata_device **r_failed_dev)
3046{
3047 struct ata_port *ap = link->ap;
Tejun Heo00115e02007-11-27 19:28:58 +09003048 struct ata_device *dev;
3049 int rc;
Tejun Heo6f1d1e32007-11-27 19:28:55 +09003050
Tejun Heo76326ac2007-11-27 19:28:59 +09003051 /* if data transfer is verified, clear DUBIOUS_XFER on ering top */
Tejun Heo1eca4362008-11-03 20:03:17 +09003052 ata_for_each_dev(dev, link, ENABLED) {
Tejun Heo76326ac2007-11-27 19:28:59 +09003053 if (!(dev->flags & ATA_DFLAG_DUBIOUS_XFER)) {
3054 struct ata_ering_entry *ent;
3055
3056 ent = ata_ering_top(&dev->ering);
3057 if (ent)
3058 ent->eflags &= ~ATA_EFLAG_DUBIOUS_XFER;
3059 }
3060 }
3061
Tejun Heo6f1d1e32007-11-27 19:28:55 +09003062 /* has private set_mode? */
3063 if (ap->ops->set_mode)
Tejun Heo00115e02007-11-27 19:28:58 +09003064 rc = ap->ops->set_mode(link, r_failed_dev);
3065 else
3066 rc = ata_do_set_mode(link, r_failed_dev);
3067
3068 /* if transfer mode has changed, set DUBIOUS_XFER on device */
Tejun Heo1eca4362008-11-03 20:03:17 +09003069 ata_for_each_dev(dev, link, ENABLED) {
Tejun Heo00115e02007-11-27 19:28:58 +09003070 struct ata_eh_context *ehc = &link->eh_context;
3071 u8 saved_xfer_mode = ehc->saved_xfer_mode[dev->devno];
3072 u8 saved_ncq = !!(ehc->saved_ncq_enabled & (1 << dev->devno));
3073
3074 if (dev->xfer_mode != saved_xfer_mode ||
3075 ata_ncq_enabled(dev) != saved_ncq)
3076 dev->flags |= ATA_DFLAG_DUBIOUS_XFER;
3077 }
3078
3079 return rc;
Tejun Heo6f1d1e32007-11-27 19:28:55 +09003080}
3081
Tejun Heo11fc33d2008-08-30 14:20:01 +02003082/**
3083 * atapi_eh_clear_ua - Clear ATAPI UNIT ATTENTION after reset
3084 * @dev: ATAPI device to clear UA for
3085 *
3086 * Resets and other operations can make an ATAPI device raise
3087 * UNIT ATTENTION which causes the next operation to fail. This
3088 * function clears UA.
3089 *
3090 * LOCKING:
3091 * EH context (may sleep).
3092 *
3093 * RETURNS:
3094 * 0 on success, -errno on failure.
3095 */
3096static int atapi_eh_clear_ua(struct ata_device *dev)
3097{
3098 int i;
3099
3100 for (i = 0; i < ATA_EH_UA_TRIES; i++) {
Tejun Heob5357082009-03-02 18:55:16 +09003101 u8 *sense_buffer = dev->link->ap->sector_buf;
Tejun Heo11fc33d2008-08-30 14:20:01 +02003102 u8 sense_key = 0;
3103 unsigned int err_mask;
3104
3105 err_mask = atapi_eh_tur(dev, &sense_key);
3106 if (err_mask != 0 && err_mask != AC_ERR_DEV) {
3107 ata_dev_printk(dev, KERN_WARNING, "TEST_UNIT_READY "
3108 "failed (err_mask=0x%x)\n", err_mask);
3109 return -EIO;
3110 }
3111
3112 if (!err_mask || sense_key != UNIT_ATTENTION)
3113 return 0;
3114
3115 err_mask = atapi_eh_request_sense(dev, sense_buffer, sense_key);
3116 if (err_mask) {
3117 ata_dev_printk(dev, KERN_WARNING, "failed to clear "
3118 "UNIT ATTENTION (err_mask=0x%x)\n", err_mask);
3119 return -EIO;
3120 }
3121 }
3122
3123 ata_dev_printk(dev, KERN_WARNING,
3124 "UNIT ATTENTION persists after %d tries\n", ATA_EH_UA_TRIES);
3125
3126 return 0;
3127}
3128
Tejun Heo6013efd2009-11-19 15:36:45 +09003129/**
3130 * ata_eh_maybe_retry_flush - Retry FLUSH if necessary
3131 * @dev: ATA device which may need FLUSH retry
3132 *
3133 * If @dev failed FLUSH, it needs to be reported upper layer
3134 * immediately as it means that @dev failed to remap and already
3135 * lost at least a sector and further FLUSH retrials won't make
3136 * any difference to the lost sector. However, if FLUSH failed
3137 * for other reasons, for example transmission error, FLUSH needs
3138 * to be retried.
3139 *
3140 * This function determines whether FLUSH failure retry is
3141 * necessary and performs it if so.
3142 *
3143 * RETURNS:
3144 * 0 if EH can continue, -errno if EH needs to be repeated.
3145 */
3146static int ata_eh_maybe_retry_flush(struct ata_device *dev)
3147{
3148 struct ata_link *link = dev->link;
3149 struct ata_port *ap = link->ap;
3150 struct ata_queued_cmd *qc;
3151 struct ata_taskfile tf;
3152 unsigned int err_mask;
3153 int rc = 0;
3154
3155 /* did flush fail for this device? */
3156 if (!ata_tag_valid(link->active_tag))
3157 return 0;
3158
3159 qc = __ata_qc_from_tag(ap, link->active_tag);
3160 if (qc->dev != dev || (qc->tf.command != ATA_CMD_FLUSH_EXT &&
3161 qc->tf.command != ATA_CMD_FLUSH))
3162 return 0;
3163
3164 /* if the device failed it, it should be reported to upper layers */
3165 if (qc->err_mask & AC_ERR_DEV)
3166 return 0;
3167
3168 /* flush failed for some other reason, give it another shot */
3169 ata_tf_init(dev, &tf);
3170
3171 tf.command = qc->tf.command;
3172 tf.flags |= ATA_TFLAG_DEVICE;
3173 tf.protocol = ATA_PROT_NODATA;
3174
3175 ata_dev_printk(dev, KERN_WARNING, "retrying FLUSH 0x%x Emask 0x%x\n",
3176 tf.command, qc->err_mask);
3177
3178 err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0);
3179 if (!err_mask) {
3180 /*
3181 * FLUSH is complete but there's no way to
3182 * successfully complete a failed command from EH.
3183 * Making sure retry is allowed at least once and
3184 * retrying it should do the trick - whatever was in
3185 * the cache is already on the platter and this won't
3186 * cause infinite loop.
3187 */
3188 qc->scsicmd->allowed = max(qc->scsicmd->allowed, 1);
3189 } else {
3190 ata_dev_printk(dev, KERN_WARNING, "FLUSH failed Emask 0x%x\n",
3191 err_mask);
3192 rc = -EIO;
3193
3194 /* if device failed it, report it to upper layers */
3195 if (err_mask & AC_ERR_DEV) {
3196 qc->err_mask |= AC_ERR_DEV;
3197 qc->result_tf = tf;
3198 if (!(ap->pflags & ATA_PFLAG_FROZEN))
3199 rc = 0;
3200 }
3201 }
3202 return rc;
3203}
3204
Tejun Heo02607312007-08-06 18:36:23 +09003205static int ata_link_nr_enabled(struct ata_link *link)
Tejun Heo022bdb02006-05-15 20:58:22 +09003206{
Tejun Heof58229f2007-08-06 18:36:23 +09003207 struct ata_device *dev;
3208 int cnt = 0;
Tejun Heo022bdb02006-05-15 20:58:22 +09003209
Tejun Heo1eca4362008-11-03 20:03:17 +09003210 ata_for_each_dev(dev, link, ENABLED)
3211 cnt++;
Tejun Heo022bdb02006-05-15 20:58:22 +09003212 return cnt;
3213}
3214
Tejun Heo02607312007-08-06 18:36:23 +09003215static int ata_link_nr_vacant(struct ata_link *link)
Tejun Heo084fe632006-05-31 18:28:03 +09003216{
Tejun Heof58229f2007-08-06 18:36:23 +09003217 struct ata_device *dev;
3218 int cnt = 0;
Tejun Heo084fe632006-05-31 18:28:03 +09003219
Tejun Heo1eca4362008-11-03 20:03:17 +09003220 ata_for_each_dev(dev, link, ALL)
Tejun Heof58229f2007-08-06 18:36:23 +09003221 if (dev->class == ATA_DEV_UNKNOWN)
Tejun Heo084fe632006-05-31 18:28:03 +09003222 cnt++;
3223 return cnt;
3224}
3225
Tejun Heo02607312007-08-06 18:36:23 +09003226static int ata_eh_skip_recovery(struct ata_link *link)
Tejun Heo084fe632006-05-31 18:28:03 +09003227{
Tejun Heo672b2d62008-01-24 00:05:14 +09003228 struct ata_port *ap = link->ap;
Tejun Heo02607312007-08-06 18:36:23 +09003229 struct ata_eh_context *ehc = &link->eh_context;
Tejun Heof58229f2007-08-06 18:36:23 +09003230 struct ata_device *dev;
Tejun Heo084fe632006-05-31 18:28:03 +09003231
Tejun Heof9df58c2007-09-23 13:14:13 +09003232 /* skip disabled links */
3233 if (link->flags & ATA_LFLAG_DISABLED)
3234 return 1;
3235
Tejun Heo672b2d62008-01-24 00:05:14 +09003236 /* thaw frozen port and recover failed devices */
3237 if ((ap->pflags & ATA_PFLAG_FROZEN) || ata_link_nr_enabled(link))
3238 return 0;
3239
3240 /* reset at least once if reset is requested */
3241 if ((ehc->i.action & ATA_EH_RESET) &&
3242 !(ehc->i.flags & ATA_EHI_DID_RESET))
Tejun Heo084fe632006-05-31 18:28:03 +09003243 return 0;
3244
3245 /* skip if class codes for all vacant slots are ATA_DEV_NONE */
Tejun Heo1eca4362008-11-03 20:03:17 +09003246 ata_for_each_dev(dev, link, ALL) {
Tejun Heo084fe632006-05-31 18:28:03 +09003247 if (dev->class == ATA_DEV_UNKNOWN &&
3248 ehc->classes[dev->devno] != ATA_DEV_NONE)
3249 return 0;
3250 }
3251
3252 return 1;
3253}
3254
Tejun Heoc2c7a892009-01-29 20:31:34 +09003255static int ata_count_probe_trials_cb(struct ata_ering_entry *ent, void *void_arg)
3256{
3257 u64 interval = msecs_to_jiffies(ATA_EH_PROBE_TRIAL_INTERVAL);
3258 u64 now = get_jiffies_64();
3259 int *trials = void_arg;
3260
3261 if (ent->timestamp < now - min(now, interval))
3262 return -1;
3263
3264 (*trials)++;
3265 return 0;
3266}
3267
Tejun Heo02c05a22007-11-27 19:28:54 +09003268static int ata_eh_schedule_probe(struct ata_device *dev)
3269{
3270 struct ata_eh_context *ehc = &dev->link->eh_context;
Tejun Heoc2c7a892009-01-29 20:31:34 +09003271 struct ata_link *link = ata_dev_phys_link(dev);
3272 int trials = 0;
Tejun Heo02c05a22007-11-27 19:28:54 +09003273
3274 if (!(ehc->i.probe_mask & (1 << dev->devno)) ||
3275 (ehc->did_probe_mask & (1 << dev->devno)))
3276 return 0;
3277
3278 ata_eh_detach_dev(dev);
3279 ata_dev_init(dev);
3280 ehc->did_probe_mask |= (1 << dev->devno);
Tejun Heocf480622008-01-24 00:05:14 +09003281 ehc->i.action |= ATA_EH_RESET;
Tejun Heo00115e02007-11-27 19:28:58 +09003282 ehc->saved_xfer_mode[dev->devno] = 0;
3283 ehc->saved_ncq_enabled &= ~(1 << dev->devno);
Tejun Heo02c05a22007-11-27 19:28:54 +09003284
Tejun Heoc2c7a892009-01-29 20:31:34 +09003285 /* Record and count probe trials on the ering. The specific
3286 * error mask used is irrelevant. Because a successful device
3287 * detection clears the ering, this count accumulates only if
3288 * there are consecutive failed probes.
3289 *
3290 * If the count is equal to or higher than ATA_EH_PROBE_TRIALS
3291 * in the last ATA_EH_PROBE_TRIAL_INTERVAL, link speed is
3292 * forced to 1.5Gbps.
3293 *
3294 * This is to work around cases where failed link speed
3295 * negotiation results in device misdetection leading to
3296 * infinite DEVXCHG or PHRDY CHG events.
3297 */
3298 ata_ering_record(&dev->ering, 0, AC_ERR_OTHER);
3299 ata_ering_map(&dev->ering, ata_count_probe_trials_cb, &trials);
3300
3301 if (trials > ATA_EH_PROBE_TRIALS)
3302 sata_down_spd_limit(link, 1);
3303
Tejun Heo02c05a22007-11-27 19:28:54 +09003304 return 1;
3305}
3306
Tejun Heo9b1e2652007-08-06 18:36:24 +09003307static int ata_eh_handle_dev_fail(struct ata_device *dev, int err)
Tejun Heofee7ca72007-07-01 19:05:58 +09003308{
Tejun Heo9af5c9c2007-08-06 18:36:22 +09003309 struct ata_eh_context *ehc = &dev->link->eh_context;
Tejun Heofee7ca72007-07-01 19:05:58 +09003310
Tejun Heocf9a5902009-01-29 20:31:35 +09003311 /* -EAGAIN from EH routine indicates retry without prejudice.
3312 * The requester is responsible for ensuring forward progress.
3313 */
3314 if (err != -EAGAIN)
3315 ehc->tries[dev->devno]--;
Tejun Heofee7ca72007-07-01 19:05:58 +09003316
3317 switch (err) {
3318 case -ENODEV:
3319 /* device missing or wrong IDENTIFY data, schedule probing */
3320 ehc->i.probe_mask |= (1 << dev->devno);
3321 case -EINVAL:
3322 /* give it just one more chance */
3323 ehc->tries[dev->devno] = min(ehc->tries[dev->devno], 1);
3324 case -EIO:
Tejun Heod89293a2009-01-29 20:31:29 +09003325 if (ehc->tries[dev->devno] == 1) {
Tejun Heofee7ca72007-07-01 19:05:58 +09003326 /* This is the last chance, better to slow
3327 * down than lose it.
3328 */
Tejun Heoa07d4992009-01-29 20:31:33 +09003329 sata_down_spd_limit(ata_dev_phys_link(dev), 0);
Tejun Heod89293a2009-01-29 20:31:29 +09003330 if (dev->pio_mode > XFER_PIO_0)
3331 ata_down_xfermask_limit(dev, ATA_DNXFER_PIO);
Tejun Heofee7ca72007-07-01 19:05:58 +09003332 }
3333 }
3334
3335 if (ata_dev_enabled(dev) && !ehc->tries[dev->devno]) {
3336 /* disable device if it has used up all its chances */
3337 ata_dev_disable(dev);
3338
3339 /* detach if offline */
Tejun Heob1c72912008-07-31 17:02:43 +09003340 if (ata_phys_link_offline(ata_dev_phys_link(dev)))
Tejun Heofee7ca72007-07-01 19:05:58 +09003341 ata_eh_detach_dev(dev);
3342
Tejun Heo02c05a22007-11-27 19:28:54 +09003343 /* schedule probe if necessary */
Tejun Heo87fbc5a2008-05-20 02:17:54 +09003344 if (ata_eh_schedule_probe(dev)) {
Tejun Heofee7ca72007-07-01 19:05:58 +09003345 ehc->tries[dev->devno] = ATA_EH_DEV_TRIES;
Tejun Heo87fbc5a2008-05-20 02:17:54 +09003346 memset(ehc->cmd_timeout_idx[dev->devno], 0,
3347 sizeof(ehc->cmd_timeout_idx[dev->devno]));
3348 }
Tejun Heo9b1e2652007-08-06 18:36:24 +09003349
3350 return 1;
Tejun Heofee7ca72007-07-01 19:05:58 +09003351 } else {
Tejun Heocf480622008-01-24 00:05:14 +09003352 ehc->i.action |= ATA_EH_RESET;
Tejun Heo9b1e2652007-08-06 18:36:24 +09003353 return 0;
Tejun Heofee7ca72007-07-01 19:05:58 +09003354 }
3355}
3356
Tejun Heo022bdb02006-05-15 20:58:22 +09003357/**
3358 * ata_eh_recover - recover host port after error
3359 * @ap: host port to recover
Tejun Heof5914a42006-05-31 18:27:48 +09003360 * @prereset: prereset method (can be NULL)
Tejun Heo022bdb02006-05-15 20:58:22 +09003361 * @softreset: softreset method (can be NULL)
3362 * @hardreset: hardreset method (can be NULL)
3363 * @postreset: postreset method (can be NULL)
Tejun Heo9b1e2652007-08-06 18:36:24 +09003364 * @r_failed_link: out parameter for failed link
Tejun Heo022bdb02006-05-15 20:58:22 +09003365 *
3366 * This is the alpha and omega, eum and yang, heart and soul of
3367 * libata exception handling. On entry, actions required to
Tejun Heo9b1e2652007-08-06 18:36:24 +09003368 * recover each link and hotplug requests are recorded in the
3369 * link's eh_context. This function executes all the operations
3370 * with appropriate retrials and fallbacks to resurrect failed
Tejun Heo084fe632006-05-31 18:28:03 +09003371 * devices, detach goners and greet newcomers.
Tejun Heo022bdb02006-05-15 20:58:22 +09003372 *
3373 * LOCKING:
3374 * Kernel thread context (may sleep).
3375 *
3376 * RETURNS:
3377 * 0 on success, -errno on failure.
3378 */
Tejun Heofb7fd612007-09-23 13:14:12 +09003379int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
3380 ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
3381 ata_postreset_fn_t postreset,
3382 struct ata_link **r_failed_link)
Tejun Heo022bdb02006-05-15 20:58:22 +09003383{
Tejun Heo9b1e2652007-08-06 18:36:24 +09003384 struct ata_link *link;
Tejun Heo022bdb02006-05-15 20:58:22 +09003385 struct ata_device *dev;
Tejun Heo0a2c0f52008-05-20 02:17:52 +09003386 int nr_failed_devs;
Tejun Heodc98c322008-05-19 01:15:07 +09003387 int rc;
Elias Oltmanns45fabbb2008-09-21 11:54:08 +02003388 unsigned long flags, deadline;
Tejun Heo022bdb02006-05-15 20:58:22 +09003389
3390 DPRINTK("ENTER\n");
3391
3392 /* prep for recovery */
Tejun Heo1eca4362008-11-03 20:03:17 +09003393 ata_for_each_link(link, ap, EDGE) {
Tejun Heo9b1e2652007-08-06 18:36:24 +09003394 struct ata_eh_context *ehc = &link->eh_context;
Tejun Heo084fe632006-05-31 18:28:03 +09003395
Tejun Heof9df58c2007-09-23 13:14:13 +09003396 /* re-enable link? */
3397 if (ehc->i.action & ATA_EH_ENABLE_LINK) {
3398 ata_eh_about_to_do(link, NULL, ATA_EH_ENABLE_LINK);
3399 spin_lock_irqsave(ap->lock, flags);
3400 link->flags &= ~ATA_LFLAG_DISABLED;
3401 spin_unlock_irqrestore(ap->lock, flags);
3402 ata_eh_done(link, NULL, ATA_EH_ENABLE_LINK);
3403 }
3404
Tejun Heo1eca4362008-11-03 20:03:17 +09003405 ata_for_each_dev(dev, link, ALL) {
Tejun Heofd995f72007-09-23 13:14:12 +09003406 if (link->flags & ATA_LFLAG_NO_RETRY)
3407 ehc->tries[dev->devno] = 1;
3408 else
3409 ehc->tries[dev->devno] = ATA_EH_DEV_TRIES;
Tejun Heo79a55b72007-01-18 17:22:18 +09003410
Tejun Heo9b1e2652007-08-06 18:36:24 +09003411 /* collect port action mask recorded in dev actions */
3412 ehc->i.action |= ehc->i.dev_action[dev->devno] &
3413 ~ATA_EH_PERDEV_MASK;
3414 ehc->i.dev_action[dev->devno] &= ATA_EH_PERDEV_MASK;
Tejun Heo084fe632006-05-31 18:28:03 +09003415
Tejun Heo9b1e2652007-08-06 18:36:24 +09003416 /* process hotplug request */
3417 if (dev->flags & ATA_DFLAG_DETACH)
3418 ata_eh_detach_dev(dev);
3419
Tejun Heo02c05a22007-11-27 19:28:54 +09003420 /* schedule probe if necessary */
3421 if (!ata_dev_enabled(dev))
3422 ata_eh_schedule_probe(dev);
Tejun Heo084fe632006-05-31 18:28:03 +09003423 }
Tejun Heo022bdb02006-05-15 20:58:22 +09003424 }
3425
3426 retry:
Tejun Heo022bdb02006-05-15 20:58:22 +09003427 rc = 0;
Tejun Heo9b1e2652007-08-06 18:36:24 +09003428 nr_failed_devs = 0;
Tejun Heo022bdb02006-05-15 20:58:22 +09003429
Tejun Heoaeb2ecd2006-06-12 14:11:43 +09003430 /* if UNLOADING, finish immediately */
Tejun Heob51e9e52006-06-29 01:29:30 +09003431 if (ap->pflags & ATA_PFLAG_UNLOADING)
Tejun Heoaeb2ecd2006-06-12 14:11:43 +09003432 goto out;
3433
Tejun Heo9b1e2652007-08-06 18:36:24 +09003434 /* prep for EH */
Tejun Heo1eca4362008-11-03 20:03:17 +09003435 ata_for_each_link(link, ap, EDGE) {
Tejun Heo9b1e2652007-08-06 18:36:24 +09003436 struct ata_eh_context *ehc = &link->eh_context;
Tejun Heo022bdb02006-05-15 20:58:22 +09003437
Tejun Heo9b1e2652007-08-06 18:36:24 +09003438 /* skip EH if possible. */
3439 if (ata_eh_skip_recovery(link))
3440 ehc->i.action = 0;
3441
Tejun Heo1eca4362008-11-03 20:03:17 +09003442 ata_for_each_dev(dev, link, ALL)
Tejun Heo9b1e2652007-08-06 18:36:24 +09003443 ehc->classes[dev->devno] = ATA_DEV_UNKNOWN;
3444 }
Tejun Heo084fe632006-05-31 18:28:03 +09003445
Tejun Heo022bdb02006-05-15 20:58:22 +09003446 /* reset */
Tejun Heo1eca4362008-11-03 20:03:17 +09003447 ata_for_each_link(link, ap, EDGE) {
Tejun Heodc98c322008-05-19 01:15:07 +09003448 struct ata_eh_context *ehc = &link->eh_context;
Tejun Heo022bdb02006-05-15 20:58:22 +09003449
Tejun Heodc98c322008-05-19 01:15:07 +09003450 if (!(ehc->i.action & ATA_EH_RESET))
3451 continue;
Tejun Heo9b1e2652007-08-06 18:36:24 +09003452
Tejun Heodc98c322008-05-19 01:15:07 +09003453 rc = ata_eh_reset(link, ata_link_nr_vacant(link),
3454 prereset, softreset, hardreset, postreset);
3455 if (rc) {
3456 ata_link_printk(link, KERN_ERR,
3457 "reset failed, giving up\n");
3458 goto out;
Tejun Heo022bdb02006-05-15 20:58:22 +09003459 }
Tejun Heo022bdb02006-05-15 20:58:22 +09003460 }
3461
Elias Oltmanns45fabbb2008-09-21 11:54:08 +02003462 do {
3463 unsigned long now;
3464
3465 /*
3466 * clears ATA_EH_PARK in eh_info and resets
3467 * ap->park_req_pending
3468 */
3469 ata_eh_pull_park_action(ap);
3470
3471 deadline = jiffies;
Tejun Heo1eca4362008-11-03 20:03:17 +09003472 ata_for_each_link(link, ap, EDGE) {
3473 ata_for_each_dev(dev, link, ALL) {
Elias Oltmanns45fabbb2008-09-21 11:54:08 +02003474 struct ata_eh_context *ehc = &link->eh_context;
3475 unsigned long tmp;
3476
3477 if (dev->class != ATA_DEV_ATA)
3478 continue;
3479 if (!(ehc->i.dev_action[dev->devno] &
3480 ATA_EH_PARK))
3481 continue;
3482 tmp = dev->unpark_deadline;
3483 if (time_before(deadline, tmp))
3484 deadline = tmp;
3485 else if (time_before_eq(tmp, jiffies))
3486 continue;
3487 if (ehc->unloaded_mask & (1 << dev->devno))
3488 continue;
3489
3490 ata_eh_park_issue_cmd(dev, 1);
3491 }
3492 }
3493
3494 now = jiffies;
3495 if (time_before_eq(deadline, now))
3496 break;
3497
3498 deadline = wait_for_completion_timeout(&ap->park_req_pending,
3499 deadline - now);
3500 } while (deadline);
Tejun Heo1eca4362008-11-03 20:03:17 +09003501 ata_for_each_link(link, ap, EDGE) {
3502 ata_for_each_dev(dev, link, ALL) {
Elias Oltmanns45fabbb2008-09-21 11:54:08 +02003503 if (!(link->eh_context.unloaded_mask &
3504 (1 << dev->devno)))
3505 continue;
3506
3507 ata_eh_park_issue_cmd(dev, 0);
3508 ata_eh_done(link, dev, ATA_EH_PARK);
3509 }
3510 }
3511
Tejun Heo9b1e2652007-08-06 18:36:24 +09003512 /* the rest */
Tejun Heo1eca4362008-11-03 20:03:17 +09003513 ata_for_each_link(link, ap, EDGE) {
Tejun Heo9b1e2652007-08-06 18:36:24 +09003514 struct ata_eh_context *ehc = &link->eh_context;
Tejun Heo022bdb02006-05-15 20:58:22 +09003515
Tejun Heo9b1e2652007-08-06 18:36:24 +09003516 /* revalidate existing devices and attach new ones */
3517 rc = ata_eh_revalidate_and_attach(link, &dev);
Tejun Heo4ae72a12007-02-02 16:22:30 +09003518 if (rc)
Tejun Heo022bdb02006-05-15 20:58:22 +09003519 goto dev_fail;
Tejun Heo9b1e2652007-08-06 18:36:24 +09003520
Tejun Heo633273a2007-09-23 13:19:54 +09003521 /* if PMP got attached, return, pmp EH will take care of it */
3522 if (link->device->class == ATA_DEV_PMP) {
3523 ehc->i.action = 0;
3524 return 0;
3525 }
3526
Tejun Heo9b1e2652007-08-06 18:36:24 +09003527 /* configure transfer mode if necessary */
3528 if (ehc->i.flags & ATA_EHI_SETMODE) {
3529 rc = ata_set_mode(link, &dev);
3530 if (rc)
3531 goto dev_fail;
3532 ehc->i.flags &= ~ATA_EHI_SETMODE;
3533 }
3534
Tejun Heo11fc33d2008-08-30 14:20:01 +02003535 /* If reset has been issued, clear UA to avoid
3536 * disrupting the current users of the device.
3537 */
3538 if (ehc->i.flags & ATA_EHI_DID_RESET) {
Tejun Heo1eca4362008-11-03 20:03:17 +09003539 ata_for_each_dev(dev, link, ALL) {
Tejun Heo11fc33d2008-08-30 14:20:01 +02003540 if (dev->class != ATA_DEV_ATAPI)
3541 continue;
3542 rc = atapi_eh_clear_ua(dev);
3543 if (rc)
3544 goto dev_fail;
3545 }
3546 }
3547
Tejun Heo6013efd2009-11-19 15:36:45 +09003548 /* retry flush if necessary */
3549 ata_for_each_dev(dev, link, ALL) {
3550 if (dev->class != ATA_DEV_ATA)
3551 continue;
3552 rc = ata_eh_maybe_retry_flush(dev);
3553 if (rc)
3554 goto dev_fail;
3555 }
3556
Tejun Heo11fc33d2008-08-30 14:20:01 +02003557 /* configure link power saving */
Tejun Heo3ec25eb2008-03-27 18:37:14 +09003558 if (ehc->i.action & ATA_EH_LPM)
Tejun Heo1eca4362008-11-03 20:03:17 +09003559 ata_for_each_dev(dev, link, ALL)
Kristen Carlson Accardica773292007-10-25 00:58:59 -04003560 ata_dev_enable_pm(dev, ap->pm_policy);
3561
Tejun Heo9b1e2652007-08-06 18:36:24 +09003562 /* this link is okay now */
3563 ehc->i.flags = 0;
3564 continue;
3565
Jeff Garzik2dcb4072007-10-19 06:42:56 -04003566dev_fail:
Tejun Heo9b1e2652007-08-06 18:36:24 +09003567 nr_failed_devs++;
Tejun Heo0a2c0f52008-05-20 02:17:52 +09003568 ata_eh_handle_dev_fail(dev, rc);
Tejun Heo9b1e2652007-08-06 18:36:24 +09003569
Tejun Heob06ce3e2007-10-09 15:06:48 +09003570 if (ap->pflags & ATA_PFLAG_FROZEN) {
3571 /* PMP reset requires working host port.
3572 * Can't retry if it's frozen.
3573 */
Tejun Heo071f44b2008-04-07 22:47:22 +09003574 if (sata_pmp_attached(ap))
Tejun Heob06ce3e2007-10-09 15:06:48 +09003575 goto out;
Tejun Heo9b1e2652007-08-06 18:36:24 +09003576 break;
Tejun Heob06ce3e2007-10-09 15:06:48 +09003577 }
Tejun Heo022bdb02006-05-15 20:58:22 +09003578 }
3579
Tejun Heo0a2c0f52008-05-20 02:17:52 +09003580 if (nr_failed_devs)
Tejun Heo9b1e2652007-08-06 18:36:24 +09003581 goto retry;
Tejun Heo022bdb02006-05-15 20:58:22 +09003582
Tejun Heo022bdb02006-05-15 20:58:22 +09003583 out:
Tejun Heo9b1e2652007-08-06 18:36:24 +09003584 if (rc && r_failed_link)
3585 *r_failed_link = link;
Tejun Heo022bdb02006-05-15 20:58:22 +09003586
3587 DPRINTK("EXIT, rc=%d\n", rc);
3588 return rc;
3589}
3590
3591/**
3592 * ata_eh_finish - finish up EH
3593 * @ap: host port to finish EH for
3594 *
3595 * Recovery is complete. Clean up EH states and retry or finish
3596 * failed qcs.
3597 *
3598 * LOCKING:
3599 * None.
3600 */
Tejun Heofb7fd612007-09-23 13:14:12 +09003601void ata_eh_finish(struct ata_port *ap)
Tejun Heo022bdb02006-05-15 20:58:22 +09003602{
3603 int tag;
3604
3605 /* retry or finish qcs */
3606 for (tag = 0; tag < ATA_MAX_QUEUE; tag++) {
3607 struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag);
3608
3609 if (!(qc->flags & ATA_QCFLAG_FAILED))
3610 continue;
3611
3612 if (qc->err_mask) {
3613 /* FIXME: Once EH migration is complete,
3614 * generate sense data in this function,
3615 * considering both err_mask and tf.
3616 */
Tejun Heo03faab72008-03-27 19:14:24 +09003617 if (qc->flags & ATA_QCFLAG_RETRY)
Tejun Heo022bdb02006-05-15 20:58:22 +09003618 ata_eh_qc_retry(qc);
Tejun Heo03faab72008-03-27 19:14:24 +09003619 else
3620 ata_eh_qc_complete(qc);
Tejun Heo022bdb02006-05-15 20:58:22 +09003621 } else {
3622 if (qc->flags & ATA_QCFLAG_SENSE_VALID) {
3623 ata_eh_qc_complete(qc);
3624 } else {
3625 /* feed zero TF to sense generation */
3626 memset(&qc->result_tf, 0, sizeof(qc->result_tf));
3627 ata_eh_qc_retry(qc);
3628 }
3629 }
3630 }
Tejun Heoda917d62007-09-23 13:14:12 +09003631
3632 /* make sure nr_active_links is zero after EH */
3633 WARN_ON(ap->nr_active_links);
3634 ap->nr_active_links = 0;
Tejun Heo022bdb02006-05-15 20:58:22 +09003635}
3636
3637/**
3638 * ata_do_eh - do standard error handling
3639 * @ap: host port to handle error for
Tejun Heoa1efdab2008-03-25 12:22:50 +09003640 *
Tejun Heof5914a42006-05-31 18:27:48 +09003641 * @prereset: prereset method (can be NULL)
Tejun Heo022bdb02006-05-15 20:58:22 +09003642 * @softreset: softreset method (can be NULL)
3643 * @hardreset: hardreset method (can be NULL)
3644 * @postreset: postreset method (can be NULL)
3645 *
3646 * Perform standard error handling sequence.
3647 *
3648 * LOCKING:
3649 * Kernel thread context (may sleep).
3650 */
Tejun Heof5914a42006-05-31 18:27:48 +09003651void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset,
3652 ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
3653 ata_postreset_fn_t postreset)
Tejun Heo022bdb02006-05-15 20:58:22 +09003654{
Tejun Heo9b1e2652007-08-06 18:36:24 +09003655 struct ata_device *dev;
3656 int rc;
3657
3658 ata_eh_autopsy(ap);
3659 ata_eh_report(ap);
3660
3661 rc = ata_eh_recover(ap, prereset, softreset, hardreset, postreset,
3662 NULL);
3663 if (rc) {
Tejun Heo1eca4362008-11-03 20:03:17 +09003664 ata_for_each_dev(dev, &ap->link, ALL)
Tejun Heo9b1e2652007-08-06 18:36:24 +09003665 ata_dev_disable(dev);
3666 }
3667
Tejun Heo022bdb02006-05-15 20:58:22 +09003668 ata_eh_finish(ap);
3669}
Tejun Heo500530f2006-07-03 16:07:27 +09003670
Tejun Heoa1efdab2008-03-25 12:22:50 +09003671/**
3672 * ata_std_error_handler - standard error handler
3673 * @ap: host port to handle error for
3674 *
3675 * Standard error handler
3676 *
3677 * LOCKING:
3678 * Kernel thread context (may sleep).
3679 */
3680void ata_std_error_handler(struct ata_port *ap)
3681{
3682 struct ata_port_operations *ops = ap->ops;
3683 ata_reset_fn_t hardreset = ops->hardreset;
3684
Tejun Heo57c9efd2008-04-07 22:47:19 +09003685 /* ignore built-in hardreset if SCR access is not available */
3686 if (ata_is_builtin_hardreset(hardreset) && !sata_scr_valid(&ap->link))
Tejun Heoa1efdab2008-03-25 12:22:50 +09003687 hardreset = NULL;
3688
3689 ata_do_eh(ap, ops->prereset, ops->softreset, hardreset, ops->postreset);
3690}
3691
Tejun Heo6ffa01d2007-03-02 17:32:47 +09003692#ifdef CONFIG_PM
Tejun Heo500530f2006-07-03 16:07:27 +09003693/**
3694 * ata_eh_handle_port_suspend - perform port suspend operation
3695 * @ap: port to suspend
3696 *
3697 * Suspend @ap.
3698 *
3699 * LOCKING:
3700 * Kernel thread context (may sleep).
3701 */
3702static void ata_eh_handle_port_suspend(struct ata_port *ap)
3703{
3704 unsigned long flags;
3705 int rc = 0;
3706
3707 /* are we suspending? */
3708 spin_lock_irqsave(ap->lock, flags);
3709 if (!(ap->pflags & ATA_PFLAG_PM_PENDING) ||
3710 ap->pm_mesg.event == PM_EVENT_ON) {
3711 spin_unlock_irqrestore(ap->lock, flags);
3712 return;
3713 }
3714 spin_unlock_irqrestore(ap->lock, flags);
3715
3716 WARN_ON(ap->pflags & ATA_PFLAG_SUSPENDED);
3717
Tejun Heo64578a32007-05-15 03:28:16 +09003718 /* tell ACPI we're suspending */
3719 rc = ata_acpi_on_suspend(ap);
3720 if (rc)
3721 goto out;
3722
Tejun Heo500530f2006-07-03 16:07:27 +09003723 /* suspend */
3724 ata_eh_freeze_port(ap);
3725
3726 if (ap->ops->port_suspend)
3727 rc = ap->ops->port_suspend(ap, ap->pm_mesg);
3728
Shaohua Libd3adca2007-11-02 09:32:38 +08003729 ata_acpi_set_state(ap, PMSG_SUSPEND);
Tejun Heo64578a32007-05-15 03:28:16 +09003730 out:
Tejun Heo500530f2006-07-03 16:07:27 +09003731 /* report result */
3732 spin_lock_irqsave(ap->lock, flags);
3733
3734 ap->pflags &= ~ATA_PFLAG_PM_PENDING;
3735 if (rc == 0)
3736 ap->pflags |= ATA_PFLAG_SUSPENDED;
Tejun Heo64578a32007-05-15 03:28:16 +09003737 else if (ap->pflags & ATA_PFLAG_FROZEN)
Tejun Heo500530f2006-07-03 16:07:27 +09003738 ata_port_schedule_eh(ap);
3739
3740 if (ap->pm_result) {
3741 *ap->pm_result = rc;
3742 ap->pm_result = NULL;
3743 }
3744
3745 spin_unlock_irqrestore(ap->lock, flags);
3746
3747 return;
3748}
3749
3750/**
3751 * ata_eh_handle_port_resume - perform port resume operation
3752 * @ap: port to resume
3753 *
3754 * Resume @ap.
3755 *
Tejun Heo500530f2006-07-03 16:07:27 +09003756 * LOCKING:
3757 * Kernel thread context (may sleep).
3758 */
3759static void ata_eh_handle_port_resume(struct ata_port *ap)
3760{
Tejun Heo6f9c1ea2009-04-23 09:55:28 +09003761 struct ata_link *link;
3762 struct ata_device *dev;
Tejun Heo500530f2006-07-03 16:07:27 +09003763 unsigned long flags;
Tejun Heo9666f402007-05-04 21:27:47 +02003764 int rc = 0;
Tejun Heo500530f2006-07-03 16:07:27 +09003765
3766 /* are we resuming? */
3767 spin_lock_irqsave(ap->lock, flags);
3768 if (!(ap->pflags & ATA_PFLAG_PM_PENDING) ||
3769 ap->pm_mesg.event != PM_EVENT_ON) {
3770 spin_unlock_irqrestore(ap->lock, flags);
3771 return;
3772 }
3773 spin_unlock_irqrestore(ap->lock, flags);
3774
Tejun Heo9666f402007-05-04 21:27:47 +02003775 WARN_ON(!(ap->pflags & ATA_PFLAG_SUSPENDED));
Tejun Heo500530f2006-07-03 16:07:27 +09003776
Tejun Heo6f9c1ea2009-04-23 09:55:28 +09003777 /*
3778 * Error timestamps are in jiffies which doesn't run while
3779 * suspended and PHY events during resume isn't too uncommon.
3780 * When the two are combined, it can lead to unnecessary speed
3781 * downs if the machine is suspended and resumed repeatedly.
3782 * Clear error history.
3783 */
3784 ata_for_each_link(link, ap, HOST_FIRST)
3785 ata_for_each_dev(dev, link, ALL)
3786 ata_ering_clear(&dev->ering);
3787
Shaohua Libd3adca2007-11-02 09:32:38 +08003788 ata_acpi_set_state(ap, PMSG_ON);
3789
Tejun Heo500530f2006-07-03 16:07:27 +09003790 if (ap->ops->port_resume)
3791 rc = ap->ops->port_resume(ap);
3792
Tejun Heo67465442007-05-15 03:28:16 +09003793 /* tell ACPI that we're resuming */
3794 ata_acpi_on_resume(ap);
3795
Tejun Heo9666f402007-05-04 21:27:47 +02003796 /* report result */
Tejun Heo500530f2006-07-03 16:07:27 +09003797 spin_lock_irqsave(ap->lock, flags);
3798 ap->pflags &= ~(ATA_PFLAG_PM_PENDING | ATA_PFLAG_SUSPENDED);
3799 if (ap->pm_result) {
3800 *ap->pm_result = rc;
3801 ap->pm_result = NULL;
3802 }
3803 spin_unlock_irqrestore(ap->lock, flags);
3804}
Tejun Heo6ffa01d2007-03-02 17:32:47 +09003805#endif /* CONFIG_PM */