blob: 0bb4b4dced76d984a7b883f1d7be07ad1386c3b6 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Jeff Garzikaf36d7f2005-08-28 20:18:39 -04002 * libata-core.c - helper library for ATA
3 *
4 * Maintained by: Jeff Garzik <jgarzik@pobox.com>
5 * Please ALWAYS copy linux-ide@vger.kernel.org
6 * on emails.
7 *
8 * Copyright 2003-2004 Red Hat, Inc. All rights reserved.
9 * Copyright 2003-2004 Jeff Garzik
10 *
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2, or (at your option)
15 * any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; see the file COPYING. If not, write to
24 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, 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 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070033 */
34
Linus Torvalds1da177e2005-04-16 15:20:36 -070035#include <linux/kernel.h>
36#include <linux/module.h>
37#include <linux/pci.h>
38#include <linux/init.h>
39#include <linux/list.h>
40#include <linux/mm.h>
41#include <linux/highmem.h>
42#include <linux/spinlock.h>
43#include <linux/blkdev.h>
44#include <linux/delay.h>
45#include <linux/timer.h>
46#include <linux/interrupt.h>
47#include <linux/completion.h>
48#include <linux/suspend.h>
49#include <linux/workqueue.h>
Jeff Garzik67846b32005-10-05 02:58:32 -040050#include <linux/jiffies.h>
David Hardeman378f0582005-09-17 17:55:31 +100051#include <linux/scatterlist.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070052#include <scsi/scsi.h>
Jeff Garzik193515d2005-11-07 00:59:37 -050053#include <scsi/scsi_cmnd.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070054#include <scsi/scsi_host.h>
55#include <linux/libata.h>
56#include <asm/io.h>
57#include <asm/semaphore.h>
58#include <asm/byteorder.h>
59
60#include "libata.h"
61
Tejun Heod7bb4cc2006-05-31 18:27:46 +090062/* debounce timing parameters in msecs { interval, duration, timeout } */
Tejun Heoe9c83912006-07-03 16:07:26 +090063const unsigned long sata_deb_timing_normal[] = { 5, 100, 2000 };
64const unsigned long sata_deb_timing_hotplug[] = { 25, 500, 2000 };
65const unsigned long sata_deb_timing_long[] = { 100, 2000, 5000 };
Tejun Heod7bb4cc2006-05-31 18:27:46 +090066
Tejun Heo3373efd2006-05-15 20:57:53 +090067static unsigned int ata_dev_init_params(struct ata_device *dev,
68 u16 heads, u16 sectors);
69static unsigned int ata_dev_set_xfermode(struct ata_device *dev);
70static void ata_dev_xfermask(struct ata_device *dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070071
72static unsigned int ata_unique_id = 1;
73static struct workqueue_struct *ata_wq;
74
Tejun Heo453b07a2006-05-31 18:27:42 +090075struct workqueue_struct *ata_aux_wq;
76
Jeff Garzik418dc1f2006-03-11 20:50:08 -050077int atapi_enabled = 1;
Jeff Garzik1623c812005-08-30 03:37:42 -040078module_param(atapi_enabled, int, 0444);
79MODULE_PARM_DESC(atapi_enabled, "Enable discovery of ATAPI devices (0=off, 1=on)");
80
Albert Lee95de7192006-04-04 10:57:18 +080081int atapi_dmadir = 0;
82module_param(atapi_dmadir, int, 0444);
83MODULE_PARM_DESC(atapi_dmadir, "Enable ATAPI DMADIR bridge support (0=off, 1=on)");
84
Jeff Garzikc3c013a2006-02-27 22:31:19 -050085int libata_fua = 0;
86module_param_named(fua, libata_fua, int, 0444);
87MODULE_PARM_DESC(fua, "FUA support (0=off, 1=on)");
88
Andrew Mortona8601e52006-06-25 01:36:52 -070089static int ata_probe_timeout = ATA_TMOUT_INTERNAL / HZ;
90module_param(ata_probe_timeout, int, 0444);
91MODULE_PARM_DESC(ata_probe_timeout, "Set ATA probing timeout (seconds)");
92
Linus Torvalds1da177e2005-04-16 15:20:36 -070093MODULE_AUTHOR("Jeff Garzik");
94MODULE_DESCRIPTION("Library module for ATA devices");
95MODULE_LICENSE("GPL");
96MODULE_VERSION(DRV_VERSION);
97
Edward Falk0baab862005-06-02 18:17:13 -040098
99/**
Linus Torvalds1da177e2005-04-16 15:20:36 -0700100 * ata_tf_to_fis - Convert ATA taskfile to SATA FIS structure
101 * @tf: Taskfile to convert
102 * @fis: Buffer into which data will output
103 * @pmp: Port multiplier port
104 *
105 * Converts a standard ATA taskfile to a Serial ATA
106 * FIS structure (Register - Host to Device).
107 *
108 * LOCKING:
109 * Inherited from caller.
110 */
111
Jeff Garzik057ace52005-10-22 14:27:05 -0400112void ata_tf_to_fis(const struct ata_taskfile *tf, u8 *fis, u8 pmp)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700113{
114 fis[0] = 0x27; /* Register - Host to Device FIS */
115 fis[1] = (pmp & 0xf) | (1 << 7); /* Port multiplier number,
116 bit 7 indicates Command FIS */
117 fis[2] = tf->command;
118 fis[3] = tf->feature;
119
120 fis[4] = tf->lbal;
121 fis[5] = tf->lbam;
122 fis[6] = tf->lbah;
123 fis[7] = tf->device;
124
125 fis[8] = tf->hob_lbal;
126 fis[9] = tf->hob_lbam;
127 fis[10] = tf->hob_lbah;
128 fis[11] = tf->hob_feature;
129
130 fis[12] = tf->nsect;
131 fis[13] = tf->hob_nsect;
132 fis[14] = 0;
133 fis[15] = tf->ctl;
134
135 fis[16] = 0;
136 fis[17] = 0;
137 fis[18] = 0;
138 fis[19] = 0;
139}
140
141/**
142 * ata_tf_from_fis - Convert SATA FIS to ATA taskfile
143 * @fis: Buffer from which data will be input
144 * @tf: Taskfile to output
145 *
Mark Lorde12a1be2005-11-12 18:55:45 -0500146 * Converts a serial ATA FIS structure to a standard ATA taskfile.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700147 *
148 * LOCKING:
149 * Inherited from caller.
150 */
151
Jeff Garzik057ace52005-10-22 14:27:05 -0400152void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700153{
154 tf->command = fis[2]; /* status */
155 tf->feature = fis[3]; /* error */
156
157 tf->lbal = fis[4];
158 tf->lbam = fis[5];
159 tf->lbah = fis[6];
160 tf->device = fis[7];
161
162 tf->hob_lbal = fis[8];
163 tf->hob_lbam = fis[9];
164 tf->hob_lbah = fis[10];
165
166 tf->nsect = fis[12];
167 tf->hob_nsect = fis[13];
168}
169
Albert Lee8cbd6df2005-10-12 15:06:27 +0800170static const u8 ata_rw_cmds[] = {
171 /* pio multi */
172 ATA_CMD_READ_MULTI,
173 ATA_CMD_WRITE_MULTI,
174 ATA_CMD_READ_MULTI_EXT,
175 ATA_CMD_WRITE_MULTI_EXT,
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100176 0,
177 0,
178 0,
179 ATA_CMD_WRITE_MULTI_FUA_EXT,
Albert Lee8cbd6df2005-10-12 15:06:27 +0800180 /* pio */
181 ATA_CMD_PIO_READ,
182 ATA_CMD_PIO_WRITE,
183 ATA_CMD_PIO_READ_EXT,
184 ATA_CMD_PIO_WRITE_EXT,
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100185 0,
186 0,
187 0,
188 0,
Albert Lee8cbd6df2005-10-12 15:06:27 +0800189 /* dma */
190 ATA_CMD_READ,
191 ATA_CMD_WRITE,
192 ATA_CMD_READ_EXT,
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100193 ATA_CMD_WRITE_EXT,
194 0,
195 0,
196 0,
197 ATA_CMD_WRITE_FUA_EXT
Albert Lee8cbd6df2005-10-12 15:06:27 +0800198};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700199
200/**
Albert Lee8cbd6df2005-10-12 15:06:27 +0800201 * ata_rwcmd_protocol - set taskfile r/w commands and protocol
202 * @qc: command to examine and configure
Linus Torvalds1da177e2005-04-16 15:20:36 -0700203 *
Jeff Garzik2e9edbf2006-03-24 09:56:57 -0500204 * Examine the device configuration and tf->flags to calculate
Albert Lee8cbd6df2005-10-12 15:06:27 +0800205 * the proper read/write commands and protocol to use.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700206 *
207 * LOCKING:
208 * caller.
209 */
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100210int ata_rwcmd_protocol(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211{
Albert Lee8cbd6df2005-10-12 15:06:27 +0800212 struct ata_taskfile *tf = &qc->tf;
213 struct ata_device *dev = qc->dev;
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100214 u8 cmd;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700215
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100216 int index, fua, lba48, write;
Jeff Garzik2e9edbf2006-03-24 09:56:57 -0500217
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100218 fua = (tf->flags & ATA_TFLAG_FUA) ? 4 : 0;
Albert Lee8cbd6df2005-10-12 15:06:27 +0800219 lba48 = (tf->flags & ATA_TFLAG_LBA48) ? 2 : 0;
220 write = (tf->flags & ATA_TFLAG_WRITE) ? 1 : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221
Albert Lee8cbd6df2005-10-12 15:06:27 +0800222 if (dev->flags & ATA_DFLAG_PIO) {
223 tf->protocol = ATA_PROT_PIO;
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100224 index = dev->multi_count ? 0 : 8;
Alan Cox8d238e02006-01-17 20:50:31 +0000225 } else if (lba48 && (qc->ap->flags & ATA_FLAG_PIO_LBA48)) {
226 /* Unable to use DMA due to host limitation */
227 tf->protocol = ATA_PROT_PIO;
Albert Lee0565c262006-02-13 18:55:25 +0800228 index = dev->multi_count ? 0 : 8;
Albert Lee8cbd6df2005-10-12 15:06:27 +0800229 } else {
230 tf->protocol = ATA_PROT_DMA;
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100231 index = 16;
Albert Lee8cbd6df2005-10-12 15:06:27 +0800232 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700233
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100234 cmd = ata_rw_cmds[index + fua + lba48 + write];
235 if (cmd) {
236 tf->command = cmd;
237 return 0;
238 }
239 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700240}
241
Tejun Heocb95d562006-03-06 04:31:56 +0900242/**
243 * ata_pack_xfermask - Pack pio, mwdma and udma masks into xfer_mask
244 * @pio_mask: pio_mask
245 * @mwdma_mask: mwdma_mask
246 * @udma_mask: udma_mask
247 *
248 * Pack @pio_mask, @mwdma_mask and @udma_mask into a single
249 * unsigned int xfer_mask.
250 *
251 * LOCKING:
252 * None.
253 *
254 * RETURNS:
255 * Packed xfer_mask.
256 */
257static unsigned int ata_pack_xfermask(unsigned int pio_mask,
258 unsigned int mwdma_mask,
259 unsigned int udma_mask)
260{
261 return ((pio_mask << ATA_SHIFT_PIO) & ATA_MASK_PIO) |
262 ((mwdma_mask << ATA_SHIFT_MWDMA) & ATA_MASK_MWDMA) |
263 ((udma_mask << ATA_SHIFT_UDMA) & ATA_MASK_UDMA);
264}
265
Tejun Heoc0489e42006-03-24 14:07:49 +0900266/**
267 * ata_unpack_xfermask - Unpack xfer_mask into pio, mwdma and udma masks
268 * @xfer_mask: xfer_mask to unpack
269 * @pio_mask: resulting pio_mask
270 * @mwdma_mask: resulting mwdma_mask
271 * @udma_mask: resulting udma_mask
272 *
273 * Unpack @xfer_mask into @pio_mask, @mwdma_mask and @udma_mask.
274 * Any NULL distination masks will be ignored.
275 */
276static void ata_unpack_xfermask(unsigned int xfer_mask,
277 unsigned int *pio_mask,
278 unsigned int *mwdma_mask,
279 unsigned int *udma_mask)
280{
281 if (pio_mask)
282 *pio_mask = (xfer_mask & ATA_MASK_PIO) >> ATA_SHIFT_PIO;
283 if (mwdma_mask)
284 *mwdma_mask = (xfer_mask & ATA_MASK_MWDMA) >> ATA_SHIFT_MWDMA;
285 if (udma_mask)
286 *udma_mask = (xfer_mask & ATA_MASK_UDMA) >> ATA_SHIFT_UDMA;
287}
288
Tejun Heocb95d562006-03-06 04:31:56 +0900289static const struct ata_xfer_ent {
Tejun Heobe9a50c2006-03-31 22:48:52 +0900290 int shift, bits;
Tejun Heocb95d562006-03-06 04:31:56 +0900291 u8 base;
292} ata_xfer_tbl[] = {
293 { ATA_SHIFT_PIO, ATA_BITS_PIO, XFER_PIO_0 },
294 { ATA_SHIFT_MWDMA, ATA_BITS_MWDMA, XFER_MW_DMA_0 },
295 { ATA_SHIFT_UDMA, ATA_BITS_UDMA, XFER_UDMA_0 },
296 { -1, },
297};
298
299/**
300 * ata_xfer_mask2mode - Find matching XFER_* for the given xfer_mask
301 * @xfer_mask: xfer_mask of interest
302 *
303 * Return matching XFER_* value for @xfer_mask. Only the highest
304 * bit of @xfer_mask is considered.
305 *
306 * LOCKING:
307 * None.
308 *
309 * RETURNS:
310 * Matching XFER_* value, 0 if no match found.
311 */
312static u8 ata_xfer_mask2mode(unsigned int xfer_mask)
313{
314 int highbit = fls(xfer_mask) - 1;
315 const struct ata_xfer_ent *ent;
316
317 for (ent = ata_xfer_tbl; ent->shift >= 0; ent++)
318 if (highbit >= ent->shift && highbit < ent->shift + ent->bits)
319 return ent->base + highbit - ent->shift;
320 return 0;
321}
322
323/**
324 * ata_xfer_mode2mask - Find matching xfer_mask for XFER_*
325 * @xfer_mode: XFER_* of interest
326 *
327 * Return matching xfer_mask for @xfer_mode.
328 *
329 * LOCKING:
330 * None.
331 *
332 * RETURNS:
333 * Matching xfer_mask, 0 if no match found.
334 */
335static unsigned int ata_xfer_mode2mask(u8 xfer_mode)
336{
337 const struct ata_xfer_ent *ent;
338
339 for (ent = ata_xfer_tbl; ent->shift >= 0; ent++)
340 if (xfer_mode >= ent->base && xfer_mode < ent->base + ent->bits)
341 return 1 << (ent->shift + xfer_mode - ent->base);
342 return 0;
343}
344
345/**
346 * ata_xfer_mode2shift - Find matching xfer_shift for XFER_*
347 * @xfer_mode: XFER_* of interest
348 *
349 * Return matching xfer_shift for @xfer_mode.
350 *
351 * LOCKING:
352 * None.
353 *
354 * RETURNS:
355 * Matching xfer_shift, -1 if no match found.
356 */
357static int ata_xfer_mode2shift(unsigned int xfer_mode)
358{
359 const struct ata_xfer_ent *ent;
360
361 for (ent = ata_xfer_tbl; ent->shift >= 0; ent++)
362 if (xfer_mode >= ent->base && xfer_mode < ent->base + ent->bits)
363 return ent->shift;
364 return -1;
365}
366
Linus Torvalds1da177e2005-04-16 15:20:36 -0700367/**
Tejun Heo1da7b0d2006-03-06 04:31:56 +0900368 * ata_mode_string - convert xfer_mask to string
369 * @xfer_mask: mask of bits supported; only highest bit counts.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700370 *
371 * Determine string which represents the highest speed
Tejun Heo1da7b0d2006-03-06 04:31:56 +0900372 * (highest bit in @modemask).
Linus Torvalds1da177e2005-04-16 15:20:36 -0700373 *
374 * LOCKING:
375 * None.
376 *
377 * RETURNS:
378 * Constant C string representing highest speed listed in
Tejun Heo1da7b0d2006-03-06 04:31:56 +0900379 * @mode_mask, or the constant C string "<n/a>".
Linus Torvalds1da177e2005-04-16 15:20:36 -0700380 */
Tejun Heo1da7b0d2006-03-06 04:31:56 +0900381static const char *ata_mode_string(unsigned int xfer_mask)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700382{
Tejun Heo75f554b2006-03-06 04:31:57 +0900383 static const char * const xfer_mode_str[] = {
384 "PIO0",
385 "PIO1",
386 "PIO2",
387 "PIO3",
388 "PIO4",
Alan Coxb352e572006-08-10 18:52:12 +0100389 "PIO5",
390 "PIO6",
Tejun Heo75f554b2006-03-06 04:31:57 +0900391 "MWDMA0",
392 "MWDMA1",
393 "MWDMA2",
Alan Coxb352e572006-08-10 18:52:12 +0100394 "MWDMA3",
395 "MWDMA4",
Tejun Heo75f554b2006-03-06 04:31:57 +0900396 "UDMA/16",
397 "UDMA/25",
398 "UDMA/33",
399 "UDMA/44",
400 "UDMA/66",
401 "UDMA/100",
402 "UDMA/133",
403 "UDMA7",
404 };
Tejun Heo1da7b0d2006-03-06 04:31:56 +0900405 int highbit;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700406
Tejun Heo1da7b0d2006-03-06 04:31:56 +0900407 highbit = fls(xfer_mask) - 1;
408 if (highbit >= 0 && highbit < ARRAY_SIZE(xfer_mode_str))
409 return xfer_mode_str[highbit];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700410 return "<n/a>";
Linus Torvalds1da177e2005-04-16 15:20:36 -0700411}
412
Tejun Heo4c360c82006-04-01 01:38:17 +0900413static const char *sata_spd_string(unsigned int spd)
414{
415 static const char * const spd_str[] = {
416 "1.5 Gbps",
417 "3.0 Gbps",
418 };
419
420 if (spd == 0 || (spd - 1) >= ARRAY_SIZE(spd_str))
421 return "<unknown>";
422 return spd_str[spd - 1];
423}
424
Tejun Heo3373efd2006-05-15 20:57:53 +0900425void ata_dev_disable(struct ata_device *dev)
Tejun Heo0b8efb02006-03-24 15:25:31 +0900426{
Borislav Petkov0dd4b212006-06-23 02:29:08 -0400427 if (ata_dev_enabled(dev) && ata_msg_drv(dev->ap)) {
Tejun Heof15a1da2006-05-15 20:57:56 +0900428 ata_dev_printk(dev, KERN_WARNING, "disabled\n");
Tejun Heo0b8efb02006-03-24 15:25:31 +0900429 dev->class++;
430 }
431}
432
Linus Torvalds1da177e2005-04-16 15:20:36 -0700433/**
434 * ata_pio_devchk - PATA device presence detection
435 * @ap: ATA channel to examine
436 * @device: Device to examine (starting at zero)
437 *
438 * This technique was originally described in
439 * Hale Landis's ATADRVR (www.ata-atapi.com), and
440 * later found its way into the ATA/ATAPI spec.
441 *
442 * Write a pattern to the ATA shadow registers,
443 * and if a device is present, it will respond by
444 * correctly storing and echoing back the
445 * ATA shadow register contents.
446 *
447 * LOCKING:
448 * caller.
449 */
450
451static unsigned int ata_pio_devchk(struct ata_port *ap,
452 unsigned int device)
453{
454 struct ata_ioports *ioaddr = &ap->ioaddr;
455 u8 nsect, lbal;
456
457 ap->ops->dev_select(ap, device);
458
459 outb(0x55, ioaddr->nsect_addr);
460 outb(0xaa, ioaddr->lbal_addr);
461
462 outb(0xaa, ioaddr->nsect_addr);
463 outb(0x55, ioaddr->lbal_addr);
464
465 outb(0x55, ioaddr->nsect_addr);
466 outb(0xaa, ioaddr->lbal_addr);
467
468 nsect = inb(ioaddr->nsect_addr);
469 lbal = inb(ioaddr->lbal_addr);
470
471 if ((nsect == 0x55) && (lbal == 0xaa))
472 return 1; /* we found a device */
473
474 return 0; /* nothing found */
475}
476
477/**
478 * ata_mmio_devchk - PATA device presence detection
479 * @ap: ATA channel to examine
480 * @device: Device to examine (starting at zero)
481 *
482 * This technique was originally described in
483 * Hale Landis's ATADRVR (www.ata-atapi.com), and
484 * later found its way into the ATA/ATAPI spec.
485 *
486 * Write a pattern to the ATA shadow registers,
487 * and if a device is present, it will respond by
488 * correctly storing and echoing back the
489 * ATA shadow register contents.
490 *
491 * LOCKING:
492 * caller.
493 */
494
495static unsigned int ata_mmio_devchk(struct ata_port *ap,
496 unsigned int device)
497{
498 struct ata_ioports *ioaddr = &ap->ioaddr;
499 u8 nsect, lbal;
500
501 ap->ops->dev_select(ap, device);
502
503 writeb(0x55, (void __iomem *) ioaddr->nsect_addr);
504 writeb(0xaa, (void __iomem *) ioaddr->lbal_addr);
505
506 writeb(0xaa, (void __iomem *) ioaddr->nsect_addr);
507 writeb(0x55, (void __iomem *) ioaddr->lbal_addr);
508
509 writeb(0x55, (void __iomem *) ioaddr->nsect_addr);
510 writeb(0xaa, (void __iomem *) ioaddr->lbal_addr);
511
512 nsect = readb((void __iomem *) ioaddr->nsect_addr);
513 lbal = readb((void __iomem *) ioaddr->lbal_addr);
514
515 if ((nsect == 0x55) && (lbal == 0xaa))
516 return 1; /* we found a device */
517
518 return 0; /* nothing found */
519}
520
521/**
522 * ata_devchk - PATA device presence detection
523 * @ap: ATA channel to examine
524 * @device: Device to examine (starting at zero)
525 *
526 * Dispatch ATA device presence detection, depending
527 * on whether we are using PIO or MMIO to talk to the
528 * ATA shadow registers.
529 *
530 * LOCKING:
531 * caller.
532 */
533
534static unsigned int ata_devchk(struct ata_port *ap,
535 unsigned int device)
536{
537 if (ap->flags & ATA_FLAG_MMIO)
538 return ata_mmio_devchk(ap, device);
539 return ata_pio_devchk(ap, device);
540}
541
542/**
543 * ata_dev_classify - determine device type based on ATA-spec signature
544 * @tf: ATA taskfile register set for device to be identified
545 *
546 * Determine from taskfile register contents whether a device is
547 * ATA or ATAPI, as per "Signature and persistence" section
548 * of ATA/PI spec (volume 1, sect 5.14).
549 *
550 * LOCKING:
551 * None.
552 *
553 * RETURNS:
554 * Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, or %ATA_DEV_UNKNOWN
555 * the event of failure.
556 */
557
Jeff Garzik057ace52005-10-22 14:27:05 -0400558unsigned int ata_dev_classify(const struct ata_taskfile *tf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700559{
560 /* Apple's open source Darwin code hints that some devices only
561 * put a proper signature into the LBA mid/high registers,
562 * So, we only check those. It's sufficient for uniqueness.
563 */
564
565 if (((tf->lbam == 0) && (tf->lbah == 0)) ||
566 ((tf->lbam == 0x3c) && (tf->lbah == 0xc3))) {
567 DPRINTK("found ATA device by sig\n");
568 return ATA_DEV_ATA;
569 }
570
571 if (((tf->lbam == 0x14) && (tf->lbah == 0xeb)) ||
572 ((tf->lbam == 0x69) && (tf->lbah == 0x96))) {
573 DPRINTK("found ATAPI device by sig\n");
574 return ATA_DEV_ATAPI;
575 }
576
577 DPRINTK("unknown device\n");
578 return ATA_DEV_UNKNOWN;
579}
580
581/**
582 * ata_dev_try_classify - Parse returned ATA device signature
583 * @ap: ATA channel to examine
584 * @device: Device to examine (starting at zero)
Tejun Heob4dc7622006-01-24 17:05:22 +0900585 * @r_err: Value of error register on completion
Linus Torvalds1da177e2005-04-16 15:20:36 -0700586 *
587 * After an event -- SRST, E.D.D., or SATA COMRESET -- occurs,
588 * an ATA/ATAPI-defined set of values is placed in the ATA
589 * shadow registers, indicating the results of device detection
590 * and diagnostics.
591 *
592 * Select the ATA device, and read the values from the ATA shadow
593 * registers. Then parse according to the Error register value,
594 * and the spec-defined values examined by ata_dev_classify().
595 *
596 * LOCKING:
597 * caller.
Tejun Heob4dc7622006-01-24 17:05:22 +0900598 *
599 * RETURNS:
600 * Device type - %ATA_DEV_ATA, %ATA_DEV_ATAPI or %ATA_DEV_NONE.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700601 */
602
Tejun Heob4dc7622006-01-24 17:05:22 +0900603static unsigned int
604ata_dev_try_classify(struct ata_port *ap, unsigned int device, u8 *r_err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700605{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700606 struct ata_taskfile tf;
607 unsigned int class;
608 u8 err;
609
610 ap->ops->dev_select(ap, device);
611
612 memset(&tf, 0, sizeof(tf));
613
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614 ap->ops->tf_read(ap, &tf);
Jeff Garzik0169e282005-10-29 21:25:10 -0400615 err = tf.feature;
Tejun Heob4dc7622006-01-24 17:05:22 +0900616 if (r_err)
617 *r_err = err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700618
Alan Cox93590852006-09-12 16:55:12 +0100619 /* see if device passed diags: if master then continue and warn later */
620 if (err == 0 && device == 0)
621 /* diagnostic fail : do nothing _YET_ */
622 ap->device[device].horkage |= ATA_HORKAGE_DIAGNOSTIC;
623 else if (err == 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700624 /* do nothing */ ;
625 else if ((device == 0) && (err == 0x81))
626 /* do nothing */ ;
627 else
Tejun Heob4dc7622006-01-24 17:05:22 +0900628 return ATA_DEV_NONE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700629
Tejun Heob4dc7622006-01-24 17:05:22 +0900630 /* determine if device is ATA or ATAPI */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700631 class = ata_dev_classify(&tf);
Tejun Heob4dc7622006-01-24 17:05:22 +0900632
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633 if (class == ATA_DEV_UNKNOWN)
Tejun Heob4dc7622006-01-24 17:05:22 +0900634 return ATA_DEV_NONE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700635 if ((class == ATA_DEV_ATA) && (ata_chk_status(ap) == 0))
Tejun Heob4dc7622006-01-24 17:05:22 +0900636 return ATA_DEV_NONE;
637 return class;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700638}
639
640/**
Tejun Heo6a62a042006-02-13 10:02:46 +0900641 * ata_id_string - Convert IDENTIFY DEVICE page into string
Linus Torvalds1da177e2005-04-16 15:20:36 -0700642 * @id: IDENTIFY DEVICE results we will examine
643 * @s: string into which data is output
644 * @ofs: offset into identify device page
645 * @len: length of string to return. must be an even number.
646 *
647 * The strings in the IDENTIFY DEVICE page are broken up into
648 * 16-bit chunks. Run through the string, and output each
649 * 8-bit chunk linearly, regardless of platform.
650 *
651 * LOCKING:
652 * caller.
653 */
654
Tejun Heo6a62a042006-02-13 10:02:46 +0900655void ata_id_string(const u16 *id, unsigned char *s,
656 unsigned int ofs, unsigned int len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700657{
658 unsigned int c;
659
660 while (len > 0) {
661 c = id[ofs] >> 8;
662 *s = c;
663 s++;
664
665 c = id[ofs] & 0xff;
666 *s = c;
667 s++;
668
669 ofs++;
670 len -= 2;
671 }
672}
673
Tejun Heo0e949ff2006-02-12 22:47:04 +0900674/**
Tejun Heo6a62a042006-02-13 10:02:46 +0900675 * ata_id_c_string - Convert IDENTIFY DEVICE page into C string
Tejun Heo0e949ff2006-02-12 22:47:04 +0900676 * @id: IDENTIFY DEVICE results we will examine
677 * @s: string into which data is output
678 * @ofs: offset into identify device page
679 * @len: length of string to return. must be an odd number.
680 *
Tejun Heo6a62a042006-02-13 10:02:46 +0900681 * This function is identical to ata_id_string except that it
Tejun Heo0e949ff2006-02-12 22:47:04 +0900682 * trims trailing spaces and terminates the resulting string with
683 * null. @len must be actual maximum length (even number) + 1.
684 *
685 * LOCKING:
686 * caller.
687 */
Tejun Heo6a62a042006-02-13 10:02:46 +0900688void ata_id_c_string(const u16 *id, unsigned char *s,
689 unsigned int ofs, unsigned int len)
Tejun Heo0e949ff2006-02-12 22:47:04 +0900690{
691 unsigned char *p;
692
693 WARN_ON(!(len & 1));
694
Tejun Heo6a62a042006-02-13 10:02:46 +0900695 ata_id_string(id, s, ofs, len - 1);
Tejun Heo0e949ff2006-02-12 22:47:04 +0900696
697 p = s + strnlen(s, len - 1);
698 while (p > s && p[-1] == ' ')
699 p--;
700 *p = '\0';
701}
Edward Falk0baab862005-06-02 18:17:13 -0400702
Tejun Heo29407402006-02-12 22:47:04 +0900703static u64 ata_id_n_sectors(const u16 *id)
704{
705 if (ata_id_has_lba(id)) {
706 if (ata_id_has_lba48(id))
707 return ata_id_u64(id, 100);
708 else
709 return ata_id_u32(id, 60);
710 } else {
711 if (ata_id_current_chs_valid(id))
712 return ata_id_u32(id, 57);
713 else
714 return id[1] * id[3] * id[6];
715 }
716}
717
Edward Falk0baab862005-06-02 18:17:13 -0400718/**
719 * ata_noop_dev_select - Select device 0/1 on ATA bus
720 * @ap: ATA channel to manipulate
721 * @device: ATA device (numbered from zero) to select
722 *
723 * This function performs no actual function.
724 *
725 * May be used as the dev_select() entry in ata_port_operations.
726 *
727 * LOCKING:
728 * caller.
729 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700730void ata_noop_dev_select (struct ata_port *ap, unsigned int device)
731{
732}
733
Edward Falk0baab862005-06-02 18:17:13 -0400734
Linus Torvalds1da177e2005-04-16 15:20:36 -0700735/**
736 * ata_std_dev_select - Select device 0/1 on ATA bus
737 * @ap: ATA channel to manipulate
738 * @device: ATA device (numbered from zero) to select
739 *
740 * Use the method defined in the ATA specification to
741 * make either device 0, or device 1, active on the
Edward Falk0baab862005-06-02 18:17:13 -0400742 * ATA channel. Works with both PIO and MMIO.
743 *
744 * May be used as the dev_select() entry in ata_port_operations.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700745 *
746 * LOCKING:
747 * caller.
748 */
749
750void ata_std_dev_select (struct ata_port *ap, unsigned int device)
751{
752 u8 tmp;
753
754 if (device == 0)
755 tmp = ATA_DEVICE_OBS;
756 else
757 tmp = ATA_DEVICE_OBS | ATA_DEV1;
758
759 if (ap->flags & ATA_FLAG_MMIO) {
760 writeb(tmp, (void __iomem *) ap->ioaddr.device_addr);
761 } else {
762 outb(tmp, ap->ioaddr.device_addr);
763 }
764 ata_pause(ap); /* needed; also flushes, for mmio */
765}
766
767/**
768 * ata_dev_select - Select device 0/1 on ATA bus
769 * @ap: ATA channel to manipulate
770 * @device: ATA device (numbered from zero) to select
771 * @wait: non-zero to wait for Status register BSY bit to clear
772 * @can_sleep: non-zero if context allows sleeping
773 *
774 * Use the method defined in the ATA specification to
775 * make either device 0, or device 1, active on the
776 * ATA channel.
777 *
778 * This is a high-level version of ata_std_dev_select(),
779 * which additionally provides the services of inserting
780 * the proper pauses and status polling, where needed.
781 *
782 * LOCKING:
783 * caller.
784 */
785
786void ata_dev_select(struct ata_port *ap, unsigned int device,
787 unsigned int wait, unsigned int can_sleep)
788{
Tejun Heo88574552006-06-25 20:00:35 +0900789 if (ata_msg_probe(ap))
Borislav Petkov0dd4b212006-06-23 02:29:08 -0400790 ata_port_printk(ap, KERN_INFO, "ata_dev_select: ENTER, ata%u: "
Tejun Heo88574552006-06-25 20:00:35 +0900791 "device %u, wait %u\n", ap->id, device, wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792
793 if (wait)
794 ata_wait_idle(ap);
795
796 ap->ops->dev_select(ap, device);
797
798 if (wait) {
799 if (can_sleep && ap->device[device].class == ATA_DEV_ATAPI)
800 msleep(150);
801 ata_wait_idle(ap);
802 }
803}
804
805/**
806 * ata_dump_id - IDENTIFY DEVICE info debugging output
Tejun Heo0bd33002006-02-12 22:47:05 +0900807 * @id: IDENTIFY DEVICE page to dump
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808 *
Tejun Heo0bd33002006-02-12 22:47:05 +0900809 * Dump selected 16-bit words from the given IDENTIFY DEVICE
810 * page.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811 *
812 * LOCKING:
813 * caller.
814 */
815
Tejun Heo0bd33002006-02-12 22:47:05 +0900816static inline void ata_dump_id(const u16 *id)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700817{
818 DPRINTK("49==0x%04x "
819 "53==0x%04x "
820 "63==0x%04x "
821 "64==0x%04x "
822 "75==0x%04x \n",
Tejun Heo0bd33002006-02-12 22:47:05 +0900823 id[49],
824 id[53],
825 id[63],
826 id[64],
827 id[75]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700828 DPRINTK("80==0x%04x "
829 "81==0x%04x "
830 "82==0x%04x "
831 "83==0x%04x "
832 "84==0x%04x \n",
Tejun Heo0bd33002006-02-12 22:47:05 +0900833 id[80],
834 id[81],
835 id[82],
836 id[83],
837 id[84]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700838 DPRINTK("88==0x%04x "
839 "93==0x%04x\n",
Tejun Heo0bd33002006-02-12 22:47:05 +0900840 id[88],
841 id[93]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700842}
843
Tejun Heocb95d562006-03-06 04:31:56 +0900844/**
845 * ata_id_xfermask - Compute xfermask from the given IDENTIFY data
846 * @id: IDENTIFY data to compute xfer mask from
847 *
848 * Compute the xfermask for this device. This is not as trivial
849 * as it seems if we must consider early devices correctly.
850 *
851 * FIXME: pre IDE drive timing (do we care ?).
852 *
853 * LOCKING:
854 * None.
855 *
856 * RETURNS:
857 * Computed xfermask
858 */
859static unsigned int ata_id_xfermask(const u16 *id)
860{
861 unsigned int pio_mask, mwdma_mask, udma_mask;
862
863 /* Usual case. Word 53 indicates word 64 is valid */
864 if (id[ATA_ID_FIELD_VALID] & (1 << 1)) {
865 pio_mask = id[ATA_ID_PIO_MODES] & 0x03;
866 pio_mask <<= 3;
867 pio_mask |= 0x7;
868 } else {
869 /* If word 64 isn't valid then Word 51 high byte holds
870 * the PIO timing number for the maximum. Turn it into
871 * a mask.
872 */
Alan Cox46767aeb2006-09-29 18:26:47 +0100873 u8 mode = id[ATA_ID_OLD_PIO_MODES] & 0xFF;
874 if (mode < 5) /* Valid PIO range */
875 pio_mask = (2 << mode) - 1;
876 else
877 pio_mask = 1;
Tejun Heocb95d562006-03-06 04:31:56 +0900878
879 /* But wait.. there's more. Design your standards by
880 * committee and you too can get a free iordy field to
881 * process. However its the speeds not the modes that
882 * are supported... Note drivers using the timing API
883 * will get this right anyway
884 */
885 }
886
887 mwdma_mask = id[ATA_ID_MWDMA_MODES] & 0x07;
Tejun Heofb21f0d2006-03-12 12:34:35 +0900888
Alan Coxb352e572006-08-10 18:52:12 +0100889 if (ata_id_is_cfa(id)) {
890 /*
891 * Process compact flash extended modes
892 */
893 int pio = id[163] & 0x7;
894 int dma = (id[163] >> 3) & 7;
895
896 if (pio)
897 pio_mask |= (1 << 5);
898 if (pio > 1)
899 pio_mask |= (1 << 6);
900 if (dma)
901 mwdma_mask |= (1 << 3);
902 if (dma > 1)
903 mwdma_mask |= (1 << 4);
904 }
905
Tejun Heofb21f0d2006-03-12 12:34:35 +0900906 udma_mask = 0;
907 if (id[ATA_ID_FIELD_VALID] & (1 << 2))
908 udma_mask = id[ATA_ID_UDMA_MODES] & 0xff;
Tejun Heocb95d562006-03-06 04:31:56 +0900909
910 return ata_pack_xfermask(pio_mask, mwdma_mask, udma_mask);
911}
912
Tejun Heo86e45b62006-03-05 15:29:09 +0900913/**
914 * ata_port_queue_task - Queue port_task
915 * @ap: The ata_port to queue port_task for
Randy Dunlape2a7f772006-05-18 10:50:18 -0700916 * @fn: workqueue function to be scheduled
917 * @data: data value to pass to workqueue function
918 * @delay: delay time for workqueue function
Tejun Heo86e45b62006-03-05 15:29:09 +0900919 *
920 * Schedule @fn(@data) for execution after @delay jiffies using
921 * port_task. There is one port_task per port and it's the
922 * user(low level driver)'s responsibility to make sure that only
923 * one task is active at any given time.
924 *
925 * libata core layer takes care of synchronization between
926 * port_task and EH. ata_port_queue_task() may be ignored for EH
927 * synchronization.
928 *
929 * LOCKING:
930 * Inherited from caller.
931 */
932void ata_port_queue_task(struct ata_port *ap, void (*fn)(void *), void *data,
933 unsigned long delay)
934{
935 int rc;
936
Tejun Heob51e9e52006-06-29 01:29:30 +0900937 if (ap->pflags & ATA_PFLAG_FLUSH_PORT_TASK)
Tejun Heo86e45b62006-03-05 15:29:09 +0900938 return;
939
David Howells52bad642006-11-22 14:54:01 +0000940 PREPARE_DELAYED_WORK(&ap->port_task, fn, data);
Tejun Heo86e45b62006-03-05 15:29:09 +0900941
David Howells52bad642006-11-22 14:54:01 +0000942 rc = queue_delayed_work(ata_wq, &ap->port_task, delay);
Tejun Heo86e45b62006-03-05 15:29:09 +0900943
944 /* rc == 0 means that another user is using port task */
945 WARN_ON(rc == 0);
946}
947
948/**
949 * ata_port_flush_task - Flush port_task
950 * @ap: The ata_port to flush port_task for
951 *
952 * After this function completes, port_task is guranteed not to
953 * be running or scheduled.
954 *
955 * LOCKING:
956 * Kernel thread context (may sleep)
957 */
958void ata_port_flush_task(struct ata_port *ap)
959{
960 unsigned long flags;
961
962 DPRINTK("ENTER\n");
963
Jeff Garzikba6a1302006-06-22 23:46:10 -0400964 spin_lock_irqsave(ap->lock, flags);
Tejun Heob51e9e52006-06-29 01:29:30 +0900965 ap->pflags |= ATA_PFLAG_FLUSH_PORT_TASK;
Jeff Garzikba6a1302006-06-22 23:46:10 -0400966 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo86e45b62006-03-05 15:29:09 +0900967
968 DPRINTK("flush #1\n");
969 flush_workqueue(ata_wq);
970
971 /*
972 * At this point, if a task is running, it's guaranteed to see
973 * the FLUSH flag; thus, it will never queue pio tasks again.
974 * Cancel and flush.
975 */
976 if (!cancel_delayed_work(&ap->port_task)) {
Borislav Petkov0dd4b212006-06-23 02:29:08 -0400977 if (ata_msg_ctl(ap))
Tejun Heo88574552006-06-25 20:00:35 +0900978 ata_port_printk(ap, KERN_DEBUG, "%s: flush #2\n",
979 __FUNCTION__);
Tejun Heo86e45b62006-03-05 15:29:09 +0900980 flush_workqueue(ata_wq);
981 }
982
Jeff Garzikba6a1302006-06-22 23:46:10 -0400983 spin_lock_irqsave(ap->lock, flags);
Tejun Heob51e9e52006-06-29 01:29:30 +0900984 ap->pflags &= ~ATA_PFLAG_FLUSH_PORT_TASK;
Jeff Garzikba6a1302006-06-22 23:46:10 -0400985 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo86e45b62006-03-05 15:29:09 +0900986
Borislav Petkov0dd4b212006-06-23 02:29:08 -0400987 if (ata_msg_ctl(ap))
988 ata_port_printk(ap, KERN_DEBUG, "%s: EXIT\n", __FUNCTION__);
Tejun Heo86e45b62006-03-05 15:29:09 +0900989}
990
Tejun Heo77853bf2006-01-23 13:09:36 +0900991void ata_qc_complete_internal(struct ata_queued_cmd *qc)
Tejun Heoa2a7a662005-12-13 14:48:31 +0900992{
Tejun Heo77853bf2006-01-23 13:09:36 +0900993 struct completion *waiting = qc->private_data;
Tejun Heoa2a7a662005-12-13 14:48:31 +0900994
Tejun Heoa2a7a662005-12-13 14:48:31 +0900995 complete(waiting);
Tejun Heoa2a7a662005-12-13 14:48:31 +0900996}
997
998/**
999 * ata_exec_internal - execute libata internal command
Tejun Heoa2a7a662005-12-13 14:48:31 +09001000 * @dev: Device to which the command is sent
1001 * @tf: Taskfile registers for the command and the result
Tejun Heod69cf372006-04-02 18:51:53 +09001002 * @cdb: CDB for packet command
Tejun Heoa2a7a662005-12-13 14:48:31 +09001003 * @dma_dir: Data tranfer direction of the command
1004 * @buf: Data buffer of the command
1005 * @buflen: Length of data buffer
1006 *
1007 * Executes libata internal command with timeout. @tf contains
1008 * command on entry and result on return. Timeout and error
1009 * conditions are reported via return value. No recovery action
1010 * is taken after a command times out. It's caller's duty to
1011 * clean up after timeout.
1012 *
1013 * LOCKING:
1014 * None. Should be called with kernel context, might sleep.
Tejun Heo551e8882006-06-12 14:09:49 +09001015 *
1016 * RETURNS:
1017 * Zero on success, AC_ERR_* mask on failure
Tejun Heoa2a7a662005-12-13 14:48:31 +09001018 */
Tejun Heo3373efd2006-05-15 20:57:53 +09001019unsigned ata_exec_internal(struct ata_device *dev,
Tejun Heo1ad8e7f2006-04-02 18:51:53 +09001020 struct ata_taskfile *tf, const u8 *cdb,
1021 int dma_dir, void *buf, unsigned int buflen)
Tejun Heoa2a7a662005-12-13 14:48:31 +09001022{
Tejun Heo3373efd2006-05-15 20:57:53 +09001023 struct ata_port *ap = dev->ap;
Tejun Heoa2a7a662005-12-13 14:48:31 +09001024 u8 command = tf->command;
1025 struct ata_queued_cmd *qc;
Tejun Heo2ab7db12006-05-15 20:58:02 +09001026 unsigned int tag, preempted_tag;
Tejun Heodedaf2b2006-05-15 21:03:43 +09001027 u32 preempted_sactive, preempted_qc_active;
Ingo Molnar60be6b92006-07-03 00:25:26 -07001028 DECLARE_COMPLETION_ONSTACK(wait);
Tejun Heoa2a7a662005-12-13 14:48:31 +09001029 unsigned long flags;
Tejun Heo77853bf2006-01-23 13:09:36 +09001030 unsigned int err_mask;
Tejun Heod95a7172006-05-15 20:58:14 +09001031 int rc;
Tejun Heoa2a7a662005-12-13 14:48:31 +09001032
Jeff Garzikba6a1302006-06-22 23:46:10 -04001033 spin_lock_irqsave(ap->lock, flags);
Tejun Heoa2a7a662005-12-13 14:48:31 +09001034
Tejun Heoe3180492006-05-15 20:58:09 +09001035 /* no internal command while frozen */
Tejun Heob51e9e52006-06-29 01:29:30 +09001036 if (ap->pflags & ATA_PFLAG_FROZEN) {
Jeff Garzikba6a1302006-06-22 23:46:10 -04001037 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoe3180492006-05-15 20:58:09 +09001038 return AC_ERR_SYSTEM;
1039 }
1040
Tejun Heo2ab7db12006-05-15 20:58:02 +09001041 /* initialize internal qc */
Tejun Heoa2a7a662005-12-13 14:48:31 +09001042
Tejun Heo2ab7db12006-05-15 20:58:02 +09001043 /* XXX: Tag 0 is used for drivers with legacy EH as some
1044 * drivers choke if any other tag is given. This breaks
1045 * ata_tag_internal() test for those drivers. Don't use new
1046 * EH stuff without converting to it.
1047 */
1048 if (ap->ops->error_handler)
1049 tag = ATA_TAG_INTERNAL;
1050 else
1051 tag = 0;
1052
Tejun Heo6cec4a32006-05-15 21:03:41 +09001053 if (test_and_set_bit(tag, &ap->qc_allocated))
Tejun Heo2ab7db12006-05-15 20:58:02 +09001054 BUG();
Tejun Heof69499f2006-05-15 20:58:03 +09001055 qc = __ata_qc_from_tag(ap, tag);
Tejun Heo2ab7db12006-05-15 20:58:02 +09001056
1057 qc->tag = tag;
1058 qc->scsicmd = NULL;
1059 qc->ap = ap;
1060 qc->dev = dev;
1061 ata_qc_reinit(qc);
1062
1063 preempted_tag = ap->active_tag;
Tejun Heodedaf2b2006-05-15 21:03:43 +09001064 preempted_sactive = ap->sactive;
1065 preempted_qc_active = ap->qc_active;
Tejun Heo2ab7db12006-05-15 20:58:02 +09001066 ap->active_tag = ATA_TAG_POISON;
Tejun Heodedaf2b2006-05-15 21:03:43 +09001067 ap->sactive = 0;
1068 ap->qc_active = 0;
Tejun Heo2ab7db12006-05-15 20:58:02 +09001069
1070 /* prepare & issue qc */
Tejun Heoa2a7a662005-12-13 14:48:31 +09001071 qc->tf = *tf;
Tejun Heod69cf372006-04-02 18:51:53 +09001072 if (cdb)
1073 memcpy(qc->cdb, cdb, ATAPI_CDB_LEN);
Tejun Heoe61e0672006-05-15 20:57:40 +09001074 qc->flags |= ATA_QCFLAG_RESULT_TF;
Tejun Heoa2a7a662005-12-13 14:48:31 +09001075 qc->dma_dir = dma_dir;
1076 if (dma_dir != DMA_NONE) {
1077 ata_sg_init_one(qc, buf, buflen);
1078 qc->nsect = buflen / ATA_SECT_SIZE;
1079 }
1080
Tejun Heo77853bf2006-01-23 13:09:36 +09001081 qc->private_data = &wait;
Tejun Heoa2a7a662005-12-13 14:48:31 +09001082 qc->complete_fn = ata_qc_complete_internal;
1083
Tejun Heo8e0e6942006-03-31 20:41:11 +09001084 ata_qc_issue(qc);
Tejun Heoa2a7a662005-12-13 14:48:31 +09001085
Jeff Garzikba6a1302006-06-22 23:46:10 -04001086 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoa2a7a662005-12-13 14:48:31 +09001087
Andrew Mortona8601e52006-06-25 01:36:52 -07001088 rc = wait_for_completion_timeout(&wait, ata_probe_timeout);
Albert Lee41ade502006-03-14 11:19:04 +08001089
Tejun Heod95a7172006-05-15 20:58:14 +09001090 ata_port_flush_task(ap);
1091
1092 if (!rc) {
Jeff Garzikba6a1302006-06-22 23:46:10 -04001093 spin_lock_irqsave(ap->lock, flags);
Tejun Heoa2a7a662005-12-13 14:48:31 +09001094
1095 /* We're racing with irq here. If we lose, the
1096 * following test prevents us from completing the qc
Tejun Heod95a7172006-05-15 20:58:14 +09001097 * twice. If we win, the port is frozen and will be
1098 * cleaned up by ->post_internal_cmd().
Tejun Heoa2a7a662005-12-13 14:48:31 +09001099 */
Tejun Heo77853bf2006-01-23 13:09:36 +09001100 if (qc->flags & ATA_QCFLAG_ACTIVE) {
Tejun Heod95a7172006-05-15 20:58:14 +09001101 qc->err_mask |= AC_ERR_TIMEOUT;
1102
1103 if (ap->ops->error_handler)
1104 ata_port_freeze(ap);
1105 else
1106 ata_qc_complete(qc);
Tejun Heof15a1da2006-05-15 20:57:56 +09001107
Borislav Petkov0dd4b212006-06-23 02:29:08 -04001108 if (ata_msg_warn(ap))
1109 ata_dev_printk(dev, KERN_WARNING,
Tejun Heo88574552006-06-25 20:00:35 +09001110 "qc timeout (cmd 0x%x)\n", command);
Tejun Heoa2a7a662005-12-13 14:48:31 +09001111 }
1112
Jeff Garzikba6a1302006-06-22 23:46:10 -04001113 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoa2a7a662005-12-13 14:48:31 +09001114 }
1115
Tejun Heod95a7172006-05-15 20:58:14 +09001116 /* do post_internal_cmd */
1117 if (ap->ops->post_internal_cmd)
1118 ap->ops->post_internal_cmd(qc);
1119
1120 if (qc->flags & ATA_QCFLAG_FAILED && !qc->err_mask) {
Borislav Petkov0dd4b212006-06-23 02:29:08 -04001121 if (ata_msg_warn(ap))
Tejun Heo88574552006-06-25 20:00:35 +09001122 ata_dev_printk(dev, KERN_WARNING,
Borislav Petkov0dd4b212006-06-23 02:29:08 -04001123 "zero err_mask for failed "
Tejun Heo88574552006-06-25 20:00:35 +09001124 "internal command, assuming AC_ERR_OTHER\n");
Tejun Heod95a7172006-05-15 20:58:14 +09001125 qc->err_mask |= AC_ERR_OTHER;
1126 }
1127
Tejun Heo15869302006-05-15 20:57:33 +09001128 /* finish up */
Jeff Garzikba6a1302006-06-22 23:46:10 -04001129 spin_lock_irqsave(ap->lock, flags);
Tejun Heo15869302006-05-15 20:57:33 +09001130
Tejun Heoe61e0672006-05-15 20:57:40 +09001131 *tf = qc->result_tf;
Tejun Heo77853bf2006-01-23 13:09:36 +09001132 err_mask = qc->err_mask;
1133
1134 ata_qc_free(qc);
Tejun Heo2ab7db12006-05-15 20:58:02 +09001135 ap->active_tag = preempted_tag;
Tejun Heodedaf2b2006-05-15 21:03:43 +09001136 ap->sactive = preempted_sactive;
1137 ap->qc_active = preempted_qc_active;
Tejun Heo77853bf2006-01-23 13:09:36 +09001138
Tejun Heo1f7dd3e92006-03-24 15:25:30 +09001139 /* XXX - Some LLDDs (sata_mv) disable port on command failure.
1140 * Until those drivers are fixed, we detect the condition
1141 * here, fail the command with AC_ERR_SYSTEM and reenable the
1142 * port.
1143 *
1144 * Note that this doesn't change any behavior as internal
1145 * command failure results in disabling the device in the
1146 * higher layer for LLDDs without new reset/EH callbacks.
1147 *
1148 * Kill the following code as soon as those drivers are fixed.
1149 */
Tejun Heo198e0fe2006-04-02 18:51:52 +09001150 if (ap->flags & ATA_FLAG_DISABLED) {
Tejun Heo1f7dd3e92006-03-24 15:25:30 +09001151 err_mask |= AC_ERR_SYSTEM;
1152 ata_port_probe(ap);
1153 }
1154
Jeff Garzikba6a1302006-06-22 23:46:10 -04001155 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo15869302006-05-15 20:57:33 +09001156
Tejun Heo77853bf2006-01-23 13:09:36 +09001157 return err_mask;
Tejun Heoa2a7a662005-12-13 14:48:31 +09001158}
1159
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160/**
Tejun Heo977e6b92006-06-24 20:30:19 +09001161 * ata_do_simple_cmd - execute simple internal command
1162 * @dev: Device to which the command is sent
1163 * @cmd: Opcode to execute
1164 *
1165 * Execute a 'simple' command, that only consists of the opcode
1166 * 'cmd' itself, without filling any other registers
1167 *
1168 * LOCKING:
1169 * Kernel thread context (may sleep).
1170 *
1171 * RETURNS:
1172 * Zero on success, AC_ERR_* mask on failure
Tejun Heoe58eb582006-06-24 20:30:19 +09001173 */
Tejun Heo77b08fb2006-06-24 20:30:19 +09001174unsigned int ata_do_simple_cmd(struct ata_device *dev, u8 cmd)
Tejun Heoe58eb582006-06-24 20:30:19 +09001175{
1176 struct ata_taskfile tf;
Tejun Heoe58eb582006-06-24 20:30:19 +09001177
1178 ata_tf_init(dev, &tf);
1179
1180 tf.command = cmd;
1181 tf.flags |= ATA_TFLAG_DEVICE;
1182 tf.protocol = ATA_PROT_NODATA;
1183
Tejun Heo977e6b92006-06-24 20:30:19 +09001184 return ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
Tejun Heoe58eb582006-06-24 20:30:19 +09001185}
1186
Linus Torvalds1da177e2005-04-16 15:20:36 -07001187/**
Alan Cox1bc4ccf2006-01-09 17:18:14 +00001188 * ata_pio_need_iordy - check if iordy needed
1189 * @adev: ATA device
1190 *
1191 * Check if the current speed of the device requires IORDY. Used
1192 * by various controllers for chip configuration.
1193 */
1194
1195unsigned int ata_pio_need_iordy(const struct ata_device *adev)
1196{
1197 int pio;
1198 int speed = adev->pio_mode - XFER_PIO_0;
1199
1200 if (speed < 2)
1201 return 0;
1202 if (speed > 2)
1203 return 1;
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001204
Alan Cox1bc4ccf2006-01-09 17:18:14 +00001205 /* If we have no drive specific rule, then PIO 2 is non IORDY */
1206
1207 if (adev->id[ATA_ID_FIELD_VALID] & 2) { /* EIDE */
1208 pio = adev->id[ATA_ID_EIDE_PIO];
1209 /* Is the speed faster than the drive allows non IORDY ? */
1210 if (pio) {
1211 /* This is cycle times not frequency - watch the logic! */
1212 if (pio > 240) /* PIO2 is 240nS per cycle */
1213 return 1;
1214 return 0;
1215 }
1216 }
1217 return 0;
1218}
1219
1220/**
Tejun Heo49016ac2006-02-21 02:12:11 +09001221 * ata_dev_read_id - Read ID data from the specified device
Tejun Heo49016ac2006-02-21 02:12:11 +09001222 * @dev: target device
1223 * @p_class: pointer to class of the target device (may be changed)
1224 * @post_reset: is this read ID post-reset?
Tejun Heofe635c72006-05-15 20:57:35 +09001225 * @id: buffer to read IDENTIFY data into
Tejun Heo49016ac2006-02-21 02:12:11 +09001226 *
1227 * Read ID data from the specified device. ATA_CMD_ID_ATA is
1228 * performed on ATA devices and ATA_CMD_ID_ATAPI on ATAPI
Tejun Heoaec5c3c2006-03-25 01:33:34 +09001229 * devices. This function also issues ATA_CMD_INIT_DEV_PARAMS
1230 * for pre-ATA4 drives.
Tejun Heo49016ac2006-02-21 02:12:11 +09001231 *
1232 * LOCKING:
1233 * Kernel thread context (may sleep)
1234 *
1235 * RETURNS:
1236 * 0 on success, -errno otherwise.
1237 */
Tejun Heoa9beec92006-05-31 18:27:44 +09001238int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
1239 int post_reset, u16 *id)
Tejun Heo49016ac2006-02-21 02:12:11 +09001240{
Tejun Heo3373efd2006-05-15 20:57:53 +09001241 struct ata_port *ap = dev->ap;
Tejun Heo49016ac2006-02-21 02:12:11 +09001242 unsigned int class = *p_class;
Tejun Heo49016ac2006-02-21 02:12:11 +09001243 struct ata_taskfile tf;
1244 unsigned int err_mask = 0;
1245 const char *reason;
1246 int rc;
1247
Borislav Petkov0dd4b212006-06-23 02:29:08 -04001248 if (ata_msg_ctl(ap))
Tejun Heo88574552006-06-25 20:00:35 +09001249 ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER, host %u, dev %u\n",
1250 __FUNCTION__, ap->id, dev->devno);
Tejun Heo49016ac2006-02-21 02:12:11 +09001251
Tejun Heo49016ac2006-02-21 02:12:11 +09001252 ata_dev_select(ap, dev->devno, 1, 1); /* select device 0/1 */
1253
1254 retry:
Tejun Heo3373efd2006-05-15 20:57:53 +09001255 ata_tf_init(dev, &tf);
Tejun Heo49016ac2006-02-21 02:12:11 +09001256
1257 switch (class) {
1258 case ATA_DEV_ATA:
1259 tf.command = ATA_CMD_ID_ATA;
1260 break;
1261 case ATA_DEV_ATAPI:
1262 tf.command = ATA_CMD_ID_ATAPI;
1263 break;
1264 default:
1265 rc = -ENODEV;
1266 reason = "unsupported class";
1267 goto err_out;
1268 }
1269
1270 tf.protocol = ATA_PROT_PIO;
1271
Tejun Heo3373efd2006-05-15 20:57:53 +09001272 err_mask = ata_exec_internal(dev, &tf, NULL, DMA_FROM_DEVICE,
Tejun Heo49016ac2006-02-21 02:12:11 +09001273 id, sizeof(id[0]) * ATA_ID_WORDS);
Tejun Heo49016ac2006-02-21 02:12:11 +09001274 if (err_mask) {
1275 rc = -EIO;
1276 reason = "I/O error";
Tejun Heo49016ac2006-02-21 02:12:11 +09001277 goto err_out;
1278 }
1279
1280 swap_buf_le16(id, ATA_ID_WORDS);
1281
Tejun Heo49016ac2006-02-21 02:12:11 +09001282 /* sanity check */
Tejun Heoa4f57492006-09-12 20:35:49 -07001283 rc = -EINVAL;
1284 reason = "device reports illegal type";
1285
1286 if (class == ATA_DEV_ATA) {
1287 if (!ata_id_is_ata(id) && !ata_id_is_cfa(id))
1288 goto err_out;
1289 } else {
1290 if (ata_id_is_ata(id))
1291 goto err_out;
Tejun Heo49016ac2006-02-21 02:12:11 +09001292 }
1293
1294 if (post_reset && class == ATA_DEV_ATA) {
1295 /*
1296 * The exact sequence expected by certain pre-ATA4 drives is:
1297 * SRST RESET
1298 * IDENTIFY
1299 * INITIALIZE DEVICE PARAMETERS
1300 * anything else..
1301 * Some drives were very specific about that exact sequence.
1302 */
1303 if (ata_id_major_version(id) < 4 || !ata_id_has_lba(id)) {
Tejun Heo3373efd2006-05-15 20:57:53 +09001304 err_mask = ata_dev_init_params(dev, id[3], id[6]);
Tejun Heo49016ac2006-02-21 02:12:11 +09001305 if (err_mask) {
1306 rc = -EIO;
1307 reason = "INIT_DEV_PARAMS failed";
1308 goto err_out;
1309 }
1310
1311 /* current CHS translation info (id[53-58]) might be
1312 * changed. reread the identify device info.
1313 */
1314 post_reset = 0;
1315 goto retry;
1316 }
1317 }
1318
1319 *p_class = class;
Tejun Heofe635c72006-05-15 20:57:35 +09001320
Tejun Heo49016ac2006-02-21 02:12:11 +09001321 return 0;
1322
1323 err_out:
Tejun Heo88574552006-06-25 20:00:35 +09001324 if (ata_msg_warn(ap))
Borislav Petkov0dd4b212006-06-23 02:29:08 -04001325 ata_dev_printk(dev, KERN_WARNING, "failed to IDENTIFY "
Tejun Heo88574552006-06-25 20:00:35 +09001326 "(%s, err_mask=0x%x)\n", reason, err_mask);
Tejun Heo49016ac2006-02-21 02:12:11 +09001327 return rc;
1328}
1329
Tejun Heo3373efd2006-05-15 20:57:53 +09001330static inline u8 ata_dev_knobble(struct ata_device *dev)
Tejun Heo4b2f3ed2006-03-01 16:09:36 +09001331{
Tejun Heo3373efd2006-05-15 20:57:53 +09001332 return ((dev->ap->cbl == ATA_CBL_SATA) && (!ata_id_is_sata(dev->id)));
Tejun Heo4b2f3ed2006-03-01 16:09:36 +09001333}
1334
Tejun Heoa6e6ce82006-05-15 21:03:48 +09001335static void ata_dev_config_ncq(struct ata_device *dev,
1336 char *desc, size_t desc_sz)
1337{
1338 struct ata_port *ap = dev->ap;
1339 int hdepth = 0, ddepth = ata_id_queue_depth(dev->id);
1340
1341 if (!ata_id_has_ncq(dev->id)) {
1342 desc[0] = '\0';
1343 return;
1344 }
1345
1346 if (ap->flags & ATA_FLAG_NCQ) {
Jeff Garzikcca39742006-08-24 03:19:22 -04001347 hdepth = min(ap->scsi_host->can_queue, ATA_MAX_QUEUE - 1);
Tejun Heoa6e6ce82006-05-15 21:03:48 +09001348 dev->flags |= ATA_DFLAG_NCQ;
1349 }
1350
1351 if (hdepth >= ddepth)
1352 snprintf(desc, desc_sz, "NCQ (depth %d)", ddepth);
1353 else
1354 snprintf(desc, desc_sz, "NCQ (depth %d/%d)", hdepth, ddepth);
1355}
1356
Brian Kinge6d902a2006-06-28 08:30:31 -05001357static void ata_set_port_max_cmd_len(struct ata_port *ap)
1358{
1359 int i;
1360
Jeff Garzikcca39742006-08-24 03:19:22 -04001361 if (ap->scsi_host) {
1362 unsigned int len = 0;
1363
Brian Kinge6d902a2006-06-28 08:30:31 -05001364 for (i = 0; i < ATA_MAX_DEVICES; i++)
Jeff Garzikcca39742006-08-24 03:19:22 -04001365 len = max(len, ap->device[i].cdb_len);
1366
1367 ap->scsi_host->max_cmd_len = len;
Brian Kinge6d902a2006-06-28 08:30:31 -05001368 }
1369}
1370
Tejun Heo49016ac2006-02-21 02:12:11 +09001371/**
Tejun Heoffeae412006-03-01 16:09:35 +09001372 * ata_dev_configure - Configure the specified ATA/ATAPI device
Tejun Heoffeae412006-03-01 16:09:35 +09001373 * @dev: Target device to configure
Tejun Heo4c2d7212006-03-05 17:55:58 +09001374 * @print_info: Enable device info printout
Linus Torvalds1da177e2005-04-16 15:20:36 -07001375 *
Tejun Heoffeae412006-03-01 16:09:35 +09001376 * Configure @dev according to @dev->id. Generic and low-level
1377 * driver specific fixups are also applied.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001378 *
1379 * LOCKING:
Tejun Heoffeae412006-03-01 16:09:35 +09001380 * Kernel thread context (may sleep)
1381 *
1382 * RETURNS:
1383 * 0 on success, -errno otherwise
Linus Torvalds1da177e2005-04-16 15:20:36 -07001384 */
Tejun Heoa9beec92006-05-31 18:27:44 +09001385int ata_dev_configure(struct ata_device *dev, int print_info)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001386{
Tejun Heo3373efd2006-05-15 20:57:53 +09001387 struct ata_port *ap = dev->ap;
Tejun Heo1148c3a2006-03-13 19:48:04 +09001388 const u16 *id = dev->id;
Tejun Heoff8854b2006-03-06 04:31:56 +09001389 unsigned int xfer_mask;
Alan Coxb352e572006-08-10 18:52:12 +01001390 char revbuf[7]; /* XYZ-99\0 */
Brian Kinge6d902a2006-06-28 08:30:31 -05001391 int rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001392
Borislav Petkov0dd4b212006-06-23 02:29:08 -04001393 if (!ata_dev_enabled(dev) && ata_msg_info(ap)) {
Tejun Heo88574552006-06-25 20:00:35 +09001394 ata_dev_printk(dev, KERN_INFO,
1395 "%s: ENTER/EXIT (host %u, dev %u) -- nodev\n",
1396 __FUNCTION__, ap->id, dev->devno);
Tejun Heoffeae412006-03-01 16:09:35 +09001397 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001398 }
1399
Borislav Petkov0dd4b212006-06-23 02:29:08 -04001400 if (ata_msg_probe(ap))
Tejun Heo88574552006-06-25 20:00:35 +09001401 ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER, host %u, dev %u\n",
1402 __FUNCTION__, ap->id, dev->devno);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001403
Tejun Heoc39f5eb2006-03-13 19:51:19 +09001404 /* print device capabilities */
Borislav Petkov0dd4b212006-06-23 02:29:08 -04001405 if (ata_msg_probe(ap))
Tejun Heo88574552006-06-25 20:00:35 +09001406 ata_dev_printk(dev, KERN_DEBUG,
1407 "%s: cfg 49:%04x 82:%04x 83:%04x 84:%04x "
1408 "85:%04x 86:%04x 87:%04x 88:%04x\n",
Borislav Petkov0dd4b212006-06-23 02:29:08 -04001409 __FUNCTION__,
Tejun Heof15a1da2006-05-15 20:57:56 +09001410 id[49], id[82], id[83], id[84],
1411 id[85], id[86], id[87], id[88]);
Tejun Heoc39f5eb2006-03-13 19:51:19 +09001412
Tejun Heo208a9932006-03-05 17:55:58 +09001413 /* initialize to-be-configured parameters */
Tejun Heoea1dd4e2006-04-02 18:51:53 +09001414 dev->flags &= ~ATA_DFLAG_CFG_MASK;
Tejun Heo208a9932006-03-05 17:55:58 +09001415 dev->max_sectors = 0;
1416 dev->cdb_len = 0;
1417 dev->n_sectors = 0;
1418 dev->cylinders = 0;
1419 dev->heads = 0;
1420 dev->sectors = 0;
1421
Linus Torvalds1da177e2005-04-16 15:20:36 -07001422 /*
1423 * common ATA, ATAPI feature tests
1424 */
1425
Tejun Heoff8854b2006-03-06 04:31:56 +09001426 /* find max transfer mode; for printk only */
Tejun Heo1148c3a2006-03-13 19:48:04 +09001427 xfer_mask = ata_id_xfermask(id);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001428
Borislav Petkov0dd4b212006-06-23 02:29:08 -04001429 if (ata_msg_probe(ap))
1430 ata_dump_id(id);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001431
1432 /* ATA-specific feature tests */
1433 if (dev->class == ATA_DEV_ATA) {
Alan Coxb352e572006-08-10 18:52:12 +01001434 if (ata_id_is_cfa(id)) {
1435 if (id[162] & 1) /* CPRM may make this media unusable */
1436 ata_dev_printk(dev, KERN_WARNING, "ata%u: device %u supports DRM functions and may not be fully accessable.\n",
1437 ap->id, dev->devno);
1438 snprintf(revbuf, 7, "CFA");
1439 }
1440 else
1441 snprintf(revbuf, 7, "ATA-%d", ata_id_major_version(id));
1442
Tejun Heo1148c3a2006-03-13 19:48:04 +09001443 dev->n_sectors = ata_id_n_sectors(id);
Tejun Heo29407402006-02-12 22:47:04 +09001444
Tejun Heo1148c3a2006-03-13 19:48:04 +09001445 if (ata_id_has_lba(id)) {
Tejun Heo4c2d7212006-03-05 17:55:58 +09001446 const char *lba_desc;
Tejun Heoa6e6ce82006-05-15 21:03:48 +09001447 char ncq_desc[20];
Albert Lee8bf62ece2005-05-12 15:29:42 -04001448
Tejun Heo4c2d7212006-03-05 17:55:58 +09001449 lba_desc = "LBA";
1450 dev->flags |= ATA_DFLAG_LBA;
Tejun Heo1148c3a2006-03-13 19:48:04 +09001451 if (ata_id_has_lba48(id)) {
Albert Lee8bf62ece2005-05-12 15:29:42 -04001452 dev->flags |= ATA_DFLAG_LBA48;
Tejun Heo4c2d7212006-03-05 17:55:58 +09001453 lba_desc = "LBA48";
1454 }
Albert Lee8bf62ece2005-05-12 15:29:42 -04001455
Tejun Heoa6e6ce82006-05-15 21:03:48 +09001456 /* config NCQ */
1457 ata_dev_config_ncq(dev, ncq_desc, sizeof(ncq_desc));
1458
Albert Lee8bf62ece2005-05-12 15:29:42 -04001459 /* print device info to dmesg */
Borislav Petkov5afc8142006-06-27 14:51:25 +02001460 if (ata_msg_drv(ap) && print_info)
Alan Coxb352e572006-08-10 18:52:12 +01001461 ata_dev_printk(dev, KERN_INFO, "%s, "
Tejun Heoa6e6ce82006-05-15 21:03:48 +09001462 "max %s, %Lu sectors: %s %s\n",
Alan Coxb352e572006-08-10 18:52:12 +01001463 revbuf,
Tejun Heof15a1da2006-05-15 20:57:56 +09001464 ata_mode_string(xfer_mask),
1465 (unsigned long long)dev->n_sectors,
Tejun Heoa6e6ce82006-05-15 21:03:48 +09001466 lba_desc, ncq_desc);
Tejun Heoffeae412006-03-01 16:09:35 +09001467 } else {
Albert Lee8bf62ece2005-05-12 15:29:42 -04001468 /* CHS */
1469
1470 /* Default translation */
Tejun Heo1148c3a2006-03-13 19:48:04 +09001471 dev->cylinders = id[1];
1472 dev->heads = id[3];
1473 dev->sectors = id[6];
Albert Lee8bf62ece2005-05-12 15:29:42 -04001474
Tejun Heo1148c3a2006-03-13 19:48:04 +09001475 if (ata_id_current_chs_valid(id)) {
Albert Lee8bf62ece2005-05-12 15:29:42 -04001476 /* Current CHS translation is valid. */
Tejun Heo1148c3a2006-03-13 19:48:04 +09001477 dev->cylinders = id[54];
1478 dev->heads = id[55];
1479 dev->sectors = id[56];
Albert Lee8bf62ece2005-05-12 15:29:42 -04001480 }
1481
1482 /* print device info to dmesg */
Borislav Petkov5afc8142006-06-27 14:51:25 +02001483 if (ata_msg_drv(ap) && print_info)
Alan Coxb352e572006-08-10 18:52:12 +01001484 ata_dev_printk(dev, KERN_INFO, "%s, "
Tejun Heof15a1da2006-05-15 20:57:56 +09001485 "max %s, %Lu sectors: CHS %u/%u/%u\n",
Alan Coxb352e572006-08-10 18:52:12 +01001486 revbuf,
Tejun Heof15a1da2006-05-15 20:57:56 +09001487 ata_mode_string(xfer_mask),
1488 (unsigned long long)dev->n_sectors,
Tejun Heo88574552006-06-25 20:00:35 +09001489 dev->cylinders, dev->heads,
1490 dev->sectors);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001491 }
1492
Albert Lee07f6f7d2005-11-01 19:33:20 +08001493 if (dev->id[59] & 0x100) {
1494 dev->multi_count = dev->id[59] & 0xff;
Borislav Petkov5afc8142006-06-27 14:51:25 +02001495 if (ata_msg_drv(ap) && print_info)
Tejun Heo88574552006-06-25 20:00:35 +09001496 ata_dev_printk(dev, KERN_INFO,
1497 "ata%u: dev %u multi count %u\n",
1498 ap->id, dev->devno, dev->multi_count);
Albert Lee07f6f7d2005-11-01 19:33:20 +08001499 }
1500
Tejun Heo6e7846e2006-02-12 23:32:58 +09001501 dev->cdb_len = 16;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001502 }
1503
1504 /* ATAPI-specific feature tests */
Jeff Garzik2c13b7c2005-11-14 14:14:16 -05001505 else if (dev->class == ATA_DEV_ATAPI) {
Albert Lee08a556d2006-03-31 13:29:04 +08001506 char *cdb_intr_string = "";
1507
Tejun Heo1148c3a2006-03-13 19:48:04 +09001508 rc = atapi_cdb_len(id);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001509 if ((rc < 12) || (rc > ATAPI_CDB_LEN)) {
Borislav Petkov0dd4b212006-06-23 02:29:08 -04001510 if (ata_msg_warn(ap))
Tejun Heo88574552006-06-25 20:00:35 +09001511 ata_dev_printk(dev, KERN_WARNING,
1512 "unsupported CDB len\n");
Tejun Heoffeae412006-03-01 16:09:35 +09001513 rc = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001514 goto err_out_nosup;
1515 }
Tejun Heo6e7846e2006-02-12 23:32:58 +09001516 dev->cdb_len = (unsigned int) rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001517
Albert Lee08a556d2006-03-31 13:29:04 +08001518 if (ata_id_cdb_intr(dev->id)) {
Albert Lee312f7da2005-09-27 17:38:03 +08001519 dev->flags |= ATA_DFLAG_CDB_INTR;
Albert Lee08a556d2006-03-31 13:29:04 +08001520 cdb_intr_string = ", CDB intr";
1521 }
Albert Lee312f7da2005-09-27 17:38:03 +08001522
Linus Torvalds1da177e2005-04-16 15:20:36 -07001523 /* print device info to dmesg */
Borislav Petkov5afc8142006-06-27 14:51:25 +02001524 if (ata_msg_drv(ap) && print_info)
Tejun Heo12436c32006-05-15 20:59:15 +09001525 ata_dev_printk(dev, KERN_INFO, "ATAPI, max %s%s\n",
1526 ata_mode_string(xfer_mask),
1527 cdb_intr_string);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001528 }
1529
Alan Cox93590852006-09-12 16:55:12 +01001530 if (dev->horkage & ATA_HORKAGE_DIAGNOSTIC) {
1531 /* Let the user know. We don't want to disallow opens for
1532 rescue purposes, or in case the vendor is just a blithering
1533 idiot */
1534 if (print_info) {
1535 ata_dev_printk(dev, KERN_WARNING,
1536"Drive reports diagnostics failure. This may indicate a drive\n");
1537 ata_dev_printk(dev, KERN_WARNING,
1538"fault or invalid emulation. Contact drive vendor for information.\n");
1539 }
1540 }
1541
Brian Kinge6d902a2006-06-28 08:30:31 -05001542 ata_set_port_max_cmd_len(ap);
Tejun Heo6e7846e2006-02-12 23:32:58 +09001543
Tejun Heo4b2f3ed2006-03-01 16:09:36 +09001544 /* limit bridge transfers to udma5, 200 sectors */
Tejun Heo3373efd2006-05-15 20:57:53 +09001545 if (ata_dev_knobble(dev)) {
Borislav Petkov5afc8142006-06-27 14:51:25 +02001546 if (ata_msg_drv(ap) && print_info)
Tejun Heof15a1da2006-05-15 20:57:56 +09001547 ata_dev_printk(dev, KERN_INFO,
1548 "applying bridge limits\n");
Tejun Heo5a529132006-03-24 14:07:50 +09001549 dev->udma_mask &= ATA_UDMA5;
Tejun Heo4b2f3ed2006-03-01 16:09:36 +09001550 dev->max_sectors = ATA_MAX_SECTORS;
1551 }
1552
1553 if (ap->ops->dev_config)
1554 ap->ops->dev_config(ap, dev);
1555
Borislav Petkov0dd4b212006-06-23 02:29:08 -04001556 if (ata_msg_probe(ap))
1557 ata_dev_printk(dev, KERN_DEBUG, "%s: EXIT, drv_stat = 0x%x\n",
1558 __FUNCTION__, ata_chk_status(ap));
Tejun Heoffeae412006-03-01 16:09:35 +09001559 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001560
1561err_out_nosup:
Borislav Petkov0dd4b212006-06-23 02:29:08 -04001562 if (ata_msg_probe(ap))
Tejun Heo88574552006-06-25 20:00:35 +09001563 ata_dev_printk(dev, KERN_DEBUG,
1564 "%s: EXIT, err\n", __FUNCTION__);
Tejun Heoffeae412006-03-01 16:09:35 +09001565 return rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001566}
1567
1568/**
1569 * ata_bus_probe - Reset and probe ATA bus
1570 * @ap: Bus to probe
1571 *
Jeff Garzik0cba6322005-05-30 19:49:12 -04001572 * Master ATA bus probing function. Initiates a hardware-dependent
1573 * bus reset, then attempts to identify any devices found on
1574 * the bus.
1575 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001576 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04001577 * PCI/etc. bus probe sem.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001578 *
1579 * RETURNS:
Tejun Heo96072e62006-04-01 01:38:17 +09001580 * Zero on success, negative errno otherwise.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001581 */
1582
Brian King80289162006-08-07 14:27:31 -05001583int ata_bus_probe(struct ata_port *ap)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001584{
Tejun Heo28ca5c52006-03-01 16:09:36 +09001585 unsigned int classes[ATA_MAX_DEVICES];
Tejun Heo14d2bac2006-04-02 17:54:46 +09001586 int tries[ATA_MAX_DEVICES];
1587 int i, rc, down_xfermask;
Tejun Heoe82cbdb2006-04-01 01:38:18 +09001588 struct ata_device *dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001589
Tejun Heo28ca5c52006-03-01 16:09:36 +09001590 ata_port_probe(ap);
1591
Tejun Heo14d2bac2006-04-02 17:54:46 +09001592 for (i = 0; i < ATA_MAX_DEVICES; i++)
1593 tries[i] = ATA_PROBE_MAX_TRIES;
1594
1595 retry:
1596 down_xfermask = 0;
1597
Tejun Heo20444702006-03-13 01:57:01 +09001598 /* reset and determine device classes */
Tejun Heo52783c52006-05-31 18:28:22 +09001599 ap->ops->phy_reset(ap);
Tejun Heo2061a472006-03-12 00:57:39 +09001600
Tejun Heo52783c52006-05-31 18:28:22 +09001601 for (i = 0; i < ATA_MAX_DEVICES; i++) {
1602 dev = &ap->device[i];
Tejun Heoc19ba8a2006-01-24 17:05:22 +09001603
Tejun Heo52783c52006-05-31 18:28:22 +09001604 if (!(ap->flags & ATA_FLAG_DISABLED) &&
1605 dev->class != ATA_DEV_UNKNOWN)
1606 classes[dev->devno] = dev->class;
1607 else
1608 classes[dev->devno] = ATA_DEV_NONE;
Tejun Heo20444702006-03-13 01:57:01 +09001609
Tejun Heo52783c52006-05-31 18:28:22 +09001610 dev->class = ATA_DEV_UNKNOWN;
Tejun Heo28ca5c52006-03-01 16:09:36 +09001611 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001612
Tejun Heo52783c52006-05-31 18:28:22 +09001613 ata_port_probe(ap);
Tejun Heo20444702006-03-13 01:57:01 +09001614
Alan Coxb6079ca2006-05-22 16:52:06 +01001615 /* after the reset the device state is PIO 0 and the controller
1616 state is undefined. Record the mode */
1617
1618 for (i = 0; i < ATA_MAX_DEVICES; i++)
1619 ap->device[i].pio_mode = XFER_PIO_0;
1620
Tejun Heo28ca5c52006-03-01 16:09:36 +09001621 /* read IDENTIFY page and configure devices */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001622 for (i = 0; i < ATA_MAX_DEVICES; i++) {
Tejun Heoe82cbdb2006-04-01 01:38:18 +09001623 dev = &ap->device[i];
Tejun Heo28ca5c52006-03-01 16:09:36 +09001624
Tejun Heoec573752006-04-11 22:26:29 +09001625 if (tries[i])
1626 dev->class = classes[i];
Tejun Heo14d2bac2006-04-02 17:54:46 +09001627
Tejun Heoe1211e32006-04-01 01:38:18 +09001628 if (!ata_dev_enabled(dev))
Tejun Heoffeae412006-03-01 16:09:35 +09001629 continue;
1630
Tejun Heo3373efd2006-05-15 20:57:53 +09001631 rc = ata_dev_read_id(dev, &dev->class, 1, dev->id);
Tejun Heo14d2bac2006-04-02 17:54:46 +09001632 if (rc)
1633 goto fail;
Tejun Heoffeae412006-03-01 16:09:35 +09001634
Tejun Heo3373efd2006-05-15 20:57:53 +09001635 rc = ata_dev_configure(dev, 1);
Tejun Heo14d2bac2006-04-02 17:54:46 +09001636 if (rc)
1637 goto fail;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001638 }
1639
Tejun Heoe82cbdb2006-04-01 01:38:18 +09001640 /* configure transfer mode */
Tejun Heo3adcebb2006-05-15 20:57:37 +09001641 rc = ata_set_mode(ap, &dev);
Tejun Heo51713d32006-04-11 22:26:29 +09001642 if (rc) {
1643 down_xfermask = 1;
1644 goto fail;
Tejun Heoe82cbdb2006-04-01 01:38:18 +09001645 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001646
Tejun Heoe82cbdb2006-04-01 01:38:18 +09001647 for (i = 0; i < ATA_MAX_DEVICES; i++)
1648 if (ata_dev_enabled(&ap->device[i]))
1649 return 0;
Alan Coxe35a9e02006-03-27 18:46:37 +01001650
Tejun Heoe82cbdb2006-04-01 01:38:18 +09001651 /* no device present, disable port */
1652 ata_port_disable(ap);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001653 ap->ops->port_disable(ap);
Tejun Heo96072e62006-04-01 01:38:17 +09001654 return -ENODEV;
Tejun Heo14d2bac2006-04-02 17:54:46 +09001655
1656 fail:
1657 switch (rc) {
1658 case -EINVAL:
1659 case -ENODEV:
1660 tries[dev->devno] = 0;
1661 break;
1662 case -EIO:
Tejun Heo3c567b72006-05-15 20:57:23 +09001663 sata_down_spd_limit(ap);
Tejun Heo14d2bac2006-04-02 17:54:46 +09001664 /* fall through */
1665 default:
1666 tries[dev->devno]--;
1667 if (down_xfermask &&
Tejun Heo3373efd2006-05-15 20:57:53 +09001668 ata_down_xfermask_limit(dev, tries[dev->devno] == 1))
Tejun Heo14d2bac2006-04-02 17:54:46 +09001669 tries[dev->devno] = 0;
1670 }
1671
Tejun Heoec573752006-04-11 22:26:29 +09001672 if (!tries[dev->devno]) {
Tejun Heo3373efd2006-05-15 20:57:53 +09001673 ata_down_xfermask_limit(dev, 1);
1674 ata_dev_disable(dev);
Tejun Heoec573752006-04-11 22:26:29 +09001675 }
1676
Tejun Heo14d2bac2006-04-02 17:54:46 +09001677 goto retry;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001678}
1679
1680/**
Jeff Garzik0cba6322005-05-30 19:49:12 -04001681 * ata_port_probe - Mark port as enabled
1682 * @ap: Port for which we indicate enablement
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683 *
Jeff Garzik0cba6322005-05-30 19:49:12 -04001684 * Modify @ap data structure such that the system
1685 * thinks that the entire port is enabled.
1686 *
Jeff Garzikcca39742006-08-24 03:19:22 -04001687 * LOCKING: host lock, or some other form of
Jeff Garzik0cba6322005-05-30 19:49:12 -04001688 * serialization.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001689 */
1690
1691void ata_port_probe(struct ata_port *ap)
1692{
Tejun Heo198e0fe2006-04-02 18:51:52 +09001693 ap->flags &= ~ATA_FLAG_DISABLED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001694}
1695
1696/**
Tejun Heo3be680b2005-12-19 22:35:02 +09001697 * sata_print_link_status - Print SATA link status
1698 * @ap: SATA port to printk link status about
1699 *
1700 * This function prints link speed and status of a SATA link.
1701 *
1702 * LOCKING:
1703 * None.
1704 */
1705static void sata_print_link_status(struct ata_port *ap)
1706{
Tejun Heo6d5f9732006-04-03 00:09:41 +09001707 u32 sstatus, scontrol, tmp;
Tejun Heo3be680b2005-12-19 22:35:02 +09001708
Tejun Heo81952c52006-05-15 20:57:47 +09001709 if (sata_scr_read(ap, SCR_STATUS, &sstatus))
Tejun Heo3be680b2005-12-19 22:35:02 +09001710 return;
Tejun Heo81952c52006-05-15 20:57:47 +09001711 sata_scr_read(ap, SCR_CONTROL, &scontrol);
Tejun Heo3be680b2005-12-19 22:35:02 +09001712
Tejun Heo81952c52006-05-15 20:57:47 +09001713 if (ata_port_online(ap)) {
Tejun Heo3be680b2005-12-19 22:35:02 +09001714 tmp = (sstatus >> 4) & 0xf;
Tejun Heof15a1da2006-05-15 20:57:56 +09001715 ata_port_printk(ap, KERN_INFO,
1716 "SATA link up %s (SStatus %X SControl %X)\n",
1717 sata_spd_string(tmp), sstatus, scontrol);
Tejun Heo3be680b2005-12-19 22:35:02 +09001718 } else {
Tejun Heof15a1da2006-05-15 20:57:56 +09001719 ata_port_printk(ap, KERN_INFO,
1720 "SATA link down (SStatus %X SControl %X)\n",
1721 sstatus, scontrol);
Tejun Heo3be680b2005-12-19 22:35:02 +09001722 }
1723}
1724
1725/**
Jeff Garzik780a87f2005-05-30 15:41:05 -04001726 * __sata_phy_reset - Wake/reset a low-level SATA PHY
1727 * @ap: SATA port associated with target SATA PHY.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001728 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04001729 * This function issues commands to standard SATA Sxxx
1730 * PHY registers, to wake up the phy (and device), and
1731 * clear any reset condition.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001732 *
1733 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04001734 * PCI/etc. bus probe sem.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001735 *
1736 */
1737void __sata_phy_reset(struct ata_port *ap)
1738{
1739 u32 sstatus;
1740 unsigned long timeout = jiffies + (HZ * 5);
1741
1742 if (ap->flags & ATA_FLAG_SATA_RESET) {
Brett Russcdcca89e2005-03-28 15:10:27 -05001743 /* issue phy wake/reset */
Tejun Heo81952c52006-05-15 20:57:47 +09001744 sata_scr_write_flush(ap, SCR_CONTROL, 0x301);
Tejun Heo62ba2842005-06-26 23:27:19 +09001745 /* Couldn't find anything in SATA I/II specs, but
1746 * AHCI-1.1 10.4.2 says at least 1 ms. */
1747 mdelay(1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001748 }
Tejun Heo81952c52006-05-15 20:57:47 +09001749 /* phy wake/clear reset */
1750 sata_scr_write_flush(ap, SCR_CONTROL, 0x300);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751
1752 /* wait for phy to become ready, if necessary */
1753 do {
1754 msleep(200);
Tejun Heo81952c52006-05-15 20:57:47 +09001755 sata_scr_read(ap, SCR_STATUS, &sstatus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001756 if ((sstatus & 0xf) != 1)
1757 break;
1758 } while (time_before(jiffies, timeout));
1759
Tejun Heo3be680b2005-12-19 22:35:02 +09001760 /* print link status */
1761 sata_print_link_status(ap);
Jeff Garzik656563e2005-11-20 03:36:45 -05001762
Tejun Heo3be680b2005-12-19 22:35:02 +09001763 /* TODO: phy layer with polling, timeouts, etc. */
Tejun Heo81952c52006-05-15 20:57:47 +09001764 if (!ata_port_offline(ap))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001765 ata_port_probe(ap);
Tejun Heo3be680b2005-12-19 22:35:02 +09001766 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001767 ata_port_disable(ap);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001768
Tejun Heo198e0fe2006-04-02 18:51:52 +09001769 if (ap->flags & ATA_FLAG_DISABLED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001770 return;
1771
1772 if (ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT)) {
1773 ata_port_disable(ap);
1774 return;
1775 }
1776
1777 ap->cbl = ATA_CBL_SATA;
1778}
1779
1780/**
Jeff Garzik780a87f2005-05-30 15:41:05 -04001781 * sata_phy_reset - Reset SATA bus.
1782 * @ap: SATA port associated with target SATA PHY.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001783 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04001784 * This function resets the SATA bus, and then probes
1785 * the bus for devices.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001786 *
1787 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04001788 * PCI/etc. bus probe sem.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001789 *
1790 */
1791void sata_phy_reset(struct ata_port *ap)
1792{
1793 __sata_phy_reset(ap);
Tejun Heo198e0fe2006-04-02 18:51:52 +09001794 if (ap->flags & ATA_FLAG_DISABLED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001795 return;
1796 ata_bus_reset(ap);
1797}
1798
1799/**
Alan Coxebdfca62006-03-23 15:38:34 +00001800 * ata_dev_pair - return other device on cable
Alan Coxebdfca62006-03-23 15:38:34 +00001801 * @adev: device
1802 *
1803 * Obtain the other device on the same cable, or if none is
1804 * present NULL is returned
1805 */
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001806
Tejun Heo3373efd2006-05-15 20:57:53 +09001807struct ata_device *ata_dev_pair(struct ata_device *adev)
Alan Coxebdfca62006-03-23 15:38:34 +00001808{
Tejun Heo3373efd2006-05-15 20:57:53 +09001809 struct ata_port *ap = adev->ap;
Alan Coxebdfca62006-03-23 15:38:34 +00001810 struct ata_device *pair = &ap->device[1 - adev->devno];
Tejun Heoe1211e32006-04-01 01:38:18 +09001811 if (!ata_dev_enabled(pair))
Alan Coxebdfca62006-03-23 15:38:34 +00001812 return NULL;
1813 return pair;
1814}
1815
1816/**
Jeff Garzik780a87f2005-05-30 15:41:05 -04001817 * ata_port_disable - Disable port.
1818 * @ap: Port to be disabled.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001819 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04001820 * Modify @ap data structure such that the system
1821 * thinks that the entire port is disabled, and should
1822 * never attempt to probe or communicate with devices
1823 * on this port.
1824 *
Jeff Garzikcca39742006-08-24 03:19:22 -04001825 * LOCKING: host lock, or some other form of
Jeff Garzik780a87f2005-05-30 15:41:05 -04001826 * serialization.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001827 */
1828
1829void ata_port_disable(struct ata_port *ap)
1830{
1831 ap->device[0].class = ATA_DEV_NONE;
1832 ap->device[1].class = ATA_DEV_NONE;
Tejun Heo198e0fe2006-04-02 18:51:52 +09001833 ap->flags |= ATA_FLAG_DISABLED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001834}
1835
Tejun Heo1c3fae42006-04-02 20:53:28 +09001836/**
Tejun Heo3c567b72006-05-15 20:57:23 +09001837 * sata_down_spd_limit - adjust SATA spd limit downward
Tejun Heo1c3fae42006-04-02 20:53:28 +09001838 * @ap: Port to adjust SATA spd limit for
1839 *
1840 * Adjust SATA spd limit of @ap downward. Note that this
1841 * function only adjusts the limit. The change must be applied
Tejun Heo3c567b72006-05-15 20:57:23 +09001842 * using sata_set_spd().
Tejun Heo1c3fae42006-04-02 20:53:28 +09001843 *
1844 * LOCKING:
1845 * Inherited from caller.
1846 *
1847 * RETURNS:
1848 * 0 on success, negative errno on failure
1849 */
Tejun Heo3c567b72006-05-15 20:57:23 +09001850int sata_down_spd_limit(struct ata_port *ap)
Tejun Heo1c3fae42006-04-02 20:53:28 +09001851{
Tejun Heo81952c52006-05-15 20:57:47 +09001852 u32 sstatus, spd, mask;
1853 int rc, highbit;
Tejun Heo1c3fae42006-04-02 20:53:28 +09001854
Tejun Heo81952c52006-05-15 20:57:47 +09001855 rc = sata_scr_read(ap, SCR_STATUS, &sstatus);
1856 if (rc)
1857 return rc;
Tejun Heo1c3fae42006-04-02 20:53:28 +09001858
1859 mask = ap->sata_spd_limit;
1860 if (mask <= 1)
1861 return -EINVAL;
1862 highbit = fls(mask) - 1;
1863 mask &= ~(1 << highbit);
1864
Tejun Heo81952c52006-05-15 20:57:47 +09001865 spd = (sstatus >> 4) & 0xf;
Tejun Heo1c3fae42006-04-02 20:53:28 +09001866 if (spd <= 1)
1867 return -EINVAL;
1868 spd--;
1869 mask &= (1 << spd) - 1;
1870 if (!mask)
1871 return -EINVAL;
1872
1873 ap->sata_spd_limit = mask;
1874
Tejun Heof15a1da2006-05-15 20:57:56 +09001875 ata_port_printk(ap, KERN_WARNING, "limiting SATA link speed to %s\n",
1876 sata_spd_string(fls(mask)));
Tejun Heo1c3fae42006-04-02 20:53:28 +09001877
1878 return 0;
1879}
1880
Tejun Heo3c567b72006-05-15 20:57:23 +09001881static int __sata_set_spd_needed(struct ata_port *ap, u32 *scontrol)
Tejun Heo1c3fae42006-04-02 20:53:28 +09001882{
1883 u32 spd, limit;
1884
1885 if (ap->sata_spd_limit == UINT_MAX)
1886 limit = 0;
1887 else
1888 limit = fls(ap->sata_spd_limit);
1889
1890 spd = (*scontrol >> 4) & 0xf;
1891 *scontrol = (*scontrol & ~0xf0) | ((limit & 0xf) << 4);
1892
1893 return spd != limit;
1894}
1895
1896/**
Tejun Heo3c567b72006-05-15 20:57:23 +09001897 * sata_set_spd_needed - is SATA spd configuration needed
Tejun Heo1c3fae42006-04-02 20:53:28 +09001898 * @ap: Port in question
1899 *
1900 * Test whether the spd limit in SControl matches
1901 * @ap->sata_spd_limit. This function is used to determine
1902 * whether hardreset is necessary to apply SATA spd
1903 * configuration.
1904 *
1905 * LOCKING:
1906 * Inherited from caller.
1907 *
1908 * RETURNS:
1909 * 1 if SATA spd configuration is needed, 0 otherwise.
1910 */
Tejun Heo3c567b72006-05-15 20:57:23 +09001911int sata_set_spd_needed(struct ata_port *ap)
Tejun Heo1c3fae42006-04-02 20:53:28 +09001912{
1913 u32 scontrol;
1914
Tejun Heo81952c52006-05-15 20:57:47 +09001915 if (sata_scr_read(ap, SCR_CONTROL, &scontrol))
Tejun Heo1c3fae42006-04-02 20:53:28 +09001916 return 0;
1917
Tejun Heo3c567b72006-05-15 20:57:23 +09001918 return __sata_set_spd_needed(ap, &scontrol);
Tejun Heo1c3fae42006-04-02 20:53:28 +09001919}
1920
1921/**
Tejun Heo3c567b72006-05-15 20:57:23 +09001922 * sata_set_spd - set SATA spd according to spd limit
Tejun Heo1c3fae42006-04-02 20:53:28 +09001923 * @ap: Port to set SATA spd for
1924 *
1925 * Set SATA spd of @ap according to sata_spd_limit.
1926 *
1927 * LOCKING:
1928 * Inherited from caller.
1929 *
1930 * RETURNS:
1931 * 0 if spd doesn't need to be changed, 1 if spd has been
Tejun Heo81952c52006-05-15 20:57:47 +09001932 * changed. Negative errno if SCR registers are inaccessible.
Tejun Heo1c3fae42006-04-02 20:53:28 +09001933 */
Tejun Heo3c567b72006-05-15 20:57:23 +09001934int sata_set_spd(struct ata_port *ap)
Tejun Heo1c3fae42006-04-02 20:53:28 +09001935{
1936 u32 scontrol;
Tejun Heo81952c52006-05-15 20:57:47 +09001937 int rc;
Tejun Heo1c3fae42006-04-02 20:53:28 +09001938
Tejun Heo81952c52006-05-15 20:57:47 +09001939 if ((rc = sata_scr_read(ap, SCR_CONTROL, &scontrol)))
1940 return rc;
Tejun Heo1c3fae42006-04-02 20:53:28 +09001941
Tejun Heo3c567b72006-05-15 20:57:23 +09001942 if (!__sata_set_spd_needed(ap, &scontrol))
Tejun Heo1c3fae42006-04-02 20:53:28 +09001943 return 0;
1944
Tejun Heo81952c52006-05-15 20:57:47 +09001945 if ((rc = sata_scr_write(ap, SCR_CONTROL, scontrol)))
1946 return rc;
1947
Tejun Heo1c3fae42006-04-02 20:53:28 +09001948 return 1;
1949}
1950
Alan Cox452503f2005-10-21 19:01:32 -04001951/*
1952 * This mode timing computation functionality is ported over from
1953 * drivers/ide/ide-timing.h and was originally written by Vojtech Pavlik
1954 */
1955/*
Alan Coxb352e572006-08-10 18:52:12 +01001956 * PIO 0-4, MWDMA 0-2 and UDMA 0-6 timings (in nanoseconds).
Alan Cox452503f2005-10-21 19:01:32 -04001957 * These were taken from ATA/ATAPI-6 standard, rev 0a, except
Alan Coxb352e572006-08-10 18:52:12 +01001958 * for UDMA6, which is currently supported only by Maxtor drives.
1959 *
1960 * For PIO 5/6 MWDMA 3/4 see the CFA specification 3.0.
Alan Cox452503f2005-10-21 19:01:32 -04001961 */
1962
1963static const struct ata_timing ata_timing[] = {
1964
1965 { XFER_UDMA_6, 0, 0, 0, 0, 0, 0, 0, 15 },
1966 { XFER_UDMA_5, 0, 0, 0, 0, 0, 0, 0, 20 },
1967 { XFER_UDMA_4, 0, 0, 0, 0, 0, 0, 0, 30 },
1968 { XFER_UDMA_3, 0, 0, 0, 0, 0, 0, 0, 45 },
1969
Alan Coxb352e572006-08-10 18:52:12 +01001970 { XFER_MW_DMA_4, 25, 0, 0, 0, 55, 20, 80, 0 },
1971 { XFER_MW_DMA_3, 25, 0, 0, 0, 65, 25, 100, 0 },
Alan Cox452503f2005-10-21 19:01:32 -04001972 { XFER_UDMA_2, 0, 0, 0, 0, 0, 0, 0, 60 },
1973 { XFER_UDMA_1, 0, 0, 0, 0, 0, 0, 0, 80 },
1974 { XFER_UDMA_0, 0, 0, 0, 0, 0, 0, 0, 120 },
1975
1976/* { XFER_UDMA_SLOW, 0, 0, 0, 0, 0, 0, 0, 150 }, */
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001977
Alan Cox452503f2005-10-21 19:01:32 -04001978 { XFER_MW_DMA_2, 25, 0, 0, 0, 70, 25, 120, 0 },
1979 { XFER_MW_DMA_1, 45, 0, 0, 0, 80, 50, 150, 0 },
1980 { XFER_MW_DMA_0, 60, 0, 0, 0, 215, 215, 480, 0 },
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001981
Alan Cox452503f2005-10-21 19:01:32 -04001982 { XFER_SW_DMA_2, 60, 0, 0, 0, 120, 120, 240, 0 },
1983 { XFER_SW_DMA_1, 90, 0, 0, 0, 240, 240, 480, 0 },
1984 { XFER_SW_DMA_0, 120, 0, 0, 0, 480, 480, 960, 0 },
1985
Alan Coxb352e572006-08-10 18:52:12 +01001986 { XFER_PIO_6, 10, 55, 20, 80, 55, 20, 80, 0 },
1987 { XFER_PIO_5, 15, 65, 25, 100, 65, 25, 100, 0 },
Alan Cox452503f2005-10-21 19:01:32 -04001988 { XFER_PIO_4, 25, 70, 25, 120, 70, 25, 120, 0 },
1989 { XFER_PIO_3, 30, 80, 70, 180, 80, 70, 180, 0 },
1990
1991 { XFER_PIO_2, 30, 290, 40, 330, 100, 90, 240, 0 },
1992 { XFER_PIO_1, 50, 290, 93, 383, 125, 100, 383, 0 },
1993 { XFER_PIO_0, 70, 290, 240, 600, 165, 150, 600, 0 },
1994
1995/* { XFER_PIO_SLOW, 120, 290, 240, 960, 290, 240, 960, 0 }, */
1996
1997 { 0xFF }
1998};
1999
2000#define ENOUGH(v,unit) (((v)-1)/(unit)+1)
2001#define EZ(v,unit) ((v)?ENOUGH(v,unit):0)
2002
2003static void ata_timing_quantize(const struct ata_timing *t, struct ata_timing *q, int T, int UT)
2004{
2005 q->setup = EZ(t->setup * 1000, T);
2006 q->act8b = EZ(t->act8b * 1000, T);
2007 q->rec8b = EZ(t->rec8b * 1000, T);
2008 q->cyc8b = EZ(t->cyc8b * 1000, T);
2009 q->active = EZ(t->active * 1000, T);
2010 q->recover = EZ(t->recover * 1000, T);
2011 q->cycle = EZ(t->cycle * 1000, T);
2012 q->udma = EZ(t->udma * 1000, UT);
2013}
2014
2015void ata_timing_merge(const struct ata_timing *a, const struct ata_timing *b,
2016 struct ata_timing *m, unsigned int what)
2017{
2018 if (what & ATA_TIMING_SETUP ) m->setup = max(a->setup, b->setup);
2019 if (what & ATA_TIMING_ACT8B ) m->act8b = max(a->act8b, b->act8b);
2020 if (what & ATA_TIMING_REC8B ) m->rec8b = max(a->rec8b, b->rec8b);
2021 if (what & ATA_TIMING_CYC8B ) m->cyc8b = max(a->cyc8b, b->cyc8b);
2022 if (what & ATA_TIMING_ACTIVE ) m->active = max(a->active, b->active);
2023 if (what & ATA_TIMING_RECOVER) m->recover = max(a->recover, b->recover);
2024 if (what & ATA_TIMING_CYCLE ) m->cycle = max(a->cycle, b->cycle);
2025 if (what & ATA_TIMING_UDMA ) m->udma = max(a->udma, b->udma);
2026}
2027
2028static const struct ata_timing* ata_timing_find_mode(unsigned short speed)
2029{
2030 const struct ata_timing *t;
2031
2032 for (t = ata_timing; t->mode != speed; t++)
Alan Cox91190752005-10-26 12:17:46 -04002033 if (t->mode == 0xFF)
Alan Cox452503f2005-10-21 19:01:32 -04002034 return NULL;
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05002035 return t;
Alan Cox452503f2005-10-21 19:01:32 -04002036}
2037
2038int ata_timing_compute(struct ata_device *adev, unsigned short speed,
2039 struct ata_timing *t, int T, int UT)
2040{
2041 const struct ata_timing *s;
2042 struct ata_timing p;
2043
2044 /*
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05002045 * Find the mode.
Albert Lee75b1f2f2005-11-16 17:06:18 +08002046 */
Alan Cox452503f2005-10-21 19:01:32 -04002047
2048 if (!(s = ata_timing_find_mode(speed)))
2049 return -EINVAL;
2050
Albert Lee75b1f2f2005-11-16 17:06:18 +08002051 memcpy(t, s, sizeof(*s));
2052
Alan Cox452503f2005-10-21 19:01:32 -04002053 /*
2054 * If the drive is an EIDE drive, it can tell us it needs extended
2055 * PIO/MW_DMA cycle timing.
2056 */
2057
2058 if (adev->id[ATA_ID_FIELD_VALID] & 2) { /* EIDE drive */
2059 memset(&p, 0, sizeof(p));
2060 if(speed >= XFER_PIO_0 && speed <= XFER_SW_DMA_0) {
2061 if (speed <= XFER_PIO_2) p.cycle = p.cyc8b = adev->id[ATA_ID_EIDE_PIO];
2062 else p.cycle = p.cyc8b = adev->id[ATA_ID_EIDE_PIO_IORDY];
2063 } else if(speed >= XFER_MW_DMA_0 && speed <= XFER_MW_DMA_2) {
2064 p.cycle = adev->id[ATA_ID_EIDE_DMA_MIN];
2065 }
2066 ata_timing_merge(&p, t, t, ATA_TIMING_CYCLE | ATA_TIMING_CYC8B);
2067 }
2068
2069 /*
2070 * Convert the timing to bus clock counts.
2071 */
2072
Albert Lee75b1f2f2005-11-16 17:06:18 +08002073 ata_timing_quantize(t, t, T, UT);
Alan Cox452503f2005-10-21 19:01:32 -04002074
2075 /*
Randy Dunlapc893a3a2006-01-28 13:15:32 -05002076 * Even in DMA/UDMA modes we still use PIO access for IDENTIFY,
2077 * S.M.A.R.T * and some other commands. We have to ensure that the
2078 * DMA cycle timing is slower/equal than the fastest PIO timing.
Alan Cox452503f2005-10-21 19:01:32 -04002079 */
2080
2081 if (speed > XFER_PIO_4) {
2082 ata_timing_compute(adev, adev->pio_mode, &p, T, UT);
2083 ata_timing_merge(&p, t, t, ATA_TIMING_ALL);
2084 }
2085
2086 /*
Randy Dunlapc893a3a2006-01-28 13:15:32 -05002087 * Lengthen active & recovery time so that cycle time is correct.
Alan Cox452503f2005-10-21 19:01:32 -04002088 */
2089
2090 if (t->act8b + t->rec8b < t->cyc8b) {
2091 t->act8b += (t->cyc8b - (t->act8b + t->rec8b)) / 2;
2092 t->rec8b = t->cyc8b - t->act8b;
2093 }
2094
2095 if (t->active + t->recover < t->cycle) {
2096 t->active += (t->cycle - (t->active + t->recover)) / 2;
2097 t->recover = t->cycle - t->active;
2098 }
2099
2100 return 0;
2101}
2102
Tejun Heocf176e12006-04-02 17:54:46 +09002103/**
2104 * ata_down_xfermask_limit - adjust dev xfer masks downward
Tejun Heocf176e12006-04-02 17:54:46 +09002105 * @dev: Device to adjust xfer masks
2106 * @force_pio0: Force PIO0
2107 *
2108 * Adjust xfer masks of @dev downward. Note that this function
2109 * does not apply the change. Invoking ata_set_mode() afterwards
2110 * will apply the limit.
2111 *
2112 * LOCKING:
2113 * Inherited from caller.
2114 *
2115 * RETURNS:
2116 * 0 on success, negative errno on failure
2117 */
Tejun Heo3373efd2006-05-15 20:57:53 +09002118int ata_down_xfermask_limit(struct ata_device *dev, int force_pio0)
Tejun Heocf176e12006-04-02 17:54:46 +09002119{
2120 unsigned long xfer_mask;
2121 int highbit;
2122
2123 xfer_mask = ata_pack_xfermask(dev->pio_mask, dev->mwdma_mask,
2124 dev->udma_mask);
2125
2126 if (!xfer_mask)
2127 goto fail;
2128 /* don't gear down to MWDMA from UDMA, go directly to PIO */
2129 if (xfer_mask & ATA_MASK_UDMA)
2130 xfer_mask &= ~ATA_MASK_MWDMA;
2131
2132 highbit = fls(xfer_mask) - 1;
2133 xfer_mask &= ~(1 << highbit);
2134 if (force_pio0)
2135 xfer_mask &= 1 << ATA_SHIFT_PIO;
2136 if (!xfer_mask)
2137 goto fail;
2138
2139 ata_unpack_xfermask(xfer_mask, &dev->pio_mask, &dev->mwdma_mask,
2140 &dev->udma_mask);
2141
Tejun Heof15a1da2006-05-15 20:57:56 +09002142 ata_dev_printk(dev, KERN_WARNING, "limiting speed to %s\n",
2143 ata_mode_string(xfer_mask));
Tejun Heocf176e12006-04-02 17:54:46 +09002144
2145 return 0;
2146
2147 fail:
2148 return -EINVAL;
2149}
2150
Tejun Heo3373efd2006-05-15 20:57:53 +09002151static int ata_dev_set_mode(struct ata_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002152{
Tejun Heo83206a22006-03-24 15:25:31 +09002153 unsigned int err_mask;
2154 int rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002155
Tejun Heoe8384602006-04-02 18:51:53 +09002156 dev->flags &= ~ATA_DFLAG_PIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002157 if (dev->xfer_shift == ATA_SHIFT_PIO)
2158 dev->flags |= ATA_DFLAG_PIO;
2159
Tejun Heo3373efd2006-05-15 20:57:53 +09002160 err_mask = ata_dev_set_xfermode(dev);
Tejun Heo83206a22006-03-24 15:25:31 +09002161 if (err_mask) {
Tejun Heof15a1da2006-05-15 20:57:56 +09002162 ata_dev_printk(dev, KERN_ERR, "failed to set xfermode "
2163 "(err_mask=0x%x)\n", err_mask);
Tejun Heo83206a22006-03-24 15:25:31 +09002164 return -EIO;
2165 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002166
Tejun Heo3373efd2006-05-15 20:57:53 +09002167 rc = ata_dev_revalidate(dev, 0);
Tejun Heo5eb45c02006-04-02 18:51:52 +09002168 if (rc)
Tejun Heo83206a22006-03-24 15:25:31 +09002169 return rc;
Tejun Heo48a8a142006-03-05 17:55:58 +09002170
Tejun Heo23e71c32006-03-06 04:31:57 +09002171 DPRINTK("xfer_shift=%u, xfer_mode=0x%x\n",
2172 dev->xfer_shift, (int)dev->xfer_mode);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002173
Tejun Heof15a1da2006-05-15 20:57:56 +09002174 ata_dev_printk(dev, KERN_INFO, "configured for %s\n",
2175 ata_mode_string(ata_xfer_mode2mask(dev->xfer_mode)));
Tejun Heo83206a22006-03-24 15:25:31 +09002176 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002177}
2178
Linus Torvalds1da177e2005-04-16 15:20:36 -07002179/**
2180 * ata_set_mode - Program timings and issue SET FEATURES - XFER
2181 * @ap: port on which timings will be programmed
Tejun Heoe82cbdb2006-04-01 01:38:18 +09002182 * @r_failed_dev: out paramter for failed device
Linus Torvalds1da177e2005-04-16 15:20:36 -07002183 *
Tejun Heoe82cbdb2006-04-01 01:38:18 +09002184 * Set ATA device disk transfer mode (PIO3, UDMA6, etc.). If
2185 * ata_set_mode() fails, pointer to the failing device is
2186 * returned in @r_failed_dev.
Jeff Garzik780a87f2005-05-30 15:41:05 -04002187 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002188 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04002189 * PCI/etc. bus probe sem.
Tejun Heoe82cbdb2006-04-01 01:38:18 +09002190 *
2191 * RETURNS:
2192 * 0 on success, negative errno otherwise
Linus Torvalds1da177e2005-04-16 15:20:36 -07002193 */
Tejun Heo1ad8e7f2006-04-02 18:51:53 +09002194int ata_set_mode(struct ata_port *ap, struct ata_device **r_failed_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002195{
Tejun Heoe8e06192006-04-01 01:38:18 +09002196 struct ata_device *dev;
Tejun Heoe82cbdb2006-04-01 01:38:18 +09002197 int i, rc = 0, used_dma = 0, found = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002198
Tejun Heo3adcebb2006-05-15 20:57:37 +09002199 /* has private set_mode? */
2200 if (ap->ops->set_mode) {
2201 /* FIXME: make ->set_mode handle no device case and
2202 * return error code and failing device on failure.
2203 */
2204 for (i = 0; i < ATA_MAX_DEVICES; i++) {
Tejun Heo02670bf2006-07-03 16:07:26 +09002205 if (ata_dev_ready(&ap->device[i])) {
Tejun Heo3adcebb2006-05-15 20:57:37 +09002206 ap->ops->set_mode(ap);
2207 break;
2208 }
2209 }
2210 return 0;
2211 }
2212
Tejun Heoa6d5a512006-03-06 04:31:57 +09002213 /* step 1: calculate xfer_mask */
2214 for (i = 0; i < ATA_MAX_DEVICES; i++) {
Tejun Heoacf356b2006-03-24 14:07:50 +09002215 unsigned int pio_mask, dma_mask;
Tejun Heoa6d5a512006-03-06 04:31:57 +09002216
Tejun Heoe8e06192006-04-01 01:38:18 +09002217 dev = &ap->device[i];
2218
Tejun Heoe1211e32006-04-01 01:38:18 +09002219 if (!ata_dev_enabled(dev))
Tejun Heoa6d5a512006-03-06 04:31:57 +09002220 continue;
2221
Tejun Heo3373efd2006-05-15 20:57:53 +09002222 ata_dev_xfermask(dev);
Tejun Heoa6d5a512006-03-06 04:31:57 +09002223
Tejun Heoacf356b2006-03-24 14:07:50 +09002224 pio_mask = ata_pack_xfermask(dev->pio_mask, 0, 0);
2225 dma_mask = ata_pack_xfermask(0, dev->mwdma_mask, dev->udma_mask);
2226 dev->pio_mode = ata_xfer_mask2mode(pio_mask);
2227 dev->dma_mode = ata_xfer_mask2mode(dma_mask);
Alan Cox5444a6f2006-03-27 18:58:20 +01002228
Tejun Heo4f659772006-04-01 01:38:18 +09002229 found = 1;
Alan Cox5444a6f2006-03-27 18:58:20 +01002230 if (dev->dma_mode)
2231 used_dma = 1;
Tejun Heoa6d5a512006-03-06 04:31:57 +09002232 }
Tejun Heo4f659772006-04-01 01:38:18 +09002233 if (!found)
Tejun Heoe82cbdb2006-04-01 01:38:18 +09002234 goto out;
Tejun Heoa6d5a512006-03-06 04:31:57 +09002235
2236 /* step 2: always set host PIO timings */
Tejun Heoe8e06192006-04-01 01:38:18 +09002237 for (i = 0; i < ATA_MAX_DEVICES; i++) {
2238 dev = &ap->device[i];
2239 if (!ata_dev_enabled(dev))
2240 continue;
2241
2242 if (!dev->pio_mode) {
Tejun Heof15a1da2006-05-15 20:57:56 +09002243 ata_dev_printk(dev, KERN_WARNING, "no PIO support\n");
Tejun Heoe8e06192006-04-01 01:38:18 +09002244 rc = -EINVAL;
Tejun Heoe82cbdb2006-04-01 01:38:18 +09002245 goto out;
Tejun Heoe8e06192006-04-01 01:38:18 +09002246 }
2247
2248 dev->xfer_mode = dev->pio_mode;
2249 dev->xfer_shift = ATA_SHIFT_PIO;
2250 if (ap->ops->set_piomode)
2251 ap->ops->set_piomode(ap, dev);
2252 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002253
Tejun Heoa6d5a512006-03-06 04:31:57 +09002254 /* step 3: set host DMA timings */
Tejun Heoe8e06192006-04-01 01:38:18 +09002255 for (i = 0; i < ATA_MAX_DEVICES; i++) {
2256 dev = &ap->device[i];
2257
2258 if (!ata_dev_enabled(dev) || !dev->dma_mode)
2259 continue;
2260
2261 dev->xfer_mode = dev->dma_mode;
2262 dev->xfer_shift = ata_xfer_mode2shift(dev->dma_mode);
2263 if (ap->ops->set_dmamode)
2264 ap->ops->set_dmamode(ap, dev);
2265 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002266
2267 /* step 4: update devices' xfer mode */
Tejun Heo83206a22006-03-24 15:25:31 +09002268 for (i = 0; i < ATA_MAX_DEVICES; i++) {
Tejun Heoe8e06192006-04-01 01:38:18 +09002269 dev = &ap->device[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002270
Tejun Heo02670bf2006-07-03 16:07:26 +09002271 /* don't udpate suspended devices' xfer mode */
2272 if (!ata_dev_ready(dev))
Tejun Heo83206a22006-03-24 15:25:31 +09002273 continue;
2274
Tejun Heo3373efd2006-05-15 20:57:53 +09002275 rc = ata_dev_set_mode(dev);
Tejun Heo5bbc53f2006-04-01 01:38:17 +09002276 if (rc)
Tejun Heoe82cbdb2006-04-01 01:38:18 +09002277 goto out;
Tejun Heo83206a22006-03-24 15:25:31 +09002278 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002279
Tejun Heoe8e06192006-04-01 01:38:18 +09002280 /* Record simplex status. If we selected DMA then the other
2281 * host channels are not permitted to do so.
Alan Cox5444a6f2006-03-27 18:58:20 +01002282 */
Jeff Garzikcca39742006-08-24 03:19:22 -04002283 if (used_dma && (ap->host->flags & ATA_HOST_SIMPLEX))
2284 ap->host->simplex_claimed = 1;
Alan Cox5444a6f2006-03-27 18:58:20 +01002285
Tejun Heoe8e06192006-04-01 01:38:18 +09002286 /* step5: chip specific finalisation */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002287 if (ap->ops->post_set_mode)
2288 ap->ops->post_set_mode(ap);
2289
Tejun Heoe82cbdb2006-04-01 01:38:18 +09002290 out:
2291 if (rc)
2292 *r_failed_dev = dev;
2293 return rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002294}
2295
2296/**
Jeff Garzik1fdffbc2006-02-09 05:15:27 -05002297 * ata_tf_to_host - issue ATA taskfile to host controller
2298 * @ap: port to which command is being issued
2299 * @tf: ATA taskfile register set
2300 *
2301 * Issues ATA taskfile register set to ATA host controller,
2302 * with proper synchronization with interrupt handler and
2303 * other threads.
2304 *
2305 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04002306 * spin_lock_irqsave(host lock)
Jeff Garzik1fdffbc2006-02-09 05:15:27 -05002307 */
2308
2309static inline void ata_tf_to_host(struct ata_port *ap,
2310 const struct ata_taskfile *tf)
2311{
2312 ap->ops->tf_load(ap, tf);
2313 ap->ops->exec_command(ap, tf);
2314}
2315
2316/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07002317 * ata_busy_sleep - sleep until BSY clears, or timeout
2318 * @ap: port containing status register to be polled
2319 * @tmout_pat: impatience timeout
2320 * @tmout: overall timeout
2321 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04002322 * Sleep until ATA Status register bit BSY clears,
2323 * or a timeout occurs.
2324 *
2325 * LOCKING: None.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002326 */
2327
Tejun Heo6f8b9952006-01-24 17:05:21 +09002328unsigned int ata_busy_sleep (struct ata_port *ap,
2329 unsigned long tmout_pat, unsigned long tmout)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002330{
2331 unsigned long timer_start, timeout;
2332 u8 status;
2333
2334 status = ata_busy_wait(ap, ATA_BUSY, 300);
2335 timer_start = jiffies;
2336 timeout = timer_start + tmout_pat;
2337 while ((status & ATA_BUSY) && (time_before(jiffies, timeout))) {
2338 msleep(50);
2339 status = ata_busy_wait(ap, ATA_BUSY, 3);
2340 }
2341
2342 if (status & ATA_BUSY)
Tejun Heof15a1da2006-05-15 20:57:56 +09002343 ata_port_printk(ap, KERN_WARNING,
Jeff Garzik35aa7a42006-09-28 06:50:24 -04002344 "port is slow to respond, please be patient "
2345 "(Status 0x%x)\n", status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002346
2347 timeout = timer_start + tmout;
2348 while ((status & ATA_BUSY) && (time_before(jiffies, timeout))) {
2349 msleep(50);
2350 status = ata_chk_status(ap);
2351 }
2352
2353 if (status & ATA_BUSY) {
Tejun Heof15a1da2006-05-15 20:57:56 +09002354 ata_port_printk(ap, KERN_ERR, "port failed to respond "
Jeff Garzik35aa7a42006-09-28 06:50:24 -04002355 "(%lu secs, Status 0x%x)\n",
2356 tmout / HZ, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002357 return 1;
2358 }
2359
2360 return 0;
2361}
2362
2363static void ata_bus_post_reset(struct ata_port *ap, unsigned int devmask)
2364{
2365 struct ata_ioports *ioaddr = &ap->ioaddr;
2366 unsigned int dev0 = devmask & (1 << 0);
2367 unsigned int dev1 = devmask & (1 << 1);
2368 unsigned long timeout;
2369
2370 /* if device 0 was found in ata_devchk, wait for its
2371 * BSY bit to clear
2372 */
2373 if (dev0)
2374 ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT);
2375
2376 /* if device 1 was found in ata_devchk, wait for
2377 * register access, then wait for BSY to clear
2378 */
2379 timeout = jiffies + ATA_TMOUT_BOOT;
2380 while (dev1) {
2381 u8 nsect, lbal;
2382
2383 ap->ops->dev_select(ap, 1);
2384 if (ap->flags & ATA_FLAG_MMIO) {
2385 nsect = readb((void __iomem *) ioaddr->nsect_addr);
2386 lbal = readb((void __iomem *) ioaddr->lbal_addr);
2387 } else {
2388 nsect = inb(ioaddr->nsect_addr);
2389 lbal = inb(ioaddr->lbal_addr);
2390 }
2391 if ((nsect == 1) && (lbal == 1))
2392 break;
2393 if (time_after(jiffies, timeout)) {
2394 dev1 = 0;
2395 break;
2396 }
2397 msleep(50); /* give drive a breather */
2398 }
2399 if (dev1)
2400 ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT);
2401
2402 /* is all this really necessary? */
2403 ap->ops->dev_select(ap, 0);
2404 if (dev1)
2405 ap->ops->dev_select(ap, 1);
2406 if (dev0)
2407 ap->ops->dev_select(ap, 0);
2408}
2409
Linus Torvalds1da177e2005-04-16 15:20:36 -07002410static unsigned int ata_bus_softreset(struct ata_port *ap,
2411 unsigned int devmask)
2412{
2413 struct ata_ioports *ioaddr = &ap->ioaddr;
2414
2415 DPRINTK("ata%u: bus reset via SRST\n", ap->id);
2416
2417 /* software reset. causes dev0 to be selected */
2418 if (ap->flags & ATA_FLAG_MMIO) {
2419 writeb(ap->ctl, (void __iomem *) ioaddr->ctl_addr);
2420 udelay(20); /* FIXME: flush */
2421 writeb(ap->ctl | ATA_SRST, (void __iomem *) ioaddr->ctl_addr);
2422 udelay(20); /* FIXME: flush */
2423 writeb(ap->ctl, (void __iomem *) ioaddr->ctl_addr);
2424 } else {
2425 outb(ap->ctl, ioaddr->ctl_addr);
2426 udelay(10);
2427 outb(ap->ctl | ATA_SRST, ioaddr->ctl_addr);
2428 udelay(10);
2429 outb(ap->ctl, ioaddr->ctl_addr);
2430 }
2431
2432 /* spec mandates ">= 2ms" before checking status.
2433 * We wait 150ms, because that was the magic delay used for
2434 * ATAPI devices in Hale Landis's ATADRVR, for the period of time
2435 * between when the ATA command register is written, and then
2436 * status is checked. Because waiting for "a while" before
2437 * checking status is fine, post SRST, we perform this magic
2438 * delay here as well.
Alan Cox09c7ad72006-03-22 15:52:40 +00002439 *
2440 * Old drivers/ide uses the 2mS rule and then waits for ready
Linus Torvalds1da177e2005-04-16 15:20:36 -07002441 */
2442 msleep(150);
2443
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05002444 /* Before we perform post reset processing we want to see if
Tejun Heo298a41c2006-03-25 02:58:13 +09002445 * the bus shows 0xFF because the odd clown forgets the D7
2446 * pulldown resistor.
2447 */
Tejun Heo987d2f02006-04-11 22:16:45 +09002448 if (ata_check_status(ap) == 0xFF) {
Tejun Heof15a1da2006-05-15 20:57:56 +09002449 ata_port_printk(ap, KERN_ERR, "SRST failed (status 0xFF)\n");
Tejun Heo298a41c2006-03-25 02:58:13 +09002450 return AC_ERR_OTHER;
Tejun Heo987d2f02006-04-11 22:16:45 +09002451 }
Alan Cox09c7ad72006-03-22 15:52:40 +00002452
Linus Torvalds1da177e2005-04-16 15:20:36 -07002453 ata_bus_post_reset(ap, devmask);
2454
2455 return 0;
2456}
2457
2458/**
2459 * ata_bus_reset - reset host port and associated ATA channel
2460 * @ap: port to reset
2461 *
2462 * This is typically the first time we actually start issuing
2463 * commands to the ATA channel. We wait for BSY to clear, then
2464 * issue EXECUTE DEVICE DIAGNOSTIC command, polling for its
2465 * result. Determine what devices, if any, are on the channel
2466 * by looking at the device 0/1 error register. Look at the signature
2467 * stored in each device's taskfile registers, to determine if
2468 * the device is ATA or ATAPI.
2469 *
2470 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04002471 * PCI/etc. bus probe sem.
Jeff Garzikcca39742006-08-24 03:19:22 -04002472 * Obtains host lock.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002473 *
2474 * SIDE EFFECTS:
Tejun Heo198e0fe2006-04-02 18:51:52 +09002475 * Sets ATA_FLAG_DISABLED if bus reset fails.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002476 */
2477
2478void ata_bus_reset(struct ata_port *ap)
2479{
2480 struct ata_ioports *ioaddr = &ap->ioaddr;
2481 unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS;
2482 u8 err;
Tejun Heoaec5c3c2006-03-25 01:33:34 +09002483 unsigned int dev0, dev1 = 0, devmask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002484
2485 DPRINTK("ENTER, host %u, port %u\n", ap->id, ap->port_no);
2486
2487 /* determine if device 0/1 are present */
2488 if (ap->flags & ATA_FLAG_SATA_RESET)
2489 dev0 = 1;
2490 else {
2491 dev0 = ata_devchk(ap, 0);
2492 if (slave_possible)
2493 dev1 = ata_devchk(ap, 1);
2494 }
2495
2496 if (dev0)
2497 devmask |= (1 << 0);
2498 if (dev1)
2499 devmask |= (1 << 1);
2500
2501 /* select device 0 again */
2502 ap->ops->dev_select(ap, 0);
2503
2504 /* issue bus reset */
2505 if (ap->flags & ATA_FLAG_SRST)
Tejun Heoaec5c3c2006-03-25 01:33:34 +09002506 if (ata_bus_softreset(ap, devmask))
2507 goto err_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002508
2509 /*
2510 * determine by signature whether we have ATA or ATAPI devices
2511 */
Tejun Heob4dc7622006-01-24 17:05:22 +09002512 ap->device[0].class = ata_dev_try_classify(ap, 0, &err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002513 if ((slave_possible) && (err != 0x81))
Tejun Heob4dc7622006-01-24 17:05:22 +09002514 ap->device[1].class = ata_dev_try_classify(ap, 1, &err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002515
2516 /* re-enable interrupts */
2517 if (ap->ioaddr.ctl_addr) /* FIXME: hack. create a hook instead */
2518 ata_irq_on(ap);
2519
2520 /* is double-select really necessary? */
2521 if (ap->device[1].class != ATA_DEV_NONE)
2522 ap->ops->dev_select(ap, 1);
2523 if (ap->device[0].class != ATA_DEV_NONE)
2524 ap->ops->dev_select(ap, 0);
2525
2526 /* if no devices were detected, disable this port */
2527 if ((ap->device[0].class == ATA_DEV_NONE) &&
2528 (ap->device[1].class == ATA_DEV_NONE))
2529 goto err_out;
2530
2531 if (ap->flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST)) {
2532 /* set up device control for ATA_FLAG_SATA_RESET */
2533 if (ap->flags & ATA_FLAG_MMIO)
2534 writeb(ap->ctl, (void __iomem *) ioaddr->ctl_addr);
2535 else
2536 outb(ap->ctl, ioaddr->ctl_addr);
2537 }
2538
2539 DPRINTK("EXIT\n");
2540 return;
2541
2542err_out:
Tejun Heof15a1da2006-05-15 20:57:56 +09002543 ata_port_printk(ap, KERN_ERR, "disabling port\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002544 ap->ops->port_disable(ap);
2545
2546 DPRINTK("EXIT\n");
2547}
2548
Tejun Heod7bb4cc2006-05-31 18:27:46 +09002549/**
2550 * sata_phy_debounce - debounce SATA phy status
2551 * @ap: ATA port to debounce SATA phy status for
2552 * @params: timing parameters { interval, duratinon, timeout } in msec
2553 *
2554 * Make sure SStatus of @ap reaches stable state, determined by
2555 * holding the same value where DET is not 1 for @duration polled
2556 * every @interval, before @timeout. Timeout constraints the
2557 * beginning of the stable state. Because, after hot unplugging,
2558 * DET gets stuck at 1 on some controllers, this functions waits
2559 * until timeout then returns 0 if DET is stable at 1.
2560 *
2561 * LOCKING:
2562 * Kernel thread context (may sleep)
2563 *
2564 * RETURNS:
2565 * 0 on success, -errno on failure.
2566 */
2567int sata_phy_debounce(struct ata_port *ap, const unsigned long *params)
Tejun Heo7a7921e2006-02-02 18:20:00 +09002568{
Tejun Heod7bb4cc2006-05-31 18:27:46 +09002569 unsigned long interval_msec = params[0];
2570 unsigned long duration = params[1] * HZ / 1000;
2571 unsigned long timeout = jiffies + params[2] * HZ / 1000;
2572 unsigned long last_jiffies;
2573 u32 last, cur;
2574 int rc;
2575
2576 if ((rc = sata_scr_read(ap, SCR_STATUS, &cur)))
2577 return rc;
2578 cur &= 0xf;
2579
2580 last = cur;
2581 last_jiffies = jiffies;
2582
2583 while (1) {
2584 msleep(interval_msec);
2585 if ((rc = sata_scr_read(ap, SCR_STATUS, &cur)))
2586 return rc;
2587 cur &= 0xf;
2588
2589 /* DET stable? */
2590 if (cur == last) {
2591 if (cur == 1 && time_before(jiffies, timeout))
2592 continue;
2593 if (time_after(jiffies, last_jiffies + duration))
2594 return 0;
2595 continue;
2596 }
2597
2598 /* unstable, start over */
2599 last = cur;
2600 last_jiffies = jiffies;
2601
2602 /* check timeout */
2603 if (time_after(jiffies, timeout))
2604 return -EBUSY;
2605 }
2606}
2607
2608/**
2609 * sata_phy_resume - resume SATA phy
2610 * @ap: ATA port to resume SATA phy for
2611 * @params: timing parameters { interval, duratinon, timeout } in msec
2612 *
2613 * Resume SATA phy of @ap and debounce it.
2614 *
2615 * LOCKING:
2616 * Kernel thread context (may sleep)
2617 *
2618 * RETURNS:
2619 * 0 on success, -errno on failure.
2620 */
2621int sata_phy_resume(struct ata_port *ap, const unsigned long *params)
2622{
2623 u32 scontrol;
Tejun Heo81952c52006-05-15 20:57:47 +09002624 int rc;
Tejun Heo7a7921e2006-02-02 18:20:00 +09002625
Tejun Heo81952c52006-05-15 20:57:47 +09002626 if ((rc = sata_scr_read(ap, SCR_CONTROL, &scontrol)))
2627 return rc;
2628
Tejun Heo852ee162006-04-01 01:38:18 +09002629 scontrol = (scontrol & 0x0f0) | 0x300;
Tejun Heo81952c52006-05-15 20:57:47 +09002630
2631 if ((rc = sata_scr_write(ap, SCR_CONTROL, scontrol)))
2632 return rc;
Tejun Heo7a7921e2006-02-02 18:20:00 +09002633
Tejun Heod7bb4cc2006-05-31 18:27:46 +09002634 /* Some PHYs react badly if SStatus is pounded immediately
2635 * after resuming. Delay 200ms before debouncing.
2636 */
2637 msleep(200);
Tejun Heo7a7921e2006-02-02 18:20:00 +09002638
Tejun Heod7bb4cc2006-05-31 18:27:46 +09002639 return sata_phy_debounce(ap, params);
Tejun Heo7a7921e2006-02-02 18:20:00 +09002640}
2641
Tejun Heof5914a42006-05-31 18:27:48 +09002642static void ata_wait_spinup(struct ata_port *ap)
2643{
2644 struct ata_eh_context *ehc = &ap->eh_context;
2645 unsigned long end, secs;
2646 int rc;
2647
2648 /* first, debounce phy if SATA */
2649 if (ap->cbl == ATA_CBL_SATA) {
Tejun Heoe9c83912006-07-03 16:07:26 +09002650 rc = sata_phy_debounce(ap, sata_deb_timing_hotplug);
Tejun Heof5914a42006-05-31 18:27:48 +09002651
2652 /* if debounced successfully and offline, no need to wait */
2653 if ((rc == 0 || rc == -EOPNOTSUPP) && ata_port_offline(ap))
2654 return;
2655 }
2656
2657 /* okay, let's give the drive time to spin up */
2658 end = ehc->i.hotplug_timestamp + ATA_SPINUP_WAIT * HZ / 1000;
2659 secs = ((end - jiffies) + HZ - 1) / HZ;
2660
2661 if (time_after(jiffies, end))
2662 return;
2663
2664 if (secs > 5)
2665 ata_port_printk(ap, KERN_INFO, "waiting for device to spin up "
2666 "(%lu secs)\n", secs);
2667
2668 schedule_timeout_uninterruptible(end - jiffies);
2669}
2670
2671/**
2672 * ata_std_prereset - prepare for reset
2673 * @ap: ATA port to be reset
2674 *
2675 * @ap is about to be reset. Initialize it.
2676 *
2677 * LOCKING:
2678 * Kernel thread context (may sleep)
2679 *
2680 * RETURNS:
2681 * 0 on success, -errno otherwise.
2682 */
2683int ata_std_prereset(struct ata_port *ap)
2684{
2685 struct ata_eh_context *ehc = &ap->eh_context;
Tejun Heoe9c83912006-07-03 16:07:26 +09002686 const unsigned long *timing = sata_ehc_deb_timing(ehc);
Tejun Heof5914a42006-05-31 18:27:48 +09002687 int rc;
2688
Tejun Heo28324302006-07-03 16:07:26 +09002689 /* handle link resume & hotplug spinup */
2690 if ((ehc->i.flags & ATA_EHI_RESUME_LINK) &&
2691 (ap->flags & ATA_FLAG_HRST_TO_RESUME))
2692 ehc->i.action |= ATA_EH_HARDRESET;
2693
2694 if ((ehc->i.flags & ATA_EHI_HOTPLUGGED) &&
2695 (ap->flags & ATA_FLAG_SKIP_D2H_BSY))
2696 ata_wait_spinup(ap);
Tejun Heof5914a42006-05-31 18:27:48 +09002697
2698 /* if we're about to do hardreset, nothing more to do */
2699 if (ehc->i.action & ATA_EH_HARDRESET)
2700 return 0;
2701
2702 /* if SATA, resume phy */
2703 if (ap->cbl == ATA_CBL_SATA) {
Tejun Heof5914a42006-05-31 18:27:48 +09002704 rc = sata_phy_resume(ap, timing);
2705 if (rc && rc != -EOPNOTSUPP) {
2706 /* phy resume failed */
2707 ata_port_printk(ap, KERN_WARNING, "failed to resume "
2708 "link for reset (errno=%d)\n", rc);
2709 return rc;
2710 }
2711 }
2712
2713 /* Wait for !BSY if the controller can wait for the first D2H
2714 * Reg FIS and we don't know that no device is attached.
2715 */
2716 if (!(ap->flags & ATA_FLAG_SKIP_D2H_BSY) && !ata_port_offline(ap))
2717 ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT);
2718
2719 return 0;
2720}
2721
Tejun Heoc2bd5802006-01-24 17:05:22 +09002722/**
2723 * ata_std_softreset - reset host port via ATA SRST
2724 * @ap: port to reset
Tejun Heoc2bd5802006-01-24 17:05:22 +09002725 * @classes: resulting classes of attached devices
2726 *
Tejun Heo52783c52006-05-31 18:28:22 +09002727 * Reset host port using ATA SRST.
Tejun Heoc2bd5802006-01-24 17:05:22 +09002728 *
2729 * LOCKING:
2730 * Kernel thread context (may sleep)
2731 *
2732 * RETURNS:
2733 * 0 on success, -errno otherwise.
2734 */
Tejun Heo2bf2cb22006-04-11 22:16:45 +09002735int ata_std_softreset(struct ata_port *ap, unsigned int *classes)
Tejun Heoc2bd5802006-01-24 17:05:22 +09002736{
2737 unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS;
2738 unsigned int devmask = 0, err_mask;
2739 u8 err;
2740
2741 DPRINTK("ENTER\n");
2742
Tejun Heo81952c52006-05-15 20:57:47 +09002743 if (ata_port_offline(ap)) {
Tejun Heo3a397462006-02-10 23:58:48 +09002744 classes[0] = ATA_DEV_NONE;
2745 goto out;
2746 }
2747
Tejun Heoc2bd5802006-01-24 17:05:22 +09002748 /* determine if device 0/1 are present */
2749 if (ata_devchk(ap, 0))
2750 devmask |= (1 << 0);
2751 if (slave_possible && ata_devchk(ap, 1))
2752 devmask |= (1 << 1);
2753
Tejun Heoc2bd5802006-01-24 17:05:22 +09002754 /* select device 0 again */
2755 ap->ops->dev_select(ap, 0);
2756
2757 /* issue bus reset */
2758 DPRINTK("about to softreset, devmask=%x\n", devmask);
2759 err_mask = ata_bus_softreset(ap, devmask);
2760 if (err_mask) {
Tejun Heof15a1da2006-05-15 20:57:56 +09002761 ata_port_printk(ap, KERN_ERR, "SRST failed (err_mask=0x%x)\n",
2762 err_mask);
Tejun Heoc2bd5802006-01-24 17:05:22 +09002763 return -EIO;
2764 }
2765
2766 /* determine by signature whether we have ATA or ATAPI devices */
2767 classes[0] = ata_dev_try_classify(ap, 0, &err);
2768 if (slave_possible && err != 0x81)
2769 classes[1] = ata_dev_try_classify(ap, 1, &err);
2770
Tejun Heo3a397462006-02-10 23:58:48 +09002771 out:
Tejun Heoc2bd5802006-01-24 17:05:22 +09002772 DPRINTK("EXIT, classes[0]=%u [1]=%u\n", classes[0], classes[1]);
2773 return 0;
2774}
2775
2776/**
2777 * sata_std_hardreset - reset host port via SATA phy reset
2778 * @ap: port to reset
Tejun Heoc2bd5802006-01-24 17:05:22 +09002779 * @class: resulting class of attached device
2780 *
2781 * SATA phy-reset host port using DET bits of SControl register.
Tejun Heoc2bd5802006-01-24 17:05:22 +09002782 *
2783 * LOCKING:
2784 * Kernel thread context (may sleep)
2785 *
2786 * RETURNS:
2787 * 0 on success, -errno otherwise.
2788 */
Tejun Heo2bf2cb22006-04-11 22:16:45 +09002789int sata_std_hardreset(struct ata_port *ap, unsigned int *class)
Tejun Heoc2bd5802006-01-24 17:05:22 +09002790{
Tejun Heoe9c83912006-07-03 16:07:26 +09002791 struct ata_eh_context *ehc = &ap->eh_context;
2792 const unsigned long *timing = sata_ehc_deb_timing(ehc);
Tejun Heo852ee162006-04-01 01:38:18 +09002793 u32 scontrol;
Tejun Heo81952c52006-05-15 20:57:47 +09002794 int rc;
Tejun Heo852ee162006-04-01 01:38:18 +09002795
Tejun Heoc2bd5802006-01-24 17:05:22 +09002796 DPRINTK("ENTER\n");
2797
Tejun Heo3c567b72006-05-15 20:57:23 +09002798 if (sata_set_spd_needed(ap)) {
Tejun Heo1c3fae42006-04-02 20:53:28 +09002799 /* SATA spec says nothing about how to reconfigure
2800 * spd. To be on the safe side, turn off phy during
2801 * reconfiguration. This works for at least ICH7 AHCI
2802 * and Sil3124.
2803 */
Tejun Heo81952c52006-05-15 20:57:47 +09002804 if ((rc = sata_scr_read(ap, SCR_CONTROL, &scontrol)))
2805 return rc;
2806
Martin Hicksa34b6fc2006-07-05 15:06:13 -04002807 scontrol = (scontrol & 0x0f0) | 0x304;
Tejun Heo81952c52006-05-15 20:57:47 +09002808
2809 if ((rc = sata_scr_write(ap, SCR_CONTROL, scontrol)))
2810 return rc;
Tejun Heo1c3fae42006-04-02 20:53:28 +09002811
Tejun Heo3c567b72006-05-15 20:57:23 +09002812 sata_set_spd(ap);
Tejun Heo1c3fae42006-04-02 20:53:28 +09002813 }
2814
2815 /* issue phy wake/reset */
Tejun Heo81952c52006-05-15 20:57:47 +09002816 if ((rc = sata_scr_read(ap, SCR_CONTROL, &scontrol)))
2817 return rc;
2818
Tejun Heo852ee162006-04-01 01:38:18 +09002819 scontrol = (scontrol & 0x0f0) | 0x301;
Tejun Heo81952c52006-05-15 20:57:47 +09002820
2821 if ((rc = sata_scr_write_flush(ap, SCR_CONTROL, scontrol)))
2822 return rc;
Tejun Heoc2bd5802006-01-24 17:05:22 +09002823
Tejun Heo1c3fae42006-04-02 20:53:28 +09002824 /* Couldn't find anything in SATA I/II specs, but AHCI-1.1
Tejun Heoc2bd5802006-01-24 17:05:22 +09002825 * 10.4.2 says at least 1 ms.
2826 */
2827 msleep(1);
2828
Tejun Heo1c3fae42006-04-02 20:53:28 +09002829 /* bring phy back */
Tejun Heoe9c83912006-07-03 16:07:26 +09002830 sata_phy_resume(ap, timing);
Tejun Heoc2bd5802006-01-24 17:05:22 +09002831
Tejun Heoc2bd5802006-01-24 17:05:22 +09002832 /* TODO: phy layer with polling, timeouts, etc. */
Tejun Heo81952c52006-05-15 20:57:47 +09002833 if (ata_port_offline(ap)) {
Tejun Heoc2bd5802006-01-24 17:05:22 +09002834 *class = ATA_DEV_NONE;
2835 DPRINTK("EXIT, link offline\n");
2836 return 0;
2837 }
2838
2839 if (ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT)) {
Tejun Heof15a1da2006-05-15 20:57:56 +09002840 ata_port_printk(ap, KERN_ERR,
2841 "COMRESET failed (device not ready)\n");
Tejun Heoc2bd5802006-01-24 17:05:22 +09002842 return -EIO;
2843 }
2844
Tejun Heo3a397462006-02-10 23:58:48 +09002845 ap->ops->dev_select(ap, 0); /* probably unnecessary */
2846
Tejun Heoc2bd5802006-01-24 17:05:22 +09002847 *class = ata_dev_try_classify(ap, 0, NULL);
2848
2849 DPRINTK("EXIT, class=%u\n", *class);
2850 return 0;
2851}
2852
2853/**
2854 * ata_std_postreset - standard postreset callback
2855 * @ap: the target ata_port
2856 * @classes: classes of attached devices
2857 *
2858 * This function is invoked after a successful reset. Note that
2859 * the device might have been reset more than once using
2860 * different reset methods before postreset is invoked.
Tejun Heoc2bd5802006-01-24 17:05:22 +09002861 *
Tejun Heoc2bd5802006-01-24 17:05:22 +09002862 * LOCKING:
2863 * Kernel thread context (may sleep)
2864 */
2865void ata_std_postreset(struct ata_port *ap, unsigned int *classes)
2866{
Tejun Heodc2b3512006-05-15 20:58:00 +09002867 u32 serror;
2868
Tejun Heoc2bd5802006-01-24 17:05:22 +09002869 DPRINTK("ENTER\n");
2870
Tejun Heoc2bd5802006-01-24 17:05:22 +09002871 /* print link status */
Tejun Heo81952c52006-05-15 20:57:47 +09002872 sata_print_link_status(ap);
Tejun Heoc2bd5802006-01-24 17:05:22 +09002873
Tejun Heodc2b3512006-05-15 20:58:00 +09002874 /* clear SError */
2875 if (sata_scr_read(ap, SCR_ERROR, &serror) == 0)
2876 sata_scr_write(ap, SCR_ERROR, serror);
2877
Tejun Heo3a397462006-02-10 23:58:48 +09002878 /* re-enable interrupts */
Tejun Heoe3180492006-05-15 20:58:09 +09002879 if (!ap->ops->error_handler) {
2880 /* FIXME: hack. create a hook instead */
2881 if (ap->ioaddr.ctl_addr)
2882 ata_irq_on(ap);
2883 }
Tejun Heoc2bd5802006-01-24 17:05:22 +09002884
2885 /* is double-select really necessary? */
2886 if (classes[0] != ATA_DEV_NONE)
2887 ap->ops->dev_select(ap, 1);
2888 if (classes[1] != ATA_DEV_NONE)
2889 ap->ops->dev_select(ap, 0);
2890
Tejun Heo3a397462006-02-10 23:58:48 +09002891 /* bail out if no device is present */
2892 if (classes[0] == ATA_DEV_NONE && classes[1] == ATA_DEV_NONE) {
2893 DPRINTK("EXIT, no device\n");
2894 return;
2895 }
2896
2897 /* set up device control */
2898 if (ap->ioaddr.ctl_addr) {
2899 if (ap->flags & ATA_FLAG_MMIO)
2900 writeb(ap->ctl, (void __iomem *) ap->ioaddr.ctl_addr);
2901 else
2902 outb(ap->ctl, ap->ioaddr.ctl_addr);
2903 }
Tejun Heoc2bd5802006-01-24 17:05:22 +09002904
2905 DPRINTK("EXIT\n");
2906}
2907
Tejun Heoa62c0fc2006-01-24 17:05:22 +09002908/**
Tejun Heo623a3122006-03-05 17:55:58 +09002909 * ata_dev_same_device - Determine whether new ID matches configured device
Tejun Heo623a3122006-03-05 17:55:58 +09002910 * @dev: device to compare against
2911 * @new_class: class of the new device
2912 * @new_id: IDENTIFY page of the new device
2913 *
2914 * Compare @new_class and @new_id against @dev and determine
2915 * whether @dev is the device indicated by @new_class and
2916 * @new_id.
2917 *
2918 * LOCKING:
2919 * None.
2920 *
2921 * RETURNS:
2922 * 1 if @dev matches @new_class and @new_id, 0 otherwise.
2923 */
Tejun Heo3373efd2006-05-15 20:57:53 +09002924static int ata_dev_same_device(struct ata_device *dev, unsigned int new_class,
2925 const u16 *new_id)
Tejun Heo623a3122006-03-05 17:55:58 +09002926{
2927 const u16 *old_id = dev->id;
2928 unsigned char model[2][41], serial[2][21];
2929 u64 new_n_sectors;
2930
2931 if (dev->class != new_class) {
Tejun Heof15a1da2006-05-15 20:57:56 +09002932 ata_dev_printk(dev, KERN_INFO, "class mismatch %d != %d\n",
2933 dev->class, new_class);
Tejun Heo623a3122006-03-05 17:55:58 +09002934 return 0;
2935 }
2936
2937 ata_id_c_string(old_id, model[0], ATA_ID_PROD_OFS, sizeof(model[0]));
2938 ata_id_c_string(new_id, model[1], ATA_ID_PROD_OFS, sizeof(model[1]));
2939 ata_id_c_string(old_id, serial[0], ATA_ID_SERNO_OFS, sizeof(serial[0]));
2940 ata_id_c_string(new_id, serial[1], ATA_ID_SERNO_OFS, sizeof(serial[1]));
2941 new_n_sectors = ata_id_n_sectors(new_id);
2942
2943 if (strcmp(model[0], model[1])) {
Tejun Heof15a1da2006-05-15 20:57:56 +09002944 ata_dev_printk(dev, KERN_INFO, "model number mismatch "
2945 "'%s' != '%s'\n", model[0], model[1]);
Tejun Heo623a3122006-03-05 17:55:58 +09002946 return 0;
2947 }
2948
2949 if (strcmp(serial[0], serial[1])) {
Tejun Heof15a1da2006-05-15 20:57:56 +09002950 ata_dev_printk(dev, KERN_INFO, "serial number mismatch "
2951 "'%s' != '%s'\n", serial[0], serial[1]);
Tejun Heo623a3122006-03-05 17:55:58 +09002952 return 0;
2953 }
2954
2955 if (dev->class == ATA_DEV_ATA && dev->n_sectors != new_n_sectors) {
Tejun Heof15a1da2006-05-15 20:57:56 +09002956 ata_dev_printk(dev, KERN_INFO, "n_sectors mismatch "
2957 "%llu != %llu\n",
2958 (unsigned long long)dev->n_sectors,
2959 (unsigned long long)new_n_sectors);
Tejun Heo623a3122006-03-05 17:55:58 +09002960 return 0;
2961 }
2962
2963 return 1;
2964}
2965
2966/**
2967 * ata_dev_revalidate - Revalidate ATA device
Tejun Heo623a3122006-03-05 17:55:58 +09002968 * @dev: device to revalidate
2969 * @post_reset: is this revalidation after reset?
2970 *
2971 * Re-read IDENTIFY page and make sure @dev is still attached to
2972 * the port.
2973 *
2974 * LOCKING:
2975 * Kernel thread context (may sleep)
2976 *
2977 * RETURNS:
2978 * 0 on success, negative errno otherwise
2979 */
Tejun Heo3373efd2006-05-15 20:57:53 +09002980int ata_dev_revalidate(struct ata_device *dev, int post_reset)
Tejun Heo623a3122006-03-05 17:55:58 +09002981{
Tejun Heo5eb45c02006-04-02 18:51:52 +09002982 unsigned int class = dev->class;
Tejun Heof15a1da2006-05-15 20:57:56 +09002983 u16 *id = (void *)dev->ap->sector_buf;
Tejun Heo623a3122006-03-05 17:55:58 +09002984 int rc;
2985
Tejun Heo5eb45c02006-04-02 18:51:52 +09002986 if (!ata_dev_enabled(dev)) {
2987 rc = -ENODEV;
2988 goto fail;
2989 }
Tejun Heo623a3122006-03-05 17:55:58 +09002990
Tejun Heofe635c72006-05-15 20:57:35 +09002991 /* read ID data */
Tejun Heo3373efd2006-05-15 20:57:53 +09002992 rc = ata_dev_read_id(dev, &class, post_reset, id);
Tejun Heo623a3122006-03-05 17:55:58 +09002993 if (rc)
2994 goto fail;
2995
2996 /* is the device still there? */
Tejun Heo3373efd2006-05-15 20:57:53 +09002997 if (!ata_dev_same_device(dev, class, id)) {
Tejun Heo623a3122006-03-05 17:55:58 +09002998 rc = -ENODEV;
2999 goto fail;
3000 }
3001
Tejun Heofe635c72006-05-15 20:57:35 +09003002 memcpy(dev->id, id, sizeof(id[0]) * ATA_ID_WORDS);
Tejun Heo623a3122006-03-05 17:55:58 +09003003
3004 /* configure device according to the new ID */
Tejun Heo3373efd2006-05-15 20:57:53 +09003005 rc = ata_dev_configure(dev, 0);
Tejun Heo5eb45c02006-04-02 18:51:52 +09003006 if (rc == 0)
3007 return 0;
Tejun Heo623a3122006-03-05 17:55:58 +09003008
3009 fail:
Tejun Heof15a1da2006-05-15 20:57:56 +09003010 ata_dev_printk(dev, KERN_ERR, "revalidation failed (errno=%d)\n", rc);
Tejun Heo623a3122006-03-05 17:55:58 +09003011 return rc;
3012}
3013
Arjan van de Ven98ac62d2005-11-28 10:06:23 +01003014static const char * const ata_dma_blacklist [] = {
Alan Coxf4b15fe2006-03-22 15:54:04 +00003015 "WDC AC11000H", NULL,
3016 "WDC AC22100H", NULL,
3017 "WDC AC32500H", NULL,
3018 "WDC AC33100H", NULL,
3019 "WDC AC31600H", NULL,
3020 "WDC AC32100H", "24.09P07",
3021 "WDC AC23200L", "21.10N21",
3022 "Compaq CRD-8241B", NULL,
3023 "CRD-8400B", NULL,
3024 "CRD-8480B", NULL,
3025 "CRD-8482B", NULL,
3026 "CRD-84", NULL,
3027 "SanDisk SDP3B", NULL,
3028 "SanDisk SDP3B-64", NULL,
3029 "SANYO CD-ROM CRD", NULL,
3030 "HITACHI CDR-8", NULL,
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05003031 "HITACHI CDR-8335", NULL,
Alan Coxf4b15fe2006-03-22 15:54:04 +00003032 "HITACHI CDR-8435", NULL,
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05003033 "Toshiba CD-ROM XM-6202B", NULL,
3034 "TOSHIBA CD-ROM XM-1702BC", NULL,
3035 "CD-532E-A", NULL,
3036 "E-IDE CD-ROM CR-840", NULL,
3037 "CD-ROM Drive/F5A", NULL,
3038 "WPI CDD-820", NULL,
Alan Coxf4b15fe2006-03-22 15:54:04 +00003039 "SAMSUNG CD-ROM SC-148C", NULL,
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05003040 "SAMSUNG CD-ROM SC", NULL,
Alan Coxf4b15fe2006-03-22 15:54:04 +00003041 "SanDisk SDP3B-64", NULL,
3042 "ATAPI CD-ROM DRIVE 40X MAXIMUM",NULL,
3043 "_NEC DV5800A", NULL,
3044 "SAMSUNG CD-ROM SN-124", "N001"
Linus Torvalds1da177e2005-04-16 15:20:36 -07003045};
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05003046
Alan Coxf4b15fe2006-03-22 15:54:04 +00003047static int ata_strim(char *s, size_t len)
3048{
3049 len = strnlen(s, len);
3050
3051 /* ATAPI specifies that empty space is blank-filled; remove blanks */
3052 while ((len > 0) && (s[len - 1] == ' ')) {
3053 len--;
3054 s[len] = 0;
3055 }
3056 return len;
3057}
Linus Torvalds1da177e2005-04-16 15:20:36 -07003058
Jeff Garzik057ace52005-10-22 14:27:05 -04003059static int ata_dma_blacklisted(const struct ata_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003060{
Alan Coxf4b15fe2006-03-22 15:54:04 +00003061 unsigned char model_num[40];
3062 unsigned char model_rev[16];
3063 unsigned int nlen, rlen;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003064 int i;
3065
Albert Lee3a778272006-06-22 13:00:25 +08003066 /* We don't support polling DMA.
3067 * DMA blacklist those ATAPI devices with CDB-intr (and use PIO)
3068 * if the LLDD handles only interrupts in the HSM_ST_LAST state.
3069 */
3070 if ((dev->ap->flags & ATA_FLAG_PIO_POLLING) &&
3071 (dev->flags & ATA_DFLAG_CDB_INTR))
3072 return 1;
3073
Alan Coxf4b15fe2006-03-22 15:54:04 +00003074 ata_id_string(dev->id, model_num, ATA_ID_PROD_OFS,
3075 sizeof(model_num));
3076 ata_id_string(dev->id, model_rev, ATA_ID_FW_REV_OFS,
3077 sizeof(model_rev));
3078 nlen = ata_strim(model_num, sizeof(model_num));
3079 rlen = ata_strim(model_rev, sizeof(model_rev));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003080
Alan Coxf4b15fe2006-03-22 15:54:04 +00003081 for (i = 0; i < ARRAY_SIZE(ata_dma_blacklist); i += 2) {
3082 if (!strncmp(ata_dma_blacklist[i], model_num, nlen)) {
3083 if (ata_dma_blacklist[i+1] == NULL)
3084 return 1;
3085 if (!strncmp(ata_dma_blacklist[i], model_rev, rlen))
3086 return 1;
3087 }
3088 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003089 return 0;
3090}
3091
Tejun Heoa6d5a512006-03-06 04:31:57 +09003092/**
3093 * ata_dev_xfermask - Compute supported xfermask of the given device
Tejun Heoa6d5a512006-03-06 04:31:57 +09003094 * @dev: Device to compute xfermask for
3095 *
Tejun Heoacf356b2006-03-24 14:07:50 +09003096 * Compute supported xfermask of @dev and store it in
3097 * dev->*_mask. This function is responsible for applying all
3098 * known limits including host controller limits, device
3099 * blacklist, etc...
Tejun Heoa6d5a512006-03-06 04:31:57 +09003100 *
3101 * LOCKING:
3102 * None.
Tejun Heoa6d5a512006-03-06 04:31:57 +09003103 */
Tejun Heo3373efd2006-05-15 20:57:53 +09003104static void ata_dev_xfermask(struct ata_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003105{
Tejun Heo3373efd2006-05-15 20:57:53 +09003106 struct ata_port *ap = dev->ap;
Jeff Garzikcca39742006-08-24 03:19:22 -04003107 struct ata_host *host = ap->host;
Tejun Heoa6d5a512006-03-06 04:31:57 +09003108 unsigned long xfer_mask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003109
Tejun Heo37deecb2006-08-10 16:59:07 +09003110 /* controller modes available */
Tejun Heo565083e2006-04-02 17:54:47 +09003111 xfer_mask = ata_pack_xfermask(ap->pio_mask,
3112 ap->mwdma_mask, ap->udma_mask);
3113
3114 /* Apply cable rule here. Don't apply it early because when
3115 * we handle hot plug the cable type can itself change.
3116 */
3117 if (ap->cbl == ATA_CBL_PATA40)
3118 xfer_mask &= ~(0xF8 << ATA_SHIFT_UDMA);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003119
Tejun Heo37deecb2006-08-10 16:59:07 +09003120 xfer_mask &= ata_pack_xfermask(dev->pio_mask,
3121 dev->mwdma_mask, dev->udma_mask);
3122 xfer_mask &= ata_id_xfermask(dev->id);
Tejun Heo565083e2006-04-02 17:54:47 +09003123
Alan Coxb352e572006-08-10 18:52:12 +01003124 /*
3125 * CFA Advanced TrueIDE timings are not allowed on a shared
3126 * cable
3127 */
3128 if (ata_dev_pair(dev)) {
3129 /* No PIO5 or PIO6 */
3130 xfer_mask &= ~(0x03 << (ATA_SHIFT_PIO + 5));
3131 /* No MWDMA3 or MWDMA 4 */
3132 xfer_mask &= ~(0x03 << (ATA_SHIFT_MWDMA + 3));
3133 }
3134
Tejun Heo37deecb2006-08-10 16:59:07 +09003135 if (ata_dma_blacklisted(dev)) {
3136 xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
Tejun Heof15a1da2006-05-15 20:57:56 +09003137 ata_dev_printk(dev, KERN_WARNING,
3138 "device is on DMA blacklist, disabling DMA\n");
Tejun Heo37deecb2006-08-10 16:59:07 +09003139 }
Tejun Heoa6d5a512006-03-06 04:31:57 +09003140
Jeff Garzikcca39742006-08-24 03:19:22 -04003141 if ((host->flags & ATA_HOST_SIMPLEX) && host->simplex_claimed) {
Tejun Heo37deecb2006-08-10 16:59:07 +09003142 xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
3143 ata_dev_printk(dev, KERN_WARNING, "simplex DMA is claimed by "
3144 "other device, disabling DMA\n");
Alan Cox5444a6f2006-03-27 18:58:20 +01003145 }
Tejun Heo565083e2006-04-02 17:54:47 +09003146
Alan Cox5444a6f2006-03-27 18:58:20 +01003147 if (ap->ops->mode_filter)
3148 xfer_mask = ap->ops->mode_filter(ap, dev, xfer_mask);
3149
Tejun Heo565083e2006-04-02 17:54:47 +09003150 ata_unpack_xfermask(xfer_mask, &dev->pio_mask,
3151 &dev->mwdma_mask, &dev->udma_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003152}
3153
Linus Torvalds1da177e2005-04-16 15:20:36 -07003154/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07003155 * ata_dev_set_xfermode - Issue SET FEATURES - XFER MODE command
Linus Torvalds1da177e2005-04-16 15:20:36 -07003156 * @dev: Device to which command will be sent
3157 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04003158 * Issue SET FEATURES - XFER MODE command to device @dev
3159 * on port @ap.
3160 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07003161 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04003162 * PCI/etc. bus probe sem.
Tejun Heo83206a22006-03-24 15:25:31 +09003163 *
3164 * RETURNS:
3165 * 0 on success, AC_ERR_* mask otherwise.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003166 */
3167
Tejun Heo3373efd2006-05-15 20:57:53 +09003168static unsigned int ata_dev_set_xfermode(struct ata_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003169{
Tejun Heoa0123702005-12-13 14:49:31 +09003170 struct ata_taskfile tf;
Tejun Heo83206a22006-03-24 15:25:31 +09003171 unsigned int err_mask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003172
3173 /* set up set-features taskfile */
3174 DPRINTK("set features - xfer mode\n");
3175
Tejun Heo3373efd2006-05-15 20:57:53 +09003176 ata_tf_init(dev, &tf);
Tejun Heoa0123702005-12-13 14:49:31 +09003177 tf.command = ATA_CMD_SET_FEATURES;
3178 tf.feature = SETFEATURES_XFER;
3179 tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
3180 tf.protocol = ATA_PROT_NODATA;
3181 tf.nsect = dev->xfer_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003182
Tejun Heo3373efd2006-05-15 20:57:53 +09003183 err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003184
Tejun Heo83206a22006-03-24 15:25:31 +09003185 DPRINTK("EXIT, err_mask=%x\n", err_mask);
3186 return err_mask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003187}
3188
3189/**
Albert Lee8bf62ece2005-05-12 15:29:42 -04003190 * ata_dev_init_params - Issue INIT DEV PARAMS command
Albert Lee8bf62ece2005-05-12 15:29:42 -04003191 * @dev: Device to which command will be sent
Randy Dunlape2a7f772006-05-18 10:50:18 -07003192 * @heads: Number of heads (taskfile parameter)
3193 * @sectors: Number of sectors (taskfile parameter)
Albert Lee8bf62ece2005-05-12 15:29:42 -04003194 *
3195 * LOCKING:
Tejun Heo6aff8f12006-02-15 18:24:09 +09003196 * Kernel thread context (may sleep)
3197 *
3198 * RETURNS:
3199 * 0 on success, AC_ERR_* mask otherwise.
Albert Lee8bf62ece2005-05-12 15:29:42 -04003200 */
Tejun Heo3373efd2006-05-15 20:57:53 +09003201static unsigned int ata_dev_init_params(struct ata_device *dev,
3202 u16 heads, u16 sectors)
Albert Lee8bf62ece2005-05-12 15:29:42 -04003203{
Tejun Heoa0123702005-12-13 14:49:31 +09003204 struct ata_taskfile tf;
Tejun Heo6aff8f12006-02-15 18:24:09 +09003205 unsigned int err_mask;
Albert Lee8bf62ece2005-05-12 15:29:42 -04003206
3207 /* Number of sectors per track 1-255. Number of heads 1-16 */
3208 if (sectors < 1 || sectors > 255 || heads < 1 || heads > 16)
Albert Lee00b6f5e2006-03-27 16:39:18 +08003209 return AC_ERR_INVALID;
Albert Lee8bf62ece2005-05-12 15:29:42 -04003210
3211 /* set up init dev params taskfile */
3212 DPRINTK("init dev params \n");
3213
Tejun Heo3373efd2006-05-15 20:57:53 +09003214 ata_tf_init(dev, &tf);
Tejun Heoa0123702005-12-13 14:49:31 +09003215 tf.command = ATA_CMD_INIT_DEV_PARAMS;
3216 tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
3217 tf.protocol = ATA_PROT_NODATA;
3218 tf.nsect = sectors;
3219 tf.device |= (heads - 1) & 0x0f; /* max head = num. of heads - 1 */
Albert Lee8bf62ece2005-05-12 15:29:42 -04003220
Tejun Heo3373efd2006-05-15 20:57:53 +09003221 err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
Albert Lee8bf62ece2005-05-12 15:29:42 -04003222
Tejun Heo6aff8f12006-02-15 18:24:09 +09003223 DPRINTK("EXIT, err_mask=%x\n", err_mask);
3224 return err_mask;
Albert Lee8bf62ece2005-05-12 15:29:42 -04003225}
3226
3227/**
Jeff Garzik0cba6322005-05-30 19:49:12 -04003228 * ata_sg_clean - Unmap DMA memory associated with command
3229 * @qc: Command containing DMA memory to be released
3230 *
3231 * Unmap all mapped DMA memory associated with this command.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003232 *
3233 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04003234 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003235 */
3236
3237static void ata_sg_clean(struct ata_queued_cmd *qc)
3238{
3239 struct ata_port *ap = qc->ap;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003240 struct scatterlist *sg = qc->__sg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003241 int dir = qc->dma_dir;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003242 void *pad_buf = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003243
Tejun Heoa46314742006-02-11 19:11:13 +09003244 WARN_ON(!(qc->flags & ATA_QCFLAG_DMAMAP));
3245 WARN_ON(sg == NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003246
3247 if (qc->flags & ATA_QCFLAG_SINGLE)
Jeff Garzikf1318832006-02-20 16:55:56 -05003248 WARN_ON(qc->n_elem > 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003249
Jeff Garzik2c13b7c2005-11-14 14:14:16 -05003250 VPRINTK("unmapping %u sg elements\n", qc->n_elem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003251
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003252 /* if we padded the buffer out to 32-bit bound, and data
3253 * xfer direction is from-device, we must copy from the
3254 * pad buffer back into the supplied buffer
3255 */
3256 if (qc->pad_len && !(qc->tf.flags & ATA_TFLAG_WRITE))
3257 pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ);
3258
3259 if (qc->flags & ATA_QCFLAG_SG) {
Jeff Garzike1410f22005-11-14 14:06:26 -05003260 if (qc->n_elem)
Brian King2f1f6102006-03-23 17:30:15 -06003261 dma_unmap_sg(ap->dev, sg, qc->n_elem, dir);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003262 /* restore last sg */
3263 sg[qc->orig_n_elem - 1].length += qc->pad_len;
3264 if (pad_buf) {
3265 struct scatterlist *psg = &qc->pad_sgent;
3266 void *addr = kmap_atomic(psg->page, KM_IRQ0);
3267 memcpy(addr + psg->offset, pad_buf, qc->pad_len);
Mark Lorddfa15982005-12-12 23:19:28 -05003268 kunmap_atomic(addr, KM_IRQ0);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003269 }
3270 } else {
Tejun Heo2e242fa2006-02-20 23:48:38 +09003271 if (qc->n_elem)
Brian King2f1f6102006-03-23 17:30:15 -06003272 dma_unmap_single(ap->dev,
Jeff Garzike1410f22005-11-14 14:06:26 -05003273 sg_dma_address(&sg[0]), sg_dma_len(&sg[0]),
3274 dir);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003275 /* restore sg */
3276 sg->length += qc->pad_len;
3277 if (pad_buf)
3278 memcpy(qc->buf_virt + sg->length - qc->pad_len,
3279 pad_buf, qc->pad_len);
3280 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003281
3282 qc->flags &= ~ATA_QCFLAG_DMAMAP;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003283 qc->__sg = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003284}
3285
3286/**
3287 * ata_fill_sg - Fill PCI IDE PRD table
3288 * @qc: Metadata associated with taskfile to be transferred
3289 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04003290 * Fill PCI IDE PRD (scatter-gather) table with segments
3291 * associated with the current disk command.
3292 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07003293 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04003294 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003295 *
3296 */
3297static void ata_fill_sg(struct ata_queued_cmd *qc)
3298{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003299 struct ata_port *ap = qc->ap;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003300 struct scatterlist *sg;
3301 unsigned int idx;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003302
Tejun Heoa46314742006-02-11 19:11:13 +09003303 WARN_ON(qc->__sg == NULL);
Jeff Garzikf1318832006-02-20 16:55:56 -05003304 WARN_ON(qc->n_elem == 0 && qc->pad_len == 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003305
3306 idx = 0;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003307 ata_for_each_sg(sg, qc) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003308 u32 addr, offset;
3309 u32 sg_len, len;
3310
3311 /* determine if physical DMA addr spans 64K boundary.
3312 * Note h/w doesn't support 64-bit, so we unconditionally
3313 * truncate dma_addr_t to u32.
3314 */
3315 addr = (u32) sg_dma_address(sg);
3316 sg_len = sg_dma_len(sg);
3317
3318 while (sg_len) {
3319 offset = addr & 0xffff;
3320 len = sg_len;
3321 if ((offset + sg_len) > 0x10000)
3322 len = 0x10000 - offset;
3323
3324 ap->prd[idx].addr = cpu_to_le32(addr);
3325 ap->prd[idx].flags_len = cpu_to_le32(len & 0xffff);
3326 VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len);
3327
3328 idx++;
3329 sg_len -= len;
3330 addr += len;
3331 }
3332 }
3333
3334 if (idx)
3335 ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
3336}
3337/**
3338 * ata_check_atapi_dma - Check whether ATAPI DMA can be supported
3339 * @qc: Metadata associated with taskfile to check
3340 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04003341 * Allow low-level driver to filter ATA PACKET commands, returning
3342 * a status indicating whether or not it is OK to use DMA for the
3343 * supplied PACKET command.
3344 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07003345 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04003346 * spin_lock_irqsave(host lock)
Jeff Garzik0cba6322005-05-30 19:49:12 -04003347 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07003348 * RETURNS: 0 when ATAPI DMA can be used
3349 * nonzero otherwise
3350 */
3351int ata_check_atapi_dma(struct ata_queued_cmd *qc)
3352{
3353 struct ata_port *ap = qc->ap;
3354 int rc = 0; /* Assume ATAPI DMA is OK by default */
3355
3356 if (ap->ops->check_atapi_dma)
3357 rc = ap->ops->check_atapi_dma(qc);
3358
3359 return rc;
3360}
3361/**
3362 * ata_qc_prep - Prepare taskfile for submission
3363 * @qc: Metadata associated with taskfile to be prepared
3364 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04003365 * Prepare ATA taskfile for submission.
3366 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07003367 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04003368 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003369 */
3370void ata_qc_prep(struct ata_queued_cmd *qc)
3371{
3372 if (!(qc->flags & ATA_QCFLAG_DMAMAP))
3373 return;
3374
3375 ata_fill_sg(qc);
3376}
3377
Brian Kinge46834c2006-03-17 17:04:03 -06003378void ata_noop_qc_prep(struct ata_queued_cmd *qc) { }
3379
Jeff Garzik0cba6322005-05-30 19:49:12 -04003380/**
3381 * ata_sg_init_one - Associate command with memory buffer
3382 * @qc: Command to be associated
3383 * @buf: Memory buffer
3384 * @buflen: Length of memory buffer, in bytes.
3385 *
3386 * Initialize the data-related elements of queued_cmd @qc
3387 * to point to a single memory buffer, @buf of byte length @buflen.
3388 *
3389 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04003390 * spin_lock_irqsave(host lock)
Jeff Garzik0cba6322005-05-30 19:49:12 -04003391 */
3392
Linus Torvalds1da177e2005-04-16 15:20:36 -07003393void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen)
3394{
3395 struct scatterlist *sg;
3396
3397 qc->flags |= ATA_QCFLAG_SINGLE;
3398
3399 memset(&qc->sgent, 0, sizeof(qc->sgent));
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003400 qc->__sg = &qc->sgent;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003401 qc->n_elem = 1;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003402 qc->orig_n_elem = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003403 qc->buf_virt = buf;
Brian King233277c2006-06-07 11:25:31 -05003404 qc->nbytes = buflen;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003405
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003406 sg = qc->__sg;
Jeff Garzikf0612bb2005-10-30 01:58:18 -05003407 sg_init_one(sg, buf, buflen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003408}
3409
Jeff Garzik0cba6322005-05-30 19:49:12 -04003410/**
3411 * ata_sg_init - Associate command with scatter-gather table.
3412 * @qc: Command to be associated
3413 * @sg: Scatter-gather table.
3414 * @n_elem: Number of elements in s/g table.
3415 *
3416 * Initialize the data-related elements of queued_cmd @qc
3417 * to point to a scatter-gather table @sg, containing @n_elem
3418 * elements.
3419 *
3420 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04003421 * spin_lock_irqsave(host lock)
Jeff Garzik0cba6322005-05-30 19:49:12 -04003422 */
3423
Linus Torvalds1da177e2005-04-16 15:20:36 -07003424void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
3425 unsigned int n_elem)
3426{
3427 qc->flags |= ATA_QCFLAG_SG;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003428 qc->__sg = sg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003429 qc->n_elem = n_elem;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003430 qc->orig_n_elem = n_elem;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003431}
3432
3433/**
Jeff Garzik0cba6322005-05-30 19:49:12 -04003434 * ata_sg_setup_one - DMA-map the memory buffer associated with a command.
3435 * @qc: Command with memory buffer to be mapped.
3436 *
3437 * DMA-map the memory buffer associated with queued_cmd @qc.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003438 *
3439 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04003440 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003441 *
3442 * RETURNS:
Jeff Garzik0cba6322005-05-30 19:49:12 -04003443 * Zero on success, negative on error.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003444 */
3445
3446static int ata_sg_setup_one(struct ata_queued_cmd *qc)
3447{
3448 struct ata_port *ap = qc->ap;
3449 int dir = qc->dma_dir;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003450 struct scatterlist *sg = qc->__sg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003451 dma_addr_t dma_address;
Tejun Heo2e242fa2006-02-20 23:48:38 +09003452 int trim_sg = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003453
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003454 /* we must lengthen transfers to end on a 32-bit boundary */
3455 qc->pad_len = sg->length & 3;
3456 if (qc->pad_len) {
3457 void *pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ);
3458 struct scatterlist *psg = &qc->pad_sgent;
3459
Tejun Heoa46314742006-02-11 19:11:13 +09003460 WARN_ON(qc->dev->class != ATA_DEV_ATAPI);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003461
3462 memset(pad_buf, 0, ATA_DMA_PAD_SZ);
3463
3464 if (qc->tf.flags & ATA_TFLAG_WRITE)
3465 memcpy(pad_buf, qc->buf_virt + sg->length - qc->pad_len,
3466 qc->pad_len);
3467
3468 sg_dma_address(psg) = ap->pad_dma + (qc->tag * ATA_DMA_PAD_SZ);
3469 sg_dma_len(psg) = ATA_DMA_PAD_SZ;
3470 /* trim sg */
3471 sg->length -= qc->pad_len;
Tejun Heo2e242fa2006-02-20 23:48:38 +09003472 if (sg->length == 0)
3473 trim_sg = 1;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003474
3475 DPRINTK("padding done, sg->length=%u pad_len=%u\n",
3476 sg->length, qc->pad_len);
3477 }
3478
Tejun Heo2e242fa2006-02-20 23:48:38 +09003479 if (trim_sg) {
3480 qc->n_elem--;
Jeff Garzike1410f22005-11-14 14:06:26 -05003481 goto skip_map;
3482 }
3483
Brian King2f1f6102006-03-23 17:30:15 -06003484 dma_address = dma_map_single(ap->dev, qc->buf_virt,
Albert Lee32529e02005-05-26 03:49:42 -04003485 sg->length, dir);
Tejun Heo537a95d2005-11-05 14:29:01 -05003486 if (dma_mapping_error(dma_address)) {
3487 /* restore sg */
3488 sg->length += qc->pad_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003489 return -1;
Tejun Heo537a95d2005-11-05 14:29:01 -05003490 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003491
3492 sg_dma_address(sg) = dma_address;
Albert Lee32529e02005-05-26 03:49:42 -04003493 sg_dma_len(sg) = sg->length;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003494
Tejun Heo2e242fa2006-02-20 23:48:38 +09003495skip_map:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003496 DPRINTK("mapped buffer of %d bytes for %s\n", sg_dma_len(sg),
3497 qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
3498
3499 return 0;
3500}
3501
3502/**
Jeff Garzik0cba6322005-05-30 19:49:12 -04003503 * ata_sg_setup - DMA-map the scatter-gather table associated with a command.
3504 * @qc: Command with scatter-gather table to be mapped.
3505 *
3506 * DMA-map the scatter-gather table associated with queued_cmd @qc.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003507 *
3508 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04003509 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003510 *
3511 * RETURNS:
Jeff Garzik0cba6322005-05-30 19:49:12 -04003512 * Zero on success, negative on error.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003513 *
3514 */
3515
3516static int ata_sg_setup(struct ata_queued_cmd *qc)
3517{
3518 struct ata_port *ap = qc->ap;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003519 struct scatterlist *sg = qc->__sg;
3520 struct scatterlist *lsg = &sg[qc->n_elem - 1];
Jeff Garzike1410f22005-11-14 14:06:26 -05003521 int n_elem, pre_n_elem, dir, trim_sg = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003522
3523 VPRINTK("ENTER, ata%u\n", ap->id);
Tejun Heoa46314742006-02-11 19:11:13 +09003524 WARN_ON(!(qc->flags & ATA_QCFLAG_SG));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003525
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003526 /* we must lengthen transfers to end on a 32-bit boundary */
3527 qc->pad_len = lsg->length & 3;
3528 if (qc->pad_len) {
3529 void *pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ);
3530 struct scatterlist *psg = &qc->pad_sgent;
3531 unsigned int offset;
3532
Tejun Heoa46314742006-02-11 19:11:13 +09003533 WARN_ON(qc->dev->class != ATA_DEV_ATAPI);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003534
3535 memset(pad_buf, 0, ATA_DMA_PAD_SZ);
3536
3537 /*
3538 * psg->page/offset are used to copy to-be-written
3539 * data in this function or read data in ata_sg_clean.
3540 */
3541 offset = lsg->offset + lsg->length - qc->pad_len;
3542 psg->page = nth_page(lsg->page, offset >> PAGE_SHIFT);
3543 psg->offset = offset_in_page(offset);
3544
3545 if (qc->tf.flags & ATA_TFLAG_WRITE) {
3546 void *addr = kmap_atomic(psg->page, KM_IRQ0);
3547 memcpy(pad_buf, addr + psg->offset, qc->pad_len);
Mark Lorddfa15982005-12-12 23:19:28 -05003548 kunmap_atomic(addr, KM_IRQ0);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003549 }
3550
3551 sg_dma_address(psg) = ap->pad_dma + (qc->tag * ATA_DMA_PAD_SZ);
3552 sg_dma_len(psg) = ATA_DMA_PAD_SZ;
3553 /* trim last sg */
3554 lsg->length -= qc->pad_len;
Jeff Garzike1410f22005-11-14 14:06:26 -05003555 if (lsg->length == 0)
3556 trim_sg = 1;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003557
3558 DPRINTK("padding done, sg[%d].length=%u pad_len=%u\n",
3559 qc->n_elem - 1, lsg->length, qc->pad_len);
3560 }
3561
Jeff Garzike1410f22005-11-14 14:06:26 -05003562 pre_n_elem = qc->n_elem;
3563 if (trim_sg && pre_n_elem)
3564 pre_n_elem--;
3565
3566 if (!pre_n_elem) {
3567 n_elem = 0;
3568 goto skip_map;
3569 }
3570
Linus Torvalds1da177e2005-04-16 15:20:36 -07003571 dir = qc->dma_dir;
Brian King2f1f6102006-03-23 17:30:15 -06003572 n_elem = dma_map_sg(ap->dev, sg, pre_n_elem, dir);
Tejun Heo537a95d2005-11-05 14:29:01 -05003573 if (n_elem < 1) {
3574 /* restore last sg */
3575 lsg->length += qc->pad_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003576 return -1;
Tejun Heo537a95d2005-11-05 14:29:01 -05003577 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003578
3579 DPRINTK("%d sg elements mapped\n", n_elem);
3580
Jeff Garzike1410f22005-11-14 14:06:26 -05003581skip_map:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003582 qc->n_elem = n_elem;
3583
3584 return 0;
3585}
3586
3587/**
Randy Dunlapc893a3a2006-01-28 13:15:32 -05003588 * swap_buf_le16 - swap halves of 16-bit words in place
Edward Falk0baab862005-06-02 18:17:13 -04003589 * @buf: Buffer to swap
3590 * @buf_words: Number of 16-bit words in buffer.
3591 *
3592 * Swap halves of 16-bit words if needed to convert from
3593 * little-endian byte order to native cpu byte order, or
3594 * vice-versa.
3595 *
3596 * LOCKING:
Randy Dunlap6f0ef4f2005-10-25 01:44:30 -04003597 * Inherited from caller.
Edward Falk0baab862005-06-02 18:17:13 -04003598 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003599void swap_buf_le16(u16 *buf, unsigned int buf_words)
3600{
3601#ifdef __BIG_ENDIAN
3602 unsigned int i;
3603
3604 for (i = 0; i < buf_words; i++)
3605 buf[i] = le16_to_cpu(buf[i]);
3606#endif /* __BIG_ENDIAN */
3607}
3608
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003609/**
3610 * ata_mmio_data_xfer - Transfer data by MMIO
Jeff Garzikbf717b112006-06-13 20:27:03 -04003611 * @adev: device for this I/O
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003612 * @buf: data buffer
3613 * @buflen: buffer length
Jeff Garzik344baba2005-09-07 01:15:17 -04003614 * @write_data: read/write
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003615 *
3616 * Transfer data from/to the device data register by MMIO.
3617 *
3618 * LOCKING:
3619 * Inherited from caller.
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003620 */
3621
Tejun Heo88574552006-06-25 20:00:35 +09003622void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf,
Alan Coxa6b2c5d2006-05-22 16:59:59 +01003623 unsigned int buflen, int write_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003624{
Alan Coxa6b2c5d2006-05-22 16:59:59 +01003625 struct ata_port *ap = adev->ap;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003626 unsigned int i;
3627 unsigned int words = buflen >> 1;
3628 u16 *buf16 = (u16 *) buf;
3629 void __iomem *mmio = (void __iomem *)ap->ioaddr.data_addr;
3630
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003631 /* Transfer multiple of 2 bytes */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003632 if (write_data) {
3633 for (i = 0; i < words; i++)
3634 writew(le16_to_cpu(buf16[i]), mmio);
3635 } else {
3636 for (i = 0; i < words; i++)
3637 buf16[i] = cpu_to_le16(readw(mmio));
3638 }
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003639
3640 /* Transfer trailing 1 byte, if any. */
3641 if (unlikely(buflen & 0x01)) {
3642 u16 align_buf[1] = { 0 };
3643 unsigned char *trailing_buf = buf + buflen - 1;
3644
3645 if (write_data) {
3646 memcpy(align_buf, trailing_buf, 1);
3647 writew(le16_to_cpu(align_buf[0]), mmio);
3648 } else {
3649 align_buf[0] = cpu_to_le16(readw(mmio));
3650 memcpy(trailing_buf, align_buf, 1);
3651 }
3652 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003653}
3654
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003655/**
3656 * ata_pio_data_xfer - Transfer data by PIO
Alan Coxa6b2c5d2006-05-22 16:59:59 +01003657 * @adev: device to target
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003658 * @buf: data buffer
3659 * @buflen: buffer length
Jeff Garzik344baba2005-09-07 01:15:17 -04003660 * @write_data: read/write
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003661 *
3662 * Transfer data from/to the device data register by PIO.
3663 *
3664 * LOCKING:
3665 * Inherited from caller.
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003666 */
3667
Tejun Heo88574552006-06-25 20:00:35 +09003668void ata_pio_data_xfer(struct ata_device *adev, unsigned char *buf,
Alan Coxa6b2c5d2006-05-22 16:59:59 +01003669 unsigned int buflen, int write_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003670{
Alan Coxa6b2c5d2006-05-22 16:59:59 +01003671 struct ata_port *ap = adev->ap;
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003672 unsigned int words = buflen >> 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003673
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003674 /* Transfer multiple of 2 bytes */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003675 if (write_data)
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003676 outsw(ap->ioaddr.data_addr, buf, words);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003677 else
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003678 insw(ap->ioaddr.data_addr, buf, words);
3679
3680 /* Transfer trailing 1 byte, if any. */
3681 if (unlikely(buflen & 0x01)) {
3682 u16 align_buf[1] = { 0 };
3683 unsigned char *trailing_buf = buf + buflen - 1;
3684
3685 if (write_data) {
3686 memcpy(align_buf, trailing_buf, 1);
3687 outw(le16_to_cpu(align_buf[0]), ap->ioaddr.data_addr);
3688 } else {
3689 align_buf[0] = cpu_to_le16(inw(ap->ioaddr.data_addr));
3690 memcpy(trailing_buf, align_buf, 1);
3691 }
3692 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003693}
3694
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003695/**
Alan Cox75e99582006-05-24 14:14:41 +01003696 * ata_pio_data_xfer_noirq - Transfer data by PIO
3697 * @adev: device to target
3698 * @buf: data buffer
3699 * @buflen: buffer length
3700 * @write_data: read/write
3701 *
Tejun Heo88574552006-06-25 20:00:35 +09003702 * Transfer data from/to the device data register by PIO. Do the
Alan Cox75e99582006-05-24 14:14:41 +01003703 * transfer with interrupts disabled.
3704 *
3705 * LOCKING:
3706 * Inherited from caller.
3707 */
3708
3709void ata_pio_data_xfer_noirq(struct ata_device *adev, unsigned char *buf,
3710 unsigned int buflen, int write_data)
3711{
3712 unsigned long flags;
3713 local_irq_save(flags);
3714 ata_pio_data_xfer(adev, buf, buflen, write_data);
3715 local_irq_restore(flags);
3716}
3717
3718
3719/**
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003720 * ata_pio_sector - Transfer ATA_SECT_SIZE (512 bytes) of data.
3721 * @qc: Command on going
3722 *
3723 * Transfer ATA_SECT_SIZE of data from/to the ATA device.
3724 *
3725 * LOCKING:
3726 * Inherited from caller.
3727 */
3728
Linus Torvalds1da177e2005-04-16 15:20:36 -07003729static void ata_pio_sector(struct ata_queued_cmd *qc)
3730{
3731 int do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003732 struct scatterlist *sg = qc->__sg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003733 struct ata_port *ap = qc->ap;
3734 struct page *page;
3735 unsigned int offset;
3736 unsigned char *buf;
3737
3738 if (qc->cursect == (qc->nsect - 1))
Albert Lee14be71f2005-09-27 17:36:35 +08003739 ap->hsm_task_state = HSM_ST_LAST;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003740
3741 page = sg[qc->cursg].page;
3742 offset = sg[qc->cursg].offset + qc->cursg_ofs * ATA_SECT_SIZE;
3743
3744 /* get the current page and offset */
3745 page = nth_page(page, (offset >> PAGE_SHIFT));
3746 offset %= PAGE_SIZE;
3747
Albert Lee7282aa42005-10-09 09:46:07 -04003748 DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
3749
Albert Lee91b8b312005-10-09 09:48:44 -04003750 if (PageHighMem(page)) {
3751 unsigned long flags;
Albert Lee7282aa42005-10-09 09:46:07 -04003752
Alan Coxa6b2c5d2006-05-22 16:59:59 +01003753 /* FIXME: use a bounce buffer */
Albert Lee91b8b312005-10-09 09:48:44 -04003754 local_irq_save(flags);
3755 buf = kmap_atomic(page, KM_IRQ0);
Albert Lee083958d2005-10-09 09:47:31 -04003756
Albert Lee91b8b312005-10-09 09:48:44 -04003757 /* do the actual data transfer */
Alan Coxa6b2c5d2006-05-22 16:59:59 +01003758 ap->ops->data_xfer(qc->dev, buf + offset, ATA_SECT_SIZE, do_write);
Albert Lee91b8b312005-10-09 09:48:44 -04003759
3760 kunmap_atomic(buf, KM_IRQ0);
3761 local_irq_restore(flags);
3762 } else {
3763 buf = page_address(page);
Alan Coxa6b2c5d2006-05-22 16:59:59 +01003764 ap->ops->data_xfer(qc->dev, buf + offset, ATA_SECT_SIZE, do_write);
Albert Lee91b8b312005-10-09 09:48:44 -04003765 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003766
3767 qc->cursect++;
3768 qc->cursg_ofs++;
3769
Albert Lee32529e02005-05-26 03:49:42 -04003770 if ((qc->cursg_ofs * ATA_SECT_SIZE) == (&sg[qc->cursg])->length) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003771 qc->cursg++;
3772 qc->cursg_ofs = 0;
3773 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003774}
Linus Torvalds1da177e2005-04-16 15:20:36 -07003775
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003776/**
Albert Lee07f6f7d2005-11-01 19:33:20 +08003777 * ata_pio_sectors - Transfer one or many 512-byte sectors.
3778 * @qc: Command on going
3779 *
Jeff Garzikc81e29b2006-05-24 01:49:12 -04003780 * Transfer one or many ATA_SECT_SIZE of data from/to the
Albert Lee07f6f7d2005-11-01 19:33:20 +08003781 * ATA device for the DRQ request.
3782 *
3783 * LOCKING:
3784 * Inherited from caller.
3785 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003786
Albert Lee07f6f7d2005-11-01 19:33:20 +08003787static void ata_pio_sectors(struct ata_queued_cmd *qc)
3788{
3789 if (is_multi_taskfile(&qc->tf)) {
3790 /* READ/WRITE MULTIPLE */
3791 unsigned int nsect;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003792
Jeff Garzik587005d2006-02-11 18:17:32 -05003793 WARN_ON(qc->dev->multi_count == 0);
Albert Lee07f6f7d2005-11-01 19:33:20 +08003794
3795 nsect = min(qc->nsect - qc->cursect, qc->dev->multi_count);
3796 while (nsect--)
3797 ata_pio_sector(qc);
3798 } else
3799 ata_pio_sector(qc);
3800}
3801
3802/**
Albert Leec71c1852005-10-04 06:03:45 -04003803 * atapi_send_cdb - Write CDB bytes to hardware
3804 * @ap: Port to which ATAPI device is attached.
3805 * @qc: Taskfile currently active
3806 *
3807 * When device has indicated its readiness to accept
3808 * a CDB, this function is called. Send the CDB.
3809 *
3810 * LOCKING:
3811 * caller.
3812 */
3813
3814static void atapi_send_cdb(struct ata_port *ap, struct ata_queued_cmd *qc)
3815{
3816 /* send SCSI cdb */
3817 DPRINTK("send cdb\n");
Jeff Garzikdb024d52006-02-13 00:23:57 -05003818 WARN_ON(qc->dev->cdb_len < 12);
Albert Leec71c1852005-10-04 06:03:45 -04003819
Alan Coxa6b2c5d2006-05-22 16:59:59 +01003820 ap->ops->data_xfer(qc->dev, qc->cdb, qc->dev->cdb_len, 1);
Albert Leec71c1852005-10-04 06:03:45 -04003821 ata_altstatus(ap); /* flush */
3822
3823 switch (qc->tf.protocol) {
3824 case ATA_PROT_ATAPI:
3825 ap->hsm_task_state = HSM_ST;
3826 break;
3827 case ATA_PROT_ATAPI_NODATA:
3828 ap->hsm_task_state = HSM_ST_LAST;
3829 break;
3830 case ATA_PROT_ATAPI_DMA:
3831 ap->hsm_task_state = HSM_ST_LAST;
3832 /* initiate bmdma */
3833 ap->ops->bmdma_start(qc);
3834 break;
3835 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003836}
3837
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003838/**
3839 * __atapi_pio_bytes - Transfer data from/to the ATAPI device.
3840 * @qc: Command on going
3841 * @bytes: number of bytes
3842 *
3843 * Transfer Transfer data from/to the ATAPI device.
3844 *
3845 * LOCKING:
3846 * Inherited from caller.
3847 *
3848 */
3849
Linus Torvalds1da177e2005-04-16 15:20:36 -07003850static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
3851{
3852 int do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003853 struct scatterlist *sg = qc->__sg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003854 struct ata_port *ap = qc->ap;
3855 struct page *page;
3856 unsigned char *buf;
3857 unsigned int offset, count;
3858
Albert Lee563a6e12005-08-12 14:17:50 +08003859 if (qc->curbytes + bytes >= qc->nbytes)
Albert Lee14be71f2005-09-27 17:36:35 +08003860 ap->hsm_task_state = HSM_ST_LAST;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003861
3862next_sg:
Albert Lee563a6e12005-08-12 14:17:50 +08003863 if (unlikely(qc->cursg >= qc->n_elem)) {
Jeff Garzik7fb6ec22005-09-16 06:01:48 -04003864 /*
Albert Lee563a6e12005-08-12 14:17:50 +08003865 * The end of qc->sg is reached and the device expects
3866 * more data to transfer. In order not to overrun qc->sg
3867 * and fulfill length specified in the byte count register,
3868 * - for read case, discard trailing data from the device
3869 * - for write case, padding zero data to the device
3870 */
3871 u16 pad_buf[1] = { 0 };
3872 unsigned int words = bytes >> 1;
3873 unsigned int i;
3874
3875 if (words) /* warning if bytes > 1 */
Tejun Heof15a1da2006-05-15 20:57:56 +09003876 ata_dev_printk(qc->dev, KERN_WARNING,
3877 "%u bytes trailing data\n", bytes);
Albert Lee563a6e12005-08-12 14:17:50 +08003878
3879 for (i = 0; i < words; i++)
Alan Coxa6b2c5d2006-05-22 16:59:59 +01003880 ap->ops->data_xfer(qc->dev, (unsigned char*)pad_buf, 2, do_write);
Albert Lee563a6e12005-08-12 14:17:50 +08003881
Albert Lee14be71f2005-09-27 17:36:35 +08003882 ap->hsm_task_state = HSM_ST_LAST;
Albert Lee563a6e12005-08-12 14:17:50 +08003883 return;
3884 }
3885
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003886 sg = &qc->__sg[qc->cursg];
Linus Torvalds1da177e2005-04-16 15:20:36 -07003887
Linus Torvalds1da177e2005-04-16 15:20:36 -07003888 page = sg->page;
3889 offset = sg->offset + qc->cursg_ofs;
3890
3891 /* get the current page and offset */
3892 page = nth_page(page, (offset >> PAGE_SHIFT));
3893 offset %= PAGE_SIZE;
3894
Albert Lee6952df02005-06-06 15:56:03 +08003895 /* don't overrun current sg */
Albert Lee32529e02005-05-26 03:49:42 -04003896 count = min(sg->length - qc->cursg_ofs, bytes);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003897
3898 /* don't cross page boundaries */
3899 count = min(count, (unsigned int)PAGE_SIZE - offset);
3900
Albert Lee7282aa42005-10-09 09:46:07 -04003901 DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
3902
Albert Lee91b8b312005-10-09 09:48:44 -04003903 if (PageHighMem(page)) {
3904 unsigned long flags;
Albert Lee7282aa42005-10-09 09:46:07 -04003905
Alan Coxa6b2c5d2006-05-22 16:59:59 +01003906 /* FIXME: use bounce buffer */
Albert Lee91b8b312005-10-09 09:48:44 -04003907 local_irq_save(flags);
3908 buf = kmap_atomic(page, KM_IRQ0);
Albert Lee083958d2005-10-09 09:47:31 -04003909
Albert Lee91b8b312005-10-09 09:48:44 -04003910 /* do the actual data transfer */
Alan Coxa6b2c5d2006-05-22 16:59:59 +01003911 ap->ops->data_xfer(qc->dev, buf + offset, count, do_write);
Albert Lee91b8b312005-10-09 09:48:44 -04003912
3913 kunmap_atomic(buf, KM_IRQ0);
3914 local_irq_restore(flags);
3915 } else {
3916 buf = page_address(page);
Alan Coxa6b2c5d2006-05-22 16:59:59 +01003917 ap->ops->data_xfer(qc->dev, buf + offset, count, do_write);
Albert Lee91b8b312005-10-09 09:48:44 -04003918 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003919
3920 bytes -= count;
3921 qc->curbytes += count;
3922 qc->cursg_ofs += count;
3923
Albert Lee32529e02005-05-26 03:49:42 -04003924 if (qc->cursg_ofs == sg->length) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003925 qc->cursg++;
3926 qc->cursg_ofs = 0;
3927 }
3928
Albert Lee563a6e12005-08-12 14:17:50 +08003929 if (bytes)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003930 goto next_sg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003931}
3932
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003933/**
3934 * atapi_pio_bytes - Transfer data from/to the ATAPI device.
3935 * @qc: Command on going
3936 *
3937 * Transfer Transfer data from/to the ATAPI device.
3938 *
3939 * LOCKING:
3940 * Inherited from caller.
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003941 */
3942
Linus Torvalds1da177e2005-04-16 15:20:36 -07003943static void atapi_pio_bytes(struct ata_queued_cmd *qc)
3944{
3945 struct ata_port *ap = qc->ap;
3946 struct ata_device *dev = qc->dev;
3947 unsigned int ireason, bc_lo, bc_hi, bytes;
3948 int i_write, do_write = (qc->tf.flags & ATA_TFLAG_WRITE) ? 1 : 0;
3949
Albert Leeeec4c3f2006-05-18 17:51:10 +08003950 /* Abuse qc->result_tf for temp storage of intermediate TF
3951 * here to save some kernel stack usage.
3952 * For normal completion, qc->result_tf is not relevant. For
3953 * error, qc->result_tf is later overwritten by ata_qc_complete().
3954 * So, the correctness of qc->result_tf is not affected.
3955 */
3956 ap->ops->tf_read(ap, &qc->result_tf);
3957 ireason = qc->result_tf.nsect;
3958 bc_lo = qc->result_tf.lbam;
3959 bc_hi = qc->result_tf.lbah;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003960 bytes = (bc_hi << 8) | bc_lo;
3961
3962 /* shall be cleared to zero, indicating xfer of data */
3963 if (ireason & (1 << 0))
3964 goto err_out;
3965
3966 /* make sure transfer direction matches expected */
3967 i_write = ((ireason & (1 << 1)) == 0) ? 1 : 0;
3968 if (do_write != i_write)
3969 goto err_out;
3970
Albert Lee312f7da2005-09-27 17:38:03 +08003971 VPRINTK("ata%u: xfering %d bytes\n", ap->id, bytes);
3972
Linus Torvalds1da177e2005-04-16 15:20:36 -07003973 __atapi_pio_bytes(qc, bytes);
3974
3975 return;
3976
3977err_out:
Tejun Heof15a1da2006-05-15 20:57:56 +09003978 ata_dev_printk(dev, KERN_INFO, "ATAPI check failed\n");
Tejun Heo11a56d22006-01-23 13:09:36 +09003979 qc->err_mask |= AC_ERR_HSM;
Albert Lee14be71f2005-09-27 17:36:35 +08003980 ap->hsm_task_state = HSM_ST_ERR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003981}
3982
3983/**
Albert Leec234fb02006-03-25 17:58:38 +08003984 * ata_hsm_ok_in_wq - Check if the qc can be handled in the workqueue.
3985 * @ap: the target ata_port
3986 * @qc: qc on going
Linus Torvalds1da177e2005-04-16 15:20:36 -07003987 *
Albert Leec234fb02006-03-25 17:58:38 +08003988 * RETURNS:
3989 * 1 if ok in workqueue, 0 otherwise.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003990 */
Albert Leec234fb02006-03-25 17:58:38 +08003991
3992static inline int ata_hsm_ok_in_wq(struct ata_port *ap, struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003993{
Albert Leec234fb02006-03-25 17:58:38 +08003994 if (qc->tf.flags & ATA_TFLAG_POLLING)
3995 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003996
Albert Leec234fb02006-03-25 17:58:38 +08003997 if (ap->hsm_task_state == HSM_ST_FIRST) {
3998 if (qc->tf.protocol == ATA_PROT_PIO &&
3999 (qc->tf.flags & ATA_TFLAG_WRITE))
4000 return 1;
4001
4002 if (is_atapi_taskfile(&qc->tf) &&
4003 !(qc->dev->flags & ATA_DFLAG_CDB_INTR))
4004 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004005 }
4006
Albert Leec234fb02006-03-25 17:58:38 +08004007 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004008}
4009
Albert Leec234fb02006-03-25 17:58:38 +08004010/**
Tejun Heoc17ea202006-05-15 20:59:29 +09004011 * ata_hsm_qc_complete - finish a qc running on standard HSM
4012 * @qc: Command to complete
4013 * @in_wq: 1 if called from workqueue, 0 otherwise
4014 *
4015 * Finish @qc which is running on standard HSM.
4016 *
4017 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04004018 * If @in_wq is zero, spin_lock_irqsave(host lock).
Tejun Heoc17ea202006-05-15 20:59:29 +09004019 * Otherwise, none on entry and grabs host lock.
4020 */
4021static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq)
4022{
4023 struct ata_port *ap = qc->ap;
4024 unsigned long flags;
4025
4026 if (ap->ops->error_handler) {
4027 if (in_wq) {
Jeff Garzikba6a1302006-06-22 23:46:10 -04004028 spin_lock_irqsave(ap->lock, flags);
Tejun Heoc17ea202006-05-15 20:59:29 +09004029
Jeff Garzikcca39742006-08-24 03:19:22 -04004030 /* EH might have kicked in while host lock is
4031 * released.
Tejun Heoc17ea202006-05-15 20:59:29 +09004032 */
4033 qc = ata_qc_from_tag(ap, qc->tag);
4034 if (qc) {
4035 if (likely(!(qc->err_mask & AC_ERR_HSM))) {
4036 ata_irq_on(ap);
4037 ata_qc_complete(qc);
4038 } else
4039 ata_port_freeze(ap);
4040 }
4041
Jeff Garzikba6a1302006-06-22 23:46:10 -04004042 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoc17ea202006-05-15 20:59:29 +09004043 } else {
4044 if (likely(!(qc->err_mask & AC_ERR_HSM)))
4045 ata_qc_complete(qc);
4046 else
4047 ata_port_freeze(ap);
4048 }
4049 } else {
4050 if (in_wq) {
Jeff Garzikba6a1302006-06-22 23:46:10 -04004051 spin_lock_irqsave(ap->lock, flags);
Tejun Heoc17ea202006-05-15 20:59:29 +09004052 ata_irq_on(ap);
4053 ata_qc_complete(qc);
Jeff Garzikba6a1302006-06-22 23:46:10 -04004054 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heoc17ea202006-05-15 20:59:29 +09004055 } else
4056 ata_qc_complete(qc);
4057 }
Jeff Garzikc81e29b2006-05-24 01:49:12 -04004058
4059 ata_altstatus(ap); /* flush */
Tejun Heoc17ea202006-05-15 20:59:29 +09004060}
4061
4062/**
Albert Leebb5cb292006-03-25 17:48:02 +08004063 * ata_hsm_move - move the HSM to the next state.
4064 * @ap: the target ata_port
4065 * @qc: qc on going
4066 * @status: current device status
4067 * @in_wq: 1 if called from workqueue, 0 otherwise
4068 *
4069 * RETURNS:
4070 * 1 when poll next status needed, 0 otherwise.
4071 */
Tejun Heo9a1004d2006-05-31 18:27:52 +09004072int ata_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
4073 u8 status, int in_wq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004074{
Albert Leebb5cb292006-03-25 17:48:02 +08004075 unsigned long flags = 0;
4076 int poll_next;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004077
Albert Lee6912ccd2006-03-25 17:45:49 +08004078 WARN_ON((qc->flags & ATA_QCFLAG_ACTIVE) == 0);
Albert Lee0565c262006-02-13 18:55:25 +08004079
Albert Leebb5cb292006-03-25 17:48:02 +08004080 /* Make sure ata_qc_issue_prot() does not throw things
4081 * like DMA polling into the workqueue. Notice that
4082 * in_wq is not equivalent to (qc->tf.flags & ATA_TFLAG_POLLING).
Albert Lee1c848982005-12-05 15:40:15 +08004083 */
Albert Leec234fb02006-03-25 17:58:38 +08004084 WARN_ON(in_wq != ata_hsm_ok_in_wq(ap, qc));
Albert Lee1c848982005-12-05 15:40:15 +08004085
Albert Leee2cec772006-03-25 17:43:49 +08004086fsm_start:
Albert Lee999bb6f2006-03-25 18:07:48 +08004087 DPRINTK("ata%u: protocol %d task_state %d (dev_stat 0x%X)\n",
4088 ap->id, qc->tf.protocol, ap->hsm_task_state, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004089
Albert Leee2cec772006-03-25 17:43:49 +08004090 switch (ap->hsm_task_state) {
4091 case HSM_ST_FIRST:
Albert Leebb5cb292006-03-25 17:48:02 +08004092 /* Send first data block or PACKET CDB */
4093
4094 /* If polling, we will stay in the work queue after
4095 * sending the data. Otherwise, interrupt handler
4096 * takes over after sending the data.
4097 */
4098 poll_next = (qc->tf.flags & ATA_TFLAG_POLLING);
4099
Albert Leee2cec772006-03-25 17:43:49 +08004100 /* check device status */
Albert Lee3655d1d2006-05-19 11:43:04 +08004101 if (unlikely((status & ATA_DRQ) == 0)) {
4102 /* handle BSY=0, DRQ=0 as error */
4103 if (likely(status & (ATA_ERR | ATA_DF)))
4104 /* device stops HSM for abort/error */
4105 qc->err_mask |= AC_ERR_DEV;
4106 else
4107 /* HSM violation. Let EH handle this */
4108 qc->err_mask |= AC_ERR_HSM;
4109
Albert Leee2cec772006-03-25 17:43:49 +08004110 ap->hsm_task_state = HSM_ST_ERR;
4111 goto fsm_start;
4112 }
4113
Albert Lee71601952006-03-25 18:11:12 +08004114 /* Device should not ask for data transfer (DRQ=1)
4115 * when it finds something wrong.
Albert Leeeee6c322006-04-01 17:38:43 +08004116 * We ignore DRQ here and stop the HSM by
4117 * changing hsm_task_state to HSM_ST_ERR and
4118 * let the EH abort the command or reset the device.
Albert Lee71601952006-03-25 18:11:12 +08004119 */
4120 if (unlikely(status & (ATA_ERR | ATA_DF))) {
4121 printk(KERN_WARNING "ata%d: DRQ=1 with device error, dev_stat 0x%X\n",
4122 ap->id, status);
Albert Lee3655d1d2006-05-19 11:43:04 +08004123 qc->err_mask |= AC_ERR_HSM;
Albert Leeeee6c322006-04-01 17:38:43 +08004124 ap->hsm_task_state = HSM_ST_ERR;
4125 goto fsm_start;
Albert Lee71601952006-03-25 18:11:12 +08004126 }
4127
Albert Leebb5cb292006-03-25 17:48:02 +08004128 /* Send the CDB (atapi) or the first data block (ata pio out).
4129 * During the state transition, interrupt handler shouldn't
4130 * be invoked before the data transfer is complete and
4131 * hsm_task_state is changed. Hence, the following locking.
4132 */
4133 if (in_wq)
Jeff Garzikba6a1302006-06-22 23:46:10 -04004134 spin_lock_irqsave(ap->lock, flags);
Albert Leee2cec772006-03-25 17:43:49 +08004135
Albert Leebb5cb292006-03-25 17:48:02 +08004136 if (qc->tf.protocol == ATA_PROT_PIO) {
4137 /* PIO data out protocol.
4138 * send first data block.
4139 */
4140
4141 /* ata_pio_sectors() might change the state
4142 * to HSM_ST_LAST. so, the state is changed here
4143 * before ata_pio_sectors().
4144 */
4145 ap->hsm_task_state = HSM_ST;
4146 ata_pio_sectors(qc);
4147 ata_altstatus(ap); /* flush */
4148 } else
4149 /* send CDB */
4150 atapi_send_cdb(ap, qc);
4151
4152 if (in_wq)
Jeff Garzikba6a1302006-06-22 23:46:10 -04004153 spin_unlock_irqrestore(ap->lock, flags);
Albert Leebb5cb292006-03-25 17:48:02 +08004154
4155 /* if polling, ata_pio_task() handles the rest.
4156 * otherwise, interrupt handler takes over from here.
4157 */
Albert Leee2cec772006-03-25 17:43:49 +08004158 break;
4159
4160 case HSM_ST:
4161 /* complete command or read/write the data register */
4162 if (qc->tf.protocol == ATA_PROT_ATAPI) {
4163 /* ATAPI PIO protocol */
4164 if ((status & ATA_DRQ) == 0) {
Albert Lee3655d1d2006-05-19 11:43:04 +08004165 /* No more data to transfer or device error.
4166 * Device error will be tagged in HSM_ST_LAST.
4167 */
Albert Leee2cec772006-03-25 17:43:49 +08004168 ap->hsm_task_state = HSM_ST_LAST;
4169 goto fsm_start;
4170 }
4171
Albert Lee71601952006-03-25 18:11:12 +08004172 /* Device should not ask for data transfer (DRQ=1)
4173 * when it finds something wrong.
Albert Leeeee6c322006-04-01 17:38:43 +08004174 * We ignore DRQ here and stop the HSM by
4175 * changing hsm_task_state to HSM_ST_ERR and
4176 * let the EH abort the command or reset the device.
Albert Lee71601952006-03-25 18:11:12 +08004177 */
4178 if (unlikely(status & (ATA_ERR | ATA_DF))) {
4179 printk(KERN_WARNING "ata%d: DRQ=1 with device error, dev_stat 0x%X\n",
4180 ap->id, status);
Albert Lee3655d1d2006-05-19 11:43:04 +08004181 qc->err_mask |= AC_ERR_HSM;
Albert Leeeee6c322006-04-01 17:38:43 +08004182 ap->hsm_task_state = HSM_ST_ERR;
4183 goto fsm_start;
Albert Lee71601952006-03-25 18:11:12 +08004184 }
4185
Albert Leee2cec772006-03-25 17:43:49 +08004186 atapi_pio_bytes(qc);
4187
4188 if (unlikely(ap->hsm_task_state == HSM_ST_ERR))
4189 /* bad ireason reported by device */
4190 goto fsm_start;
4191
4192 } else {
4193 /* ATA PIO protocol */
4194 if (unlikely((status & ATA_DRQ) == 0)) {
4195 /* handle BSY=0, DRQ=0 as error */
Albert Lee3655d1d2006-05-19 11:43:04 +08004196 if (likely(status & (ATA_ERR | ATA_DF)))
4197 /* device stops HSM for abort/error */
4198 qc->err_mask |= AC_ERR_DEV;
4199 else
4200 /* HSM violation. Let EH handle this */
4201 qc->err_mask |= AC_ERR_HSM;
4202
Albert Leee2cec772006-03-25 17:43:49 +08004203 ap->hsm_task_state = HSM_ST_ERR;
4204 goto fsm_start;
4205 }
4206
Albert Leeeee6c322006-04-01 17:38:43 +08004207 /* For PIO reads, some devices may ask for
4208 * data transfer (DRQ=1) alone with ERR=1.
4209 * We respect DRQ here and transfer one
4210 * block of junk data before changing the
4211 * hsm_task_state to HSM_ST_ERR.
4212 *
4213 * For PIO writes, ERR=1 DRQ=1 doesn't make
4214 * sense since the data block has been
4215 * transferred to the device.
Albert Lee71601952006-03-25 18:11:12 +08004216 */
4217 if (unlikely(status & (ATA_ERR | ATA_DF))) {
Albert Lee71601952006-03-25 18:11:12 +08004218 /* data might be corrputed */
4219 qc->err_mask |= AC_ERR_DEV;
Albert Leeeee6c322006-04-01 17:38:43 +08004220
4221 if (!(qc->tf.flags & ATA_TFLAG_WRITE)) {
4222 ata_pio_sectors(qc);
4223 ata_altstatus(ap);
4224 status = ata_wait_idle(ap);
4225 }
4226
Albert Lee3655d1d2006-05-19 11:43:04 +08004227 if (status & (ATA_BUSY | ATA_DRQ))
4228 qc->err_mask |= AC_ERR_HSM;
4229
Albert Leeeee6c322006-04-01 17:38:43 +08004230 /* ata_pio_sectors() might change the
4231 * state to HSM_ST_LAST. so, the state
4232 * is changed after ata_pio_sectors().
4233 */
4234 ap->hsm_task_state = HSM_ST_ERR;
4235 goto fsm_start;
Albert Lee71601952006-03-25 18:11:12 +08004236 }
4237
Albert Leee2cec772006-03-25 17:43:49 +08004238 ata_pio_sectors(qc);
4239
4240 if (ap->hsm_task_state == HSM_ST_LAST &&
4241 (!(qc->tf.flags & ATA_TFLAG_WRITE))) {
4242 /* all data read */
4243 ata_altstatus(ap);
Albert Lee52a32202006-03-25 18:18:15 +08004244 status = ata_wait_idle(ap);
Albert Leee2cec772006-03-25 17:43:49 +08004245 goto fsm_start;
4246 }
4247 }
4248
4249 ata_altstatus(ap); /* flush */
Albert Leebb5cb292006-03-25 17:48:02 +08004250 poll_next = 1;
Albert Leee2cec772006-03-25 17:43:49 +08004251 break;
4252
4253 case HSM_ST_LAST:
Albert Lee6912ccd2006-03-25 17:45:49 +08004254 if (unlikely(!ata_ok(status))) {
4255 qc->err_mask |= __ac_err_mask(status);
Albert Leee2cec772006-03-25 17:43:49 +08004256 ap->hsm_task_state = HSM_ST_ERR;
4257 goto fsm_start;
4258 }
4259
4260 /* no more data to transfer */
Albert Lee4332a772006-04-03 17:43:24 +08004261 DPRINTK("ata%u: dev %u command complete, drv_stat 0x%x\n",
4262 ap->id, qc->dev->devno, status);
Albert Leee2cec772006-03-25 17:43:49 +08004263
Albert Lee6912ccd2006-03-25 17:45:49 +08004264 WARN_ON(qc->err_mask);
4265
Albert Leee2cec772006-03-25 17:43:49 +08004266 ap->hsm_task_state = HSM_ST_IDLE;
4267
4268 /* complete taskfile transaction */
Tejun Heoc17ea202006-05-15 20:59:29 +09004269 ata_hsm_qc_complete(qc, in_wq);
Albert Leebb5cb292006-03-25 17:48:02 +08004270
4271 poll_next = 0;
Albert Leee2cec772006-03-25 17:43:49 +08004272 break;
4273
4274 case HSM_ST_ERR:
Albert Leee2cec772006-03-25 17:43:49 +08004275 /* make sure qc->err_mask is available to
4276 * know what's wrong and recover
4277 */
4278 WARN_ON(qc->err_mask == 0);
4279
4280 ap->hsm_task_state = HSM_ST_IDLE;
Albert Leebb5cb292006-03-25 17:48:02 +08004281
Albert Lee999bb6f2006-03-25 18:07:48 +08004282 /* complete taskfile transaction */
Tejun Heoc17ea202006-05-15 20:59:29 +09004283 ata_hsm_qc_complete(qc, in_wq);
Albert Leebb5cb292006-03-25 17:48:02 +08004284
4285 poll_next = 0;
Albert Leee2cec772006-03-25 17:43:49 +08004286 break;
4287 default:
Albert Leebb5cb292006-03-25 17:48:02 +08004288 poll_next = 0;
Albert Lee6912ccd2006-03-25 17:45:49 +08004289 BUG();
Albert Leee2cec772006-03-25 17:43:49 +08004290 }
4291
Albert Leebb5cb292006-03-25 17:48:02 +08004292 return poll_next;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004293}
4294
4295static void ata_pio_task(void *_data)
4296{
Tejun Heoc91af2c2006-04-02 18:51:53 +09004297 struct ata_queued_cmd *qc = _data;
4298 struct ata_port *ap = qc->ap;
Albert Leea1af3732006-03-25 17:50:15 +08004299 u8 status;
4300 int poll_next;
Jeff Garzik7fb6ec22005-09-16 06:01:48 -04004301
4302fsm_start:
Albert Leea1af3732006-03-25 17:50:15 +08004303 WARN_ON(ap->hsm_task_state == HSM_ST_IDLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004304
Albert Leea1af3732006-03-25 17:50:15 +08004305 /*
4306 * This is purely heuristic. This is a fast path.
4307 * Sometimes when we enter, BSY will be cleared in
4308 * a chk-status or two. If not, the drive is probably seeking
4309 * or something. Snooze for a couple msecs, then
4310 * chk-status again. If still busy, queue delayed work.
4311 */
4312 status = ata_busy_wait(ap, ATA_BUSY, 5);
4313 if (status & ATA_BUSY) {
4314 msleep(2);
4315 status = ata_busy_wait(ap, ATA_BUSY, 10);
4316 if (status & ATA_BUSY) {
Albert Lee31ce6da2006-04-03 18:31:44 +08004317 ata_port_queue_task(ap, ata_pio_task, qc, ATA_SHORT_PAUSE);
Albert Leea1af3732006-03-25 17:50:15 +08004318 return;
4319 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004320 }
4321
Albert Leea1af3732006-03-25 17:50:15 +08004322 /* move the HSM */
4323 poll_next = ata_hsm_move(ap, qc, status, 1);
4324
4325 /* another command or interrupt handler
4326 * may be running at this point.
4327 */
4328 if (poll_next)
Jeff Garzik7fb6ec22005-09-16 06:01:48 -04004329 goto fsm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004330}
4331
Linus Torvalds1da177e2005-04-16 15:20:36 -07004332/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07004333 * ata_qc_new - Request an available ATA command, for queueing
4334 * @ap: Port associated with device @dev
4335 * @dev: Device from whom we request an available command structure
4336 *
4337 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04004338 * None.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004339 */
4340
4341static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap)
4342{
4343 struct ata_queued_cmd *qc = NULL;
4344 unsigned int i;
4345
Tejun Heoe3180492006-05-15 20:58:09 +09004346 /* no command while frozen */
Tejun Heob51e9e52006-06-29 01:29:30 +09004347 if (unlikely(ap->pflags & ATA_PFLAG_FROZEN))
Tejun Heoe3180492006-05-15 20:58:09 +09004348 return NULL;
4349
Tejun Heo2ab7db12006-05-15 20:58:02 +09004350 /* the last tag is reserved for internal command. */
4351 for (i = 0; i < ATA_MAX_QUEUE - 1; i++)
Tejun Heo6cec4a32006-05-15 21:03:41 +09004352 if (!test_and_set_bit(i, &ap->qc_allocated)) {
Tejun Heof69499f2006-05-15 20:58:03 +09004353 qc = __ata_qc_from_tag(ap, i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004354 break;
4355 }
4356
4357 if (qc)
4358 qc->tag = i;
4359
4360 return qc;
4361}
4362
4363/**
4364 * ata_qc_new_init - Request an available ATA command, and initialize it
Linus Torvalds1da177e2005-04-16 15:20:36 -07004365 * @dev: Device from whom we request an available command structure
4366 *
4367 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04004368 * None.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004369 */
4370
Tejun Heo3373efd2006-05-15 20:57:53 +09004371struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004372{
Tejun Heo3373efd2006-05-15 20:57:53 +09004373 struct ata_port *ap = dev->ap;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004374 struct ata_queued_cmd *qc;
4375
4376 qc = ata_qc_new(ap);
4377 if (qc) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004378 qc->scsicmd = NULL;
4379 qc->ap = ap;
4380 qc->dev = dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004381
Jeff Garzik2c13b7c2005-11-14 14:14:16 -05004382 ata_qc_reinit(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004383 }
4384
4385 return qc;
4386}
4387
Linus Torvalds1da177e2005-04-16 15:20:36 -07004388/**
4389 * ata_qc_free - free unused ata_queued_cmd
4390 * @qc: Command to complete
4391 *
4392 * Designed to free unused ata_queued_cmd object
4393 * in case something prevents using it.
4394 *
4395 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04004396 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004397 */
4398void ata_qc_free(struct ata_queued_cmd *qc)
4399{
Tejun Heo4ba946e2006-01-23 13:09:36 +09004400 struct ata_port *ap = qc->ap;
4401 unsigned int tag;
4402
Tejun Heoa46314742006-02-11 19:11:13 +09004403 WARN_ON(qc == NULL); /* ata_qc_from_tag _might_ return NULL */
Linus Torvalds1da177e2005-04-16 15:20:36 -07004404
Tejun Heo4ba946e2006-01-23 13:09:36 +09004405 qc->flags = 0;
4406 tag = qc->tag;
4407 if (likely(ata_tag_valid(tag))) {
Tejun Heo4ba946e2006-01-23 13:09:36 +09004408 qc->tag = ATA_TAG_POISON;
Tejun Heo6cec4a32006-05-15 21:03:41 +09004409 clear_bit(tag, &ap->qc_allocated);
Tejun Heo4ba946e2006-01-23 13:09:36 +09004410 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004411}
4412
Tejun Heo76014422006-02-11 15:13:49 +09004413void __ata_qc_complete(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004414{
Tejun Heodedaf2b2006-05-15 21:03:43 +09004415 struct ata_port *ap = qc->ap;
4416
Tejun Heoa46314742006-02-11 19:11:13 +09004417 WARN_ON(qc == NULL); /* ata_qc_from_tag _might_ return NULL */
4418 WARN_ON(!(qc->flags & ATA_QCFLAG_ACTIVE));
Linus Torvalds1da177e2005-04-16 15:20:36 -07004419
4420 if (likely(qc->flags & ATA_QCFLAG_DMAMAP))
4421 ata_sg_clean(qc);
4422
Tejun Heo7401abf2006-05-15 20:57:32 +09004423 /* command should be marked inactive atomically with qc completion */
Tejun Heodedaf2b2006-05-15 21:03:43 +09004424 if (qc->tf.protocol == ATA_PROT_NCQ)
4425 ap->sactive &= ~(1 << qc->tag);
4426 else
4427 ap->active_tag = ATA_TAG_POISON;
Tejun Heo7401abf2006-05-15 20:57:32 +09004428
Albert Lee3f3791d2005-08-16 14:25:38 +08004429 /* atapi: mark qc as inactive to prevent the interrupt handler
4430 * from completing the command twice later, before the error handler
4431 * is called. (when rc != 0 and atapi request sense is needed)
4432 */
4433 qc->flags &= ~ATA_QCFLAG_ACTIVE;
Tejun Heodedaf2b2006-05-15 21:03:43 +09004434 ap->qc_active &= ~(1 << qc->tag);
Albert Lee3f3791d2005-08-16 14:25:38 +08004435
Linus Torvalds1da177e2005-04-16 15:20:36 -07004436 /* call completion callback */
Tejun Heo77853bf2006-01-23 13:09:36 +09004437 qc->complete_fn(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004438}
4439
Tejun Heof686bcb2006-05-15 20:58:05 +09004440/**
4441 * ata_qc_complete - Complete an active ATA command
4442 * @qc: Command to complete
4443 * @err_mask: ATA Status register contents
4444 *
4445 * Indicate to the mid and upper layers that an ATA
4446 * command has completed, with either an ok or not-ok status.
4447 *
4448 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04004449 * spin_lock_irqsave(host lock)
Tejun Heof686bcb2006-05-15 20:58:05 +09004450 */
4451void ata_qc_complete(struct ata_queued_cmd *qc)
4452{
4453 struct ata_port *ap = qc->ap;
4454
4455 /* XXX: New EH and old EH use different mechanisms to
4456 * synchronize EH with regular execution path.
4457 *
4458 * In new EH, a failed qc is marked with ATA_QCFLAG_FAILED.
4459 * Normal execution path is responsible for not accessing a
4460 * failed qc. libata core enforces the rule by returning NULL
4461 * from ata_qc_from_tag() for failed qcs.
4462 *
4463 * Old EH depends on ata_qc_complete() nullifying completion
4464 * requests if ATA_QCFLAG_EH_SCHEDULED is set. Old EH does
4465 * not synchronize with interrupt handler. Only PIO task is
4466 * taken care of.
4467 */
4468 if (ap->ops->error_handler) {
Tejun Heob51e9e52006-06-29 01:29:30 +09004469 WARN_ON(ap->pflags & ATA_PFLAG_FROZEN);
Tejun Heof686bcb2006-05-15 20:58:05 +09004470
4471 if (unlikely(qc->err_mask))
4472 qc->flags |= ATA_QCFLAG_FAILED;
4473
4474 if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) {
4475 if (!ata_tag_internal(qc->tag)) {
4476 /* always fill result TF for failed qc */
4477 ap->ops->tf_read(ap, &qc->result_tf);
4478 ata_qc_schedule_eh(qc);
4479 return;
4480 }
4481 }
4482
4483 /* read result TF if requested */
4484 if (qc->flags & ATA_QCFLAG_RESULT_TF)
4485 ap->ops->tf_read(ap, &qc->result_tf);
4486
4487 __ata_qc_complete(qc);
4488 } else {
4489 if (qc->flags & ATA_QCFLAG_EH_SCHEDULED)
4490 return;
4491
4492 /* read result TF if failed or requested */
4493 if (qc->err_mask || qc->flags & ATA_QCFLAG_RESULT_TF)
4494 ap->ops->tf_read(ap, &qc->result_tf);
4495
4496 __ata_qc_complete(qc);
4497 }
4498}
4499
Tejun Heodedaf2b2006-05-15 21:03:43 +09004500/**
4501 * ata_qc_complete_multiple - Complete multiple qcs successfully
4502 * @ap: port in question
4503 * @qc_active: new qc_active mask
4504 * @finish_qc: LLDD callback invoked before completing a qc
4505 *
4506 * Complete in-flight commands. This functions is meant to be
4507 * called from low-level driver's interrupt routine to complete
4508 * requests normally. ap->qc_active and @qc_active is compared
4509 * and commands are completed accordingly.
4510 *
4511 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04004512 * spin_lock_irqsave(host lock)
Tejun Heodedaf2b2006-05-15 21:03:43 +09004513 *
4514 * RETURNS:
4515 * Number of completed commands on success, -errno otherwise.
4516 */
4517int ata_qc_complete_multiple(struct ata_port *ap, u32 qc_active,
4518 void (*finish_qc)(struct ata_queued_cmd *))
4519{
4520 int nr_done = 0;
4521 u32 done_mask;
4522 int i;
4523
4524 done_mask = ap->qc_active ^ qc_active;
4525
4526 if (unlikely(done_mask & qc_active)) {
4527 ata_port_printk(ap, KERN_ERR, "illegal qc_active transition "
4528 "(%08x->%08x)\n", ap->qc_active, qc_active);
4529 return -EINVAL;
4530 }
4531
4532 for (i = 0; i < ATA_MAX_QUEUE; i++) {
4533 struct ata_queued_cmd *qc;
4534
4535 if (!(done_mask & (1 << i)))
4536 continue;
4537
4538 if ((qc = ata_qc_from_tag(ap, i))) {
4539 if (finish_qc)
4540 finish_qc(qc);
4541 ata_qc_complete(qc);
4542 nr_done++;
4543 }
4544 }
4545
4546 return nr_done;
4547}
4548
Linus Torvalds1da177e2005-04-16 15:20:36 -07004549static inline int ata_should_dma_map(struct ata_queued_cmd *qc)
4550{
4551 struct ata_port *ap = qc->ap;
4552
4553 switch (qc->tf.protocol) {
Tejun Heo3dc1d882006-05-15 21:03:45 +09004554 case ATA_PROT_NCQ:
Linus Torvalds1da177e2005-04-16 15:20:36 -07004555 case ATA_PROT_DMA:
4556 case ATA_PROT_ATAPI_DMA:
4557 return 1;
4558
4559 case ATA_PROT_ATAPI:
4560 case ATA_PROT_PIO:
Linus Torvalds1da177e2005-04-16 15:20:36 -07004561 if (ap->flags & ATA_FLAG_PIO_DMA)
4562 return 1;
4563
4564 /* fall through */
4565
4566 default:
4567 return 0;
4568 }
4569
4570 /* never reached */
4571}
4572
4573/**
4574 * ata_qc_issue - issue taskfile to device
4575 * @qc: command to issue to device
4576 *
4577 * Prepare an ATA command to submission to device.
4578 * This includes mapping the data into a DMA-able
4579 * area, filling in the S/G table, and finally
4580 * writing the taskfile to hardware, starting the command.
4581 *
4582 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04004583 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004584 */
Tejun Heo8e0e6942006-03-31 20:41:11 +09004585void ata_qc_issue(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004586{
4587 struct ata_port *ap = qc->ap;
4588
Tejun Heodedaf2b2006-05-15 21:03:43 +09004589 /* Make sure only one non-NCQ command is outstanding. The
4590 * check is skipped for old EH because it reuses active qc to
4591 * request ATAPI sense.
4592 */
4593 WARN_ON(ap->ops->error_handler && ata_tag_valid(ap->active_tag));
4594
4595 if (qc->tf.protocol == ATA_PROT_NCQ) {
4596 WARN_ON(ap->sactive & (1 << qc->tag));
4597 ap->sactive |= 1 << qc->tag;
4598 } else {
4599 WARN_ON(ap->sactive);
4600 ap->active_tag = qc->tag;
4601 }
4602
Tejun Heoe4a70e72006-03-31 20:36:47 +09004603 qc->flags |= ATA_QCFLAG_ACTIVE;
Tejun Heodedaf2b2006-05-15 21:03:43 +09004604 ap->qc_active |= 1 << qc->tag;
Tejun Heoe4a70e72006-03-31 20:36:47 +09004605
Linus Torvalds1da177e2005-04-16 15:20:36 -07004606 if (ata_should_dma_map(qc)) {
4607 if (qc->flags & ATA_QCFLAG_SG) {
4608 if (ata_sg_setup(qc))
Tejun Heo8e436af2006-01-23 13:09:36 +09004609 goto sg_err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004610 } else if (qc->flags & ATA_QCFLAG_SINGLE) {
4611 if (ata_sg_setup_one(qc))
Tejun Heo8e436af2006-01-23 13:09:36 +09004612 goto sg_err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004613 }
4614 } else {
4615 qc->flags &= ~ATA_QCFLAG_DMAMAP;
4616 }
4617
4618 ap->ops->qc_prep(qc);
4619
Tejun Heo8e0e6942006-03-31 20:41:11 +09004620 qc->err_mask |= ap->ops->qc_issue(qc);
4621 if (unlikely(qc->err_mask))
4622 goto err;
4623 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004624
Tejun Heo8e436af2006-01-23 13:09:36 +09004625sg_err:
4626 qc->flags &= ~ATA_QCFLAG_DMAMAP;
Tejun Heo8e0e6942006-03-31 20:41:11 +09004627 qc->err_mask |= AC_ERR_SYSTEM;
4628err:
4629 ata_qc_complete(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004630}
4631
4632/**
4633 * ata_qc_issue_prot - issue taskfile to device in proto-dependent manner
4634 * @qc: command to issue to device
4635 *
4636 * Using various libata functions and hooks, this function
4637 * starts an ATA command. ATA commands are grouped into
4638 * classes called "protocols", and issuing each type of protocol
4639 * is slightly different.
4640 *
Edward Falk0baab862005-06-02 18:17:13 -04004641 * May be used as the qc_issue() entry in ata_port_operations.
4642 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07004643 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04004644 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004645 *
4646 * RETURNS:
Tejun Heo9a3d9eb2006-01-23 13:09:36 +09004647 * Zero on success, AC_ERR_* mask on failure
Linus Torvalds1da177e2005-04-16 15:20:36 -07004648 */
4649
Tejun Heo9a3d9eb2006-01-23 13:09:36 +09004650unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004651{
4652 struct ata_port *ap = qc->ap;
4653
Albert Leee50362e2005-09-27 17:39:50 +08004654 /* Use polling pio if the LLD doesn't handle
4655 * interrupt driven pio and atapi CDB interrupt.
4656 */
4657 if (ap->flags & ATA_FLAG_PIO_POLLING) {
4658 switch (qc->tf.protocol) {
4659 case ATA_PROT_PIO:
4660 case ATA_PROT_ATAPI:
4661 case ATA_PROT_ATAPI_NODATA:
4662 qc->tf.flags |= ATA_TFLAG_POLLING;
4663 break;
4664 case ATA_PROT_ATAPI_DMA:
4665 if (qc->dev->flags & ATA_DFLAG_CDB_INTR)
Albert Lee3a778272006-06-22 13:00:25 +08004666 /* see ata_dma_blacklisted() */
Albert Leee50362e2005-09-27 17:39:50 +08004667 BUG();
4668 break;
4669 default:
4670 break;
4671 }
4672 }
4673
Albert Lee312f7da2005-09-27 17:38:03 +08004674 /* select the device */
Linus Torvalds1da177e2005-04-16 15:20:36 -07004675 ata_dev_select(ap, qc->dev->devno, 1, 0);
4676
Albert Lee312f7da2005-09-27 17:38:03 +08004677 /* start the command */
Linus Torvalds1da177e2005-04-16 15:20:36 -07004678 switch (qc->tf.protocol) {
4679 case ATA_PROT_NODATA:
Albert Lee312f7da2005-09-27 17:38:03 +08004680 if (qc->tf.flags & ATA_TFLAG_POLLING)
4681 ata_qc_set_polling(qc);
4682
Jeff Garzike5338252005-10-30 21:37:17 -05004683 ata_tf_to_host(ap, &qc->tf);
Albert Lee312f7da2005-09-27 17:38:03 +08004684 ap->hsm_task_state = HSM_ST_LAST;
4685
4686 if (qc->tf.flags & ATA_TFLAG_POLLING)
Albert Lee31ce6da2006-04-03 18:31:44 +08004687 ata_port_queue_task(ap, ata_pio_task, qc, 0);
Albert Lee312f7da2005-09-27 17:38:03 +08004688
Linus Torvalds1da177e2005-04-16 15:20:36 -07004689 break;
4690
4691 case ATA_PROT_DMA:
Jeff Garzik587005d2006-02-11 18:17:32 -05004692 WARN_ON(qc->tf.flags & ATA_TFLAG_POLLING);
Albert Lee312f7da2005-09-27 17:38:03 +08004693
Linus Torvalds1da177e2005-04-16 15:20:36 -07004694 ap->ops->tf_load(ap, &qc->tf); /* load tf registers */
4695 ap->ops->bmdma_setup(qc); /* set up bmdma */
4696 ap->ops->bmdma_start(qc); /* initiate bmdma */
Albert Lee312f7da2005-09-27 17:38:03 +08004697 ap->hsm_task_state = HSM_ST_LAST;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004698 break;
4699
Albert Lee312f7da2005-09-27 17:38:03 +08004700 case ATA_PROT_PIO:
4701 if (qc->tf.flags & ATA_TFLAG_POLLING)
4702 ata_qc_set_polling(qc);
4703
Jeff Garzike5338252005-10-30 21:37:17 -05004704 ata_tf_to_host(ap, &qc->tf);
Albert Lee312f7da2005-09-27 17:38:03 +08004705
Albert Lee54f00382005-09-30 19:14:19 +08004706 if (qc->tf.flags & ATA_TFLAG_WRITE) {
4707 /* PIO data out protocol */
4708 ap->hsm_task_state = HSM_ST_FIRST;
Albert Lee31ce6da2006-04-03 18:31:44 +08004709 ata_port_queue_task(ap, ata_pio_task, qc, 0);
Albert Lee54f00382005-09-30 19:14:19 +08004710
4711 /* always send first data block using
Albert Leee27486d2005-11-01 19:24:49 +08004712 * the ata_pio_task() codepath.
Albert Lee54f00382005-09-30 19:14:19 +08004713 */
Albert Lee312f7da2005-09-27 17:38:03 +08004714 } else {
Albert Lee54f00382005-09-30 19:14:19 +08004715 /* PIO data in protocol */
4716 ap->hsm_task_state = HSM_ST;
Albert Lee312f7da2005-09-27 17:38:03 +08004717
Albert Lee54f00382005-09-30 19:14:19 +08004718 if (qc->tf.flags & ATA_TFLAG_POLLING)
Albert Lee31ce6da2006-04-03 18:31:44 +08004719 ata_port_queue_task(ap, ata_pio_task, qc, 0);
Albert Lee312f7da2005-09-27 17:38:03 +08004720
Albert Lee54f00382005-09-30 19:14:19 +08004721 /* if polling, ata_pio_task() handles the rest.
4722 * otherwise, interrupt handler takes over from here.
4723 */
Albert Lee312f7da2005-09-27 17:38:03 +08004724 }
4725
Linus Torvalds1da177e2005-04-16 15:20:36 -07004726 break;
4727
4728 case ATA_PROT_ATAPI:
Linus Torvalds1da177e2005-04-16 15:20:36 -07004729 case ATA_PROT_ATAPI_NODATA:
Albert Lee312f7da2005-09-27 17:38:03 +08004730 if (qc->tf.flags & ATA_TFLAG_POLLING)
4731 ata_qc_set_polling(qc);
4732
Jeff Garzike5338252005-10-30 21:37:17 -05004733 ata_tf_to_host(ap, &qc->tf);
Jeff Garzikf6ef65e2006-01-27 02:45:00 -05004734
Albert Lee312f7da2005-09-27 17:38:03 +08004735 ap->hsm_task_state = HSM_ST_FIRST;
4736
4737 /* send cdb by polling if no cdb interrupt */
4738 if ((!(qc->dev->flags & ATA_DFLAG_CDB_INTR)) ||
4739 (qc->tf.flags & ATA_TFLAG_POLLING))
Albert Lee31ce6da2006-04-03 18:31:44 +08004740 ata_port_queue_task(ap, ata_pio_task, qc, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004741 break;
4742
4743 case ATA_PROT_ATAPI_DMA:
Jeff Garzik587005d2006-02-11 18:17:32 -05004744 WARN_ON(qc->tf.flags & ATA_TFLAG_POLLING);
Albert Lee312f7da2005-09-27 17:38:03 +08004745
Linus Torvalds1da177e2005-04-16 15:20:36 -07004746 ap->ops->tf_load(ap, &qc->tf); /* load tf registers */
4747 ap->ops->bmdma_setup(qc); /* set up bmdma */
Albert Lee312f7da2005-09-27 17:38:03 +08004748 ap->hsm_task_state = HSM_ST_FIRST;
4749
4750 /* send cdb by polling if no cdb interrupt */
4751 if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR))
Albert Lee31ce6da2006-04-03 18:31:44 +08004752 ata_port_queue_task(ap, ata_pio_task, qc, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004753 break;
4754
4755 default:
4756 WARN_ON(1);
Tejun Heo9a3d9eb2006-01-23 13:09:36 +09004757 return AC_ERR_SYSTEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004758 }
4759
4760 return 0;
4761}
4762
4763/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07004764 * ata_host_intr - Handle host interrupt for given (port, task)
4765 * @ap: Port on which interrupt arrived (possibly...)
4766 * @qc: Taskfile currently active in engine
4767 *
4768 * Handle host interrupt for given queued command. Currently,
4769 * only DMA interrupts are handled. All other commands are
4770 * handled via polling with interrupts disabled (nIEN bit).
4771 *
4772 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04004773 * spin_lock_irqsave(host lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004774 *
4775 * RETURNS:
4776 * One if interrupt was handled, zero if not (shared irq).
4777 */
4778
4779inline unsigned int ata_host_intr (struct ata_port *ap,
4780 struct ata_queued_cmd *qc)
4781{
Albert Lee312f7da2005-09-27 17:38:03 +08004782 u8 status, host_stat = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004783
Albert Lee312f7da2005-09-27 17:38:03 +08004784 VPRINTK("ata%u: protocol %d task_state %d\n",
4785 ap->id, qc->tf.protocol, ap->hsm_task_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004786
Albert Lee312f7da2005-09-27 17:38:03 +08004787 /* Check whether we are expecting interrupt in this state */
4788 switch (ap->hsm_task_state) {
4789 case HSM_ST_FIRST:
Albert Lee6912ccd2006-03-25 17:45:49 +08004790 /* Some pre-ATAPI-4 devices assert INTRQ
4791 * at this state when ready to receive CDB.
4792 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07004793
Albert Lee312f7da2005-09-27 17:38:03 +08004794 /* Check the ATA_DFLAG_CDB_INTR flag is enough here.
4795 * The flag was turned on only for atapi devices.
4796 * No need to check is_atapi_taskfile(&qc->tf) again.
4797 */
4798 if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR))
Linus Torvalds1da177e2005-04-16 15:20:36 -07004799 goto idle_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004800 break;
Albert Lee312f7da2005-09-27 17:38:03 +08004801 case HSM_ST_LAST:
4802 if (qc->tf.protocol == ATA_PROT_DMA ||
4803 qc->tf.protocol == ATA_PROT_ATAPI_DMA) {
4804 /* check status of DMA engine */
4805 host_stat = ap->ops->bmdma_status(ap);
4806 VPRINTK("ata%u: host_stat 0x%X\n", ap->id, host_stat);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004807
Albert Lee312f7da2005-09-27 17:38:03 +08004808 /* if it's not our irq... */
4809 if (!(host_stat & ATA_DMA_INTR))
4810 goto idle_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004811
Albert Lee312f7da2005-09-27 17:38:03 +08004812 /* before we do anything else, clear DMA-Start bit */
4813 ap->ops->bmdma_stop(qc);
Albert Leea4f16612005-12-26 16:40:53 +08004814
4815 if (unlikely(host_stat & ATA_DMA_ERR)) {
4816 /* error when transfering data to/from memory */
4817 qc->err_mask |= AC_ERR_HOST_BUS;
4818 ap->hsm_task_state = HSM_ST_ERR;
4819 }
Albert Lee312f7da2005-09-27 17:38:03 +08004820 }
4821 break;
4822 case HSM_ST:
4823 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004824 default:
4825 goto idle_irq;
4826 }
4827
Albert Lee312f7da2005-09-27 17:38:03 +08004828 /* check altstatus */
4829 status = ata_altstatus(ap);
4830 if (status & ATA_BUSY)
4831 goto idle_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004832
Albert Lee312f7da2005-09-27 17:38:03 +08004833 /* check main status, clearing INTRQ */
4834 status = ata_chk_status(ap);
4835 if (unlikely(status & ATA_BUSY))
4836 goto idle_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004837
Albert Lee312f7da2005-09-27 17:38:03 +08004838 /* ack bmdma irq events */
4839 ap->ops->irq_clear(ap);
4840
Albert Leebb5cb292006-03-25 17:48:02 +08004841 ata_hsm_move(ap, qc, status, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004842 return 1; /* irq handled */
4843
4844idle_irq:
4845 ap->stats.idle_irq++;
4846
4847#ifdef ATA_IRQ_TRAP
4848 if ((ap->stats.idle_irq % 1000) == 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004849 ata_irq_ack(ap, 0); /* debug trap */
Tejun Heof15a1da2006-05-15 20:57:56 +09004850 ata_port_printk(ap, KERN_WARNING, "irq trap\n");
Alan Cox23cfce82006-03-21 16:06:53 +00004851 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004852 }
4853#endif
4854 return 0; /* irq not handled */
4855}
4856
4857/**
4858 * ata_interrupt - Default ATA host interrupt handler
Jeff Garzik0cba6322005-05-30 19:49:12 -04004859 * @irq: irq line (unused)
Jeff Garzikcca39742006-08-24 03:19:22 -04004860 * @dev_instance: pointer to our ata_host information structure
Linus Torvalds1da177e2005-04-16 15:20:36 -07004861 *
Jeff Garzik0cba6322005-05-30 19:49:12 -04004862 * Default interrupt handler for PCI IDE devices. Calls
4863 * ata_host_intr() for each port that is not disabled.
4864 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07004865 * LOCKING:
Jeff Garzikcca39742006-08-24 03:19:22 -04004866 * Obtains host lock during operation.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004867 *
4868 * RETURNS:
Jeff Garzik0cba6322005-05-30 19:49:12 -04004869 * IRQ_NONE or IRQ_HANDLED.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004870 */
4871
David Howells7d12e782006-10-05 14:55:46 +01004872irqreturn_t ata_interrupt (int irq, void *dev_instance)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004873{
Jeff Garzikcca39742006-08-24 03:19:22 -04004874 struct ata_host *host = dev_instance;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004875 unsigned int i;
4876 unsigned int handled = 0;
4877 unsigned long flags;
4878
4879 /* TODO: make _irqsave conditional on x86 PCI IDE legacy mode */
Jeff Garzikcca39742006-08-24 03:19:22 -04004880 spin_lock_irqsave(&host->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004881
Jeff Garzikcca39742006-08-24 03:19:22 -04004882 for (i = 0; i < host->n_ports; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004883 struct ata_port *ap;
4884
Jeff Garzikcca39742006-08-24 03:19:22 -04004885 ap = host->ports[i];
Tejun Heoc1389502005-08-22 14:59:24 +09004886 if (ap &&
Jeff Garzik029f5462006-04-02 10:30:40 -04004887 !(ap->flags & ATA_FLAG_DISABLED)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004888 struct ata_queued_cmd *qc;
4889
4890 qc = ata_qc_from_tag(ap, ap->active_tag);
Albert Lee312f7da2005-09-27 17:38:03 +08004891 if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING)) &&
Albert Lee21b1ed72005-04-29 17:34:59 +08004892 (qc->flags & ATA_QCFLAG_ACTIVE))
Linus Torvalds1da177e2005-04-16 15:20:36 -07004893 handled |= ata_host_intr(ap, qc);
4894 }
4895 }
4896
Jeff Garzikcca39742006-08-24 03:19:22 -04004897 spin_unlock_irqrestore(&host->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004898
4899 return IRQ_RETVAL(handled);
4900}
4901
Tejun Heo34bf2172006-05-15 20:57:46 +09004902/**
4903 * sata_scr_valid - test whether SCRs are accessible
4904 * @ap: ATA port to test SCR accessibility for
4905 *
4906 * Test whether SCRs are accessible for @ap.
4907 *
4908 * LOCKING:
4909 * None.
4910 *
4911 * RETURNS:
4912 * 1 if SCRs are accessible, 0 otherwise.
4913 */
4914int sata_scr_valid(struct ata_port *ap)
4915{
4916 return ap->cbl == ATA_CBL_SATA && ap->ops->scr_read;
4917}
4918
4919/**
4920 * sata_scr_read - read SCR register of the specified port
4921 * @ap: ATA port to read SCR for
4922 * @reg: SCR to read
4923 * @val: Place to store read value
4924 *
4925 * Read SCR register @reg of @ap into *@val. This function is
4926 * guaranteed to succeed if the cable type of the port is SATA
4927 * and the port implements ->scr_read.
4928 *
4929 * LOCKING:
4930 * None.
4931 *
4932 * RETURNS:
4933 * 0 on success, negative errno on failure.
4934 */
4935int sata_scr_read(struct ata_port *ap, int reg, u32 *val)
4936{
4937 if (sata_scr_valid(ap)) {
4938 *val = ap->ops->scr_read(ap, reg);
4939 return 0;
4940 }
4941 return -EOPNOTSUPP;
4942}
4943
4944/**
4945 * sata_scr_write - write SCR register of the specified port
4946 * @ap: ATA port to write SCR for
4947 * @reg: SCR to write
4948 * @val: value to write
4949 *
4950 * Write @val to SCR register @reg of @ap. This function is
4951 * guaranteed to succeed if the cable type of the port is SATA
4952 * and the port implements ->scr_read.
4953 *
4954 * LOCKING:
4955 * None.
4956 *
4957 * RETURNS:
4958 * 0 on success, negative errno on failure.
4959 */
4960int sata_scr_write(struct ata_port *ap, int reg, u32 val)
4961{
4962 if (sata_scr_valid(ap)) {
4963 ap->ops->scr_write(ap, reg, val);
4964 return 0;
4965 }
4966 return -EOPNOTSUPP;
4967}
4968
4969/**
4970 * sata_scr_write_flush - write SCR register of the specified port and flush
4971 * @ap: ATA port to write SCR for
4972 * @reg: SCR to write
4973 * @val: value to write
4974 *
4975 * This function is identical to sata_scr_write() except that this
4976 * function performs flush after writing to the register.
4977 *
4978 * LOCKING:
4979 * None.
4980 *
4981 * RETURNS:
4982 * 0 on success, negative errno on failure.
4983 */
4984int sata_scr_write_flush(struct ata_port *ap, int reg, u32 val)
4985{
4986 if (sata_scr_valid(ap)) {
4987 ap->ops->scr_write(ap, reg, val);
4988 ap->ops->scr_read(ap, reg);
4989 return 0;
4990 }
4991 return -EOPNOTSUPP;
4992}
4993
4994/**
4995 * ata_port_online - test whether the given port is online
4996 * @ap: ATA port to test
4997 *
4998 * Test whether @ap is online. Note that this function returns 0
4999 * if online status of @ap cannot be obtained, so
5000 * ata_port_online(ap) != !ata_port_offline(ap).
5001 *
5002 * LOCKING:
5003 * None.
5004 *
5005 * RETURNS:
5006 * 1 if the port online status is available and online.
5007 */
5008int ata_port_online(struct ata_port *ap)
5009{
5010 u32 sstatus;
5011
5012 if (!sata_scr_read(ap, SCR_STATUS, &sstatus) && (sstatus & 0xf) == 0x3)
5013 return 1;
5014 return 0;
5015}
5016
5017/**
5018 * ata_port_offline - test whether the given port is offline
5019 * @ap: ATA port to test
5020 *
5021 * Test whether @ap is offline. Note that this function returns
5022 * 0 if offline status of @ap cannot be obtained, so
5023 * ata_port_online(ap) != !ata_port_offline(ap).
5024 *
5025 * LOCKING:
5026 * None.
5027 *
5028 * RETURNS:
5029 * 1 if the port offline status is available and offline.
5030 */
5031int ata_port_offline(struct ata_port *ap)
5032{
5033 u32 sstatus;
5034
5035 if (!sata_scr_read(ap, SCR_STATUS, &sstatus) && (sstatus & 0xf) != 0x3)
5036 return 1;
5037 return 0;
5038}
Edward Falk0baab862005-06-02 18:17:13 -04005039
Tejun Heo77b08fb2006-06-24 20:30:19 +09005040int ata_flush_cache(struct ata_device *dev)
Jens Axboe9b847542006-01-06 09:28:07 +01005041{
Tejun Heo977e6b92006-06-24 20:30:19 +09005042 unsigned int err_mask;
Jens Axboe9b847542006-01-06 09:28:07 +01005043 u8 cmd;
5044
5045 if (!ata_try_flush_cache(dev))
5046 return 0;
5047
5048 if (ata_id_has_flush_ext(dev->id))
5049 cmd = ATA_CMD_FLUSH_EXT;
5050 else
5051 cmd = ATA_CMD_FLUSH;
5052
Tejun Heo977e6b92006-06-24 20:30:19 +09005053 err_mask = ata_do_simple_cmd(dev, cmd);
5054 if (err_mask) {
5055 ata_dev_printk(dev, KERN_ERR, "failed to flush cache\n");
5056 return -EIO;
5057 }
5058
5059 return 0;
Jens Axboe9b847542006-01-06 09:28:07 +01005060}
5061
Jeff Garzikcca39742006-08-24 03:19:22 -04005062static int ata_host_request_pm(struct ata_host *host, pm_message_t mesg,
5063 unsigned int action, unsigned int ehi_flags,
5064 int wait)
Tejun Heo500530f2006-07-03 16:07:27 +09005065{
5066 unsigned long flags;
5067 int i, rc;
5068
Jeff Garzikcca39742006-08-24 03:19:22 -04005069 for (i = 0; i < host->n_ports; i++) {
5070 struct ata_port *ap = host->ports[i];
Tejun Heo500530f2006-07-03 16:07:27 +09005071
5072 /* Previous resume operation might still be in
5073 * progress. Wait for PM_PENDING to clear.
5074 */
5075 if (ap->pflags & ATA_PFLAG_PM_PENDING) {
5076 ata_port_wait_eh(ap);
5077 WARN_ON(ap->pflags & ATA_PFLAG_PM_PENDING);
5078 }
5079
5080 /* request PM ops to EH */
5081 spin_lock_irqsave(ap->lock, flags);
5082
5083 ap->pm_mesg = mesg;
5084 if (wait) {
5085 rc = 0;
5086 ap->pm_result = &rc;
5087 }
5088
5089 ap->pflags |= ATA_PFLAG_PM_PENDING;
5090 ap->eh_info.action |= action;
5091 ap->eh_info.flags |= ehi_flags;
5092
5093 ata_port_schedule_eh(ap);
5094
5095 spin_unlock_irqrestore(ap->lock, flags);
5096
5097 /* wait and check result */
5098 if (wait) {
5099 ata_port_wait_eh(ap);
5100 WARN_ON(ap->pflags & ATA_PFLAG_PM_PENDING);
5101 if (rc)
5102 return rc;
5103 }
5104 }
5105
5106 return 0;
5107}
5108
5109/**
Jeff Garzikcca39742006-08-24 03:19:22 -04005110 * ata_host_suspend - suspend host
5111 * @host: host to suspend
Tejun Heo500530f2006-07-03 16:07:27 +09005112 * @mesg: PM message
5113 *
Jeff Garzikcca39742006-08-24 03:19:22 -04005114 * Suspend @host. Actual operation is performed by EH. This
Tejun Heo500530f2006-07-03 16:07:27 +09005115 * function requests EH to perform PM operations and waits for EH
5116 * to finish.
5117 *
5118 * LOCKING:
5119 * Kernel thread context (may sleep).
5120 *
5121 * RETURNS:
5122 * 0 on success, -errno on failure.
5123 */
Jeff Garzikcca39742006-08-24 03:19:22 -04005124int ata_host_suspend(struct ata_host *host, pm_message_t mesg)
Tejun Heo500530f2006-07-03 16:07:27 +09005125{
5126 int i, j, rc;
5127
Jeff Garzikcca39742006-08-24 03:19:22 -04005128 rc = ata_host_request_pm(host, mesg, 0, ATA_EHI_QUIET, 1);
Tejun Heo500530f2006-07-03 16:07:27 +09005129 if (rc)
5130 goto fail;
5131
5132 /* EH is quiescent now. Fail if we have any ready device.
5133 * This happens if hotplug occurs between completion of device
5134 * suspension and here.
5135 */
Jeff Garzikcca39742006-08-24 03:19:22 -04005136 for (i = 0; i < host->n_ports; i++) {
5137 struct ata_port *ap = host->ports[i];
Tejun Heo500530f2006-07-03 16:07:27 +09005138
5139 for (j = 0; j < ATA_MAX_DEVICES; j++) {
5140 struct ata_device *dev = &ap->device[j];
5141
5142 if (ata_dev_ready(dev)) {
5143 ata_port_printk(ap, KERN_WARNING,
5144 "suspend failed, device %d "
5145 "still active\n", dev->devno);
5146 rc = -EBUSY;
5147 goto fail;
5148 }
5149 }
5150 }
5151
Jeff Garzikcca39742006-08-24 03:19:22 -04005152 host->dev->power.power_state = mesg;
Tejun Heo500530f2006-07-03 16:07:27 +09005153 return 0;
5154
5155 fail:
Jeff Garzikcca39742006-08-24 03:19:22 -04005156 ata_host_resume(host);
Tejun Heo500530f2006-07-03 16:07:27 +09005157 return rc;
5158}
5159
5160/**
Jeff Garzikcca39742006-08-24 03:19:22 -04005161 * ata_host_resume - resume host
5162 * @host: host to resume
Tejun Heo500530f2006-07-03 16:07:27 +09005163 *
Jeff Garzikcca39742006-08-24 03:19:22 -04005164 * Resume @host. Actual operation is performed by EH. This
Tejun Heo500530f2006-07-03 16:07:27 +09005165 * function requests EH to perform PM operations and returns.
5166 * Note that all resume operations are performed parallely.
5167 *
5168 * LOCKING:
5169 * Kernel thread context (may sleep).
5170 */
Jeff Garzikcca39742006-08-24 03:19:22 -04005171void ata_host_resume(struct ata_host *host)
Tejun Heo500530f2006-07-03 16:07:27 +09005172{
Jeff Garzikcca39742006-08-24 03:19:22 -04005173 ata_host_request_pm(host, PMSG_ON, ATA_EH_SOFTRESET,
5174 ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET, 0);
5175 host->dev->power.power_state = PMSG_ON;
Tejun Heo500530f2006-07-03 16:07:27 +09005176}
5177
Randy Dunlapc893a3a2006-01-28 13:15:32 -05005178/**
5179 * ata_port_start - Set port up for dma.
5180 * @ap: Port to initialize
5181 *
5182 * Called just after data structures for each port are
5183 * initialized. Allocates space for PRD table.
5184 *
5185 * May be used as the port_start() entry in ata_port_operations.
5186 *
5187 * LOCKING:
5188 * Inherited from caller.
5189 */
5190
Linus Torvalds1da177e2005-04-16 15:20:36 -07005191int ata_port_start (struct ata_port *ap)
5192{
Brian King2f1f6102006-03-23 17:30:15 -06005193 struct device *dev = ap->dev;
Jeff Garzik6037d6b2005-11-04 22:08:00 -05005194 int rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005195
5196 ap->prd = dma_alloc_coherent(dev, ATA_PRD_TBL_SZ, &ap->prd_dma, GFP_KERNEL);
5197 if (!ap->prd)
5198 return -ENOMEM;
5199
Jeff Garzik6037d6b2005-11-04 22:08:00 -05005200 rc = ata_pad_alloc(ap, dev);
5201 if (rc) {
Jeff Garzikcedc9a42005-10-05 07:13:30 -04005202 dma_free_coherent(dev, ATA_PRD_TBL_SZ, ap->prd, ap->prd_dma);
Jeff Garzik6037d6b2005-11-04 22:08:00 -05005203 return rc;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04005204 }
5205
Linus Torvalds1da177e2005-04-16 15:20:36 -07005206 DPRINTK("prd alloc, virt %p, dma %llx\n", ap->prd, (unsigned long long) ap->prd_dma);
5207
5208 return 0;
5209}
5210
Edward Falk0baab862005-06-02 18:17:13 -04005211
5212/**
5213 * ata_port_stop - Undo ata_port_start()
5214 * @ap: Port to shut down
5215 *
5216 * Frees the PRD table.
5217 *
5218 * May be used as the port_stop() entry in ata_port_operations.
5219 *
5220 * LOCKING:
Randy Dunlap6f0ef4f2005-10-25 01:44:30 -04005221 * Inherited from caller.
Edward Falk0baab862005-06-02 18:17:13 -04005222 */
5223
Linus Torvalds1da177e2005-04-16 15:20:36 -07005224void ata_port_stop (struct ata_port *ap)
5225{
Brian King2f1f6102006-03-23 17:30:15 -06005226 struct device *dev = ap->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005227
5228 dma_free_coherent(dev, ATA_PRD_TBL_SZ, ap->prd, ap->prd_dma);
Jeff Garzik6037d6b2005-11-04 22:08:00 -05005229 ata_pad_free(ap, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005230}
5231
Jeff Garzikcca39742006-08-24 03:19:22 -04005232void ata_host_stop (struct ata_host *host)
Jeff Garzikaa8f0dc2005-05-26 21:54:27 -04005233{
Jeff Garzikcca39742006-08-24 03:19:22 -04005234 if (host->mmio_base)
5235 iounmap(host->mmio_base);
Jeff Garzikaa8f0dc2005-05-26 21:54:27 -04005236}
5237
Linus Torvalds1da177e2005-04-16 15:20:36 -07005238/**
Tejun Heo3ef3b432006-05-31 18:27:30 +09005239 * ata_dev_init - Initialize an ata_device structure
5240 * @dev: Device structure to initialize
5241 *
5242 * Initialize @dev in preparation for probing.
5243 *
5244 * LOCKING:
5245 * Inherited from caller.
5246 */
5247void ata_dev_init(struct ata_device *dev)
5248{
5249 struct ata_port *ap = dev->ap;
Tejun Heo72fa4b72006-05-31 18:27:32 +09005250 unsigned long flags;
Tejun Heo3ef3b432006-05-31 18:27:30 +09005251
Tejun Heo5a04bf42006-05-31 18:27:38 +09005252 /* SATA spd limit is bound to the first device */
5253 ap->sata_spd_limit = ap->hw_sata_spd_limit;
5254
Tejun Heo72fa4b72006-05-31 18:27:32 +09005255 /* High bits of dev->flags are used to record warm plug
5256 * requests which occur asynchronously. Synchronize using
Jeff Garzikcca39742006-08-24 03:19:22 -04005257 * host lock.
Tejun Heo72fa4b72006-05-31 18:27:32 +09005258 */
Jeff Garzikba6a1302006-06-22 23:46:10 -04005259 spin_lock_irqsave(ap->lock, flags);
Tejun Heo72fa4b72006-05-31 18:27:32 +09005260 dev->flags &= ~ATA_DFLAG_INIT_MASK;
Jeff Garzikba6a1302006-06-22 23:46:10 -04005261 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo72fa4b72006-05-31 18:27:32 +09005262
5263 memset((void *)dev + ATA_DEVICE_CLEAR_OFFSET, 0,
5264 sizeof(*dev) - ATA_DEVICE_CLEAR_OFFSET);
Tejun Heo3ef3b432006-05-31 18:27:30 +09005265 dev->pio_mask = UINT_MAX;
5266 dev->mwdma_mask = UINT_MAX;
5267 dev->udma_mask = UINT_MAX;
5268}
5269
5270/**
Brian King155a8a92006-08-07 14:27:17 -05005271 * ata_port_init - Initialize an ata_port structure
Linus Torvalds1da177e2005-04-16 15:20:36 -07005272 * @ap: Structure to initialize
Jeff Garzikcca39742006-08-24 03:19:22 -04005273 * @host: Collection of hosts to which @ap belongs
Linus Torvalds1da177e2005-04-16 15:20:36 -07005274 * @ent: Probe information provided by low-level driver
5275 * @port_no: Port number associated with this ata_port
5276 *
Brian King155a8a92006-08-07 14:27:17 -05005277 * Initialize a new ata_port structure.
Jeff Garzik0cba6322005-05-30 19:49:12 -04005278 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07005279 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04005280 * Inherited from caller.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005281 */
Jeff Garzikcca39742006-08-24 03:19:22 -04005282void ata_port_init(struct ata_port *ap, struct ata_host *host,
Brian King155a8a92006-08-07 14:27:17 -05005283 const struct ata_probe_ent *ent, unsigned int port_no)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005284{
5285 unsigned int i;
5286
Jeff Garzikcca39742006-08-24 03:19:22 -04005287 ap->lock = &host->lock;
Tejun Heo198e0fe2006-04-02 18:51:52 +09005288 ap->flags = ATA_FLAG_DISABLED;
Brian King155a8a92006-08-07 14:27:17 -05005289 ap->id = ata_unique_id++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005290 ap->ctl = ATA_DEVCTL_OBS;
Jeff Garzikcca39742006-08-24 03:19:22 -04005291 ap->host = host;
Brian King2f1f6102006-03-23 17:30:15 -06005292 ap->dev = ent->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005293 ap->port_no = port_no;
Tejun Heofea63e32006-09-16 03:04:15 +09005294 if (port_no == 1 && ent->pinfo2) {
5295 ap->pio_mask = ent->pinfo2->pio_mask;
5296 ap->mwdma_mask = ent->pinfo2->mwdma_mask;
5297 ap->udma_mask = ent->pinfo2->udma_mask;
5298 ap->flags |= ent->pinfo2->flags;
5299 ap->ops = ent->pinfo2->port_ops;
5300 } else {
5301 ap->pio_mask = ent->pio_mask;
5302 ap->mwdma_mask = ent->mwdma_mask;
5303 ap->udma_mask = ent->udma_mask;
5304 ap->flags |= ent->port_flags;
5305 ap->ops = ent->port_ops;
5306 }
Tejun Heo5a04bf42006-05-31 18:27:38 +09005307 ap->hw_sata_spd_limit = UINT_MAX;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005308 ap->active_tag = ATA_TAG_POISON;
5309 ap->last_ctl = 0xFF;
Borislav Petkovbd5d8252006-06-11 23:17:01 -04005310
5311#if defined(ATA_VERBOSE_DEBUG)
5312 /* turn on all debugging levels */
5313 ap->msg_enable = 0x00FF;
5314#elif defined(ATA_DEBUG)
5315 ap->msg_enable = ATA_MSG_DRV | ATA_MSG_INFO | ATA_MSG_CTL | ATA_MSG_WARN | ATA_MSG_ERR;
Tejun Heo88574552006-06-25 20:00:35 +09005316#else
Borislav Petkov0dd4b212006-06-23 02:29:08 -04005317 ap->msg_enable = ATA_MSG_DRV | ATA_MSG_ERR | ATA_MSG_WARN;
Borislav Petkovbd5d8252006-06-11 23:17:01 -04005318#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07005319
David Howells52bad642006-11-22 14:54:01 +00005320 INIT_DELAYED_WORK(&ap->port_task, NULL, NULL);
5321 INIT_DELAYED_WORK(&ap->hotplug_task, ata_scsi_hotplug, ap);
zhao, forrest3057ac32006-06-12 12:01:34 +08005322 INIT_WORK(&ap->scsi_rescan_task, ata_scsi_dev_rescan, ap);
Tejun Heoa72ec4c2006-01-23 13:09:37 +09005323 INIT_LIST_HEAD(&ap->eh_done_q);
Tejun Heoc6cf9e92006-05-31 18:27:27 +09005324 init_waitqueue_head(&ap->eh_wait_q);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005325
Tejun Heo838df622006-05-15 20:57:44 +09005326 /* set cable type */
5327 ap->cbl = ATA_CBL_NONE;
5328 if (ap->flags & ATA_FLAG_SATA)
5329 ap->cbl = ATA_CBL_SATA;
5330
Tejun Heoacf356b2006-03-24 14:07:50 +09005331 for (i = 0; i < ATA_MAX_DEVICES; i++) {
5332 struct ata_device *dev = &ap->device[i];
Tejun Heo38d87232006-05-15 20:57:51 +09005333 dev->ap = ap;
Tejun Heo72fa4b72006-05-31 18:27:32 +09005334 dev->devno = i;
Tejun Heo3ef3b432006-05-31 18:27:30 +09005335 ata_dev_init(dev);
Tejun Heoacf356b2006-03-24 14:07:50 +09005336 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005337
5338#ifdef ATA_IRQ_TRAP
5339 ap->stats.unhandled_irq = 1;
5340 ap->stats.idle_irq = 1;
5341#endif
5342
5343 memcpy(&ap->ioaddr, &ent->port[port_no], sizeof(struct ata_ioports));
5344}
5345
5346/**
Tejun Heo4608c162006-08-10 16:59:01 +09005347 * ata_port_init_shost - Initialize SCSI host associated with ATA port
5348 * @ap: ATA port to initialize SCSI host for
5349 * @shost: SCSI host associated with @ap
Brian King155a8a92006-08-07 14:27:17 -05005350 *
Tejun Heo4608c162006-08-10 16:59:01 +09005351 * Initialize SCSI host @shost associated with ATA port @ap.
Brian King155a8a92006-08-07 14:27:17 -05005352 *
5353 * LOCKING:
5354 * Inherited from caller.
5355 */
Tejun Heo4608c162006-08-10 16:59:01 +09005356static void ata_port_init_shost(struct ata_port *ap, struct Scsi_Host *shost)
Brian King155a8a92006-08-07 14:27:17 -05005357{
Jeff Garzikcca39742006-08-24 03:19:22 -04005358 ap->scsi_host = shost;
Brian King155a8a92006-08-07 14:27:17 -05005359
Tejun Heo4608c162006-08-10 16:59:01 +09005360 shost->unique_id = ap->id;
5361 shost->max_id = 16;
5362 shost->max_lun = 1;
5363 shost->max_channel = 1;
5364 shost->max_cmd_len = 12;
Brian King155a8a92006-08-07 14:27:17 -05005365}
5366
5367/**
Jeff Garzik996139f2006-08-10 16:59:03 +09005368 * ata_port_add - Attach low-level ATA driver to system
Linus Torvalds1da177e2005-04-16 15:20:36 -07005369 * @ent: Information provided by low-level driver
Jeff Garzikcca39742006-08-24 03:19:22 -04005370 * @host: Collections of ports to which we add
Linus Torvalds1da177e2005-04-16 15:20:36 -07005371 * @port_no: Port number associated with this host
5372 *
Jeff Garzik0cba6322005-05-30 19:49:12 -04005373 * Attach low-level ATA driver to system.
5374 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07005375 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04005376 * PCI/etc. bus probe sem.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005377 *
5378 * RETURNS:
Jeff Garzik0cba6322005-05-30 19:49:12 -04005379 * New ata_port on success, for NULL on error.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005380 */
Jeff Garzik996139f2006-08-10 16:59:03 +09005381static struct ata_port * ata_port_add(const struct ata_probe_ent *ent,
Jeff Garzikcca39742006-08-24 03:19:22 -04005382 struct ata_host *host,
Linus Torvalds1da177e2005-04-16 15:20:36 -07005383 unsigned int port_no)
5384{
Jeff Garzik996139f2006-08-10 16:59:03 +09005385 struct Scsi_Host *shost;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005386 struct ata_port *ap;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005387
5388 DPRINTK("ENTER\n");
Tejun Heoaec5c3c2006-03-25 01:33:34 +09005389
Tejun Heo52783c52006-05-31 18:28:22 +09005390 if (!ent->port_ops->error_handler &&
Jeff Garzikcca39742006-08-24 03:19:22 -04005391 !(ent->port_flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST))) {
Tejun Heoaec5c3c2006-03-25 01:33:34 +09005392 printk(KERN_ERR "ata%u: no reset mechanism available\n",
5393 port_no);
5394 return NULL;
5395 }
5396
Jeff Garzik996139f2006-08-10 16:59:03 +09005397 shost = scsi_host_alloc(ent->sht, sizeof(struct ata_port));
5398 if (!shost)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005399 return NULL;
5400
Jeff Garzik996139f2006-08-10 16:59:03 +09005401 shost->transportt = &ata_scsi_transport_template;
Tejun Heo30afc842006-03-18 18:40:14 +09005402
Jeff Garzik996139f2006-08-10 16:59:03 +09005403 ap = ata_shost_to_port(shost);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005404
Jeff Garzikcca39742006-08-24 03:19:22 -04005405 ata_port_init(ap, host, ent, port_no);
Jeff Garzik996139f2006-08-10 16:59:03 +09005406 ata_port_init_shost(ap, shost);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005407
Linus Torvalds1da177e2005-04-16 15:20:36 -07005408 return ap;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005409}
5410
5411/**
Jeff Garzikcca39742006-08-24 03:19:22 -04005412 * ata_sas_host_init - Initialize a host struct
5413 * @host: host to initialize
5414 * @dev: device host is attached to
5415 * @flags: host flags
5416 * @ops: port_ops
Brian Kingb03732f2006-08-07 14:27:10 -05005417 *
5418 * LOCKING:
5419 * PCI/etc. bus probe sem.
5420 *
5421 */
5422
Jeff Garzikcca39742006-08-24 03:19:22 -04005423void ata_host_init(struct ata_host *host, struct device *dev,
5424 unsigned long flags, const struct ata_port_operations *ops)
Brian Kingb03732f2006-08-07 14:27:10 -05005425{
Jeff Garzikcca39742006-08-24 03:19:22 -04005426 spin_lock_init(&host->lock);
5427 host->dev = dev;
5428 host->flags = flags;
5429 host->ops = ops;
Brian Kingb03732f2006-08-07 14:27:10 -05005430}
5431
5432/**
Jeff Garzik0cba6322005-05-30 19:49:12 -04005433 * ata_device_add - Register hardware device with ATA and SCSI layers
5434 * @ent: Probe information describing hardware device to be registered
5435 *
5436 * This function processes the information provided in the probe
5437 * information struct @ent, allocates the necessary ATA and SCSI
5438 * host information structures, initializes them, and registers
5439 * everything with requisite kernel subsystems.
5440 *
5441 * This function requests irqs, probes the ATA bus, and probes
5442 * the SCSI bus.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005443 *
5444 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04005445 * PCI/etc. bus probe sem.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005446 *
5447 * RETURNS:
Jeff Garzik0cba6322005-05-30 19:49:12 -04005448 * Number of ports registered. Zero on error (no ports registered).
Linus Torvalds1da177e2005-04-16 15:20:36 -07005449 */
Jeff Garzik057ace52005-10-22 14:27:05 -04005450int ata_device_add(const struct ata_probe_ent *ent)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005451{
Jeff Garzik6d0500d2006-08-10 16:59:05 +09005452 unsigned int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005453 struct device *dev = ent->dev;
Jeff Garzikcca39742006-08-24 03:19:22 -04005454 struct ata_host *host;
Jeff Garzik39b07ce2006-06-11 23:59:44 -04005455 int rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005456
5457 DPRINTK("ENTER\n");
Alan Cox02f076a2006-09-26 17:35:32 +01005458
5459 if (ent->irq == 0) {
5460 dev_printk(KERN_ERR, dev, "is not available: No interrupt assigned.\n");
5461 return 0;
5462 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005463 /* alloc a container for our list of ATA ports (buses) */
Jeff Garzikcca39742006-08-24 03:19:22 -04005464 host = kzalloc(sizeof(struct ata_host) +
5465 (ent->n_ports * sizeof(void *)), GFP_KERNEL);
5466 if (!host)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005467 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005468
Jeff Garzikcca39742006-08-24 03:19:22 -04005469 ata_host_init(host, dev, ent->_host_flags, ent->port_ops);
5470 host->n_ports = ent->n_ports;
5471 host->irq = ent->irq;
5472 host->irq2 = ent->irq2;
5473 host->mmio_base = ent->mmio_base;
5474 host->private_data = ent->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005475
5476 /* register each port bound to this device */
Jeff Garzikcca39742006-08-24 03:19:22 -04005477 for (i = 0; i < host->n_ports; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005478 struct ata_port *ap;
5479 unsigned long xfer_mode_mask;
Alan Cox2ec7df02006-08-10 16:59:10 +09005480 int irq_line = ent->irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005481
Jeff Garzikcca39742006-08-24 03:19:22 -04005482 ap = ata_port_add(ent, host, i);
Dave Jonesc38778c2006-09-26 23:52:50 -07005483 host->ports[i] = ap;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005484 if (!ap)
5485 goto err_out;
5486
Tejun Heodd5b06c2006-08-10 16:59:12 +09005487 /* dummy? */
5488 if (ent->dummy_port_mask & (1 << i)) {
5489 ata_port_printk(ap, KERN_INFO, "DUMMY\n");
5490 ap->ops = &ata_dummy_port_ops;
5491 continue;
5492 }
5493
5494 /* start port */
5495 rc = ap->ops->port_start(ap);
5496 if (rc) {
Jeff Garzikcca39742006-08-24 03:19:22 -04005497 host->ports[i] = NULL;
5498 scsi_host_put(ap->scsi_host);
Tejun Heodd5b06c2006-08-10 16:59:12 +09005499 goto err_out;
5500 }
5501
Alan Cox2ec7df02006-08-10 16:59:10 +09005502 /* Report the secondary IRQ for second channel legacy */
5503 if (i == 1 && ent->irq2)
5504 irq_line = ent->irq2;
5505
Linus Torvalds1da177e2005-04-16 15:20:36 -07005506 xfer_mode_mask =(ap->udma_mask << ATA_SHIFT_UDMA) |
5507 (ap->mwdma_mask << ATA_SHIFT_MWDMA) |
5508 (ap->pio_mask << ATA_SHIFT_PIO);
5509
5510 /* print per-port info to dmesg */
Tejun Heof15a1da2006-05-15 20:57:56 +09005511 ata_port_printk(ap, KERN_INFO, "%cATA max %s cmd 0x%lX "
Alan Cox2ec7df02006-08-10 16:59:10 +09005512 "ctl 0x%lX bmdma 0x%lX irq %d\n",
Tejun Heof15a1da2006-05-15 20:57:56 +09005513 ap->flags & ATA_FLAG_SATA ? 'S' : 'P',
5514 ata_mode_string(xfer_mode_mask),
5515 ap->ioaddr.cmd_addr,
5516 ap->ioaddr.ctl_addr,
5517 ap->ioaddr.bmdma_addr,
Alan Cox2ec7df02006-08-10 16:59:10 +09005518 irq_line);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005519
5520 ata_chk_status(ap);
Jeff Garzikcca39742006-08-24 03:19:22 -04005521 host->ops->irq_clear(ap);
Tejun Heoe3180492006-05-15 20:58:09 +09005522 ata_eh_freeze_port(ap); /* freeze port before requesting IRQ */
Linus Torvalds1da177e2005-04-16 15:20:36 -07005523 }
5524
Alan Cox2ec7df02006-08-10 16:59:10 +09005525 /* obtain irq, that may be shared between channels */
Jeff Garzik39b07ce2006-06-11 23:59:44 -04005526 rc = request_irq(ent->irq, ent->port_ops->irq_handler, ent->irq_flags,
Jeff Garzikcca39742006-08-24 03:19:22 -04005527 DRV_NAME, host);
Jeff Garzik39b07ce2006-06-11 23:59:44 -04005528 if (rc) {
5529 dev_printk(KERN_ERR, dev, "irq %lu request failed: %d\n",
5530 ent->irq, rc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005531 goto err_out;
Jeff Garzik39b07ce2006-06-11 23:59:44 -04005532 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005533
Alan Cox2ec7df02006-08-10 16:59:10 +09005534 /* do we have a second IRQ for the other channel, eg legacy mode */
5535 if (ent->irq2) {
5536 /* We will get weird core code crashes later if this is true
5537 so trap it now */
5538 BUG_ON(ent->irq == ent->irq2);
5539
5540 rc = request_irq(ent->irq2, ent->port_ops->irq_handler, ent->irq_flags,
Jeff Garzikcca39742006-08-24 03:19:22 -04005541 DRV_NAME, host);
Alan Cox2ec7df02006-08-10 16:59:10 +09005542 if (rc) {
5543 dev_printk(KERN_ERR, dev, "irq %lu request failed: %d\n",
5544 ent->irq2, rc);
5545 goto err_out_free_irq;
5546 }
5547 }
5548
Linus Torvalds1da177e2005-04-16 15:20:36 -07005549 /* perform each probe synchronously */
5550 DPRINTK("probe begin\n");
Jeff Garzikcca39742006-08-24 03:19:22 -04005551 for (i = 0; i < host->n_ports; i++) {
5552 struct ata_port *ap = host->ports[i];
Tejun Heo5a04bf42006-05-31 18:27:38 +09005553 u32 scontrol;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005554 int rc;
5555
Tejun Heo5a04bf42006-05-31 18:27:38 +09005556 /* init sata_spd_limit to the current value */
5557 if (sata_scr_read(ap, SCR_CONTROL, &scontrol) == 0) {
5558 int spd = (scontrol >> 4) & 0xf;
5559 ap->hw_sata_spd_limit &= (1 << spd) - 1;
5560 }
5561 ap->sata_spd_limit = ap->hw_sata_spd_limit;
5562
Jeff Garzikcca39742006-08-24 03:19:22 -04005563 rc = scsi_add_host(ap->scsi_host, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005564 if (rc) {
Tejun Heof15a1da2006-05-15 20:57:56 +09005565 ata_port_printk(ap, KERN_ERR, "scsi_add_host failed\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07005566 /* FIXME: do something useful here */
5567 /* FIXME: handle unconditional calls to
5568 * scsi_scan_host and ata_host_remove, below,
5569 * at the very least
5570 */
5571 }
Tejun Heo3e706392006-05-31 18:28:11 +09005572
Tejun Heo52783c52006-05-31 18:28:22 +09005573 if (ap->ops->error_handler) {
Tejun Heo1cdaf532006-07-03 16:07:26 +09005574 struct ata_eh_info *ehi = &ap->eh_info;
Tejun Heo3e706392006-05-31 18:28:11 +09005575 unsigned long flags;
5576
5577 ata_port_probe(ap);
5578
5579 /* kick EH for boot probing */
Jeff Garzikba6a1302006-06-22 23:46:10 -04005580 spin_lock_irqsave(ap->lock, flags);
Tejun Heo3e706392006-05-31 18:28:11 +09005581
Tejun Heo1cdaf532006-07-03 16:07:26 +09005582 ehi->probe_mask = (1 << ATA_MAX_DEVICES) - 1;
5583 ehi->action |= ATA_EH_SOFTRESET;
5584 ehi->flags |= ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET;
Tejun Heo3e706392006-05-31 18:28:11 +09005585
Tejun Heob51e9e52006-06-29 01:29:30 +09005586 ap->pflags |= ATA_PFLAG_LOADING;
Tejun Heo3e706392006-05-31 18:28:11 +09005587 ata_port_schedule_eh(ap);
5588
Jeff Garzikba6a1302006-06-22 23:46:10 -04005589 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo3e706392006-05-31 18:28:11 +09005590
5591 /* wait for EH to finish */
5592 ata_port_wait_eh(ap);
5593 } else {
5594 DPRINTK("ata%u: bus probe begin\n", ap->id);
5595 rc = ata_bus_probe(ap);
5596 DPRINTK("ata%u: bus probe end\n", ap->id);
5597
5598 if (rc) {
5599 /* FIXME: do something useful here?
5600 * Current libata behavior will
5601 * tear down everything when
5602 * the module is removed
5603 * or the h/w is unplugged.
5604 */
5605 }
5606 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005607 }
5608
5609 /* probes are done, now scan each port's disk(s) */
Randy Dunlapc893a3a2006-01-28 13:15:32 -05005610 DPRINTK("host probe begin\n");
Jeff Garzikcca39742006-08-24 03:19:22 -04005611 for (i = 0; i < host->n_ports; i++) {
5612 struct ata_port *ap = host->ports[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07005613
Jeff Garzik644dd0c2005-10-03 15:55:19 -04005614 ata_scsi_scan_host(ap);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005615 }
5616
Jeff Garzikcca39742006-08-24 03:19:22 -04005617 dev_set_drvdata(dev, host);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005618
5619 VPRINTK("EXIT, returning %u\n", ent->n_ports);
5620 return ent->n_ports; /* success */
5621
Alan Cox2ec7df02006-08-10 16:59:10 +09005622err_out_free_irq:
Jeff Garzikcca39742006-08-24 03:19:22 -04005623 free_irq(ent->irq, host);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005624err_out:
Jeff Garzikcca39742006-08-24 03:19:22 -04005625 for (i = 0; i < host->n_ports; i++) {
5626 struct ata_port *ap = host->ports[i];
Tejun Heo77f3f872006-08-05 03:59:19 +09005627 if (ap) {
5628 ap->ops->port_stop(ap);
Jeff Garzikcca39742006-08-24 03:19:22 -04005629 scsi_host_put(ap->scsi_host);
Tejun Heo77f3f872006-08-05 03:59:19 +09005630 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005631 }
Jeff Garzik6d0500d2006-08-10 16:59:05 +09005632
Jeff Garzikcca39742006-08-24 03:19:22 -04005633 kfree(host);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005634 VPRINTK("EXIT, returning 0\n");
5635 return 0;
5636}
5637
5638/**
Tejun Heo720ba122006-05-31 18:28:13 +09005639 * ata_port_detach - Detach ATA port in prepration of device removal
5640 * @ap: ATA port to be detached
5641 *
5642 * Detach all ATA devices and the associated SCSI devices of @ap;
5643 * then, remove the associated SCSI host. @ap is guaranteed to
5644 * be quiescent on return from this function.
5645 *
5646 * LOCKING:
5647 * Kernel thread context (may sleep).
5648 */
5649void ata_port_detach(struct ata_port *ap)
5650{
5651 unsigned long flags;
5652 int i;
5653
5654 if (!ap->ops->error_handler)
Tejun Heoc3cf30a2006-08-05 03:59:11 +09005655 goto skip_eh;
Tejun Heo720ba122006-05-31 18:28:13 +09005656
5657 /* tell EH we're leaving & flush EH */
Jeff Garzikba6a1302006-06-22 23:46:10 -04005658 spin_lock_irqsave(ap->lock, flags);
Tejun Heob51e9e52006-06-29 01:29:30 +09005659 ap->pflags |= ATA_PFLAG_UNLOADING;
Jeff Garzikba6a1302006-06-22 23:46:10 -04005660 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo720ba122006-05-31 18:28:13 +09005661
5662 ata_port_wait_eh(ap);
5663
5664 /* EH is now guaranteed to see UNLOADING, so no new device
5665 * will be attached. Disable all existing devices.
5666 */
Jeff Garzikba6a1302006-06-22 23:46:10 -04005667 spin_lock_irqsave(ap->lock, flags);
Tejun Heo720ba122006-05-31 18:28:13 +09005668
5669 for (i = 0; i < ATA_MAX_DEVICES; i++)
5670 ata_dev_disable(&ap->device[i]);
5671
Jeff Garzikba6a1302006-06-22 23:46:10 -04005672 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo720ba122006-05-31 18:28:13 +09005673
5674 /* Final freeze & EH. All in-flight commands are aborted. EH
5675 * will be skipped and retrials will be terminated with bad
5676 * target.
5677 */
Jeff Garzikba6a1302006-06-22 23:46:10 -04005678 spin_lock_irqsave(ap->lock, flags);
Tejun Heo720ba122006-05-31 18:28:13 +09005679 ata_port_freeze(ap); /* won't be thawed */
Jeff Garzikba6a1302006-06-22 23:46:10 -04005680 spin_unlock_irqrestore(ap->lock, flags);
Tejun Heo720ba122006-05-31 18:28:13 +09005681
5682 ata_port_wait_eh(ap);
5683
5684 /* Flush hotplug task. The sequence is similar to
5685 * ata_port_flush_task().
5686 */
5687 flush_workqueue(ata_aux_wq);
5688 cancel_delayed_work(&ap->hotplug_task);
5689 flush_workqueue(ata_aux_wq);
5690
Tejun Heoc3cf30a2006-08-05 03:59:11 +09005691 skip_eh:
Tejun Heo720ba122006-05-31 18:28:13 +09005692 /* remove the associated SCSI host */
Jeff Garzikcca39742006-08-24 03:19:22 -04005693 scsi_remove_host(ap->scsi_host);
Tejun Heo720ba122006-05-31 18:28:13 +09005694}
5695
5696/**
Jeff Garzikcca39742006-08-24 03:19:22 -04005697 * ata_host_remove - PCI layer callback for device removal
5698 * @host: ATA host set that was removed
Alan Cox17b14452005-09-15 15:44:00 +01005699 *
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05005700 * Unregister all objects associated with this host set. Free those
Alan Cox17b14452005-09-15 15:44:00 +01005701 * objects.
5702 *
5703 * LOCKING:
5704 * Inherited from calling layer (may sleep).
5705 */
5706
Jeff Garzikcca39742006-08-24 03:19:22 -04005707void ata_host_remove(struct ata_host *host)
Alan Cox17b14452005-09-15 15:44:00 +01005708{
Alan Cox17b14452005-09-15 15:44:00 +01005709 unsigned int i;
5710
Jeff Garzikcca39742006-08-24 03:19:22 -04005711 for (i = 0; i < host->n_ports; i++)
5712 ata_port_detach(host->ports[i]);
Alan Cox17b14452005-09-15 15:44:00 +01005713
Jeff Garzikcca39742006-08-24 03:19:22 -04005714 free_irq(host->irq, host);
5715 if (host->irq2)
5716 free_irq(host->irq2, host);
Alan Cox17b14452005-09-15 15:44:00 +01005717
Jeff Garzikcca39742006-08-24 03:19:22 -04005718 for (i = 0; i < host->n_ports; i++) {
5719 struct ata_port *ap = host->ports[i];
Alan Cox17b14452005-09-15 15:44:00 +01005720
Jeff Garzikcca39742006-08-24 03:19:22 -04005721 ata_scsi_release(ap->scsi_host);
Alan Cox17b14452005-09-15 15:44:00 +01005722
5723 if ((ap->flags & ATA_FLAG_NO_LEGACY) == 0) {
5724 struct ata_ioports *ioaddr = &ap->ioaddr;
5725
Alan Cox2ec7df02006-08-10 16:59:10 +09005726 /* FIXME: Add -ac IDE pci mods to remove these special cases */
5727 if (ioaddr->cmd_addr == ATA_PRIMARY_CMD)
5728 release_region(ATA_PRIMARY_CMD, 8);
5729 else if (ioaddr->cmd_addr == ATA_SECONDARY_CMD)
5730 release_region(ATA_SECONDARY_CMD, 8);
Alan Cox17b14452005-09-15 15:44:00 +01005731 }
5732
Jeff Garzikcca39742006-08-24 03:19:22 -04005733 scsi_host_put(ap->scsi_host);
Alan Cox17b14452005-09-15 15:44:00 +01005734 }
5735
Jeff Garzikcca39742006-08-24 03:19:22 -04005736 if (host->ops->host_stop)
5737 host->ops->host_stop(host);
Alan Cox17b14452005-09-15 15:44:00 +01005738
Jeff Garzikcca39742006-08-24 03:19:22 -04005739 kfree(host);
Alan Cox17b14452005-09-15 15:44:00 +01005740}
5741
5742/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07005743 * ata_scsi_release - SCSI layer callback hook for host unload
Jeff Garzik4f931372006-09-29 05:07:25 -04005744 * @shost: libata host to be unloaded
Linus Torvalds1da177e2005-04-16 15:20:36 -07005745 *
5746 * Performs all duties necessary to shut down a libata port...
5747 * Kill port kthread, disable port, and release resources.
5748 *
5749 * LOCKING:
5750 * Inherited from SCSI layer.
5751 *
5752 * RETURNS:
5753 * One.
5754 */
5755
Jeff Garzikcca39742006-08-24 03:19:22 -04005756int ata_scsi_release(struct Scsi_Host *shost)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005757{
Jeff Garzikcca39742006-08-24 03:19:22 -04005758 struct ata_port *ap = ata_shost_to_port(shost);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005759
5760 DPRINTK("ENTER\n");
5761
5762 ap->ops->port_disable(ap);
Jeff Garzik6543bc02006-08-05 03:59:17 +09005763 ap->ops->port_stop(ap);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005764
5765 DPRINTK("EXIT\n");
5766 return 1;
5767}
5768
Brian Kingf6d950e2006-08-07 14:27:24 -05005769struct ata_probe_ent *
5770ata_probe_ent_alloc(struct device *dev, const struct ata_port_info *port)
5771{
5772 struct ata_probe_ent *probe_ent;
5773
5774 probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
5775 if (!probe_ent) {
5776 printk(KERN_ERR DRV_NAME "(%s): out of memory\n",
5777 kobject_name(&(dev->kobj)));
5778 return NULL;
5779 }
5780
5781 INIT_LIST_HEAD(&probe_ent->node);
5782 probe_ent->dev = dev;
5783
5784 probe_ent->sht = port->sht;
Jeff Garzikcca39742006-08-24 03:19:22 -04005785 probe_ent->port_flags = port->flags;
Brian Kingf6d950e2006-08-07 14:27:24 -05005786 probe_ent->pio_mask = port->pio_mask;
5787 probe_ent->mwdma_mask = port->mwdma_mask;
5788 probe_ent->udma_mask = port->udma_mask;
5789 probe_ent->port_ops = port->port_ops;
Jeff Garzikd639ca92006-09-28 03:48:18 -04005790 probe_ent->private_data = port->private_data;
Brian Kingf6d950e2006-08-07 14:27:24 -05005791
5792 return probe_ent;
5793}
5794
Linus Torvalds1da177e2005-04-16 15:20:36 -07005795/**
5796 * ata_std_ports - initialize ioaddr with standard port offsets.
5797 * @ioaddr: IO address structure to be initialized
Edward Falk0baab862005-06-02 18:17:13 -04005798 *
5799 * Utility function which initializes data_addr, error_addr,
5800 * feature_addr, nsect_addr, lbal_addr, lbam_addr, lbah_addr,
5801 * device_addr, status_addr, and command_addr to standard offsets
5802 * relative to cmd_addr.
5803 *
5804 * Does not set ctl_addr, altstatus_addr, bmdma_addr, or scr_addr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005805 */
Edward Falk0baab862005-06-02 18:17:13 -04005806
Linus Torvalds1da177e2005-04-16 15:20:36 -07005807void ata_std_ports(struct ata_ioports *ioaddr)
5808{
5809 ioaddr->data_addr = ioaddr->cmd_addr + ATA_REG_DATA;
5810 ioaddr->error_addr = ioaddr->cmd_addr + ATA_REG_ERR;
5811 ioaddr->feature_addr = ioaddr->cmd_addr + ATA_REG_FEATURE;
5812 ioaddr->nsect_addr = ioaddr->cmd_addr + ATA_REG_NSECT;
5813 ioaddr->lbal_addr = ioaddr->cmd_addr + ATA_REG_LBAL;
5814 ioaddr->lbam_addr = ioaddr->cmd_addr + ATA_REG_LBAM;
5815 ioaddr->lbah_addr = ioaddr->cmd_addr + ATA_REG_LBAH;
5816 ioaddr->device_addr = ioaddr->cmd_addr + ATA_REG_DEVICE;
5817 ioaddr->status_addr = ioaddr->cmd_addr + ATA_REG_STATUS;
5818 ioaddr->command_addr = ioaddr->cmd_addr + ATA_REG_CMD;
5819}
5820
Edward Falk0baab862005-06-02 18:17:13 -04005821
Jeff Garzik374b1872005-08-30 05:42:52 -04005822#ifdef CONFIG_PCI
5823
Jeff Garzikcca39742006-08-24 03:19:22 -04005824void ata_pci_host_stop (struct ata_host *host)
Jeff Garzik374b1872005-08-30 05:42:52 -04005825{
Jeff Garzikcca39742006-08-24 03:19:22 -04005826 struct pci_dev *pdev = to_pci_dev(host->dev);
Jeff Garzik374b1872005-08-30 05:42:52 -04005827
Jeff Garzikcca39742006-08-24 03:19:22 -04005828 pci_iounmap(pdev, host->mmio_base);
Jeff Garzik374b1872005-08-30 05:42:52 -04005829}
5830
Edward Falk0baab862005-06-02 18:17:13 -04005831/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07005832 * ata_pci_remove_one - PCI layer callback for device removal
5833 * @pdev: PCI device that was removed
5834 *
5835 * PCI layer indicates to libata via this hook that
Randy Dunlap6f0ef4f2005-10-25 01:44:30 -04005836 * hot-unplug or module unload event has occurred.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005837 * Handle this by unregistering all objects associated
5838 * with this PCI device. Free those objects. Then finally
5839 * release PCI resources and disable device.
5840 *
5841 * LOCKING:
5842 * Inherited from PCI layer (may sleep).
5843 */
5844
5845void ata_pci_remove_one (struct pci_dev *pdev)
5846{
5847 struct device *dev = pci_dev_to_dev(pdev);
Jeff Garzikcca39742006-08-24 03:19:22 -04005848 struct ata_host *host = dev_get_drvdata(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005849
Jeff Garzikcca39742006-08-24 03:19:22 -04005850 ata_host_remove(host);
Tejun Heof0eb62b2006-06-12 23:05:38 +09005851
Linus Torvalds1da177e2005-04-16 15:20:36 -07005852 pci_release_regions(pdev);
5853 pci_disable_device(pdev);
5854 dev_set_drvdata(dev, NULL);
5855}
5856
5857/* move to PCI subsystem */
Jeff Garzik057ace52005-10-22 14:27:05 -04005858int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005859{
5860 unsigned long tmp = 0;
5861
5862 switch (bits->width) {
5863 case 1: {
5864 u8 tmp8 = 0;
5865 pci_read_config_byte(pdev, bits->reg, &tmp8);
5866 tmp = tmp8;
5867 break;
5868 }
5869 case 2: {
5870 u16 tmp16 = 0;
5871 pci_read_config_word(pdev, bits->reg, &tmp16);
5872 tmp = tmp16;
5873 break;
5874 }
5875 case 4: {
5876 u32 tmp32 = 0;
5877 pci_read_config_dword(pdev, bits->reg, &tmp32);
5878 tmp = tmp32;
5879 break;
5880 }
5881
5882 default:
5883 return -EINVAL;
5884 }
5885
5886 tmp &= bits->mask;
5887
5888 return (tmp == bits->val) ? 1 : 0;
5889}
Jens Axboe9b847542006-01-06 09:28:07 +01005890
Tejun Heo3c5100c2006-07-26 16:58:33 +09005891void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t mesg)
Jens Axboe9b847542006-01-06 09:28:07 +01005892{
5893 pci_save_state(pdev);
Tejun Heo500530f2006-07-03 16:07:27 +09005894
Tejun Heo3c5100c2006-07-26 16:58:33 +09005895 if (mesg.event == PM_EVENT_SUSPEND) {
Tejun Heo500530f2006-07-03 16:07:27 +09005896 pci_disable_device(pdev);
5897 pci_set_power_state(pdev, PCI_D3hot);
5898 }
Jens Axboe9b847542006-01-06 09:28:07 +01005899}
5900
Tejun Heo500530f2006-07-03 16:07:27 +09005901void ata_pci_device_do_resume(struct pci_dev *pdev)
Jens Axboe9b847542006-01-06 09:28:07 +01005902{
5903 pci_set_power_state(pdev, PCI_D0);
5904 pci_restore_state(pdev);
5905 pci_enable_device(pdev);
5906 pci_set_master(pdev);
Tejun Heo500530f2006-07-03 16:07:27 +09005907}
5908
Tejun Heo3c5100c2006-07-26 16:58:33 +09005909int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg)
Tejun Heo500530f2006-07-03 16:07:27 +09005910{
Jeff Garzikcca39742006-08-24 03:19:22 -04005911 struct ata_host *host = dev_get_drvdata(&pdev->dev);
Tejun Heo500530f2006-07-03 16:07:27 +09005912 int rc = 0;
5913
Jeff Garzikcca39742006-08-24 03:19:22 -04005914 rc = ata_host_suspend(host, mesg);
Tejun Heo500530f2006-07-03 16:07:27 +09005915 if (rc)
5916 return rc;
5917
Tejun Heo3c5100c2006-07-26 16:58:33 +09005918 ata_pci_device_do_suspend(pdev, mesg);
Tejun Heo500530f2006-07-03 16:07:27 +09005919
5920 return 0;
5921}
5922
5923int ata_pci_device_resume(struct pci_dev *pdev)
5924{
Jeff Garzikcca39742006-08-24 03:19:22 -04005925 struct ata_host *host = dev_get_drvdata(&pdev->dev);
Tejun Heo500530f2006-07-03 16:07:27 +09005926
5927 ata_pci_device_do_resume(pdev);
Jeff Garzikcca39742006-08-24 03:19:22 -04005928 ata_host_resume(host);
Jens Axboe9b847542006-01-06 09:28:07 +01005929 return 0;
5930}
Linus Torvalds1da177e2005-04-16 15:20:36 -07005931#endif /* CONFIG_PCI */
5932
5933
Linus Torvalds1da177e2005-04-16 15:20:36 -07005934static int __init ata_init(void)
5935{
Andrew Mortona8601e52006-06-25 01:36:52 -07005936 ata_probe_timeout *= HZ;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005937 ata_wq = create_workqueue("ata");
5938 if (!ata_wq)
5939 return -ENOMEM;
5940
Tejun Heo453b07a2006-05-31 18:27:42 +09005941 ata_aux_wq = create_singlethread_workqueue("ata_aux");
5942 if (!ata_aux_wq) {
5943 destroy_workqueue(ata_wq);
5944 return -ENOMEM;
5945 }
5946
Linus Torvalds1da177e2005-04-16 15:20:36 -07005947 printk(KERN_DEBUG "libata version " DRV_VERSION " loaded.\n");
5948 return 0;
5949}
5950
5951static void __exit ata_exit(void)
5952{
5953 destroy_workqueue(ata_wq);
Tejun Heo453b07a2006-05-31 18:27:42 +09005954 destroy_workqueue(ata_aux_wq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005955}
5956
Brian Kinga4625082006-11-13 16:32:36 -06005957subsys_initcall(ata_init);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005958module_exit(ata_exit);
5959
Jeff Garzik67846b32005-10-05 02:58:32 -04005960static unsigned long ratelimit_time;
Ingo Molnar34af9462006-06-27 02:53:55 -07005961static DEFINE_SPINLOCK(ata_ratelimit_lock);
Jeff Garzik67846b32005-10-05 02:58:32 -04005962
5963int ata_ratelimit(void)
5964{
5965 int rc;
5966 unsigned long flags;
5967
5968 spin_lock_irqsave(&ata_ratelimit_lock, flags);
5969
5970 if (time_after(jiffies, ratelimit_time)) {
5971 rc = 1;
5972 ratelimit_time = jiffies + (HZ/5);
5973 } else
5974 rc = 0;
5975
5976 spin_unlock_irqrestore(&ata_ratelimit_lock, flags);
5977
5978 return rc;
5979}
5980
Tejun Heoc22daff2006-04-11 22:22:29 +09005981/**
5982 * ata_wait_register - wait until register value changes
5983 * @reg: IO-mapped register
5984 * @mask: Mask to apply to read register value
5985 * @val: Wait condition
5986 * @interval_msec: polling interval in milliseconds
5987 * @timeout_msec: timeout in milliseconds
5988 *
5989 * Waiting for some bits of register to change is a common
5990 * operation for ATA controllers. This function reads 32bit LE
5991 * IO-mapped register @reg and tests for the following condition.
5992 *
5993 * (*@reg & mask) != val
5994 *
5995 * If the condition is met, it returns; otherwise, the process is
5996 * repeated after @interval_msec until timeout.
5997 *
5998 * LOCKING:
5999 * Kernel thread context (may sleep)
6000 *
6001 * RETURNS:
6002 * The final register value.
6003 */
6004u32 ata_wait_register(void __iomem *reg, u32 mask, u32 val,
6005 unsigned long interval_msec,
6006 unsigned long timeout_msec)
6007{
6008 unsigned long timeout;
6009 u32 tmp;
6010
6011 tmp = ioread32(reg);
6012
6013 /* Calculate timeout _after_ the first read to make sure
6014 * preceding writes reach the controller before starting to
6015 * eat away the timeout.
6016 */
6017 timeout = jiffies + (timeout_msec * HZ) / 1000;
6018
6019 while ((tmp & mask) == val && time_before(jiffies, timeout)) {
6020 msleep(interval_msec);
6021 tmp = ioread32(reg);
6022 }
6023
6024 return tmp;
6025}
6026
Linus Torvalds1da177e2005-04-16 15:20:36 -07006027/*
Tejun Heodd5b06c2006-08-10 16:59:12 +09006028 * Dummy port_ops
6029 */
6030static void ata_dummy_noret(struct ata_port *ap) { }
6031static int ata_dummy_ret0(struct ata_port *ap) { return 0; }
6032static void ata_dummy_qc_noret(struct ata_queued_cmd *qc) { }
6033
6034static u8 ata_dummy_check_status(struct ata_port *ap)
6035{
6036 return ATA_DRDY;
6037}
6038
6039static unsigned int ata_dummy_qc_issue(struct ata_queued_cmd *qc)
6040{
6041 return AC_ERR_SYSTEM;
6042}
6043
6044const struct ata_port_operations ata_dummy_port_ops = {
6045 .port_disable = ata_port_disable,
6046 .check_status = ata_dummy_check_status,
6047 .check_altstatus = ata_dummy_check_status,
6048 .dev_select = ata_noop_dev_select,
6049 .qc_prep = ata_noop_qc_prep,
6050 .qc_issue = ata_dummy_qc_issue,
6051 .freeze = ata_dummy_noret,
6052 .thaw = ata_dummy_noret,
6053 .error_handler = ata_dummy_noret,
6054 .post_internal_cmd = ata_dummy_qc_noret,
6055 .irq_clear = ata_dummy_noret,
6056 .port_start = ata_dummy_ret0,
6057 .port_stop = ata_dummy_noret,
6058};
6059
6060/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07006061 * libata is essentially a library of internal helper functions for
6062 * low-level ATA host controller drivers. As such, the API/ABI is
6063 * likely to change as new drivers are added and updated.
6064 * Do not depend on ABI/API stability.
6065 */
6066
Tejun Heoe9c83912006-07-03 16:07:26 +09006067EXPORT_SYMBOL_GPL(sata_deb_timing_normal);
6068EXPORT_SYMBOL_GPL(sata_deb_timing_hotplug);
6069EXPORT_SYMBOL_GPL(sata_deb_timing_long);
Tejun Heodd5b06c2006-08-10 16:59:12 +09006070EXPORT_SYMBOL_GPL(ata_dummy_port_ops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006071EXPORT_SYMBOL_GPL(ata_std_bios_param);
6072EXPORT_SYMBOL_GPL(ata_std_ports);
Jeff Garzikcca39742006-08-24 03:19:22 -04006073EXPORT_SYMBOL_GPL(ata_host_init);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006074EXPORT_SYMBOL_GPL(ata_device_add);
Tejun Heo720ba122006-05-31 18:28:13 +09006075EXPORT_SYMBOL_GPL(ata_port_detach);
Jeff Garzikcca39742006-08-24 03:19:22 -04006076EXPORT_SYMBOL_GPL(ata_host_remove);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006077EXPORT_SYMBOL_GPL(ata_sg_init);
6078EXPORT_SYMBOL_GPL(ata_sg_init_one);
Tejun Heo9a1004d2006-05-31 18:27:52 +09006079EXPORT_SYMBOL_GPL(ata_hsm_move);
Tejun Heof686bcb2006-05-15 20:58:05 +09006080EXPORT_SYMBOL_GPL(ata_qc_complete);
Tejun Heodedaf2b2006-05-15 21:03:43 +09006081EXPORT_SYMBOL_GPL(ata_qc_complete_multiple);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006082EXPORT_SYMBOL_GPL(ata_qc_issue_prot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006083EXPORT_SYMBOL_GPL(ata_tf_load);
6084EXPORT_SYMBOL_GPL(ata_tf_read);
6085EXPORT_SYMBOL_GPL(ata_noop_dev_select);
6086EXPORT_SYMBOL_GPL(ata_std_dev_select);
6087EXPORT_SYMBOL_GPL(ata_tf_to_fis);
6088EXPORT_SYMBOL_GPL(ata_tf_from_fis);
6089EXPORT_SYMBOL_GPL(ata_check_status);
6090EXPORT_SYMBOL_GPL(ata_altstatus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006091EXPORT_SYMBOL_GPL(ata_exec_command);
6092EXPORT_SYMBOL_GPL(ata_port_start);
6093EXPORT_SYMBOL_GPL(ata_port_stop);
Jeff Garzikaa8f0dc2005-05-26 21:54:27 -04006094EXPORT_SYMBOL_GPL(ata_host_stop);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006095EXPORT_SYMBOL_GPL(ata_interrupt);
Alan Coxa6b2c5d2006-05-22 16:59:59 +01006096EXPORT_SYMBOL_GPL(ata_mmio_data_xfer);
6097EXPORT_SYMBOL_GPL(ata_pio_data_xfer);
Alan Cox75e99582006-05-24 14:14:41 +01006098EXPORT_SYMBOL_GPL(ata_pio_data_xfer_noirq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006099EXPORT_SYMBOL_GPL(ata_qc_prep);
Brian Kinge46834c2006-03-17 17:04:03 -06006100EXPORT_SYMBOL_GPL(ata_noop_qc_prep);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006101EXPORT_SYMBOL_GPL(ata_bmdma_setup);
6102EXPORT_SYMBOL_GPL(ata_bmdma_start);
6103EXPORT_SYMBOL_GPL(ata_bmdma_irq_clear);
6104EXPORT_SYMBOL_GPL(ata_bmdma_status);
6105EXPORT_SYMBOL_GPL(ata_bmdma_stop);
Tejun Heo6d97dbd2006-05-15 20:58:24 +09006106EXPORT_SYMBOL_GPL(ata_bmdma_freeze);
6107EXPORT_SYMBOL_GPL(ata_bmdma_thaw);
6108EXPORT_SYMBOL_GPL(ata_bmdma_drive_eh);
6109EXPORT_SYMBOL_GPL(ata_bmdma_error_handler);
6110EXPORT_SYMBOL_GPL(ata_bmdma_post_internal_cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006111EXPORT_SYMBOL_GPL(ata_port_probe);
Tejun Heo3c567b72006-05-15 20:57:23 +09006112EXPORT_SYMBOL_GPL(sata_set_spd);
Tejun Heod7bb4cc2006-05-31 18:27:46 +09006113EXPORT_SYMBOL_GPL(sata_phy_debounce);
6114EXPORT_SYMBOL_GPL(sata_phy_resume);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006115EXPORT_SYMBOL_GPL(sata_phy_reset);
6116EXPORT_SYMBOL_GPL(__sata_phy_reset);
6117EXPORT_SYMBOL_GPL(ata_bus_reset);
Tejun Heof5914a42006-05-31 18:27:48 +09006118EXPORT_SYMBOL_GPL(ata_std_prereset);
Tejun Heoc2bd5802006-01-24 17:05:22 +09006119EXPORT_SYMBOL_GPL(ata_std_softreset);
6120EXPORT_SYMBOL_GPL(sata_std_hardreset);
6121EXPORT_SYMBOL_GPL(ata_std_postreset);
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05006122EXPORT_SYMBOL_GPL(ata_dev_classify);
6123EXPORT_SYMBOL_GPL(ata_dev_pair);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006124EXPORT_SYMBOL_GPL(ata_port_disable);
Jeff Garzik67846b32005-10-05 02:58:32 -04006125EXPORT_SYMBOL_GPL(ata_ratelimit);
Tejun Heoc22daff2006-04-11 22:22:29 +09006126EXPORT_SYMBOL_GPL(ata_wait_register);
Tejun Heo6f8b9952006-01-24 17:05:21 +09006127EXPORT_SYMBOL_GPL(ata_busy_sleep);
Tejun Heo86e45b62006-03-05 15:29:09 +09006128EXPORT_SYMBOL_GPL(ata_port_queue_task);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006129EXPORT_SYMBOL_GPL(ata_scsi_ioctl);
6130EXPORT_SYMBOL_GPL(ata_scsi_queuecmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006131EXPORT_SYMBOL_GPL(ata_scsi_slave_config);
Tejun Heo83c47bc2006-05-31 18:28:07 +09006132EXPORT_SYMBOL_GPL(ata_scsi_slave_destroy);
Tejun Heoa6e6ce82006-05-15 21:03:48 +09006133EXPORT_SYMBOL_GPL(ata_scsi_change_queue_depth);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006134EXPORT_SYMBOL_GPL(ata_scsi_release);
6135EXPORT_SYMBOL_GPL(ata_host_intr);
Tejun Heo34bf2172006-05-15 20:57:46 +09006136EXPORT_SYMBOL_GPL(sata_scr_valid);
6137EXPORT_SYMBOL_GPL(sata_scr_read);
6138EXPORT_SYMBOL_GPL(sata_scr_write);
6139EXPORT_SYMBOL_GPL(sata_scr_write_flush);
6140EXPORT_SYMBOL_GPL(ata_port_online);
6141EXPORT_SYMBOL_GPL(ata_port_offline);
Jeff Garzikcca39742006-08-24 03:19:22 -04006142EXPORT_SYMBOL_GPL(ata_host_suspend);
6143EXPORT_SYMBOL_GPL(ata_host_resume);
Tejun Heo6a62a042006-02-13 10:02:46 +09006144EXPORT_SYMBOL_GPL(ata_id_string);
6145EXPORT_SYMBOL_GPL(ata_id_c_string);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006146EXPORT_SYMBOL_GPL(ata_scsi_simulate);
6147
Alan Cox1bc4ccf2006-01-09 17:18:14 +00006148EXPORT_SYMBOL_GPL(ata_pio_need_iordy);
Alan Cox452503f2005-10-21 19:01:32 -04006149EXPORT_SYMBOL_GPL(ata_timing_compute);
6150EXPORT_SYMBOL_GPL(ata_timing_merge);
6151
Linus Torvalds1da177e2005-04-16 15:20:36 -07006152#ifdef CONFIG_PCI
6153EXPORT_SYMBOL_GPL(pci_test_config_bits);
Jeff Garzik374b1872005-08-30 05:42:52 -04006154EXPORT_SYMBOL_GPL(ata_pci_host_stop);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006155EXPORT_SYMBOL_GPL(ata_pci_init_native_mode);
6156EXPORT_SYMBOL_GPL(ata_pci_init_one);
6157EXPORT_SYMBOL_GPL(ata_pci_remove_one);
Tejun Heo500530f2006-07-03 16:07:27 +09006158EXPORT_SYMBOL_GPL(ata_pci_device_do_suspend);
6159EXPORT_SYMBOL_GPL(ata_pci_device_do_resume);
Jens Axboe9b847542006-01-06 09:28:07 +01006160EXPORT_SYMBOL_GPL(ata_pci_device_suspend);
6161EXPORT_SYMBOL_GPL(ata_pci_device_resume);
Alan Cox67951ad2006-03-22 15:55:54 +00006162EXPORT_SYMBOL_GPL(ata_pci_default_filter);
6163EXPORT_SYMBOL_GPL(ata_pci_clear_simplex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006164#endif /* CONFIG_PCI */
Jens Axboe9b847542006-01-06 09:28:07 +01006165
Jens Axboe9b847542006-01-06 09:28:07 +01006166EXPORT_SYMBOL_GPL(ata_scsi_device_suspend);
6167EXPORT_SYMBOL_GPL(ata_scsi_device_resume);
Tejun Heoece1d632006-04-02 18:51:53 +09006168
Tejun Heoece1d632006-04-02 18:51:53 +09006169EXPORT_SYMBOL_GPL(ata_eng_timeout);
Tejun Heo7b70fc02006-05-15 20:58:07 +09006170EXPORT_SYMBOL_GPL(ata_port_schedule_eh);
6171EXPORT_SYMBOL_GPL(ata_port_abort);
Tejun Heoe3180492006-05-15 20:58:09 +09006172EXPORT_SYMBOL_GPL(ata_port_freeze);
6173EXPORT_SYMBOL_GPL(ata_eh_freeze_port);
6174EXPORT_SYMBOL_GPL(ata_eh_thaw_port);
Tejun Heoece1d632006-04-02 18:51:53 +09006175EXPORT_SYMBOL_GPL(ata_eh_qc_complete);
6176EXPORT_SYMBOL_GPL(ata_eh_qc_retry);
Tejun Heo022bdb02006-05-15 20:58:22 +09006177EXPORT_SYMBOL_GPL(ata_do_eh);