blob: c3c4263fdb123927a7c113be09b34f30ab5ed1f3 [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
35#include <linux/config.h>
36#include <linux/kernel.h>
37#include <linux/module.h>
38#include <linux/pci.h>
39#include <linux/init.h>
40#include <linux/list.h>
41#include <linux/mm.h>
42#include <linux/highmem.h>
43#include <linux/spinlock.h>
44#include <linux/blkdev.h>
45#include <linux/delay.h>
46#include <linux/timer.h>
47#include <linux/interrupt.h>
48#include <linux/completion.h>
49#include <linux/suspend.h>
50#include <linux/workqueue.h>
Jeff Garzik67846b32005-10-05 02:58:32 -040051#include <linux/jiffies.h>
David Hardeman378f0582005-09-17 17:55:31 +100052#include <linux/scatterlist.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070053#include <scsi/scsi.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070054#include "scsi_priv.h"
Jeff Garzik193515d2005-11-07 00:59:37 -050055#include <scsi/scsi_cmnd.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070056#include <scsi/scsi_host.h>
57#include <linux/libata.h>
58#include <asm/io.h>
59#include <asm/semaphore.h>
60#include <asm/byteorder.h>
61
62#include "libata.h"
63
Tejun Heo6aff8f12006-02-15 18:24:09 +090064static unsigned int ata_dev_init_params(struct ata_port *ap,
65 struct ata_device *dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070066static void ata_set_mode(struct ata_port *ap);
Tejun Heo83206a22006-03-24 15:25:31 +090067static unsigned int ata_dev_set_xfermode(struct ata_port *ap,
68 struct ata_device *dev);
Tejun Heoacf356b2006-03-24 14:07:50 +090069static void ata_dev_xfermask(struct ata_port *ap, struct ata_device *dev);
Jeff Garzike33b9df2005-10-09 09:51:46 -040070static void ata_pio_error(struct ata_port *ap);
Linus Torvalds1da177e2005-04-16 15:20:36 -070071
72static unsigned int ata_unique_id = 1;
73static struct workqueue_struct *ata_wq;
74
Jeff Garzik418dc1f2006-03-11 20:50:08 -050075int atapi_enabled = 1;
Jeff Garzik1623c812005-08-30 03:37:42 -040076module_param(atapi_enabled, int, 0444);
77MODULE_PARM_DESC(atapi_enabled, "Enable discovery of ATAPI devices (0=off, 1=on)");
78
Jeff Garzikc3c013a2006-02-27 22:31:19 -050079int libata_fua = 0;
80module_param_named(fua, libata_fua, int, 0444);
81MODULE_PARM_DESC(fua, "FUA support (0=off, 1=on)");
82
Linus Torvalds1da177e2005-04-16 15:20:36 -070083MODULE_AUTHOR("Jeff Garzik");
84MODULE_DESCRIPTION("Library module for ATA devices");
85MODULE_LICENSE("GPL");
86MODULE_VERSION(DRV_VERSION);
87
Edward Falk0baab862005-06-02 18:17:13 -040088
89/**
Linus Torvalds1da177e2005-04-16 15:20:36 -070090 * ata_tf_to_fis - Convert ATA taskfile to SATA FIS structure
91 * @tf: Taskfile to convert
92 * @fis: Buffer into which data will output
93 * @pmp: Port multiplier port
94 *
95 * Converts a standard ATA taskfile to a Serial ATA
96 * FIS structure (Register - Host to Device).
97 *
98 * LOCKING:
99 * Inherited from caller.
100 */
101
Jeff Garzik057ace52005-10-22 14:27:05 -0400102void ata_tf_to_fis(const struct ata_taskfile *tf, u8 *fis, u8 pmp)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103{
104 fis[0] = 0x27; /* Register - Host to Device FIS */
105 fis[1] = (pmp & 0xf) | (1 << 7); /* Port multiplier number,
106 bit 7 indicates Command FIS */
107 fis[2] = tf->command;
108 fis[3] = tf->feature;
109
110 fis[4] = tf->lbal;
111 fis[5] = tf->lbam;
112 fis[6] = tf->lbah;
113 fis[7] = tf->device;
114
115 fis[8] = tf->hob_lbal;
116 fis[9] = tf->hob_lbam;
117 fis[10] = tf->hob_lbah;
118 fis[11] = tf->hob_feature;
119
120 fis[12] = tf->nsect;
121 fis[13] = tf->hob_nsect;
122 fis[14] = 0;
123 fis[15] = tf->ctl;
124
125 fis[16] = 0;
126 fis[17] = 0;
127 fis[18] = 0;
128 fis[19] = 0;
129}
130
131/**
132 * ata_tf_from_fis - Convert SATA FIS to ATA taskfile
133 * @fis: Buffer from which data will be input
134 * @tf: Taskfile to output
135 *
Mark Lorde12a1be2005-11-12 18:55:45 -0500136 * Converts a serial ATA FIS structure to a standard ATA taskfile.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700137 *
138 * LOCKING:
139 * Inherited from caller.
140 */
141
Jeff Garzik057ace52005-10-22 14:27:05 -0400142void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700143{
144 tf->command = fis[2]; /* status */
145 tf->feature = fis[3]; /* error */
146
147 tf->lbal = fis[4];
148 tf->lbam = fis[5];
149 tf->lbah = fis[6];
150 tf->device = fis[7];
151
152 tf->hob_lbal = fis[8];
153 tf->hob_lbam = fis[9];
154 tf->hob_lbah = fis[10];
155
156 tf->nsect = fis[12];
157 tf->hob_nsect = fis[13];
158}
159
Albert Lee8cbd6df2005-10-12 15:06:27 +0800160static const u8 ata_rw_cmds[] = {
161 /* pio multi */
162 ATA_CMD_READ_MULTI,
163 ATA_CMD_WRITE_MULTI,
164 ATA_CMD_READ_MULTI_EXT,
165 ATA_CMD_WRITE_MULTI_EXT,
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100166 0,
167 0,
168 0,
169 ATA_CMD_WRITE_MULTI_FUA_EXT,
Albert Lee8cbd6df2005-10-12 15:06:27 +0800170 /* pio */
171 ATA_CMD_PIO_READ,
172 ATA_CMD_PIO_WRITE,
173 ATA_CMD_PIO_READ_EXT,
174 ATA_CMD_PIO_WRITE_EXT,
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100175 0,
176 0,
177 0,
178 0,
Albert Lee8cbd6df2005-10-12 15:06:27 +0800179 /* dma */
180 ATA_CMD_READ,
181 ATA_CMD_WRITE,
182 ATA_CMD_READ_EXT,
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100183 ATA_CMD_WRITE_EXT,
184 0,
185 0,
186 0,
187 ATA_CMD_WRITE_FUA_EXT
Albert Lee8cbd6df2005-10-12 15:06:27 +0800188};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700189
190/**
Albert Lee8cbd6df2005-10-12 15:06:27 +0800191 * ata_rwcmd_protocol - set taskfile r/w commands and protocol
192 * @qc: command to examine and configure
Linus Torvalds1da177e2005-04-16 15:20:36 -0700193 *
Jeff Garzik2e9edbf2006-03-24 09:56:57 -0500194 * Examine the device configuration and tf->flags to calculate
Albert Lee8cbd6df2005-10-12 15:06:27 +0800195 * the proper read/write commands and protocol to use.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700196 *
197 * LOCKING:
198 * caller.
199 */
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100200int ata_rwcmd_protocol(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700201{
Albert Lee8cbd6df2005-10-12 15:06:27 +0800202 struct ata_taskfile *tf = &qc->tf;
203 struct ata_device *dev = qc->dev;
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100204 u8 cmd;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700205
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100206 int index, fua, lba48, write;
Jeff Garzik2e9edbf2006-03-24 09:56:57 -0500207
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100208 fua = (tf->flags & ATA_TFLAG_FUA) ? 4 : 0;
Albert Lee8cbd6df2005-10-12 15:06:27 +0800209 lba48 = (tf->flags & ATA_TFLAG_LBA48) ? 2 : 0;
210 write = (tf->flags & ATA_TFLAG_WRITE) ? 1 : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211
Albert Lee8cbd6df2005-10-12 15:06:27 +0800212 if (dev->flags & ATA_DFLAG_PIO) {
213 tf->protocol = ATA_PROT_PIO;
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100214 index = dev->multi_count ? 0 : 8;
Alan Cox8d238e02006-01-17 20:50:31 +0000215 } else if (lba48 && (qc->ap->flags & ATA_FLAG_PIO_LBA48)) {
216 /* Unable to use DMA due to host limitation */
217 tf->protocol = ATA_PROT_PIO;
Albert Leeaef9d532006-02-08 16:37:43 +0800218 index = dev->multi_count ? 0 : 8;
Albert Lee8cbd6df2005-10-12 15:06:27 +0800219 } else {
220 tf->protocol = ATA_PROT_DMA;
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100221 index = 16;
Albert Lee8cbd6df2005-10-12 15:06:27 +0800222 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223
Tejun Heo9a3dccc2006-01-06 09:56:18 +0100224 cmd = ata_rw_cmds[index + fua + lba48 + write];
225 if (cmd) {
226 tf->command = cmd;
227 return 0;
228 }
229 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700230}
231
Tejun Heocb95d562006-03-06 04:31:56 +0900232/**
233 * ata_pack_xfermask - Pack pio, mwdma and udma masks into xfer_mask
234 * @pio_mask: pio_mask
235 * @mwdma_mask: mwdma_mask
236 * @udma_mask: udma_mask
237 *
238 * Pack @pio_mask, @mwdma_mask and @udma_mask into a single
239 * unsigned int xfer_mask.
240 *
241 * LOCKING:
242 * None.
243 *
244 * RETURNS:
245 * Packed xfer_mask.
246 */
247static unsigned int ata_pack_xfermask(unsigned int pio_mask,
248 unsigned int mwdma_mask,
249 unsigned int udma_mask)
250{
251 return ((pio_mask << ATA_SHIFT_PIO) & ATA_MASK_PIO) |
252 ((mwdma_mask << ATA_SHIFT_MWDMA) & ATA_MASK_MWDMA) |
253 ((udma_mask << ATA_SHIFT_UDMA) & ATA_MASK_UDMA);
254}
255
Tejun Heoc0489e42006-03-24 14:07:49 +0900256/**
257 * ata_unpack_xfermask - Unpack xfer_mask into pio, mwdma and udma masks
258 * @xfer_mask: xfer_mask to unpack
259 * @pio_mask: resulting pio_mask
260 * @mwdma_mask: resulting mwdma_mask
261 * @udma_mask: resulting udma_mask
262 *
263 * Unpack @xfer_mask into @pio_mask, @mwdma_mask and @udma_mask.
264 * Any NULL distination masks will be ignored.
265 */
266static void ata_unpack_xfermask(unsigned int xfer_mask,
267 unsigned int *pio_mask,
268 unsigned int *mwdma_mask,
269 unsigned int *udma_mask)
270{
271 if (pio_mask)
272 *pio_mask = (xfer_mask & ATA_MASK_PIO) >> ATA_SHIFT_PIO;
273 if (mwdma_mask)
274 *mwdma_mask = (xfer_mask & ATA_MASK_MWDMA) >> ATA_SHIFT_MWDMA;
275 if (udma_mask)
276 *udma_mask = (xfer_mask & ATA_MASK_UDMA) >> ATA_SHIFT_UDMA;
277}
278
Tejun Heocb95d562006-03-06 04:31:56 +0900279static const struct ata_xfer_ent {
280 unsigned int shift, bits;
281 u8 base;
282} ata_xfer_tbl[] = {
283 { ATA_SHIFT_PIO, ATA_BITS_PIO, XFER_PIO_0 },
284 { ATA_SHIFT_MWDMA, ATA_BITS_MWDMA, XFER_MW_DMA_0 },
285 { ATA_SHIFT_UDMA, ATA_BITS_UDMA, XFER_UDMA_0 },
286 { -1, },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287};
288
289/**
Tejun Heocb95d562006-03-06 04:31:56 +0900290 * ata_xfer_mask2mode - Find matching XFER_* for the given xfer_mask
291 * @xfer_mask: xfer_mask of interest
292 *
293 * Return matching XFER_* value for @xfer_mask. Only the highest
294 * bit of @xfer_mask is considered.
295 *
296 * LOCKING:
297 * None.
298 *
299 * RETURNS:
300 * Matching XFER_* value, 0 if no match found.
301 */
302static u8 ata_xfer_mask2mode(unsigned int xfer_mask)
303{
304 int highbit = fls(xfer_mask) - 1;
305 const struct ata_xfer_ent *ent;
306
307 for (ent = ata_xfer_tbl; ent->shift >= 0; ent++)
308 if (highbit >= ent->shift && highbit < ent->shift + ent->bits)
309 return ent->base + highbit - ent->shift;
310 return 0;
311}
312
313/**
314 * ata_xfer_mode2mask - Find matching xfer_mask for XFER_*
315 * @xfer_mode: XFER_* of interest
316 *
317 * Return matching xfer_mask for @xfer_mode.
318 *
319 * LOCKING:
320 * None.
321 *
322 * RETURNS:
323 * Matching xfer_mask, 0 if no match found.
324 */
325static unsigned int ata_xfer_mode2mask(u8 xfer_mode)
326{
327 const struct ata_xfer_ent *ent;
328
329 for (ent = ata_xfer_tbl; ent->shift >= 0; ent++)
330 if (xfer_mode >= ent->base && xfer_mode < ent->base + ent->bits)
331 return 1 << (ent->shift + xfer_mode - ent->base);
332 return 0;
333}
334
335/**
336 * ata_xfer_mode2shift - Find matching xfer_shift for XFER_*
337 * @xfer_mode: XFER_* of interest
338 *
339 * Return matching xfer_shift for @xfer_mode.
340 *
341 * LOCKING:
342 * None.
343 *
344 * RETURNS:
345 * Matching xfer_shift, -1 if no match found.
346 */
347static int ata_xfer_mode2shift(unsigned int xfer_mode)
348{
349 const struct ata_xfer_ent *ent;
350
351 for (ent = ata_xfer_tbl; ent->shift >= 0; ent++)
352 if (xfer_mode >= ent->base && xfer_mode < ent->base + ent->bits)
353 return ent->shift;
354 return -1;
355}
356
Linus Torvalds1da177e2005-04-16 15:20:36 -0700357/**
Tejun Heo1da7b0d2006-03-06 04:31:56 +0900358 * ata_mode_string - convert xfer_mask to string
359 * @xfer_mask: mask of bits supported; only highest bit counts.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700360 *
361 * Determine string which represents the highest speed
Tejun Heo1da7b0d2006-03-06 04:31:56 +0900362 * (highest bit in @modemask).
Linus Torvalds1da177e2005-04-16 15:20:36 -0700363 *
364 * LOCKING:
365 * None.
366 *
367 * RETURNS:
368 * Constant C string representing highest speed listed in
Tejun Heo1da7b0d2006-03-06 04:31:56 +0900369 * @mode_mask, or the constant C string "<n/a>".
Linus Torvalds1da177e2005-04-16 15:20:36 -0700370 */
Tejun Heo1da7b0d2006-03-06 04:31:56 +0900371static const char *ata_mode_string(unsigned int xfer_mask)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700372{
Tejun Heo75f554b2006-03-06 04:31:57 +0900373 static const char * const xfer_mode_str[] = {
374 "PIO0",
375 "PIO1",
376 "PIO2",
377 "PIO3",
378 "PIO4",
379 "MWDMA0",
380 "MWDMA1",
381 "MWDMA2",
382 "UDMA/16",
383 "UDMA/25",
384 "UDMA/33",
385 "UDMA/44",
386 "UDMA/66",
387 "UDMA/100",
388 "UDMA/133",
389 "UDMA7",
390 };
Tejun Heo1da7b0d2006-03-06 04:31:56 +0900391 int highbit;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700392
Tejun Heo1da7b0d2006-03-06 04:31:56 +0900393 highbit = fls(xfer_mask) - 1;
394 if (highbit >= 0 && highbit < ARRAY_SIZE(xfer_mode_str))
395 return xfer_mode_str[highbit];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700396 return "<n/a>";
Linus Torvalds1da177e2005-04-16 15:20:36 -0700397}
398
Tejun Heo0b8efb02006-03-24 15:25:31 +0900399static void ata_dev_disable(struct ata_port *ap, struct ata_device *dev)
400{
401 if (ata_dev_present(dev)) {
402 printk(KERN_WARNING "ata%u: dev %u disabled\n",
403 ap->id, dev->devno);
404 dev->class++;
405 }
406}
407
Linus Torvalds1da177e2005-04-16 15:20:36 -0700408/**
409 * ata_pio_devchk - PATA device presence detection
410 * @ap: ATA channel to examine
411 * @device: Device to examine (starting at zero)
412 *
413 * This technique was originally described in
414 * Hale Landis's ATADRVR (www.ata-atapi.com), and
415 * later found its way into the ATA/ATAPI spec.
416 *
417 * Write a pattern to the ATA shadow registers,
418 * and if a device is present, it will respond by
419 * correctly storing and echoing back the
420 * ATA shadow register contents.
421 *
422 * LOCKING:
423 * caller.
424 */
425
426static unsigned int ata_pio_devchk(struct ata_port *ap,
427 unsigned int device)
428{
429 struct ata_ioports *ioaddr = &ap->ioaddr;
430 u8 nsect, lbal;
431
432 ap->ops->dev_select(ap, device);
433
434 outb(0x55, ioaddr->nsect_addr);
435 outb(0xaa, ioaddr->lbal_addr);
436
437 outb(0xaa, ioaddr->nsect_addr);
438 outb(0x55, ioaddr->lbal_addr);
439
440 outb(0x55, ioaddr->nsect_addr);
441 outb(0xaa, ioaddr->lbal_addr);
442
443 nsect = inb(ioaddr->nsect_addr);
444 lbal = inb(ioaddr->lbal_addr);
445
446 if ((nsect == 0x55) && (lbal == 0xaa))
447 return 1; /* we found a device */
448
449 return 0; /* nothing found */
450}
451
452/**
453 * ata_mmio_devchk - PATA device presence detection
454 * @ap: ATA channel to examine
455 * @device: Device to examine (starting at zero)
456 *
457 * This technique was originally described in
458 * Hale Landis's ATADRVR (www.ata-atapi.com), and
459 * later found its way into the ATA/ATAPI spec.
460 *
461 * Write a pattern to the ATA shadow registers,
462 * and if a device is present, it will respond by
463 * correctly storing and echoing back the
464 * ATA shadow register contents.
465 *
466 * LOCKING:
467 * caller.
468 */
469
470static unsigned int ata_mmio_devchk(struct ata_port *ap,
471 unsigned int device)
472{
473 struct ata_ioports *ioaddr = &ap->ioaddr;
474 u8 nsect, lbal;
475
476 ap->ops->dev_select(ap, device);
477
478 writeb(0x55, (void __iomem *) ioaddr->nsect_addr);
479 writeb(0xaa, (void __iomem *) ioaddr->lbal_addr);
480
481 writeb(0xaa, (void __iomem *) ioaddr->nsect_addr);
482 writeb(0x55, (void __iomem *) ioaddr->lbal_addr);
483
484 writeb(0x55, (void __iomem *) ioaddr->nsect_addr);
485 writeb(0xaa, (void __iomem *) ioaddr->lbal_addr);
486
487 nsect = readb((void __iomem *) ioaddr->nsect_addr);
488 lbal = readb((void __iomem *) ioaddr->lbal_addr);
489
490 if ((nsect == 0x55) && (lbal == 0xaa))
491 return 1; /* we found a device */
492
493 return 0; /* nothing found */
494}
495
496/**
497 * ata_devchk - PATA device presence detection
498 * @ap: ATA channel to examine
499 * @device: Device to examine (starting at zero)
500 *
501 * Dispatch ATA device presence detection, depending
502 * on whether we are using PIO or MMIO to talk to the
503 * ATA shadow registers.
504 *
505 * LOCKING:
506 * caller.
507 */
508
509static unsigned int ata_devchk(struct ata_port *ap,
510 unsigned int device)
511{
512 if (ap->flags & ATA_FLAG_MMIO)
513 return ata_mmio_devchk(ap, device);
514 return ata_pio_devchk(ap, device);
515}
516
517/**
518 * ata_dev_classify - determine device type based on ATA-spec signature
519 * @tf: ATA taskfile register set for device to be identified
520 *
521 * Determine from taskfile register contents whether a device is
522 * ATA or ATAPI, as per "Signature and persistence" section
523 * of ATA/PI spec (volume 1, sect 5.14).
524 *
525 * LOCKING:
526 * None.
527 *
528 * RETURNS:
529 * Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, or %ATA_DEV_UNKNOWN
530 * the event of failure.
531 */
532
Jeff Garzik057ace52005-10-22 14:27:05 -0400533unsigned int ata_dev_classify(const struct ata_taskfile *tf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534{
535 /* Apple's open source Darwin code hints that some devices only
536 * put a proper signature into the LBA mid/high registers,
537 * So, we only check those. It's sufficient for uniqueness.
538 */
539
540 if (((tf->lbam == 0) && (tf->lbah == 0)) ||
541 ((tf->lbam == 0x3c) && (tf->lbah == 0xc3))) {
542 DPRINTK("found ATA device by sig\n");
543 return ATA_DEV_ATA;
544 }
545
546 if (((tf->lbam == 0x14) && (tf->lbah == 0xeb)) ||
547 ((tf->lbam == 0x69) && (tf->lbah == 0x96))) {
548 DPRINTK("found ATAPI device by sig\n");
549 return ATA_DEV_ATAPI;
550 }
551
552 DPRINTK("unknown device\n");
553 return ATA_DEV_UNKNOWN;
554}
555
556/**
557 * ata_dev_try_classify - Parse returned ATA device signature
558 * @ap: ATA channel to examine
559 * @device: Device to examine (starting at zero)
Tejun Heob4dc7622006-01-24 17:05:22 +0900560 * @r_err: Value of error register on completion
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561 *
562 * After an event -- SRST, E.D.D., or SATA COMRESET -- occurs,
563 * an ATA/ATAPI-defined set of values is placed in the ATA
564 * shadow registers, indicating the results of device detection
565 * and diagnostics.
566 *
567 * Select the ATA device, and read the values from the ATA shadow
568 * registers. Then parse according to the Error register value,
569 * and the spec-defined values examined by ata_dev_classify().
570 *
571 * LOCKING:
572 * caller.
Tejun Heob4dc7622006-01-24 17:05:22 +0900573 *
574 * RETURNS:
575 * Device type - %ATA_DEV_ATA, %ATA_DEV_ATAPI or %ATA_DEV_NONE.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700576 */
577
Tejun Heob4dc7622006-01-24 17:05:22 +0900578static unsigned int
579ata_dev_try_classify(struct ata_port *ap, unsigned int device, u8 *r_err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700580{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700581 struct ata_taskfile tf;
582 unsigned int class;
583 u8 err;
584
585 ap->ops->dev_select(ap, device);
586
587 memset(&tf, 0, sizeof(tf));
588
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589 ap->ops->tf_read(ap, &tf);
Jeff Garzik0169e282005-10-29 21:25:10 -0400590 err = tf.feature;
Tejun Heob4dc7622006-01-24 17:05:22 +0900591 if (r_err)
592 *r_err = err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700593
594 /* see if device passed diags */
595 if (err == 1)
596 /* do nothing */ ;
597 else if ((device == 0) && (err == 0x81))
598 /* do nothing */ ;
599 else
Tejun Heob4dc7622006-01-24 17:05:22 +0900600 return ATA_DEV_NONE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700601
Tejun Heob4dc7622006-01-24 17:05:22 +0900602 /* determine if device is ATA or ATAPI */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700603 class = ata_dev_classify(&tf);
Tejun Heob4dc7622006-01-24 17:05:22 +0900604
Linus Torvalds1da177e2005-04-16 15:20:36 -0700605 if (class == ATA_DEV_UNKNOWN)
Tejun Heob4dc7622006-01-24 17:05:22 +0900606 return ATA_DEV_NONE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700607 if ((class == ATA_DEV_ATA) && (ata_chk_status(ap) == 0))
Tejun Heob4dc7622006-01-24 17:05:22 +0900608 return ATA_DEV_NONE;
609 return class;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700610}
611
612/**
Tejun Heo6a62a042006-02-13 10:02:46 +0900613 * ata_id_string - Convert IDENTIFY DEVICE page into string
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614 * @id: IDENTIFY DEVICE results we will examine
615 * @s: string into which data is output
616 * @ofs: offset into identify device page
617 * @len: length of string to return. must be an even number.
618 *
619 * The strings in the IDENTIFY DEVICE page are broken up into
620 * 16-bit chunks. Run through the string, and output each
621 * 8-bit chunk linearly, regardless of platform.
622 *
623 * LOCKING:
624 * caller.
625 */
626
Tejun Heo6a62a042006-02-13 10:02:46 +0900627void ata_id_string(const u16 *id, unsigned char *s,
628 unsigned int ofs, unsigned int len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700629{
630 unsigned int c;
631
632 while (len > 0) {
633 c = id[ofs] >> 8;
634 *s = c;
635 s++;
636
637 c = id[ofs] & 0xff;
638 *s = c;
639 s++;
640
641 ofs++;
642 len -= 2;
643 }
644}
645
Tejun Heo0e949ff2006-02-12 22:47:04 +0900646/**
Tejun Heo6a62a042006-02-13 10:02:46 +0900647 * ata_id_c_string - Convert IDENTIFY DEVICE page into C string
Tejun Heo0e949ff2006-02-12 22:47:04 +0900648 * @id: IDENTIFY DEVICE results we will examine
649 * @s: string into which data is output
650 * @ofs: offset into identify device page
651 * @len: length of string to return. must be an odd number.
652 *
Tejun Heo6a62a042006-02-13 10:02:46 +0900653 * This function is identical to ata_id_string except that it
Tejun Heo0e949ff2006-02-12 22:47:04 +0900654 * trims trailing spaces and terminates the resulting string with
655 * null. @len must be actual maximum length (even number) + 1.
656 *
657 * LOCKING:
658 * caller.
659 */
Tejun Heo6a62a042006-02-13 10:02:46 +0900660void ata_id_c_string(const u16 *id, unsigned char *s,
661 unsigned int ofs, unsigned int len)
Tejun Heo0e949ff2006-02-12 22:47:04 +0900662{
663 unsigned char *p;
664
665 WARN_ON(!(len & 1));
666
Tejun Heo6a62a042006-02-13 10:02:46 +0900667 ata_id_string(id, s, ofs, len - 1);
Tejun Heo0e949ff2006-02-12 22:47:04 +0900668
669 p = s + strnlen(s, len - 1);
670 while (p > s && p[-1] == ' ')
671 p--;
672 *p = '\0';
673}
Edward Falk0baab862005-06-02 18:17:13 -0400674
Tejun Heo29407402006-02-12 22:47:04 +0900675static u64 ata_id_n_sectors(const u16 *id)
676{
677 if (ata_id_has_lba(id)) {
678 if (ata_id_has_lba48(id))
679 return ata_id_u64(id, 100);
680 else
681 return ata_id_u32(id, 60);
682 } else {
683 if (ata_id_current_chs_valid(id))
684 return ata_id_u32(id, 57);
685 else
686 return id[1] * id[3] * id[6];
687 }
688}
Edward Falk0baab862005-06-02 18:17:13 -0400689
690/**
691 * ata_noop_dev_select - Select device 0/1 on ATA bus
692 * @ap: ATA channel to manipulate
693 * @device: ATA device (numbered from zero) to select
694 *
695 * This function performs no actual function.
696 *
697 * May be used as the dev_select() entry in ata_port_operations.
698 *
699 * LOCKING:
700 * caller.
701 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702void ata_noop_dev_select (struct ata_port *ap, unsigned int device)
703{
704}
705
Edward Falk0baab862005-06-02 18:17:13 -0400706
Linus Torvalds1da177e2005-04-16 15:20:36 -0700707/**
708 * ata_std_dev_select - Select device 0/1 on ATA bus
709 * @ap: ATA channel to manipulate
710 * @device: ATA device (numbered from zero) to select
711 *
712 * Use the method defined in the ATA specification to
713 * make either device 0, or device 1, active on the
Edward Falk0baab862005-06-02 18:17:13 -0400714 * ATA channel. Works with both PIO and MMIO.
715 *
716 * May be used as the dev_select() entry in ata_port_operations.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700717 *
718 * LOCKING:
719 * caller.
720 */
721
722void ata_std_dev_select (struct ata_port *ap, unsigned int device)
723{
724 u8 tmp;
725
726 if (device == 0)
727 tmp = ATA_DEVICE_OBS;
728 else
729 tmp = ATA_DEVICE_OBS | ATA_DEV1;
730
731 if (ap->flags & ATA_FLAG_MMIO) {
732 writeb(tmp, (void __iomem *) ap->ioaddr.device_addr);
733 } else {
734 outb(tmp, ap->ioaddr.device_addr);
735 }
736 ata_pause(ap); /* needed; also flushes, for mmio */
737}
738
739/**
740 * ata_dev_select - Select device 0/1 on ATA bus
741 * @ap: ATA channel to manipulate
742 * @device: ATA device (numbered from zero) to select
743 * @wait: non-zero to wait for Status register BSY bit to clear
744 * @can_sleep: non-zero if context allows sleeping
745 *
746 * Use the method defined in the ATA specification to
747 * make either device 0, or device 1, active on the
748 * ATA channel.
749 *
750 * This is a high-level version of ata_std_dev_select(),
751 * which additionally provides the services of inserting
752 * the proper pauses and status polling, where needed.
753 *
754 * LOCKING:
755 * caller.
756 */
757
758void ata_dev_select(struct ata_port *ap, unsigned int device,
759 unsigned int wait, unsigned int can_sleep)
760{
761 VPRINTK("ENTER, ata%u: device %u, wait %u\n",
762 ap->id, device, wait);
763
764 if (wait)
765 ata_wait_idle(ap);
766
767 ap->ops->dev_select(ap, device);
768
769 if (wait) {
770 if (can_sleep && ap->device[device].class == ATA_DEV_ATAPI)
771 msleep(150);
772 ata_wait_idle(ap);
773 }
774}
775
776/**
777 * ata_dump_id - IDENTIFY DEVICE info debugging output
Tejun Heo0bd33002006-02-12 22:47:05 +0900778 * @id: IDENTIFY DEVICE page to dump
Linus Torvalds1da177e2005-04-16 15:20:36 -0700779 *
Tejun Heo0bd33002006-02-12 22:47:05 +0900780 * Dump selected 16-bit words from the given IDENTIFY DEVICE
781 * page.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782 *
783 * LOCKING:
784 * caller.
785 */
786
Tejun Heo0bd33002006-02-12 22:47:05 +0900787static inline void ata_dump_id(const u16 *id)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788{
789 DPRINTK("49==0x%04x "
790 "53==0x%04x "
791 "63==0x%04x "
792 "64==0x%04x "
793 "75==0x%04x \n",
Tejun Heo0bd33002006-02-12 22:47:05 +0900794 id[49],
795 id[53],
796 id[63],
797 id[64],
798 id[75]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700799 DPRINTK("80==0x%04x "
800 "81==0x%04x "
801 "82==0x%04x "
802 "83==0x%04x "
803 "84==0x%04x \n",
Tejun Heo0bd33002006-02-12 22:47:05 +0900804 id[80],
805 id[81],
806 id[82],
807 id[83],
808 id[84]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700809 DPRINTK("88==0x%04x "
810 "93==0x%04x\n",
Tejun Heo0bd33002006-02-12 22:47:05 +0900811 id[88],
812 id[93]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813}
814
Tejun Heocb95d562006-03-06 04:31:56 +0900815/**
816 * ata_id_xfermask - Compute xfermask from the given IDENTIFY data
817 * @id: IDENTIFY data to compute xfer mask from
Alan Cox11e29e22005-10-21 18:46:32 -0400818 *
Tejun Heocb95d562006-03-06 04:31:56 +0900819 * Compute the xfermask for this device. This is not as trivial
820 * as it seems if we must consider early devices correctly.
821 *
822 * FIXME: pre IDE drive timing (do we care ?).
823 *
824 * LOCKING:
825 * None.
826 *
827 * RETURNS:
828 * Computed xfermask
Alan Cox11e29e22005-10-21 18:46:32 -0400829 */
Tejun Heocb95d562006-03-06 04:31:56 +0900830static unsigned int ata_id_xfermask(const u16 *id)
Alan Cox11e29e22005-10-21 18:46:32 -0400831{
Tejun Heocb95d562006-03-06 04:31:56 +0900832 unsigned int pio_mask, mwdma_mask, udma_mask;
Alan Cox11e29e22005-10-21 18:46:32 -0400833
Alan Coxffa29452006-01-09 17:14:40 +0000834 /* Usual case. Word 53 indicates word 64 is valid */
Tejun Heocb95d562006-03-06 04:31:56 +0900835 if (id[ATA_ID_FIELD_VALID] & (1 << 1)) {
836 pio_mask = id[ATA_ID_PIO_MODES] & 0x03;
837 pio_mask <<= 3;
838 pio_mask |= 0x7;
839 } else {
840 /* If word 64 isn't valid then Word 51 high byte holds
841 * the PIO timing number for the maximum. Turn it into
842 * a mask.
843 */
844 pio_mask = (2 << (id[ATA_ID_OLD_PIO_MODES] & 0xFF)) - 1 ;
845
846 /* But wait.. there's more. Design your standards by
847 * committee and you too can get a free iordy field to
848 * process. However its the speeds not the modes that
849 * are supported... Note drivers using the timing API
850 * will get this right anyway
851 */
Alan Cox11e29e22005-10-21 18:46:32 -0400852 }
853
Tejun Heocb95d562006-03-06 04:31:56 +0900854 mwdma_mask = id[ATA_ID_MWDMA_MODES] & 0x07;
Tejun Heofb21f0d2006-03-12 12:34:35 +0900855
856 udma_mask = 0;
857 if (id[ATA_ID_FIELD_VALID] & (1 << 2))
858 udma_mask = id[ATA_ID_UDMA_MODES] & 0xff;
Alan Cox11e29e22005-10-21 18:46:32 -0400859
Tejun Heocb95d562006-03-06 04:31:56 +0900860 return ata_pack_xfermask(pio_mask, mwdma_mask, udma_mask);
Tejun Heoc18d06f2006-02-02 00:56:10 +0900861}
862
863/**
Tejun Heo86e45b62006-03-05 15:29:09 +0900864 * ata_port_queue_task - Queue port_task
865 * @ap: The ata_port to queue port_task for
Tejun Heoc18d06f2006-02-02 00:56:10 +0900866 *
Tejun Heo86e45b62006-03-05 15:29:09 +0900867 * Schedule @fn(@data) for execution after @delay jiffies using
868 * port_task. There is one port_task per port and it's the
869 * user(low level driver)'s responsibility to make sure that only
870 * one task is active at any given time.
871 *
872 * libata core layer takes care of synchronization between
873 * port_task and EH. ata_port_queue_task() may be ignored for EH
874 * synchronization.
875 *
876 * LOCKING:
877 * Inherited from caller.
878 */
879void ata_port_queue_task(struct ata_port *ap, void (*fn)(void *), void *data,
880 unsigned long delay)
881{
882 int rc;
883
Tejun Heo2e755f62006-03-05 15:29:09 +0900884 if (ap->flags & ATA_FLAG_FLUSH_PORT_TASK)
Tejun Heo86e45b62006-03-05 15:29:09 +0900885 return;
886
887 PREPARE_WORK(&ap->port_task, fn, data);
888
889 if (!delay)
890 rc = queue_work(ata_wq, &ap->port_task);
891 else
892 rc = queue_delayed_work(ata_wq, &ap->port_task, delay);
893
894 /* rc == 0 means that another user is using port task */
895 WARN_ON(rc == 0);
896}
897
898/**
899 * ata_port_flush_task - Flush port_task
900 * @ap: The ata_port to flush port_task for
901 *
902 * After this function completes, port_task is guranteed not to
903 * be running or scheduled.
Tejun Heoc18d06f2006-02-02 00:56:10 +0900904 *
905 * LOCKING:
906 * Kernel thread context (may sleep)
907 */
Tejun Heo86e45b62006-03-05 15:29:09 +0900908void ata_port_flush_task(struct ata_port *ap)
Tejun Heoc18d06f2006-02-02 00:56:10 +0900909{
Tejun Heoc18d06f2006-02-02 00:56:10 +0900910 unsigned long flags;
911
912 DPRINTK("ENTER\n");
913
914 spin_lock_irqsave(&ap->host_set->lock, flags);
Tejun Heo2e755f62006-03-05 15:29:09 +0900915 ap->flags |= ATA_FLAG_FLUSH_PORT_TASK;
Tejun Heoc18d06f2006-02-02 00:56:10 +0900916 spin_unlock_irqrestore(&ap->host_set->lock, flags);
917
918 DPRINTK("flush #1\n");
919 flush_workqueue(ata_wq);
920
921 /*
922 * At this point, if a task is running, it's guaranteed to see
923 * the FLUSH flag; thus, it will never queue pio tasks again.
924 * Cancel and flush.
925 */
Tejun Heo86e45b62006-03-05 15:29:09 +0900926 if (!cancel_delayed_work(&ap->port_task)) {
Tejun Heoc18d06f2006-02-02 00:56:10 +0900927 DPRINTK("flush #2\n");
928 flush_workqueue(ata_wq);
929 }
930
931 spin_lock_irqsave(&ap->host_set->lock, flags);
Tejun Heo2e755f62006-03-05 15:29:09 +0900932 ap->flags &= ~ATA_FLAG_FLUSH_PORT_TASK;
Tejun Heoc18d06f2006-02-02 00:56:10 +0900933 spin_unlock_irqrestore(&ap->host_set->lock, flags);
934
935 DPRINTK("EXIT\n");
Tejun Heo95064372006-01-23 13:09:37 +0900936}
937
Tejun Heo77853bf2006-01-23 13:09:36 +0900938void ata_qc_complete_internal(struct ata_queued_cmd *qc)
Jeff Garzik64f043d2005-11-17 10:50:01 -0500939{
Tejun Heo77853bf2006-01-23 13:09:36 +0900940 struct completion *waiting = qc->private_data;
Jeff Garzik64f043d2005-11-17 10:50:01 -0500941
Tejun Heo77853bf2006-01-23 13:09:36 +0900942 qc->ap->ops->tf_read(qc->ap, &qc->tf);
Tejun Heoa2a7a662005-12-13 14:48:31 +0900943 complete(waiting);
Tejun Heoa2a7a662005-12-13 14:48:31 +0900944}
Jeff Garzik64f043d2005-11-17 10:50:01 -0500945
Tejun Heoa2a7a662005-12-13 14:48:31 +0900946/**
947 * ata_exec_internal - execute libata internal command
948 * @ap: Port to which the command is sent
949 * @dev: Device to which the command is sent
950 * @tf: Taskfile registers for the command and the result
951 * @dma_dir: Data tranfer direction of the command
952 * @buf: Data buffer of the command
953 * @buflen: Length of data buffer
954 *
955 * Executes libata internal command with timeout. @tf contains
956 * command on entry and result on return. Timeout and error
957 * conditions are reported via return value. No recovery action
958 * is taken after a command times out. It's caller's duty to
959 * clean up after timeout.
960 *
961 * LOCKING:
962 * None. Should be called with kernel context, might sleep.
963 */
964
965static unsigned
966ata_exec_internal(struct ata_port *ap, struct ata_device *dev,
967 struct ata_taskfile *tf,
968 int dma_dir, void *buf, unsigned int buflen)
969{
970 u8 command = tf->command;
971 struct ata_queued_cmd *qc;
972 DECLARE_COMPLETION(wait);
973 unsigned long flags;
Tejun Heo77853bf2006-01-23 13:09:36 +0900974 unsigned int err_mask;
Tejun Heoa2a7a662005-12-13 14:48:31 +0900975
976 spin_lock_irqsave(&ap->host_set->lock, flags);
977
978 qc = ata_qc_new_init(ap, dev);
979 BUG_ON(qc == NULL);
980
981 qc->tf = *tf;
982 qc->dma_dir = dma_dir;
983 if (dma_dir != DMA_NONE) {
984 ata_sg_init_one(qc, buf, buflen);
985 qc->nsect = buflen / ATA_SECT_SIZE;
Jeff Garzik64f043d2005-11-17 10:50:01 -0500986 }
987
Tejun Heo77853bf2006-01-23 13:09:36 +0900988 qc->private_data = &wait;
Tejun Heoa2a7a662005-12-13 14:48:31 +0900989 qc->complete_fn = ata_qc_complete_internal;
990
Tejun Heo9a3d9eb2006-01-23 13:09:36 +0900991 qc->err_mask = ata_qc_issue(qc);
992 if (qc->err_mask)
Tejun Heo8e436af2006-01-23 13:09:36 +0900993 ata_qc_complete(qc);
Tejun Heoa2a7a662005-12-13 14:48:31 +0900994
995 spin_unlock_irqrestore(&ap->host_set->lock, flags);
996
997 if (!wait_for_completion_timeout(&wait, ATA_TMOUT_INTERNAL)) {
Albert Lee41ade502006-03-14 11:19:04 +0800998 ata_port_flush_task(ap);
999
Tejun Heoa2a7a662005-12-13 14:48:31 +09001000 spin_lock_irqsave(&ap->host_set->lock, flags);
1001
1002 /* We're racing with irq here. If we lose, the
1003 * following test prevents us from completing the qc
1004 * again. If completion irq occurs after here but
1005 * before the caller cleans up, it will result in a
1006 * spurious interrupt. We can live with that.
1007 */
Tejun Heo77853bf2006-01-23 13:09:36 +09001008 if (qc->flags & ATA_QCFLAG_ACTIVE) {
Tejun Heo11a56d22006-01-23 13:09:36 +09001009 qc->err_mask = AC_ERR_TIMEOUT;
Tejun Heoa2a7a662005-12-13 14:48:31 +09001010 ata_qc_complete(qc);
1011 printk(KERN_WARNING "ata%u: qc timeout (cmd 0x%x)\n",
1012 ap->id, command);
1013 }
1014
1015 spin_unlock_irqrestore(&ap->host_set->lock, flags);
1016 }
1017
Tejun Heo77853bf2006-01-23 13:09:36 +09001018 *tf = qc->tf;
1019 err_mask = qc->err_mask;
1020
1021 ata_qc_free(qc);
1022
Tejun Heo1f7dd3e92006-03-24 15:25:30 +09001023 /* XXX - Some LLDDs (sata_mv) disable port on command failure.
1024 * Until those drivers are fixed, we detect the condition
1025 * here, fail the command with AC_ERR_SYSTEM and reenable the
1026 * port.
1027 *
1028 * Note that this doesn't change any behavior as internal
1029 * command failure results in disabling the device in the
1030 * higher layer for LLDDs without new reset/EH callbacks.
1031 *
1032 * Kill the following code as soon as those drivers are fixed.
1033 */
1034 if (ap->flags & ATA_FLAG_PORT_DISABLED) {
1035 err_mask |= AC_ERR_SYSTEM;
1036 ata_port_probe(ap);
1037 }
1038
Tejun Heo77853bf2006-01-23 13:09:36 +09001039 return err_mask;
Jeff Garzik64f043d2005-11-17 10:50:01 -05001040}
1041
Linus Torvalds1da177e2005-04-16 15:20:36 -07001042/**
Alan Cox1bc4ccf2006-01-09 17:18:14 +00001043 * ata_pio_need_iordy - check if iordy needed
1044 * @adev: ATA device
1045 *
1046 * Check if the current speed of the device requires IORDY. Used
1047 * by various controllers for chip configuration.
1048 */
1049
1050unsigned int ata_pio_need_iordy(const struct ata_device *adev)
1051{
1052 int pio;
1053 int speed = adev->pio_mode - XFER_PIO_0;
1054
1055 if (speed < 2)
1056 return 0;
1057 if (speed > 2)
1058 return 1;
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001059
Alan Cox1bc4ccf2006-01-09 17:18:14 +00001060 /* If we have no drive specific rule, then PIO 2 is non IORDY */
1061
1062 if (adev->id[ATA_ID_FIELD_VALID] & 2) { /* EIDE */
1063 pio = adev->id[ATA_ID_EIDE_PIO];
1064 /* Is the speed faster than the drive allows non IORDY ? */
1065 if (pio) {
1066 /* This is cycle times not frequency - watch the logic! */
1067 if (pio > 240) /* PIO2 is 240nS per cycle */
1068 return 1;
1069 return 0;
1070 }
1071 }
1072 return 0;
1073}
1074
1075/**
Tejun Heo49016ac2006-02-21 02:12:11 +09001076 * ata_dev_read_id - Read ID data from the specified device
1077 * @ap: port on which target device resides
1078 * @dev: target device
1079 * @p_class: pointer to class of the target device (may be changed)
1080 * @post_reset: is this read ID post-reset?
Tejun Heod9572b12006-03-01 16:09:35 +09001081 * @p_id: read IDENTIFY page (newly allocated)
Tejun Heo49016ac2006-02-21 02:12:11 +09001082 *
1083 * Read ID data from the specified device. ATA_CMD_ID_ATA is
1084 * performed on ATA devices and ATA_CMD_ID_ATAPI on ATAPI
Tejun Heoaec5c3c2006-03-25 01:33:34 +09001085 * devices. This function also issues ATA_CMD_INIT_DEV_PARAMS
1086 * for pre-ATA4 drives.
Tejun Heo49016ac2006-02-21 02:12:11 +09001087 *
1088 * LOCKING:
1089 * Kernel thread context (may sleep)
1090 *
1091 * RETURNS:
1092 * 0 on success, -errno otherwise.
1093 */
1094static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev,
Tejun Heod9572b12006-03-01 16:09:35 +09001095 unsigned int *p_class, int post_reset, u16 **p_id)
Tejun Heo49016ac2006-02-21 02:12:11 +09001096{
1097 unsigned int class = *p_class;
Tejun Heo49016ac2006-02-21 02:12:11 +09001098 struct ata_taskfile tf;
1099 unsigned int err_mask = 0;
Tejun Heod9572b12006-03-01 16:09:35 +09001100 u16 *id;
Tejun Heo49016ac2006-02-21 02:12:11 +09001101 const char *reason;
1102 int rc;
1103
1104 DPRINTK("ENTER, host %u, dev %u\n", ap->id, dev->devno);
1105
Tejun Heo49016ac2006-02-21 02:12:11 +09001106 ata_dev_select(ap, dev->devno, 1, 1); /* select device 0/1 */
1107
Tejun Heod9572b12006-03-01 16:09:35 +09001108 id = kmalloc(sizeof(id[0]) * ATA_ID_WORDS, GFP_KERNEL);
1109 if (id == NULL) {
1110 rc = -ENOMEM;
1111 reason = "out of memory";
1112 goto err_out;
1113 }
1114
Tejun Heo49016ac2006-02-21 02:12:11 +09001115 retry:
1116 ata_tf_init(ap, &tf, dev->devno);
1117
1118 switch (class) {
1119 case ATA_DEV_ATA:
1120 tf.command = ATA_CMD_ID_ATA;
1121 break;
1122 case ATA_DEV_ATAPI:
1123 tf.command = ATA_CMD_ID_ATAPI;
1124 break;
1125 default:
1126 rc = -ENODEV;
1127 reason = "unsupported class";
1128 goto err_out;
1129 }
1130
1131 tf.protocol = ATA_PROT_PIO;
1132
1133 err_mask = ata_exec_internal(ap, dev, &tf, DMA_FROM_DEVICE,
1134 id, sizeof(id[0]) * ATA_ID_WORDS);
Tejun Heo49016ac2006-02-21 02:12:11 +09001135 if (err_mask) {
1136 rc = -EIO;
1137 reason = "I/O error";
Tejun Heo49016ac2006-02-21 02:12:11 +09001138 goto err_out;
1139 }
1140
1141 swap_buf_le16(id, ATA_ID_WORDS);
1142
Tejun Heo49016ac2006-02-21 02:12:11 +09001143 /* sanity check */
1144 if ((class == ATA_DEV_ATA) != ata_id_is_ata(id)) {
1145 rc = -EINVAL;
1146 reason = "device reports illegal type";
1147 goto err_out;
1148 }
1149
1150 if (post_reset && class == ATA_DEV_ATA) {
1151 /*
1152 * The exact sequence expected by certain pre-ATA4 drives is:
1153 * SRST RESET
1154 * IDENTIFY
1155 * INITIALIZE DEVICE PARAMETERS
1156 * anything else..
1157 * Some drives were very specific about that exact sequence.
1158 */
1159 if (ata_id_major_version(id) < 4 || !ata_id_has_lba(id)) {
1160 err_mask = ata_dev_init_params(ap, dev);
1161 if (err_mask) {
1162 rc = -EIO;
1163 reason = "INIT_DEV_PARAMS failed";
1164 goto err_out;
1165 }
1166
1167 /* current CHS translation info (id[53-58]) might be
1168 * changed. reread the identify device info.
1169 */
1170 post_reset = 0;
1171 goto retry;
1172 }
1173 }
1174
1175 *p_class = class;
Tejun Heod9572b12006-03-01 16:09:35 +09001176 *p_id = id;
Tejun Heo49016ac2006-02-21 02:12:11 +09001177 return 0;
1178
1179 err_out:
1180 printk(KERN_WARNING "ata%u: dev %u failed to IDENTIFY (%s)\n",
1181 ap->id, dev->devno, reason);
Tejun Heod9572b12006-03-01 16:09:35 +09001182 kfree(id);
Tejun Heo49016ac2006-02-21 02:12:11 +09001183 return rc;
1184}
1185
Tejun Heo4b2f3ed2006-03-01 16:09:36 +09001186static inline u8 ata_dev_knobble(const struct ata_port *ap,
1187 struct ata_device *dev)
1188{
1189 return ((ap->cbl == ATA_CBL_SATA) && (!ata_id_is_sata(dev->id)));
1190}
1191
Tejun Heo49016ac2006-02-21 02:12:11 +09001192/**
Tejun Heoffeae412006-03-01 16:09:35 +09001193 * ata_dev_configure - Configure the specified ATA/ATAPI device
1194 * @ap: Port on which target device resides
1195 * @dev: Target device to configure
Tejun Heo4c2d7212006-03-05 17:55:58 +09001196 * @print_info: Enable device info printout
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197 *
Tejun Heoffeae412006-03-01 16:09:35 +09001198 * Configure @dev according to @dev->id. Generic and low-level
1199 * driver specific fixups are also applied.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001200 *
1201 * LOCKING:
Tejun Heoffeae412006-03-01 16:09:35 +09001202 * Kernel thread context (may sleep)
1203 *
1204 * RETURNS:
1205 * 0 on success, -errno otherwise
Linus Torvalds1da177e2005-04-16 15:20:36 -07001206 */
Tejun Heo4c2d7212006-03-05 17:55:58 +09001207static int ata_dev_configure(struct ata_port *ap, struct ata_device *dev,
1208 int print_info)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001209{
Tejun Heo1148c3a2006-03-13 19:48:04 +09001210 const u16 *id = dev->id;
Tejun Heoff8854b2006-03-06 04:31:56 +09001211 unsigned int xfer_mask;
Tejun Heo6e7846e2006-02-12 23:32:58 +09001212 int i, rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001213
1214 if (!ata_dev_present(dev)) {
1215 DPRINTK("ENTER/EXIT (host %u, dev %u) -- nodev\n",
Tejun Heoffeae412006-03-01 16:09:35 +09001216 ap->id, dev->devno);
1217 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001218 }
1219
Tejun Heoffeae412006-03-01 16:09:35 +09001220 DPRINTK("ENTER, host %u, dev %u\n", ap->id, dev->devno);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001221
Tejun Heoc39f5eb2006-03-13 19:51:19 +09001222 /* print device capabilities */
1223 if (print_info)
1224 printk(KERN_DEBUG "ata%u: dev %u cfg 49:%04x 82:%04x 83:%04x "
1225 "84:%04x 85:%04x 86:%04x 87:%04x 88:%04x\n",
1226 ap->id, dev->devno, id[49], id[82], id[83],
1227 id[84], id[85], id[86], id[87], id[88]);
1228
Tejun Heo208a9932006-03-05 17:55:58 +09001229 /* initialize to-be-configured parameters */
1230 dev->flags = 0;
1231 dev->max_sectors = 0;
1232 dev->cdb_len = 0;
1233 dev->n_sectors = 0;
1234 dev->cylinders = 0;
1235 dev->heads = 0;
1236 dev->sectors = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001237
1238 /*
1239 * common ATA, ATAPI feature tests
1240 */
1241
Tejun Heoff8854b2006-03-06 04:31:56 +09001242 /* find max transfer mode; for printk only */
Tejun Heo1148c3a2006-03-13 19:48:04 +09001243 xfer_mask = ata_id_xfermask(id);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244
Tejun Heo1148c3a2006-03-13 19:48:04 +09001245 ata_dump_id(id);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001246
1247 /* ATA-specific feature tests */
1248 if (dev->class == ATA_DEV_ATA) {
Tejun Heo1148c3a2006-03-13 19:48:04 +09001249 dev->n_sectors = ata_id_n_sectors(id);
Tejun Heo29407402006-02-12 22:47:04 +09001250
Tejun Heo1148c3a2006-03-13 19:48:04 +09001251 if (ata_id_has_lba(id)) {
Tejun Heo4c2d7212006-03-05 17:55:58 +09001252 const char *lba_desc;
Albert Lee8bf62ece2005-05-12 15:29:42 -04001253
Tejun Heo4c2d7212006-03-05 17:55:58 +09001254 lba_desc = "LBA";
1255 dev->flags |= ATA_DFLAG_LBA;
Tejun Heo1148c3a2006-03-13 19:48:04 +09001256 if (ata_id_has_lba48(id)) {
Albert Lee8bf62ece2005-05-12 15:29:42 -04001257 dev->flags |= ATA_DFLAG_LBA48;
Tejun Heo4c2d7212006-03-05 17:55:58 +09001258 lba_desc = "LBA48";
1259 }
Albert Lee8bf62ece2005-05-12 15:29:42 -04001260
1261 /* print device info to dmesg */
Tejun Heo4c2d7212006-03-05 17:55:58 +09001262 if (print_info)
1263 printk(KERN_INFO "ata%u: dev %u ATA-%d, "
1264 "max %s, %Lu sectors: %s\n",
1265 ap->id, dev->devno,
Tejun Heo1148c3a2006-03-13 19:48:04 +09001266 ata_id_major_version(id),
Tejun Heoff8854b2006-03-06 04:31:56 +09001267 ata_mode_string(xfer_mask),
Tejun Heo4c2d7212006-03-05 17:55:58 +09001268 (unsigned long long)dev->n_sectors,
1269 lba_desc);
Tejun Heoffeae412006-03-01 16:09:35 +09001270 } else {
Albert Lee8bf62ece2005-05-12 15:29:42 -04001271 /* CHS */
1272
1273 /* Default translation */
Tejun Heo1148c3a2006-03-13 19:48:04 +09001274 dev->cylinders = id[1];
1275 dev->heads = id[3];
1276 dev->sectors = id[6];
Albert Lee8bf62ece2005-05-12 15:29:42 -04001277
Tejun Heo1148c3a2006-03-13 19:48:04 +09001278 if (ata_id_current_chs_valid(id)) {
Albert Lee8bf62ece2005-05-12 15:29:42 -04001279 /* Current CHS translation is valid. */
Tejun Heo1148c3a2006-03-13 19:48:04 +09001280 dev->cylinders = id[54];
1281 dev->heads = id[55];
1282 dev->sectors = id[56];
Albert Lee8bf62ece2005-05-12 15:29:42 -04001283 }
1284
1285 /* print device info to dmesg */
Tejun Heo4c2d7212006-03-05 17:55:58 +09001286 if (print_info)
1287 printk(KERN_INFO "ata%u: dev %u ATA-%d, "
1288 "max %s, %Lu sectors: CHS %u/%u/%u\n",
1289 ap->id, dev->devno,
Tejun Heo1148c3a2006-03-13 19:48:04 +09001290 ata_id_major_version(id),
Tejun Heoff8854b2006-03-06 04:31:56 +09001291 ata_mode_string(xfer_mask),
Tejun Heo4c2d7212006-03-05 17:55:58 +09001292 (unsigned long long)dev->n_sectors,
1293 dev->cylinders, dev->heads, dev->sectors);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001294 }
1295
Albert Lee07f6f7d2005-11-01 19:33:20 +08001296 if (dev->id[59] & 0x100) {
1297 dev->multi_count = dev->id[59] & 0xff;
1298 DPRINTK("ata%u: dev %u multi count %u\n",
1299 ap->id, device, dev->multi_count);
1300 }
1301
Linus Torvalds1da177e2005-04-16 15:20:36 -07001302 }
1303
1304 /* ATAPI-specific feature tests */
Jeff Garzik2c13b7c2005-11-14 14:14:16 -05001305 else if (dev->class == ATA_DEV_ATAPI) {
Tejun Heo1148c3a2006-03-13 19:48:04 +09001306 rc = atapi_cdb_len(id);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307 if ((rc < 12) || (rc > ATAPI_CDB_LEN)) {
1308 printk(KERN_WARNING "ata%u: unsupported CDB len\n", ap->id);
Tejun Heoffeae412006-03-01 16:09:35 +09001309 rc = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001310 goto err_out_nosup;
1311 }
Tejun Heo6e7846e2006-02-12 23:32:58 +09001312 dev->cdb_len = (unsigned int) rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001313
Albert Lee312f7da2005-09-27 17:38:03 +08001314 if (ata_id_cdb_intr(dev->id))
1315 dev->flags |= ATA_DFLAG_CDB_INTR;
1316
Linus Torvalds1da177e2005-04-16 15:20:36 -07001317 /* print device info to dmesg */
Tejun Heo4c2d7212006-03-05 17:55:58 +09001318 if (print_info)
1319 printk(KERN_INFO "ata%u: dev %u ATAPI, max %s\n",
Tejun Heoff8854b2006-03-06 04:31:56 +09001320 ap->id, dev->devno, ata_mode_string(xfer_mask));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001321 }
1322
Tejun Heo6e7846e2006-02-12 23:32:58 +09001323 ap->host->max_cmd_len = 0;
1324 for (i = 0; i < ATA_MAX_DEVICES; i++)
1325 ap->host->max_cmd_len = max_t(unsigned int,
1326 ap->host->max_cmd_len,
1327 ap->device[i].cdb_len);
1328
Brad Campbell6f2f3812005-05-12 15:07:47 -04001329 /* limit bridge transfers to udma5, 200 sectors */
Tejun Heo4b2f3ed2006-03-01 16:09:36 +09001330 if (ata_dev_knobble(ap, dev)) {
Tejun Heo4c2d7212006-03-05 17:55:58 +09001331 if (print_info)
1332 printk(KERN_INFO "ata%u(%u): applying bridge limits\n",
1333 ap->id, dev->devno);
Tejun Heo5a529132006-03-24 14:07:50 +09001334 dev->udma_mask &= ATA_UDMA5;
Tejun Heo4b2f3ed2006-03-01 16:09:36 +09001335 dev->max_sectors = ATA_MAX_SECTORS;
Brad Campbell6f2f3812005-05-12 15:07:47 -04001336 }
1337
1338 if (ap->ops->dev_config)
Tejun Heo4b2f3ed2006-03-01 16:09:36 +09001339 ap->ops->dev_config(ap, dev);
1340
Linus Torvalds1da177e2005-04-16 15:20:36 -07001341 DPRINTK("EXIT, drv_stat = 0x%x\n", ata_chk_status(ap));
Tejun Heoffeae412006-03-01 16:09:35 +09001342 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001343
1344err_out_nosup:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001345 DPRINTK("EXIT, err\n");
Tejun Heoffeae412006-03-01 16:09:35 +09001346 return rc;
Brad Campbell6f2f3812005-05-12 15:07:47 -04001347}
1348
Linus Torvalds1da177e2005-04-16 15:20:36 -07001349/**
1350 * ata_bus_probe - Reset and probe ATA bus
1351 * @ap: Bus to probe
1352 *
Jeff Garzik0cba6322005-05-30 19:49:12 -04001353 * Master ATA bus probing function. Initiates a hardware-dependent
1354 * bus reset, then attempts to identify any devices found on
1355 * the bus.
1356 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001357 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04001358 * PCI/etc. bus probe sem.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359 *
1360 * RETURNS:
1361 * Zero on success, non-zero on error.
1362 */
1363
1364static int ata_bus_probe(struct ata_port *ap)
1365{
Tejun Heo28ca5c52006-03-01 16:09:36 +09001366 unsigned int classes[ATA_MAX_DEVICES];
1367 unsigned int i, rc, found = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001368
Tejun Heo28ca5c52006-03-01 16:09:36 +09001369 ata_port_probe(ap);
1370
Tejun Heo20444702006-03-13 01:57:01 +09001371 /* reset and determine device classes */
1372 for (i = 0; i < ATA_MAX_DEVICES; i++)
1373 classes[i] = ATA_DEV_UNKNOWN;
Tejun Heoc19ba8a2006-01-24 17:05:22 +09001374
Tejun Heo20444702006-03-13 01:57:01 +09001375 if (ap->ops->probe_reset) {
Tejun Heoc19ba8a2006-01-24 17:05:22 +09001376 rc = ap->ops->probe_reset(ap, classes);
Tejun Heo28ca5c52006-03-01 16:09:36 +09001377 if (rc) {
1378 printk("ata%u: reset failed (errno=%d)\n", ap->id, rc);
1379 return rc;
Tejun Heoc19ba8a2006-01-24 17:05:22 +09001380 }
Tejun Heo28ca5c52006-03-01 16:09:36 +09001381 } else {
Tejun Heoc19ba8a2006-01-24 17:05:22 +09001382 ap->ops->phy_reset(ap);
1383
Tejun Heo20444702006-03-13 01:57:01 +09001384 if (!(ap->flags & ATA_FLAG_PORT_DISABLED))
1385 for (i = 0; i < ATA_MAX_DEVICES; i++)
Tejun Heo28ca5c52006-03-01 16:09:36 +09001386 classes[i] = ap->device[i].class;
Tejun Heo20444702006-03-13 01:57:01 +09001387
Tejun Heo28ca5c52006-03-01 16:09:36 +09001388 ata_port_probe(ap);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001389 }
1390
Tejun Heo20444702006-03-13 01:57:01 +09001391 for (i = 0; i < ATA_MAX_DEVICES; i++)
1392 if (classes[i] == ATA_DEV_UNKNOWN)
1393 classes[i] = ATA_DEV_NONE;
1394
Tejun Heo28ca5c52006-03-01 16:09:36 +09001395 /* read IDENTIFY page and configure devices */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001396 for (i = 0; i < ATA_MAX_DEVICES; i++) {
Tejun Heoffeae412006-03-01 16:09:35 +09001397 struct ata_device *dev = &ap->device[i];
1398
Tejun Heo28ca5c52006-03-01 16:09:36 +09001399 dev->class = classes[i];
1400
Tejun Heoffeae412006-03-01 16:09:35 +09001401 if (!ata_dev_present(dev))
1402 continue;
1403
1404 WARN_ON(dev->id != NULL);
1405 if (ata_dev_read_id(ap, dev, &dev->class, 1, &dev->id)) {
1406 dev->class = ATA_DEV_NONE;
1407 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001408 }
Tejun Heoffeae412006-03-01 16:09:35 +09001409
Tejun Heo4c2d7212006-03-05 17:55:58 +09001410 if (ata_dev_configure(ap, dev, 1)) {
Tejun Heofcef9782006-03-24 15:25:31 +09001411 ata_dev_disable(ap, dev);
Tejun Heoffeae412006-03-01 16:09:35 +09001412 continue;
1413 }
1414
Tejun Heoffeae412006-03-01 16:09:35 +09001415 found = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001416 }
1417
Tejun Heo28ca5c52006-03-01 16:09:36 +09001418 if (!found)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001419 goto err_out_disable;
1420
1421 ata_set_mode(ap);
1422 if (ap->flags & ATA_FLAG_PORT_DISABLED)
1423 goto err_out_disable;
1424
1425 return 0;
1426
1427err_out_disable:
1428 ap->ops->port_disable(ap);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001429 return -1;
1430}
1431
1432/**
Jeff Garzik0cba6322005-05-30 19:49:12 -04001433 * ata_port_probe - Mark port as enabled
1434 * @ap: Port for which we indicate enablement
Linus Torvalds1da177e2005-04-16 15:20:36 -07001435 *
Jeff Garzik0cba6322005-05-30 19:49:12 -04001436 * Modify @ap data structure such that the system
1437 * thinks that the entire port is enabled.
1438 *
1439 * LOCKING: host_set lock, or some other form of
1440 * serialization.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441 */
1442
1443void ata_port_probe(struct ata_port *ap)
1444{
1445 ap->flags &= ~ATA_FLAG_PORT_DISABLED;
1446}
1447
1448/**
Tejun Heo3be680b2005-12-19 22:35:02 +09001449 * sata_print_link_status - Print SATA link status
1450 * @ap: SATA port to printk link status about
1451 *
1452 * This function prints link speed and status of a SATA link.
1453 *
1454 * LOCKING:
1455 * None.
1456 */
1457static void sata_print_link_status(struct ata_port *ap)
1458{
1459 u32 sstatus, tmp;
1460 const char *speed;
1461
1462 if (!ap->ops->scr_read)
1463 return;
1464
1465 sstatus = scr_read(ap, SCR_STATUS);
1466
1467 if (sata_dev_present(ap)) {
1468 tmp = (sstatus >> 4) & 0xf;
1469 if (tmp & (1 << 0))
1470 speed = "1.5";
1471 else if (tmp & (1 << 1))
1472 speed = "3.0";
1473 else
1474 speed = "<unknown>";
1475 printk(KERN_INFO "ata%u: SATA link up %s Gbps (SStatus %X)\n",
1476 ap->id, speed, sstatus);
1477 } else {
1478 printk(KERN_INFO "ata%u: SATA link down (SStatus %X)\n",
1479 ap->id, sstatus);
1480 }
1481}
1482
1483/**
Jeff Garzik780a87f2005-05-30 15:41:05 -04001484 * __sata_phy_reset - Wake/reset a low-level SATA PHY
1485 * @ap: SATA port associated with target SATA PHY.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001486 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04001487 * This function issues commands to standard SATA Sxxx
1488 * PHY registers, to wake up the phy (and device), and
1489 * clear any reset condition.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001490 *
1491 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04001492 * PCI/etc. bus probe sem.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001493 *
1494 */
1495void __sata_phy_reset(struct ata_port *ap)
1496{
1497 u32 sstatus;
1498 unsigned long timeout = jiffies + (HZ * 5);
1499
1500 if (ap->flags & ATA_FLAG_SATA_RESET) {
Brett Russcdcca89e2005-03-28 15:10:27 -05001501 /* issue phy wake/reset */
1502 scr_write_flush(ap, SCR_CONTROL, 0x301);
Tejun Heo62ba2842005-06-26 23:27:19 +09001503 /* Couldn't find anything in SATA I/II specs, but
1504 * AHCI-1.1 10.4.2 says at least 1 ms. */
1505 mdelay(1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001506 }
Brett Russcdcca89e2005-03-28 15:10:27 -05001507 scr_write_flush(ap, SCR_CONTROL, 0x300); /* phy wake/clear reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001508
1509 /* wait for phy to become ready, if necessary */
1510 do {
1511 msleep(200);
1512 sstatus = scr_read(ap, SCR_STATUS);
1513 if ((sstatus & 0xf) != 1)
1514 break;
1515 } while (time_before(jiffies, timeout));
1516
Tejun Heo3be680b2005-12-19 22:35:02 +09001517 /* print link status */
1518 sata_print_link_status(ap);
Jeff Garzik656563e2005-11-20 03:36:45 -05001519
Tejun Heo3be680b2005-12-19 22:35:02 +09001520 /* TODO: phy layer with polling, timeouts, etc. */
1521 if (sata_dev_present(ap))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001522 ata_port_probe(ap);
Tejun Heo3be680b2005-12-19 22:35:02 +09001523 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001524 ata_port_disable(ap);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001525
1526 if (ap->flags & ATA_FLAG_PORT_DISABLED)
1527 return;
1528
1529 if (ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT)) {
1530 ata_port_disable(ap);
1531 return;
1532 }
1533
1534 ap->cbl = ATA_CBL_SATA;
1535}
1536
1537/**
Jeff Garzik780a87f2005-05-30 15:41:05 -04001538 * sata_phy_reset - Reset SATA bus.
1539 * @ap: SATA port associated with target SATA PHY.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001540 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04001541 * This function resets the SATA bus, and then probes
1542 * the bus for devices.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001543 *
1544 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04001545 * PCI/etc. bus probe sem.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001546 *
1547 */
1548void sata_phy_reset(struct ata_port *ap)
1549{
1550 __sata_phy_reset(ap);
1551 if (ap->flags & ATA_FLAG_PORT_DISABLED)
1552 return;
1553 ata_bus_reset(ap);
1554}
1555
1556/**
Alan Coxebdfca62006-03-23 15:38:34 +00001557 * ata_dev_pair - return other device on cable
1558 * @ap: port
1559 * @adev: device
1560 *
1561 * Obtain the other device on the same cable, or if none is
1562 * present NULL is returned
1563 */
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001564
Alan Coxebdfca62006-03-23 15:38:34 +00001565struct ata_device *ata_dev_pair(struct ata_port *ap, struct ata_device *adev)
1566{
1567 struct ata_device *pair = &ap->device[1 - adev->devno];
1568 if (!ata_dev_present(pair))
1569 return NULL;
1570 return pair;
1571}
1572
1573/**
Jeff Garzik780a87f2005-05-30 15:41:05 -04001574 * ata_port_disable - Disable port.
1575 * @ap: Port to be disabled.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001576 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04001577 * Modify @ap data structure such that the system
1578 * thinks that the entire port is disabled, and should
1579 * never attempt to probe or communicate with devices
1580 * on this port.
1581 *
1582 * LOCKING: host_set lock, or some other form of
1583 * serialization.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001584 */
1585
1586void ata_port_disable(struct ata_port *ap)
1587{
1588 ap->device[0].class = ATA_DEV_NONE;
1589 ap->device[1].class = ATA_DEV_NONE;
1590 ap->flags |= ATA_FLAG_PORT_DISABLED;
1591}
1592
Alan Cox452503f2005-10-21 19:01:32 -04001593/*
1594 * This mode timing computation functionality is ported over from
1595 * drivers/ide/ide-timing.h and was originally written by Vojtech Pavlik
1596 */
1597/*
1598 * PIO 0-5, MWDMA 0-2 and UDMA 0-6 timings (in nanoseconds).
1599 * These were taken from ATA/ATAPI-6 standard, rev 0a, except
1600 * for PIO 5, which is a nonstandard extension and UDMA6, which
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001601 * is currently supported only by Maxtor drives.
Alan Cox452503f2005-10-21 19:01:32 -04001602 */
1603
1604static const struct ata_timing ata_timing[] = {
1605
1606 { XFER_UDMA_6, 0, 0, 0, 0, 0, 0, 0, 15 },
1607 { XFER_UDMA_5, 0, 0, 0, 0, 0, 0, 0, 20 },
1608 { XFER_UDMA_4, 0, 0, 0, 0, 0, 0, 0, 30 },
1609 { XFER_UDMA_3, 0, 0, 0, 0, 0, 0, 0, 45 },
1610
1611 { XFER_UDMA_2, 0, 0, 0, 0, 0, 0, 0, 60 },
1612 { XFER_UDMA_1, 0, 0, 0, 0, 0, 0, 0, 80 },
1613 { XFER_UDMA_0, 0, 0, 0, 0, 0, 0, 0, 120 },
1614
1615/* { XFER_UDMA_SLOW, 0, 0, 0, 0, 0, 0, 0, 150 }, */
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001616
Alan Cox452503f2005-10-21 19:01:32 -04001617 { XFER_MW_DMA_2, 25, 0, 0, 0, 70, 25, 120, 0 },
1618 { XFER_MW_DMA_1, 45, 0, 0, 0, 80, 50, 150, 0 },
1619 { XFER_MW_DMA_0, 60, 0, 0, 0, 215, 215, 480, 0 },
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001620
Alan Cox452503f2005-10-21 19:01:32 -04001621 { XFER_SW_DMA_2, 60, 0, 0, 0, 120, 120, 240, 0 },
1622 { XFER_SW_DMA_1, 90, 0, 0, 0, 240, 240, 480, 0 },
1623 { XFER_SW_DMA_0, 120, 0, 0, 0, 480, 480, 960, 0 },
1624
1625/* { XFER_PIO_5, 20, 50, 30, 100, 50, 30, 100, 0 }, */
1626 { XFER_PIO_4, 25, 70, 25, 120, 70, 25, 120, 0 },
1627 { XFER_PIO_3, 30, 80, 70, 180, 80, 70, 180, 0 },
1628
1629 { XFER_PIO_2, 30, 290, 40, 330, 100, 90, 240, 0 },
1630 { XFER_PIO_1, 50, 290, 93, 383, 125, 100, 383, 0 },
1631 { XFER_PIO_0, 70, 290, 240, 600, 165, 150, 600, 0 },
1632
1633/* { XFER_PIO_SLOW, 120, 290, 240, 960, 290, 240, 960, 0 }, */
1634
1635 { 0xFF }
1636};
1637
1638#define ENOUGH(v,unit) (((v)-1)/(unit)+1)
1639#define EZ(v,unit) ((v)?ENOUGH(v,unit):0)
1640
1641static void ata_timing_quantize(const struct ata_timing *t, struct ata_timing *q, int T, int UT)
1642{
1643 q->setup = EZ(t->setup * 1000, T);
1644 q->act8b = EZ(t->act8b * 1000, T);
1645 q->rec8b = EZ(t->rec8b * 1000, T);
1646 q->cyc8b = EZ(t->cyc8b * 1000, T);
1647 q->active = EZ(t->active * 1000, T);
1648 q->recover = EZ(t->recover * 1000, T);
1649 q->cycle = EZ(t->cycle * 1000, T);
1650 q->udma = EZ(t->udma * 1000, UT);
1651}
1652
1653void ata_timing_merge(const struct ata_timing *a, const struct ata_timing *b,
1654 struct ata_timing *m, unsigned int what)
1655{
1656 if (what & ATA_TIMING_SETUP ) m->setup = max(a->setup, b->setup);
1657 if (what & ATA_TIMING_ACT8B ) m->act8b = max(a->act8b, b->act8b);
1658 if (what & ATA_TIMING_REC8B ) m->rec8b = max(a->rec8b, b->rec8b);
1659 if (what & ATA_TIMING_CYC8B ) m->cyc8b = max(a->cyc8b, b->cyc8b);
1660 if (what & ATA_TIMING_ACTIVE ) m->active = max(a->active, b->active);
1661 if (what & ATA_TIMING_RECOVER) m->recover = max(a->recover, b->recover);
1662 if (what & ATA_TIMING_CYCLE ) m->cycle = max(a->cycle, b->cycle);
1663 if (what & ATA_TIMING_UDMA ) m->udma = max(a->udma, b->udma);
1664}
1665
1666static const struct ata_timing* ata_timing_find_mode(unsigned short speed)
1667{
1668 const struct ata_timing *t;
1669
1670 for (t = ata_timing; t->mode != speed; t++)
Alan Cox91190752005-10-26 12:17:46 -04001671 if (t->mode == 0xFF)
Alan Cox452503f2005-10-21 19:01:32 -04001672 return NULL;
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001673 return t;
Alan Cox452503f2005-10-21 19:01:32 -04001674}
1675
1676int ata_timing_compute(struct ata_device *adev, unsigned short speed,
1677 struct ata_timing *t, int T, int UT)
1678{
1679 const struct ata_timing *s;
1680 struct ata_timing p;
1681
1682 /*
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05001683 * Find the mode.
Albert Lee75b1f2f2005-11-16 17:06:18 +08001684 */
Alan Cox452503f2005-10-21 19:01:32 -04001685
1686 if (!(s = ata_timing_find_mode(speed)))
1687 return -EINVAL;
1688
Albert Lee75b1f2f2005-11-16 17:06:18 +08001689 memcpy(t, s, sizeof(*s));
1690
Alan Cox452503f2005-10-21 19:01:32 -04001691 /*
1692 * If the drive is an EIDE drive, it can tell us it needs extended
1693 * PIO/MW_DMA cycle timing.
1694 */
1695
1696 if (adev->id[ATA_ID_FIELD_VALID] & 2) { /* EIDE drive */
1697 memset(&p, 0, sizeof(p));
1698 if(speed >= XFER_PIO_0 && speed <= XFER_SW_DMA_0) {
1699 if (speed <= XFER_PIO_2) p.cycle = p.cyc8b = adev->id[ATA_ID_EIDE_PIO];
1700 else p.cycle = p.cyc8b = adev->id[ATA_ID_EIDE_PIO_IORDY];
1701 } else if(speed >= XFER_MW_DMA_0 && speed <= XFER_MW_DMA_2) {
1702 p.cycle = adev->id[ATA_ID_EIDE_DMA_MIN];
1703 }
1704 ata_timing_merge(&p, t, t, ATA_TIMING_CYCLE | ATA_TIMING_CYC8B);
1705 }
1706
1707 /*
1708 * Convert the timing to bus clock counts.
1709 */
1710
Albert Lee75b1f2f2005-11-16 17:06:18 +08001711 ata_timing_quantize(t, t, T, UT);
Alan Cox452503f2005-10-21 19:01:32 -04001712
1713 /*
Randy Dunlapc893a3a2006-01-28 13:15:32 -05001714 * Even in DMA/UDMA modes we still use PIO access for IDENTIFY,
1715 * S.M.A.R.T * and some other commands. We have to ensure that the
1716 * DMA cycle timing is slower/equal than the fastest PIO timing.
Alan Cox452503f2005-10-21 19:01:32 -04001717 */
1718
1719 if (speed > XFER_PIO_4) {
1720 ata_timing_compute(adev, adev->pio_mode, &p, T, UT);
1721 ata_timing_merge(&p, t, t, ATA_TIMING_ALL);
1722 }
1723
1724 /*
Randy Dunlapc893a3a2006-01-28 13:15:32 -05001725 * Lengthen active & recovery time so that cycle time is correct.
Alan Cox452503f2005-10-21 19:01:32 -04001726 */
1727
1728 if (t->act8b + t->rec8b < t->cyc8b) {
1729 t->act8b += (t->cyc8b - (t->act8b + t->rec8b)) / 2;
1730 t->rec8b = t->cyc8b - t->act8b;
1731 }
1732
1733 if (t->active + t->recover < t->cycle) {
1734 t->active += (t->cycle - (t->active + t->recover)) / 2;
1735 t->recover = t->cycle - t->active;
1736 }
1737
1738 return 0;
1739}
1740
Tejun Heo83206a22006-03-24 15:25:31 +09001741static int ata_dev_set_mode(struct ata_port *ap, struct ata_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001742{
Tejun Heo83206a22006-03-24 15:25:31 +09001743 unsigned int err_mask;
1744 int rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745
1746 if (dev->xfer_shift == ATA_SHIFT_PIO)
1747 dev->flags |= ATA_DFLAG_PIO;
1748
Tejun Heo83206a22006-03-24 15:25:31 +09001749 err_mask = ata_dev_set_xfermode(ap, dev);
1750 if (err_mask) {
1751 printk(KERN_ERR
1752 "ata%u: failed to set xfermode (err_mask=0x%x)\n",
1753 ap->id, err_mask);
1754 return -EIO;
1755 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001756
Tejun Heo83206a22006-03-24 15:25:31 +09001757 rc = ata_dev_revalidate(ap, dev, 0);
1758 if (rc) {
1759 printk(KERN_ERR
1760 "ata%u: failed to revalidate after set xfermode\n",
1761 ap->id);
1762 return rc;
Tejun Heo48a8a142006-03-05 17:55:58 +09001763 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001764
Tejun Heo23e71c32006-03-06 04:31:57 +09001765 DPRINTK("xfer_shift=%u, xfer_mode=0x%x\n",
1766 dev->xfer_shift, (int)dev->xfer_mode);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001767
1768 printk(KERN_INFO "ata%u: dev %u configured for %s\n",
Tejun Heo23e71c32006-03-06 04:31:57 +09001769 ap->id, dev->devno,
1770 ata_mode_string(ata_xfer_mode2mask(dev->xfer_mode)));
Tejun Heo83206a22006-03-24 15:25:31 +09001771 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001772}
1773
1774static int ata_host_set_pio(struct ata_port *ap)
1775{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001776 int i;
1777
1778 for (i = 0; i < ATA_MAX_DEVICES; i++) {
1779 struct ata_device *dev = &ap->device[i];
Tejun Heoa6d5a512006-03-06 04:31:57 +09001780
1781 if (!ata_dev_present(dev))
1782 continue;
1783
1784 if (!dev->pio_mode) {
Alan Cox88f93a32006-03-21 16:04:12 +00001785 printk(KERN_WARNING "ata%u: no PIO support for device %d.\n", ap->id, i);
Tejun Heoa6d5a512006-03-06 04:31:57 +09001786 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001787 }
Tejun Heoa6d5a512006-03-06 04:31:57 +09001788
1789 dev->xfer_mode = dev->pio_mode;
1790 dev->xfer_shift = ATA_SHIFT_PIO;
1791 if (ap->ops->set_piomode)
1792 ap->ops->set_piomode(ap, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001793 }
1794
1795 return 0;
1796}
1797
Tejun Heoa6d5a512006-03-06 04:31:57 +09001798static void ata_host_set_dma(struct ata_port *ap)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001799{
1800 int i;
1801
1802 for (i = 0; i < ATA_MAX_DEVICES; i++) {
1803 struct ata_device *dev = &ap->device[i];
Tejun Heoa6d5a512006-03-06 04:31:57 +09001804
1805 if (!ata_dev_present(dev) || !dev->dma_mode)
1806 continue;
1807
1808 dev->xfer_mode = dev->dma_mode;
1809 dev->xfer_shift = ata_xfer_mode2shift(dev->dma_mode);
1810 if (ap->ops->set_dmamode)
1811 ap->ops->set_dmamode(ap, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001812 }
1813}
1814
1815/**
1816 * ata_set_mode - Program timings and issue SET FEATURES - XFER
1817 * @ap: port on which timings will be programmed
1818 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04001819 * Set ATA device disk transfer mode (PIO3, UDMA6, etc.).
1820 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001821 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04001822 * PCI/etc. bus probe sem.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001823 */
1824static void ata_set_mode(struct ata_port *ap)
1825{
Tejun Heoa6d5a512006-03-06 04:31:57 +09001826 int i, rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001827
Tejun Heoa6d5a512006-03-06 04:31:57 +09001828 /* step 1: calculate xfer_mask */
1829 for (i = 0; i < ATA_MAX_DEVICES; i++) {
1830 struct ata_device *dev = &ap->device[i];
Tejun Heoacf356b2006-03-24 14:07:50 +09001831 unsigned int pio_mask, dma_mask;
Tejun Heoa6d5a512006-03-06 04:31:57 +09001832
1833 if (!ata_dev_present(dev))
1834 continue;
1835
Tejun Heoacf356b2006-03-24 14:07:50 +09001836 ata_dev_xfermask(ap, dev);
Tejun Heoa6d5a512006-03-06 04:31:57 +09001837
Tejun Heoacf356b2006-03-24 14:07:50 +09001838 /* TODO: let LLDD filter dev->*_mask here */
1839
1840 pio_mask = ata_pack_xfermask(dev->pio_mask, 0, 0);
1841 dma_mask = ata_pack_xfermask(0, dev->mwdma_mask, dev->udma_mask);
1842 dev->pio_mode = ata_xfer_mask2mode(pio_mask);
1843 dev->dma_mode = ata_xfer_mask2mode(dma_mask);
Tejun Heoa6d5a512006-03-06 04:31:57 +09001844 }
1845
1846 /* step 2: always set host PIO timings */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001847 rc = ata_host_set_pio(ap);
1848 if (rc)
1849 goto err_out;
1850
Tejun Heoa6d5a512006-03-06 04:31:57 +09001851 /* step 3: set host DMA timings */
1852 ata_host_set_dma(ap);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001853
1854 /* step 4: update devices' xfer mode */
Tejun Heo83206a22006-03-24 15:25:31 +09001855 for (i = 0; i < ATA_MAX_DEVICES; i++) {
1856 struct ata_device *dev = &ap->device[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001857
Tejun Heo83206a22006-03-24 15:25:31 +09001858 if (!ata_dev_present(dev))
1859 continue;
1860
1861 if (ata_dev_set_mode(ap, dev))
1862 goto err_out;
1863 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001864
1865 if (ap->ops->post_set_mode)
1866 ap->ops->post_set_mode(ap);
1867
Linus Torvalds1da177e2005-04-16 15:20:36 -07001868 return;
1869
1870err_out:
1871 ata_port_disable(ap);
1872}
1873
1874/**
Jeff Garzik1fdffbc2006-02-09 05:15:27 -05001875 * ata_tf_to_host - issue ATA taskfile to host controller
1876 * @ap: port to which command is being issued
1877 * @tf: ATA taskfile register set
1878 *
1879 * Issues ATA taskfile register set to ATA host controller,
1880 * with proper synchronization with interrupt handler and
1881 * other threads.
1882 *
1883 * LOCKING:
1884 * spin_lock_irqsave(host_set lock)
1885 */
1886
1887static inline void ata_tf_to_host(struct ata_port *ap,
1888 const struct ata_taskfile *tf)
1889{
1890 ap->ops->tf_load(ap, tf);
1891 ap->ops->exec_command(ap, tf);
1892}
1893
1894/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07001895 * ata_busy_sleep - sleep until BSY clears, or timeout
1896 * @ap: port containing status register to be polled
1897 * @tmout_pat: impatience timeout
1898 * @tmout: overall timeout
1899 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04001900 * Sleep until ATA Status register bit BSY clears,
1901 * or a timeout occurs.
1902 *
1903 * LOCKING: None.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001904 */
1905
Tejun Heo6f8b9952006-01-24 17:05:21 +09001906unsigned int ata_busy_sleep (struct ata_port *ap,
1907 unsigned long tmout_pat, unsigned long tmout)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001908{
1909 unsigned long timer_start, timeout;
1910 u8 status;
1911
1912 status = ata_busy_wait(ap, ATA_BUSY, 300);
1913 timer_start = jiffies;
1914 timeout = timer_start + tmout_pat;
1915 while ((status & ATA_BUSY) && (time_before(jiffies, timeout))) {
1916 msleep(50);
1917 status = ata_busy_wait(ap, ATA_BUSY, 3);
1918 }
1919
1920 if (status & ATA_BUSY)
1921 printk(KERN_WARNING "ata%u is slow to respond, "
1922 "please be patient\n", ap->id);
1923
1924 timeout = timer_start + tmout;
1925 while ((status & ATA_BUSY) && (time_before(jiffies, timeout))) {
1926 msleep(50);
1927 status = ata_chk_status(ap);
1928 }
1929
1930 if (status & ATA_BUSY) {
1931 printk(KERN_ERR "ata%u failed to respond (%lu secs)\n",
1932 ap->id, tmout / HZ);
1933 return 1;
1934 }
1935
1936 return 0;
1937}
1938
1939static void ata_bus_post_reset(struct ata_port *ap, unsigned int devmask)
1940{
1941 struct ata_ioports *ioaddr = &ap->ioaddr;
1942 unsigned int dev0 = devmask & (1 << 0);
1943 unsigned int dev1 = devmask & (1 << 1);
1944 unsigned long timeout;
1945
1946 /* if device 0 was found in ata_devchk, wait for its
1947 * BSY bit to clear
1948 */
1949 if (dev0)
1950 ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT);
1951
1952 /* if device 1 was found in ata_devchk, wait for
1953 * register access, then wait for BSY to clear
1954 */
1955 timeout = jiffies + ATA_TMOUT_BOOT;
1956 while (dev1) {
1957 u8 nsect, lbal;
1958
1959 ap->ops->dev_select(ap, 1);
1960 if (ap->flags & ATA_FLAG_MMIO) {
1961 nsect = readb((void __iomem *) ioaddr->nsect_addr);
1962 lbal = readb((void __iomem *) ioaddr->lbal_addr);
1963 } else {
1964 nsect = inb(ioaddr->nsect_addr);
1965 lbal = inb(ioaddr->lbal_addr);
1966 }
1967 if ((nsect == 1) && (lbal == 1))
1968 break;
1969 if (time_after(jiffies, timeout)) {
1970 dev1 = 0;
1971 break;
1972 }
1973 msleep(50); /* give drive a breather */
1974 }
1975 if (dev1)
1976 ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT);
1977
1978 /* is all this really necessary? */
1979 ap->ops->dev_select(ap, 0);
1980 if (dev1)
1981 ap->ops->dev_select(ap, 1);
1982 if (dev0)
1983 ap->ops->dev_select(ap, 0);
1984}
1985
Linus Torvalds1da177e2005-04-16 15:20:36 -07001986static unsigned int ata_bus_softreset(struct ata_port *ap,
1987 unsigned int devmask)
1988{
1989 struct ata_ioports *ioaddr = &ap->ioaddr;
1990
1991 DPRINTK("ata%u: bus reset via SRST\n", ap->id);
1992
1993 /* software reset. causes dev0 to be selected */
1994 if (ap->flags & ATA_FLAG_MMIO) {
1995 writeb(ap->ctl, (void __iomem *) ioaddr->ctl_addr);
1996 udelay(20); /* FIXME: flush */
1997 writeb(ap->ctl | ATA_SRST, (void __iomem *) ioaddr->ctl_addr);
1998 udelay(20); /* FIXME: flush */
1999 writeb(ap->ctl, (void __iomem *) ioaddr->ctl_addr);
2000 } else {
2001 outb(ap->ctl, ioaddr->ctl_addr);
2002 udelay(10);
2003 outb(ap->ctl | ATA_SRST, ioaddr->ctl_addr);
2004 udelay(10);
2005 outb(ap->ctl, ioaddr->ctl_addr);
2006 }
2007
2008 /* spec mandates ">= 2ms" before checking status.
2009 * We wait 150ms, because that was the magic delay used for
2010 * ATAPI devices in Hale Landis's ATADRVR, for the period of time
2011 * between when the ATA command register is written, and then
2012 * status is checked. Because waiting for "a while" before
2013 * checking status is fine, post SRST, we perform this magic
2014 * delay here as well.
Alan Cox09c7ad72006-03-22 15:52:40 +00002015 *
2016 * Old drivers/ide uses the 2mS rule and then waits for ready
Linus Torvalds1da177e2005-04-16 15:20:36 -07002017 */
2018 msleep(150);
2019
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05002020
2021 /* Before we perform post reset processing we want to see if
Alan Cox09c7ad72006-03-22 15:52:40 +00002022 the bus shows 0xFF because the odd clown forgets the D7 pulldown
2023 resistor */
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05002024
Alan Cox09c7ad72006-03-22 15:52:40 +00002025 if (ata_check_status(ap) == 0xFF)
2026 return 1; /* Positive is failure for some reason */
2027
Linus Torvalds1da177e2005-04-16 15:20:36 -07002028 ata_bus_post_reset(ap, devmask);
2029
2030 return 0;
2031}
2032
2033/**
2034 * ata_bus_reset - reset host port and associated ATA channel
2035 * @ap: port to reset
2036 *
2037 * This is typically the first time we actually start issuing
2038 * commands to the ATA channel. We wait for BSY to clear, then
2039 * issue EXECUTE DEVICE DIAGNOSTIC command, polling for its
2040 * result. Determine what devices, if any, are on the channel
2041 * by looking at the device 0/1 error register. Look at the signature
2042 * stored in each device's taskfile registers, to determine if
2043 * the device is ATA or ATAPI.
2044 *
2045 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04002046 * PCI/etc. bus probe sem.
2047 * Obtains host_set lock.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002048 *
2049 * SIDE EFFECTS:
2050 * Sets ATA_FLAG_PORT_DISABLED if bus reset fails.
2051 */
2052
2053void ata_bus_reset(struct ata_port *ap)
2054{
2055 struct ata_ioports *ioaddr = &ap->ioaddr;
2056 unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS;
2057 u8 err;
Tejun Heoaec5c3c2006-03-25 01:33:34 +09002058 unsigned int dev0, dev1 = 0, devmask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002059
2060 DPRINTK("ENTER, host %u, port %u\n", ap->id, ap->port_no);
2061
2062 /* determine if device 0/1 are present */
2063 if (ap->flags & ATA_FLAG_SATA_RESET)
2064 dev0 = 1;
2065 else {
2066 dev0 = ata_devchk(ap, 0);
2067 if (slave_possible)
2068 dev1 = ata_devchk(ap, 1);
2069 }
2070
2071 if (dev0)
2072 devmask |= (1 << 0);
2073 if (dev1)
2074 devmask |= (1 << 1);
2075
2076 /* select device 0 again */
2077 ap->ops->dev_select(ap, 0);
2078
2079 /* issue bus reset */
2080 if (ap->flags & ATA_FLAG_SRST)
Tejun Heoaec5c3c2006-03-25 01:33:34 +09002081 if (ata_bus_softreset(ap, devmask))
2082 goto err_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002083
2084 /*
2085 * determine by signature whether we have ATA or ATAPI devices
2086 */
Tejun Heob4dc7622006-01-24 17:05:22 +09002087 ap->device[0].class = ata_dev_try_classify(ap, 0, &err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002088 if ((slave_possible) && (err != 0x81))
Tejun Heob4dc7622006-01-24 17:05:22 +09002089 ap->device[1].class = ata_dev_try_classify(ap, 1, &err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002090
2091 /* re-enable interrupts */
2092 if (ap->ioaddr.ctl_addr) /* FIXME: hack. create a hook instead */
2093 ata_irq_on(ap);
2094
2095 /* is double-select really necessary? */
2096 if (ap->device[1].class != ATA_DEV_NONE)
2097 ap->ops->dev_select(ap, 1);
2098 if (ap->device[0].class != ATA_DEV_NONE)
2099 ap->ops->dev_select(ap, 0);
2100
2101 /* if no devices were detected, disable this port */
2102 if ((ap->device[0].class == ATA_DEV_NONE) &&
2103 (ap->device[1].class == ATA_DEV_NONE))
2104 goto err_out;
2105
2106 if (ap->flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST)) {
2107 /* set up device control for ATA_FLAG_SATA_RESET */
2108 if (ap->flags & ATA_FLAG_MMIO)
2109 writeb(ap->ctl, (void __iomem *) ioaddr->ctl_addr);
2110 else
2111 outb(ap->ctl, ioaddr->ctl_addr);
2112 }
2113
2114 DPRINTK("EXIT\n");
2115 return;
2116
2117err_out:
2118 printk(KERN_ERR "ata%u: disabling port\n", ap->id);
2119 ap->ops->port_disable(ap);
2120
2121 DPRINTK("EXIT\n");
2122}
2123
Tejun Heo7a7921e2006-02-02 18:20:00 +09002124static int sata_phy_resume(struct ata_port *ap)
2125{
2126 unsigned long timeout = jiffies + (HZ * 5);
2127 u32 sstatus;
2128
2129 scr_write_flush(ap, SCR_CONTROL, 0x300);
2130
2131 /* Wait for phy to become ready, if necessary. */
2132 do {
2133 msleep(200);
2134 sstatus = scr_read(ap, SCR_STATUS);
2135 if ((sstatus & 0xf) != 1)
2136 return 0;
2137 } while (time_before(jiffies, timeout));
2138
2139 return -1;
2140}
2141
Tejun Heoc2bd5802006-01-24 17:05:22 +09002142/**
Tejun Heo8a19ac82006-02-02 18:20:00 +09002143 * ata_std_probeinit - initialize probing
2144 * @ap: port to be probed
2145 *
2146 * @ap is about to be probed. Initialize it. This function is
2147 * to be used as standard callback for ata_drive_probe_reset().
Tejun Heo3a397462006-02-10 23:58:48 +09002148 *
2149 * NOTE!!! Do not use this function as probeinit if a low level
2150 * driver implements only hardreset. Just pass NULL as probeinit
2151 * in that case. Using this function is probably okay but doing
2152 * so makes reset sequence different from the original
2153 * ->phy_reset implementation and Jeff nervous. :-P
Tejun Heo8a19ac82006-02-02 18:20:00 +09002154 */
2155extern void ata_std_probeinit(struct ata_port *ap)
2156{
Tejun Heo3a397462006-02-10 23:58:48 +09002157 if (ap->flags & ATA_FLAG_SATA && ap->ops->scr_read) {
Tejun Heo8a19ac82006-02-02 18:20:00 +09002158 sata_phy_resume(ap);
Tejun Heo3a397462006-02-10 23:58:48 +09002159 if (sata_dev_present(ap))
2160 ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT);
2161 }
Tejun Heo8a19ac82006-02-02 18:20:00 +09002162}
2163
2164/**
Tejun Heoc2bd5802006-01-24 17:05:22 +09002165 * ata_std_softreset - reset host port via ATA SRST
2166 * @ap: port to reset
2167 * @verbose: fail verbosely
2168 * @classes: resulting classes of attached devices
2169 *
2170 * Reset host port using ATA SRST. This function is to be used
2171 * as standard callback for ata_drive_*_reset() functions.
2172 *
2173 * LOCKING:
2174 * Kernel thread context (may sleep)
2175 *
2176 * RETURNS:
2177 * 0 on success, -errno otherwise.
2178 */
2179int ata_std_softreset(struct ata_port *ap, int verbose, unsigned int *classes)
2180{
2181 unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS;
2182 unsigned int devmask = 0, err_mask;
2183 u8 err;
2184
2185 DPRINTK("ENTER\n");
2186
Tejun Heo3a397462006-02-10 23:58:48 +09002187 if (ap->ops->scr_read && !sata_dev_present(ap)) {
2188 classes[0] = ATA_DEV_NONE;
2189 goto out;
2190 }
2191
Tejun Heoc2bd5802006-01-24 17:05:22 +09002192 /* determine if device 0/1 are present */
2193 if (ata_devchk(ap, 0))
2194 devmask |= (1 << 0);
2195 if (slave_possible && ata_devchk(ap, 1))
2196 devmask |= (1 << 1);
2197
Tejun Heoc2bd5802006-01-24 17:05:22 +09002198 /* select device 0 again */
2199 ap->ops->dev_select(ap, 0);
2200
2201 /* issue bus reset */
2202 DPRINTK("about to softreset, devmask=%x\n", devmask);
2203 err_mask = ata_bus_softreset(ap, devmask);
2204 if (err_mask) {
2205 if (verbose)
2206 printk(KERN_ERR "ata%u: SRST failed (err_mask=0x%x)\n",
2207 ap->id, err_mask);
2208 else
2209 DPRINTK("EXIT, softreset failed (err_mask=0x%x)\n",
2210 err_mask);
2211 return -EIO;
2212 }
2213
2214 /* determine by signature whether we have ATA or ATAPI devices */
2215 classes[0] = ata_dev_try_classify(ap, 0, &err);
2216 if (slave_possible && err != 0x81)
2217 classes[1] = ata_dev_try_classify(ap, 1, &err);
2218
Tejun Heo3a397462006-02-10 23:58:48 +09002219 out:
Tejun Heoc2bd5802006-01-24 17:05:22 +09002220 DPRINTK("EXIT, classes[0]=%u [1]=%u\n", classes[0], classes[1]);
2221 return 0;
2222}
2223
2224/**
2225 * sata_std_hardreset - reset host port via SATA phy reset
2226 * @ap: port to reset
2227 * @verbose: fail verbosely
2228 * @class: resulting class of attached device
2229 *
2230 * SATA phy-reset host port using DET bits of SControl register.
2231 * This function is to be used as standard callback for
2232 * ata_drive_*_reset().
2233 *
2234 * LOCKING:
2235 * Kernel thread context (may sleep)
2236 *
2237 * RETURNS:
2238 * 0 on success, -errno otherwise.
2239 */
2240int sata_std_hardreset(struct ata_port *ap, int verbose, unsigned int *class)
2241{
Tejun Heoc2bd5802006-01-24 17:05:22 +09002242 DPRINTK("ENTER\n");
2243
2244 /* Issue phy wake/reset */
2245 scr_write_flush(ap, SCR_CONTROL, 0x301);
2246
2247 /*
2248 * Couldn't find anything in SATA I/II specs, but AHCI-1.1
2249 * 10.4.2 says at least 1 ms.
2250 */
2251 msleep(1);
2252
Tejun Heo7a7921e2006-02-02 18:20:00 +09002253 /* Bring phy back */
2254 sata_phy_resume(ap);
Tejun Heoc2bd5802006-01-24 17:05:22 +09002255
Tejun Heoc2bd5802006-01-24 17:05:22 +09002256 /* TODO: phy layer with polling, timeouts, etc. */
2257 if (!sata_dev_present(ap)) {
2258 *class = ATA_DEV_NONE;
2259 DPRINTK("EXIT, link offline\n");
2260 return 0;
2261 }
2262
2263 if (ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT)) {
2264 if (verbose)
2265 printk(KERN_ERR "ata%u: COMRESET failed "
2266 "(device not ready)\n", ap->id);
2267 else
2268 DPRINTK("EXIT, device not ready\n");
2269 return -EIO;
2270 }
2271
Tejun Heo3a397462006-02-10 23:58:48 +09002272 ap->ops->dev_select(ap, 0); /* probably unnecessary */
2273
Tejun Heoc2bd5802006-01-24 17:05:22 +09002274 *class = ata_dev_try_classify(ap, 0, NULL);
2275
2276 DPRINTK("EXIT, class=%u\n", *class);
2277 return 0;
2278}
2279
2280/**
2281 * ata_std_postreset - standard postreset callback
2282 * @ap: the target ata_port
2283 * @classes: classes of attached devices
2284 *
2285 * This function is invoked after a successful reset. Note that
2286 * the device might have been reset more than once using
2287 * different reset methods before postreset is invoked.
Tejun Heoc2bd5802006-01-24 17:05:22 +09002288 *
2289 * This function is to be used as standard callback for
2290 * ata_drive_*_reset().
2291 *
2292 * LOCKING:
2293 * Kernel thread context (may sleep)
2294 */
2295void ata_std_postreset(struct ata_port *ap, unsigned int *classes)
2296{
2297 DPRINTK("ENTER\n");
2298
Tejun Heo56497bd2006-02-15 15:01:42 +09002299 /* set cable type if it isn't already set */
Tejun Heoc2bd5802006-01-24 17:05:22 +09002300 if (ap->cbl == ATA_CBL_NONE && ap->flags & ATA_FLAG_SATA)
2301 ap->cbl = ATA_CBL_SATA;
2302
2303 /* print link status */
2304 if (ap->cbl == ATA_CBL_SATA)
2305 sata_print_link_status(ap);
2306
Tejun Heo3a397462006-02-10 23:58:48 +09002307 /* re-enable interrupts */
2308 if (ap->ioaddr.ctl_addr) /* FIXME: hack. create a hook instead */
2309 ata_irq_on(ap);
Tejun Heoc2bd5802006-01-24 17:05:22 +09002310
2311 /* is double-select really necessary? */
2312 if (classes[0] != ATA_DEV_NONE)
2313 ap->ops->dev_select(ap, 1);
2314 if (classes[1] != ATA_DEV_NONE)
2315 ap->ops->dev_select(ap, 0);
2316
Tejun Heo3a397462006-02-10 23:58:48 +09002317 /* bail out if no device is present */
2318 if (classes[0] == ATA_DEV_NONE && classes[1] == ATA_DEV_NONE) {
2319 DPRINTK("EXIT, no device\n");
2320 return;
2321 }
2322
2323 /* set up device control */
2324 if (ap->ioaddr.ctl_addr) {
2325 if (ap->flags & ATA_FLAG_MMIO)
2326 writeb(ap->ctl, (void __iomem *) ap->ioaddr.ctl_addr);
2327 else
2328 outb(ap->ctl, ap->ioaddr.ctl_addr);
2329 }
Tejun Heoc2bd5802006-01-24 17:05:22 +09002330
2331 DPRINTK("EXIT\n");
2332}
2333
2334/**
2335 * ata_std_probe_reset - standard probe reset method
2336 * @ap: prot to perform probe-reset
2337 * @classes: resulting classes of attached devices
2338 *
2339 * The stock off-the-shelf ->probe_reset method.
2340 *
2341 * LOCKING:
2342 * Kernel thread context (may sleep)
2343 *
2344 * RETURNS:
2345 * 0 on success, -errno otherwise.
2346 */
2347int ata_std_probe_reset(struct ata_port *ap, unsigned int *classes)
2348{
2349 ata_reset_fn_t hardreset;
2350
2351 hardreset = NULL;
Tejun Heob911fc32006-02-02 18:20:00 +09002352 if (ap->flags & ATA_FLAG_SATA && ap->ops->scr_read)
Tejun Heoc2bd5802006-01-24 17:05:22 +09002353 hardreset = sata_std_hardreset;
2354
Tejun Heo8a19ac82006-02-02 18:20:00 +09002355 return ata_drive_probe_reset(ap, ata_std_probeinit,
Tejun Heo7944ea92006-02-02 18:20:00 +09002356 ata_std_softreset, hardreset,
Tejun Heoc2bd5802006-01-24 17:05:22 +09002357 ata_std_postreset, classes);
2358}
2359
Tejun Heoa62c0fc2006-01-24 17:05:22 +09002360static int do_probe_reset(struct ata_port *ap, ata_reset_fn_t reset,
2361 ata_postreset_fn_t postreset,
2362 unsigned int *classes)
2363{
2364 int i, rc;
2365
2366 for (i = 0; i < ATA_MAX_DEVICES; i++)
2367 classes[i] = ATA_DEV_UNKNOWN;
2368
2369 rc = reset(ap, 0, classes);
2370 if (rc)
2371 return rc;
2372
2373 /* If any class isn't ATA_DEV_UNKNOWN, consider classification
2374 * is complete and convert all ATA_DEV_UNKNOWN to
2375 * ATA_DEV_NONE.
2376 */
2377 for (i = 0; i < ATA_MAX_DEVICES; i++)
2378 if (classes[i] != ATA_DEV_UNKNOWN)
2379 break;
2380
2381 if (i < ATA_MAX_DEVICES)
2382 for (i = 0; i < ATA_MAX_DEVICES; i++)
2383 if (classes[i] == ATA_DEV_UNKNOWN)
2384 classes[i] = ATA_DEV_NONE;
2385
2386 if (postreset)
2387 postreset(ap, classes);
2388
2389 return classes[0] != ATA_DEV_UNKNOWN ? 0 : -ENODEV;
2390}
2391
2392/**
2393 * ata_drive_probe_reset - Perform probe reset with given methods
2394 * @ap: port to reset
Tejun Heo7944ea92006-02-02 18:20:00 +09002395 * @probeinit: probeinit method (can be NULL)
Tejun Heoa62c0fc2006-01-24 17:05:22 +09002396 * @softreset: softreset method (can be NULL)
2397 * @hardreset: hardreset method (can be NULL)
2398 * @postreset: postreset method (can be NULL)
2399 * @classes: resulting classes of attached devices
2400 *
2401 * Reset the specified port and classify attached devices using
2402 * given methods. This function prefers softreset but tries all
2403 * possible reset sequences to reset and classify devices. This
2404 * function is intended to be used for constructing ->probe_reset
2405 * callback by low level drivers.
2406 *
2407 * Reset methods should follow the following rules.
2408 *
2409 * - Return 0 on sucess, -errno on failure.
2410 * - If classification is supported, fill classes[] with
2411 * recognized class codes.
2412 * - If classification is not supported, leave classes[] alone.
2413 * - If verbose is non-zero, print error message on failure;
2414 * otherwise, shut up.
2415 *
2416 * LOCKING:
2417 * Kernel thread context (may sleep)
2418 *
2419 * RETURNS:
2420 * 0 on success, -EINVAL if no reset method is avaliable, -ENODEV
2421 * if classification fails, and any error code from reset
2422 * methods.
2423 */
Tejun Heo7944ea92006-02-02 18:20:00 +09002424int ata_drive_probe_reset(struct ata_port *ap, ata_probeinit_fn_t probeinit,
Tejun Heoa62c0fc2006-01-24 17:05:22 +09002425 ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
2426 ata_postreset_fn_t postreset, unsigned int *classes)
2427{
2428 int rc = -EINVAL;
2429
Tejun Heo7944ea92006-02-02 18:20:00 +09002430 if (probeinit)
2431 probeinit(ap);
2432
Tejun Heoa62c0fc2006-01-24 17:05:22 +09002433 if (softreset) {
2434 rc = do_probe_reset(ap, softreset, postreset, classes);
2435 if (rc == 0)
2436 return 0;
2437 }
2438
2439 if (!hardreset)
2440 return rc;
2441
2442 rc = do_probe_reset(ap, hardreset, postreset, classes);
2443 if (rc == 0 || rc != -ENODEV)
2444 return rc;
2445
2446 if (softreset)
2447 rc = do_probe_reset(ap, softreset, postreset, classes);
2448
2449 return rc;
2450}
2451
Tejun Heo623a3122006-03-05 17:55:58 +09002452/**
2453 * ata_dev_same_device - Determine whether new ID matches configured device
2454 * @ap: port on which the device to compare against resides
2455 * @dev: device to compare against
2456 * @new_class: class of the new device
2457 * @new_id: IDENTIFY page of the new device
2458 *
2459 * Compare @new_class and @new_id against @dev and determine
2460 * whether @dev is the device indicated by @new_class and
2461 * @new_id.
2462 *
2463 * LOCKING:
2464 * None.
2465 *
2466 * RETURNS:
2467 * 1 if @dev matches @new_class and @new_id, 0 otherwise.
2468 */
2469static int ata_dev_same_device(struct ata_port *ap, struct ata_device *dev,
2470 unsigned int new_class, const u16 *new_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002471{
Tejun Heo623a3122006-03-05 17:55:58 +09002472 const u16 *old_id = dev->id;
2473 unsigned char model[2][41], serial[2][21];
2474 u64 new_n_sectors;
2475
2476 if (dev->class != new_class) {
2477 printk(KERN_INFO
2478 "ata%u: dev %u class mismatch %d != %d\n",
2479 ap->id, dev->devno, dev->class, new_class);
2480 return 0;
2481 }
2482
2483 ata_id_c_string(old_id, model[0], ATA_ID_PROD_OFS, sizeof(model[0]));
2484 ata_id_c_string(new_id, model[1], ATA_ID_PROD_OFS, sizeof(model[1]));
2485 ata_id_c_string(old_id, serial[0], ATA_ID_SERNO_OFS, sizeof(serial[0]));
2486 ata_id_c_string(new_id, serial[1], ATA_ID_SERNO_OFS, sizeof(serial[1]));
2487 new_n_sectors = ata_id_n_sectors(new_id);
2488
2489 if (strcmp(model[0], model[1])) {
2490 printk(KERN_INFO
2491 "ata%u: dev %u model number mismatch '%s' != '%s'\n",
2492 ap->id, dev->devno, model[0], model[1]);
2493 return 0;
2494 }
2495
2496 if (strcmp(serial[0], serial[1])) {
2497 printk(KERN_INFO
2498 "ata%u: dev %u serial number mismatch '%s' != '%s'\n",
2499 ap->id, dev->devno, serial[0], serial[1]);
2500 return 0;
2501 }
2502
2503 if (dev->class == ATA_DEV_ATA && dev->n_sectors != new_n_sectors) {
2504 printk(KERN_INFO
2505 "ata%u: dev %u n_sectors mismatch %llu != %llu\n",
2506 ap->id, dev->devno, (unsigned long long)dev->n_sectors,
2507 (unsigned long long)new_n_sectors);
2508 return 0;
2509 }
2510
2511 return 1;
2512}
2513
2514/**
2515 * ata_dev_revalidate - Revalidate ATA device
2516 * @ap: port on which the device to revalidate resides
2517 * @dev: device to revalidate
2518 * @post_reset: is this revalidation after reset?
2519 *
2520 * Re-read IDENTIFY page and make sure @dev is still attached to
2521 * the port.
2522 *
2523 * LOCKING:
2524 * Kernel thread context (may sleep)
2525 *
2526 * RETURNS:
2527 * 0 on success, negative errno otherwise
2528 */
2529int ata_dev_revalidate(struct ata_port *ap, struct ata_device *dev,
2530 int post_reset)
2531{
2532 unsigned int class;
2533 u16 *id;
2534 int rc;
2535
2536 if (!ata_dev_present(dev))
2537 return -ENODEV;
2538
2539 class = dev->class;
2540 id = NULL;
2541
2542 /* allocate & read ID data */
2543 rc = ata_dev_read_id(ap, dev, &class, post_reset, &id);
2544 if (rc)
2545 goto fail;
2546
2547 /* is the device still there? */
2548 if (!ata_dev_same_device(ap, dev, class, id)) {
2549 rc = -ENODEV;
2550 goto fail;
2551 }
2552
2553 kfree(dev->id);
2554 dev->id = id;
2555
2556 /* configure device according to the new ID */
2557 return ata_dev_configure(ap, dev, 0);
2558
2559 fail:
2560 printk(KERN_ERR "ata%u: dev %u revalidation failed (errno=%d)\n",
2561 ap->id, dev->devno, rc);
2562 kfree(id);
2563 return rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002564}
2565
Arjan van de Ven98ac62d2005-11-28 10:06:23 +01002566static const char * const ata_dma_blacklist [] = {
Alan Coxf4b15fe2006-03-22 15:54:04 +00002567 "WDC AC11000H", NULL,
2568 "WDC AC22100H", NULL,
2569 "WDC AC32500H", NULL,
2570 "WDC AC33100H", NULL,
2571 "WDC AC31600H", NULL,
2572 "WDC AC32100H", "24.09P07",
2573 "WDC AC23200L", "21.10N21",
2574 "Compaq CRD-8241B", NULL,
2575 "CRD-8400B", NULL,
2576 "CRD-8480B", NULL,
2577 "CRD-8482B", NULL,
2578 "CRD-84", NULL,
2579 "SanDisk SDP3B", NULL,
2580 "SanDisk SDP3B-64", NULL,
2581 "SANYO CD-ROM CRD", NULL,
2582 "HITACHI CDR-8", NULL,
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05002583 "HITACHI CDR-8335", NULL,
Alan Coxf4b15fe2006-03-22 15:54:04 +00002584 "HITACHI CDR-8435", NULL,
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05002585 "Toshiba CD-ROM XM-6202B", NULL,
2586 "TOSHIBA CD-ROM XM-1702BC", NULL,
2587 "CD-532E-A", NULL,
2588 "E-IDE CD-ROM CR-840", NULL,
2589 "CD-ROM Drive/F5A", NULL,
2590 "WPI CDD-820", NULL,
Alan Coxf4b15fe2006-03-22 15:54:04 +00002591 "SAMSUNG CD-ROM SC-148C", NULL,
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05002592 "SAMSUNG CD-ROM SC", NULL,
Alan Coxf4b15fe2006-03-22 15:54:04 +00002593 "SanDisk SDP3B-64", NULL,
2594 "ATAPI CD-ROM DRIVE 40X MAXIMUM",NULL,
2595 "_NEC DV5800A", NULL,
2596 "SAMSUNG CD-ROM SN-124", "N001"
Linus Torvalds1da177e2005-04-16 15:20:36 -07002597};
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05002598
Alan Coxf4b15fe2006-03-22 15:54:04 +00002599static int ata_strim(char *s, size_t len)
2600{
2601 len = strnlen(s, len);
2602
2603 /* ATAPI specifies that empty space is blank-filled; remove blanks */
2604 while ((len > 0) && (s[len - 1] == ' ')) {
2605 len--;
2606 s[len] = 0;
2607 }
2608 return len;
2609}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002610
Jeff Garzik057ace52005-10-22 14:27:05 -04002611static int ata_dma_blacklisted(const struct ata_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002612{
Alan Coxf4b15fe2006-03-22 15:54:04 +00002613 unsigned char model_num[40];
2614 unsigned char model_rev[16];
2615 unsigned int nlen, rlen;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002616 int i;
2617
Alan Coxf4b15fe2006-03-22 15:54:04 +00002618 ata_id_string(dev->id, model_num, ATA_ID_PROD_OFS,
2619 sizeof(model_num));
2620 ata_id_string(dev->id, model_rev, ATA_ID_FW_REV_OFS,
2621 sizeof(model_rev));
2622 nlen = ata_strim(model_num, sizeof(model_num));
2623 rlen = ata_strim(model_rev, sizeof(model_rev));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002624
Alan Coxf4b15fe2006-03-22 15:54:04 +00002625 for (i = 0; i < ARRAY_SIZE(ata_dma_blacklist); i += 2) {
2626 if (!strncmp(ata_dma_blacklist[i], model_num, nlen)) {
2627 if (ata_dma_blacklist[i+1] == NULL)
2628 return 1;
2629 if (!strncmp(ata_dma_blacklist[i], model_rev, rlen))
2630 return 1;
2631 }
2632 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002633 return 0;
2634}
2635
Linus Torvalds1da177e2005-04-16 15:20:36 -07002636/**
Tejun Heoa6d5a512006-03-06 04:31:57 +09002637 * ata_dev_xfermask - Compute supported xfermask of the given device
2638 * @ap: Port on which the device to compute xfermask for resides
2639 * @dev: Device to compute xfermask for
Linus Torvalds1da177e2005-04-16 15:20:36 -07002640 *
Tejun Heoacf356b2006-03-24 14:07:50 +09002641 * Compute supported xfermask of @dev and store it in
2642 * dev->*_mask. This function is responsible for applying all
2643 * known limits including host controller limits, device
2644 * blacklist, etc...
Jeff Garzik0cba6322005-05-30 19:49:12 -04002645 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002646 * LOCKING:
Tejun Heoa6d5a512006-03-06 04:31:57 +09002647 * None.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002648 */
Tejun Heoacf356b2006-03-24 14:07:50 +09002649static void ata_dev_xfermask(struct ata_port *ap, struct ata_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002650{
Tejun Heoa6d5a512006-03-06 04:31:57 +09002651 unsigned long xfer_mask;
2652 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002653
Tejun Heoa6d5a512006-03-06 04:31:57 +09002654 xfer_mask = ata_pack_xfermask(ap->pio_mask, ap->mwdma_mask,
2655 ap->udma_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002656
Tejun Heoa6d5a512006-03-06 04:31:57 +09002657 /* use port-wide xfermask for now */
2658 for (i = 0; i < ATA_MAX_DEVICES; i++) {
2659 struct ata_device *d = &ap->device[i];
2660 if (!ata_dev_present(d))
2661 continue;
Tejun Heoacf356b2006-03-24 14:07:50 +09002662 xfer_mask &= ata_pack_xfermask(d->pio_mask, d->mwdma_mask,
2663 d->udma_mask);
Tejun Heoa6d5a512006-03-06 04:31:57 +09002664 xfer_mask &= ata_id_xfermask(d->id);
2665 if (ata_dma_blacklisted(d))
2666 xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002667 }
2668
Tejun Heoa6d5a512006-03-06 04:31:57 +09002669 if (ata_dma_blacklisted(dev))
2670 printk(KERN_WARNING "ata%u: dev %u is on DMA blacklist, "
2671 "disabling DMA\n", ap->id, dev->devno);
2672
Tejun Heoacf356b2006-03-24 14:07:50 +09002673 ata_unpack_xfermask(xfer_mask, &dev->pio_mask, &dev->mwdma_mask,
2674 &dev->udma_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002675}
2676
2677/**
2678 * ata_dev_set_xfermode - Issue SET FEATURES - XFER MODE command
2679 * @ap: Port associated with device @dev
2680 * @dev: Device to which command will be sent
2681 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04002682 * Issue SET FEATURES - XFER MODE command to device @dev
2683 * on port @ap.
2684 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002685 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04002686 * PCI/etc. bus probe sem.
Tejun Heo83206a22006-03-24 15:25:31 +09002687 *
2688 * RETURNS:
2689 * 0 on success, AC_ERR_* mask otherwise.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002690 */
2691
Tejun Heo83206a22006-03-24 15:25:31 +09002692static unsigned int ata_dev_set_xfermode(struct ata_port *ap,
2693 struct ata_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002694{
Tejun Heoa0123702005-12-13 14:49:31 +09002695 struct ata_taskfile tf;
Tejun Heo83206a22006-03-24 15:25:31 +09002696 unsigned int err_mask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002697
2698 /* set up set-features taskfile */
2699 DPRINTK("set features - xfer mode\n");
2700
Tejun Heoa0123702005-12-13 14:49:31 +09002701 ata_tf_init(ap, &tf, dev->devno);
2702 tf.command = ATA_CMD_SET_FEATURES;
2703 tf.feature = SETFEATURES_XFER;
2704 tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
2705 tf.protocol = ATA_PROT_NODATA;
2706 tf.nsect = dev->xfer_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002707
Tejun Heo83206a22006-03-24 15:25:31 +09002708 err_mask = ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002709
Tejun Heo83206a22006-03-24 15:25:31 +09002710 DPRINTK("EXIT, err_mask=%x\n", err_mask);
2711 return err_mask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002712}
2713
2714/**
Albert Lee8bf62ece2005-05-12 15:29:42 -04002715 * ata_dev_init_params - Issue INIT DEV PARAMS command
2716 * @ap: Port associated with device @dev
2717 * @dev: Device to which command will be sent
2718 *
2719 * LOCKING:
Tejun Heo6aff8f12006-02-15 18:24:09 +09002720 * Kernel thread context (may sleep)
2721 *
2722 * RETURNS:
2723 * 0 on success, AC_ERR_* mask otherwise.
Albert Lee8bf62ece2005-05-12 15:29:42 -04002724 */
2725
Tejun Heo6aff8f12006-02-15 18:24:09 +09002726static unsigned int ata_dev_init_params(struct ata_port *ap,
2727 struct ata_device *dev)
Albert Lee8bf62ece2005-05-12 15:29:42 -04002728{
Tejun Heoa0123702005-12-13 14:49:31 +09002729 struct ata_taskfile tf;
Tejun Heo6aff8f12006-02-15 18:24:09 +09002730 unsigned int err_mask;
Albert Lee8bf62ece2005-05-12 15:29:42 -04002731 u16 sectors = dev->id[6];
2732 u16 heads = dev->id[3];
2733
2734 /* Number of sectors per track 1-255. Number of heads 1-16 */
2735 if (sectors < 1 || sectors > 255 || heads < 1 || heads > 16)
Tejun Heo6aff8f12006-02-15 18:24:09 +09002736 return 0;
Albert Lee8bf62ece2005-05-12 15:29:42 -04002737
2738 /* set up init dev params taskfile */
2739 DPRINTK("init dev params \n");
2740
Tejun Heoa0123702005-12-13 14:49:31 +09002741 ata_tf_init(ap, &tf, dev->devno);
2742 tf.command = ATA_CMD_INIT_DEV_PARAMS;
2743 tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
2744 tf.protocol = ATA_PROT_NODATA;
2745 tf.nsect = sectors;
2746 tf.device |= (heads - 1) & 0x0f; /* max head = num. of heads - 1 */
Albert Lee8bf62ece2005-05-12 15:29:42 -04002747
Tejun Heo6aff8f12006-02-15 18:24:09 +09002748 err_mask = ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0);
Albert Lee8bf62ece2005-05-12 15:29:42 -04002749
Tejun Heo6aff8f12006-02-15 18:24:09 +09002750 DPRINTK("EXIT, err_mask=%x\n", err_mask);
2751 return err_mask;
Albert Lee8bf62ece2005-05-12 15:29:42 -04002752}
2753
2754/**
Jeff Garzik0cba6322005-05-30 19:49:12 -04002755 * ata_sg_clean - Unmap DMA memory associated with command
2756 * @qc: Command containing DMA memory to be released
2757 *
2758 * Unmap all mapped DMA memory associated with this command.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002759 *
2760 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04002761 * spin_lock_irqsave(host_set lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002762 */
2763
2764static void ata_sg_clean(struct ata_queued_cmd *qc)
2765{
2766 struct ata_port *ap = qc->ap;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002767 struct scatterlist *sg = qc->__sg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002768 int dir = qc->dma_dir;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002769 void *pad_buf = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002770
Tejun Heoa46314742006-02-11 19:11:13 +09002771 WARN_ON(!(qc->flags & ATA_QCFLAG_DMAMAP));
2772 WARN_ON(sg == NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002773
2774 if (qc->flags & ATA_QCFLAG_SINGLE)
Jeff Garzikf1318832006-02-20 16:55:56 -05002775 WARN_ON(qc->n_elem > 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002776
Jeff Garzik2c13b7c2005-11-14 14:14:16 -05002777 VPRINTK("unmapping %u sg elements\n", qc->n_elem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002778
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002779 /* if we padded the buffer out to 32-bit bound, and data
2780 * xfer direction is from-device, we must copy from the
2781 * pad buffer back into the supplied buffer
2782 */
2783 if (qc->pad_len && !(qc->tf.flags & ATA_TFLAG_WRITE))
2784 pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ);
2785
2786 if (qc->flags & ATA_QCFLAG_SG) {
Jeff Garzike1410f22005-11-14 14:06:26 -05002787 if (qc->n_elem)
Brian King2f1f6102006-03-23 17:30:15 -06002788 dma_unmap_sg(ap->dev, sg, qc->n_elem, dir);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002789 /* restore last sg */
2790 sg[qc->orig_n_elem - 1].length += qc->pad_len;
2791 if (pad_buf) {
2792 struct scatterlist *psg = &qc->pad_sgent;
2793 void *addr = kmap_atomic(psg->page, KM_IRQ0);
2794 memcpy(addr + psg->offset, pad_buf, qc->pad_len);
Mark Lorddfa15982005-12-12 23:19:28 -05002795 kunmap_atomic(addr, KM_IRQ0);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002796 }
2797 } else {
Tejun Heo2e242fa2006-02-20 23:48:38 +09002798 if (qc->n_elem)
Brian King2f1f6102006-03-23 17:30:15 -06002799 dma_unmap_single(ap->dev,
Jeff Garzike1410f22005-11-14 14:06:26 -05002800 sg_dma_address(&sg[0]), sg_dma_len(&sg[0]),
2801 dir);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002802 /* restore sg */
2803 sg->length += qc->pad_len;
2804 if (pad_buf)
2805 memcpy(qc->buf_virt + sg->length - qc->pad_len,
2806 pad_buf, qc->pad_len);
2807 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002808
2809 qc->flags &= ~ATA_QCFLAG_DMAMAP;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002810 qc->__sg = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002811}
2812
2813/**
2814 * ata_fill_sg - Fill PCI IDE PRD table
2815 * @qc: Metadata associated with taskfile to be transferred
2816 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04002817 * Fill PCI IDE PRD (scatter-gather) table with segments
2818 * associated with the current disk command.
2819 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002820 * LOCKING:
Jeff Garzik780a87f2005-05-30 15:41:05 -04002821 * spin_lock_irqsave(host_set lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002822 *
2823 */
2824static void ata_fill_sg(struct ata_queued_cmd *qc)
2825{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002826 struct ata_port *ap = qc->ap;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002827 struct scatterlist *sg;
2828 unsigned int idx;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002829
Tejun Heoa46314742006-02-11 19:11:13 +09002830 WARN_ON(qc->__sg == NULL);
Jeff Garzikf1318832006-02-20 16:55:56 -05002831 WARN_ON(qc->n_elem == 0 && qc->pad_len == 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002832
2833 idx = 0;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002834 ata_for_each_sg(sg, qc) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002835 u32 addr, offset;
2836 u32 sg_len, len;
2837
2838 /* determine if physical DMA addr spans 64K boundary.
2839 * Note h/w doesn't support 64-bit, so we unconditionally
2840 * truncate dma_addr_t to u32.
2841 */
2842 addr = (u32) sg_dma_address(sg);
2843 sg_len = sg_dma_len(sg);
2844
2845 while (sg_len) {
2846 offset = addr & 0xffff;
2847 len = sg_len;
2848 if ((offset + sg_len) > 0x10000)
2849 len = 0x10000 - offset;
2850
2851 ap->prd[idx].addr = cpu_to_le32(addr);
2852 ap->prd[idx].flags_len = cpu_to_le32(len & 0xffff);
2853 VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len);
2854
2855 idx++;
2856 sg_len -= len;
2857 addr += len;
2858 }
2859 }
2860
2861 if (idx)
2862 ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
2863}
2864/**
2865 * ata_check_atapi_dma - Check whether ATAPI DMA can be supported
2866 * @qc: Metadata associated with taskfile to check
2867 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04002868 * Allow low-level driver to filter ATA PACKET commands, returning
2869 * a status indicating whether or not it is OK to use DMA for the
2870 * supplied PACKET command.
2871 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002872 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04002873 * spin_lock_irqsave(host_set lock)
2874 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002875 * RETURNS: 0 when ATAPI DMA can be used
2876 * nonzero otherwise
2877 */
2878int ata_check_atapi_dma(struct ata_queued_cmd *qc)
2879{
2880 struct ata_port *ap = qc->ap;
2881 int rc = 0; /* Assume ATAPI DMA is OK by default */
2882
2883 if (ap->ops->check_atapi_dma)
2884 rc = ap->ops->check_atapi_dma(qc);
2885
2886 return rc;
2887}
2888/**
2889 * ata_qc_prep - Prepare taskfile for submission
2890 * @qc: Metadata associated with taskfile to be prepared
2891 *
Jeff Garzik780a87f2005-05-30 15:41:05 -04002892 * Prepare ATA taskfile for submission.
2893 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002894 * LOCKING:
2895 * spin_lock_irqsave(host_set lock)
2896 */
2897void ata_qc_prep(struct ata_queued_cmd *qc)
2898{
2899 if (!(qc->flags & ATA_QCFLAG_DMAMAP))
2900 return;
2901
2902 ata_fill_sg(qc);
2903}
2904
Brian Kinge46834c2006-03-17 17:04:03 -06002905void ata_noop_qc_prep(struct ata_queued_cmd *qc) { }
2906
Jeff Garzik0cba6322005-05-30 19:49:12 -04002907/**
2908 * ata_sg_init_one - Associate command with memory buffer
2909 * @qc: Command to be associated
2910 * @buf: Memory buffer
2911 * @buflen: Length of memory buffer, in bytes.
2912 *
2913 * Initialize the data-related elements of queued_cmd @qc
2914 * to point to a single memory buffer, @buf of byte length @buflen.
2915 *
2916 * LOCKING:
2917 * spin_lock_irqsave(host_set lock)
2918 */
2919
Linus Torvalds1da177e2005-04-16 15:20:36 -07002920void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen)
2921{
2922 struct scatterlist *sg;
2923
2924 qc->flags |= ATA_QCFLAG_SINGLE;
2925
2926 memset(&qc->sgent, 0, sizeof(qc->sgent));
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002927 qc->__sg = &qc->sgent;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002928 qc->n_elem = 1;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002929 qc->orig_n_elem = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002930 qc->buf_virt = buf;
2931
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002932 sg = qc->__sg;
Jeff Garzikf0612bb2005-10-30 01:58:18 -05002933 sg_init_one(sg, buf, buflen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002934}
2935
Jeff Garzik0cba6322005-05-30 19:49:12 -04002936/**
2937 * ata_sg_init - Associate command with scatter-gather table.
2938 * @qc: Command to be associated
2939 * @sg: Scatter-gather table.
2940 * @n_elem: Number of elements in s/g table.
2941 *
2942 * Initialize the data-related elements of queued_cmd @qc
2943 * to point to a scatter-gather table @sg, containing @n_elem
2944 * elements.
2945 *
2946 * LOCKING:
2947 * spin_lock_irqsave(host_set lock)
2948 */
2949
Linus Torvalds1da177e2005-04-16 15:20:36 -07002950void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
2951 unsigned int n_elem)
2952{
2953 qc->flags |= ATA_QCFLAG_SG;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002954 qc->__sg = sg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002955 qc->n_elem = n_elem;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002956 qc->orig_n_elem = n_elem;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002957}
2958
2959/**
Jeff Garzik0cba6322005-05-30 19:49:12 -04002960 * ata_sg_setup_one - DMA-map the memory buffer associated with a command.
2961 * @qc: Command with memory buffer to be mapped.
2962 *
2963 * DMA-map the memory buffer associated with queued_cmd @qc.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002964 *
2965 * LOCKING:
2966 * spin_lock_irqsave(host_set lock)
2967 *
2968 * RETURNS:
Jeff Garzik0cba6322005-05-30 19:49:12 -04002969 * Zero on success, negative on error.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002970 */
2971
2972static int ata_sg_setup_one(struct ata_queued_cmd *qc)
2973{
2974 struct ata_port *ap = qc->ap;
2975 int dir = qc->dma_dir;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002976 struct scatterlist *sg = qc->__sg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002977 dma_addr_t dma_address;
Tejun Heo2e242fa2006-02-20 23:48:38 +09002978 int trim_sg = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002979
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002980 /* we must lengthen transfers to end on a 32-bit boundary */
2981 qc->pad_len = sg->length & 3;
2982 if (qc->pad_len) {
2983 void *pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ);
2984 struct scatterlist *psg = &qc->pad_sgent;
2985
Tejun Heoa46314742006-02-11 19:11:13 +09002986 WARN_ON(qc->dev->class != ATA_DEV_ATAPI);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04002987
2988 memset(pad_buf, 0, ATA_DMA_PAD_SZ);
2989
2990 if (qc->tf.flags & ATA_TFLAG_WRITE)
2991 memcpy(pad_buf, qc->buf_virt + sg->length - qc->pad_len,
2992 qc->pad_len);
2993
2994 sg_dma_address(psg) = ap->pad_dma + (qc->tag * ATA_DMA_PAD_SZ);
2995 sg_dma_len(psg) = ATA_DMA_PAD_SZ;
2996 /* trim sg */
2997 sg->length -= qc->pad_len;
Tejun Heo2e242fa2006-02-20 23:48:38 +09002998 if (sg->length == 0)
2999 trim_sg = 1;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003000
3001 DPRINTK("padding done, sg->length=%u pad_len=%u\n",
3002 sg->length, qc->pad_len);
3003 }
3004
Tejun Heo2e242fa2006-02-20 23:48:38 +09003005 if (trim_sg) {
3006 qc->n_elem--;
Jeff Garzike1410f22005-11-14 14:06:26 -05003007 goto skip_map;
3008 }
3009
Brian King2f1f6102006-03-23 17:30:15 -06003010 dma_address = dma_map_single(ap->dev, qc->buf_virt,
Albert Lee32529e02005-05-26 03:49:42 -04003011 sg->length, dir);
Tejun Heo537a95d2005-11-05 14:29:01 -05003012 if (dma_mapping_error(dma_address)) {
3013 /* restore sg */
3014 sg->length += qc->pad_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003015 return -1;
Tejun Heo537a95d2005-11-05 14:29:01 -05003016 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003017
3018 sg_dma_address(sg) = dma_address;
Albert Lee32529e02005-05-26 03:49:42 -04003019 sg_dma_len(sg) = sg->length;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003020
Tejun Heo2e242fa2006-02-20 23:48:38 +09003021skip_map:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003022 DPRINTK("mapped buffer of %d bytes for %s\n", sg_dma_len(sg),
3023 qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
3024
3025 return 0;
3026}
3027
3028/**
Jeff Garzik0cba6322005-05-30 19:49:12 -04003029 * ata_sg_setup - DMA-map the scatter-gather table associated with a command.
3030 * @qc: Command with scatter-gather table to be mapped.
3031 *
3032 * DMA-map the scatter-gather table associated with queued_cmd @qc.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003033 *
3034 * LOCKING:
3035 * spin_lock_irqsave(host_set lock)
3036 *
3037 * RETURNS:
Jeff Garzik0cba6322005-05-30 19:49:12 -04003038 * Zero on success, negative on error.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003039 *
3040 */
3041
3042static int ata_sg_setup(struct ata_queued_cmd *qc)
3043{
3044 struct ata_port *ap = qc->ap;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003045 struct scatterlist *sg = qc->__sg;
3046 struct scatterlist *lsg = &sg[qc->n_elem - 1];
Jeff Garzike1410f22005-11-14 14:06:26 -05003047 int n_elem, pre_n_elem, dir, trim_sg = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003048
3049 VPRINTK("ENTER, ata%u\n", ap->id);
Tejun Heoa46314742006-02-11 19:11:13 +09003050 WARN_ON(!(qc->flags & ATA_QCFLAG_SG));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003051
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003052 /* we must lengthen transfers to end on a 32-bit boundary */
3053 qc->pad_len = lsg->length & 3;
3054 if (qc->pad_len) {
3055 void *pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ);
3056 struct scatterlist *psg = &qc->pad_sgent;
3057 unsigned int offset;
3058
Tejun Heoa46314742006-02-11 19:11:13 +09003059 WARN_ON(qc->dev->class != ATA_DEV_ATAPI);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003060
3061 memset(pad_buf, 0, ATA_DMA_PAD_SZ);
3062
3063 /*
3064 * psg->page/offset are used to copy to-be-written
3065 * data in this function or read data in ata_sg_clean.
3066 */
3067 offset = lsg->offset + lsg->length - qc->pad_len;
3068 psg->page = nth_page(lsg->page, offset >> PAGE_SHIFT);
3069 psg->offset = offset_in_page(offset);
3070
3071 if (qc->tf.flags & ATA_TFLAG_WRITE) {
3072 void *addr = kmap_atomic(psg->page, KM_IRQ0);
3073 memcpy(pad_buf, addr + psg->offset, qc->pad_len);
Mark Lorddfa15982005-12-12 23:19:28 -05003074 kunmap_atomic(addr, KM_IRQ0);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003075 }
3076
3077 sg_dma_address(psg) = ap->pad_dma + (qc->tag * ATA_DMA_PAD_SZ);
3078 sg_dma_len(psg) = ATA_DMA_PAD_SZ;
3079 /* trim last sg */
3080 lsg->length -= qc->pad_len;
Jeff Garzike1410f22005-11-14 14:06:26 -05003081 if (lsg->length == 0)
3082 trim_sg = 1;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003083
3084 DPRINTK("padding done, sg[%d].length=%u pad_len=%u\n",
3085 qc->n_elem - 1, lsg->length, qc->pad_len);
3086 }
3087
Jeff Garzike1410f22005-11-14 14:06:26 -05003088 pre_n_elem = qc->n_elem;
3089 if (trim_sg && pre_n_elem)
3090 pre_n_elem--;
3091
3092 if (!pre_n_elem) {
3093 n_elem = 0;
3094 goto skip_map;
3095 }
3096
Linus Torvalds1da177e2005-04-16 15:20:36 -07003097 dir = qc->dma_dir;
Brian King2f1f6102006-03-23 17:30:15 -06003098 n_elem = dma_map_sg(ap->dev, sg, pre_n_elem, dir);
Tejun Heo537a95d2005-11-05 14:29:01 -05003099 if (n_elem < 1) {
3100 /* restore last sg */
3101 lsg->length += qc->pad_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003102 return -1;
Tejun Heo537a95d2005-11-05 14:29:01 -05003103 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003104
3105 DPRINTK("%d sg elements mapped\n", n_elem);
3106
Jeff Garzike1410f22005-11-14 14:06:26 -05003107skip_map:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003108 qc->n_elem = n_elem;
3109
3110 return 0;
3111}
3112
3113/**
Tejun Heo40e8c822005-08-22 17:12:45 +09003114 * ata_poll_qc_complete - turn irq back on and finish qc
3115 * @qc: Command to complete
Randy Dunlap8e8b77d2005-11-01 21:29:27 -08003116 * @err_mask: ATA status register content
Tejun Heo40e8c822005-08-22 17:12:45 +09003117 *
3118 * LOCKING:
3119 * None. (grabs host lock)
3120 */
3121
Albert Leea22e2eb2005-12-05 15:38:02 +08003122void ata_poll_qc_complete(struct ata_queued_cmd *qc)
Tejun Heo40e8c822005-08-22 17:12:45 +09003123{
3124 struct ata_port *ap = qc->ap;
Jeff Garzikb8f61532005-08-25 22:01:20 -04003125 unsigned long flags;
Tejun Heo40e8c822005-08-22 17:12:45 +09003126
Jeff Garzikb8f61532005-08-25 22:01:20 -04003127 spin_lock_irqsave(&ap->host_set->lock, flags);
Tejun Heo40e8c822005-08-22 17:12:45 +09003128 ata_irq_on(ap);
Albert Leea22e2eb2005-12-05 15:38:02 +08003129 ata_qc_complete(qc);
Jeff Garzikb8f61532005-08-25 22:01:20 -04003130 spin_unlock_irqrestore(&ap->host_set->lock, flags);
Tejun Heo40e8c822005-08-22 17:12:45 +09003131}
3132
3133/**
Randy Dunlapc893a3a2006-01-28 13:15:32 -05003134 * ata_pio_poll - poll using PIO, depending on current state
Randy Dunlap6f0ef4f2005-10-25 01:44:30 -04003135 * @ap: the target ata_port
Linus Torvalds1da177e2005-04-16 15:20:36 -07003136 *
3137 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04003138 * None. (executing in kernel thread context)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003139 *
3140 * RETURNS:
Randy Dunlap6f0ef4f2005-10-25 01:44:30 -04003141 * timeout value to use
Linus Torvalds1da177e2005-04-16 15:20:36 -07003142 */
3143
3144static unsigned long ata_pio_poll(struct ata_port *ap)
3145{
Albert Leec14b8332005-12-05 15:36:08 +08003146 struct ata_queued_cmd *qc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003147 u8 status;
Albert Lee14be71f2005-09-27 17:36:35 +08003148 unsigned int poll_state = HSM_ST_UNKNOWN;
3149 unsigned int reg_state = HSM_ST_UNKNOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003150
Albert Leec14b8332005-12-05 15:36:08 +08003151 qc = ata_qc_from_tag(ap, ap->active_tag);
Tejun Heoa46314742006-02-11 19:11:13 +09003152 WARN_ON(qc == NULL);
Albert Leec14b8332005-12-05 15:36:08 +08003153
Albert Lee14be71f2005-09-27 17:36:35 +08003154 switch (ap->hsm_task_state) {
3155 case HSM_ST:
3156 case HSM_ST_POLL:
3157 poll_state = HSM_ST_POLL;
3158 reg_state = HSM_ST;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003159 break;
Albert Lee14be71f2005-09-27 17:36:35 +08003160 case HSM_ST_LAST:
3161 case HSM_ST_LAST_POLL:
3162 poll_state = HSM_ST_LAST_POLL;
3163 reg_state = HSM_ST_LAST;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003164 break;
3165 default:
3166 BUG();
3167 break;
3168 }
3169
3170 status = ata_chk_status(ap);
3171 if (status & ATA_BUSY) {
3172 if (time_after(jiffies, ap->pio_task_timeout)) {
Tejun Heo11a56d22006-01-23 13:09:36 +09003173 qc->err_mask |= AC_ERR_TIMEOUT;
Albert Lee7c398332005-11-09 13:03:30 +08003174 ap->hsm_task_state = HSM_ST_TMOUT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003175 return 0;
3176 }
Albert Lee14be71f2005-09-27 17:36:35 +08003177 ap->hsm_task_state = poll_state;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003178 return ATA_SHORT_PAUSE;
3179 }
3180
Albert Lee14be71f2005-09-27 17:36:35 +08003181 ap->hsm_task_state = reg_state;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003182 return 0;
3183}
3184
3185/**
Randy Dunlap6f0ef4f2005-10-25 01:44:30 -04003186 * ata_pio_complete - check if drive is busy or idle
3187 * @ap: the target ata_port
Linus Torvalds1da177e2005-04-16 15:20:36 -07003188 *
3189 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04003190 * None. (executing in kernel thread context)
Jeff Garzik7fb6ec22005-09-16 06:01:48 -04003191 *
3192 * RETURNS:
Albert Leefbcdd802005-11-01 19:30:05 +08003193 * Zero if qc completed.
3194 * Non-zero if has next.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003195 */
3196
Jeff Garzik7fb6ec22005-09-16 06:01:48 -04003197static int ata_pio_complete (struct ata_port *ap)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003198{
3199 struct ata_queued_cmd *qc;
3200 u8 drv_stat;
3201
3202 /*
Alan Cox31433ea2005-08-26 15:56:47 +01003203 * This is purely heuristic. This is a fast path. Sometimes when
3204 * we enter, BSY will be cleared in a chk-status or two. If not,
3205 * the drive is probably seeking or something. Snooze for a couple
3206 * msecs, then chk-status again. If still busy, fall back to
Albert Lee07f6f7d2005-11-01 19:33:20 +08003207 * HSM_ST_LAST_POLL state.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003208 */
Albert Leefe79e682005-12-06 11:34:59 +08003209 drv_stat = ata_busy_wait(ap, ATA_BUSY, 10);
3210 if (drv_stat & ATA_BUSY) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003211 msleep(2);
Albert Leefe79e682005-12-06 11:34:59 +08003212 drv_stat = ata_busy_wait(ap, ATA_BUSY, 10);
3213 if (drv_stat & ATA_BUSY) {
Albert Lee14be71f2005-09-27 17:36:35 +08003214 ap->hsm_task_state = HSM_ST_LAST_POLL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003215 ap->pio_task_timeout = jiffies + ATA_TMOUT_PIO;
Albert Leefbcdd802005-11-01 19:30:05 +08003216 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003217 }
3218 }
3219
Albert Leec14b8332005-12-05 15:36:08 +08003220 qc = ata_qc_from_tag(ap, ap->active_tag);
Tejun Heoa46314742006-02-11 19:11:13 +09003221 WARN_ON(qc == NULL);
Albert Leec14b8332005-12-05 15:36:08 +08003222
Linus Torvalds1da177e2005-04-16 15:20:36 -07003223 drv_stat = ata_wait_idle(ap);
3224 if (!ata_ok(drv_stat)) {
Albert Lee1c848982005-12-05 15:40:15 +08003225 qc->err_mask |= __ac_err_mask(drv_stat);
Albert Lee14be71f2005-09-27 17:36:35 +08003226 ap->hsm_task_state = HSM_ST_ERR;
Albert Leefbcdd802005-11-01 19:30:05 +08003227 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003228 }
3229
Albert Lee14be71f2005-09-27 17:36:35 +08003230 ap->hsm_task_state = HSM_ST_IDLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003231
Tejun Heoa46314742006-02-11 19:11:13 +09003232 WARN_ON(qc->err_mask);
Albert Leea22e2eb2005-12-05 15:38:02 +08003233 ata_poll_qc_complete(qc);
Jeff Garzik7fb6ec22005-09-16 06:01:48 -04003234
3235 /* another command may start at this point */
3236
Albert Leefbcdd802005-11-01 19:30:05 +08003237 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003238}
3239
Edward Falk0baab862005-06-02 18:17:13 -04003240
3241/**
Randy Dunlapc893a3a2006-01-28 13:15:32 -05003242 * swap_buf_le16 - swap halves of 16-bit words in place
Edward Falk0baab862005-06-02 18:17:13 -04003243 * @buf: Buffer to swap
3244 * @buf_words: Number of 16-bit words in buffer.
3245 *
3246 * Swap halves of 16-bit words if needed to convert from
3247 * little-endian byte order to native cpu byte order, or
3248 * vice-versa.
3249 *
3250 * LOCKING:
Randy Dunlap6f0ef4f2005-10-25 01:44:30 -04003251 * Inherited from caller.
Edward Falk0baab862005-06-02 18:17:13 -04003252 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003253void swap_buf_le16(u16 *buf, unsigned int buf_words)
3254{
3255#ifdef __BIG_ENDIAN
3256 unsigned int i;
3257
3258 for (i = 0; i < buf_words; i++)
3259 buf[i] = le16_to_cpu(buf[i]);
3260#endif /* __BIG_ENDIAN */
3261}
3262
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003263/**
3264 * ata_mmio_data_xfer - Transfer data by MMIO
3265 * @ap: port to read/write
3266 * @buf: data buffer
3267 * @buflen: buffer length
Jeff Garzik344baba2005-09-07 01:15:17 -04003268 * @write_data: read/write
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003269 *
3270 * Transfer data from/to the device data register by MMIO.
3271 *
3272 * LOCKING:
3273 * Inherited from caller.
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003274 */
3275
Linus Torvalds1da177e2005-04-16 15:20:36 -07003276static void ata_mmio_data_xfer(struct ata_port *ap, unsigned char *buf,
3277 unsigned int buflen, int write_data)
3278{
3279 unsigned int i;
3280 unsigned int words = buflen >> 1;
3281 u16 *buf16 = (u16 *) buf;
3282 void __iomem *mmio = (void __iomem *)ap->ioaddr.data_addr;
3283
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003284 /* Transfer multiple of 2 bytes */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003285 if (write_data) {
3286 for (i = 0; i < words; i++)
3287 writew(le16_to_cpu(buf16[i]), mmio);
3288 } else {
3289 for (i = 0; i < words; i++)
3290 buf16[i] = cpu_to_le16(readw(mmio));
3291 }
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003292
3293 /* Transfer trailing 1 byte, if any. */
3294 if (unlikely(buflen & 0x01)) {
3295 u16 align_buf[1] = { 0 };
3296 unsigned char *trailing_buf = buf + buflen - 1;
3297
3298 if (write_data) {
3299 memcpy(align_buf, trailing_buf, 1);
3300 writew(le16_to_cpu(align_buf[0]), mmio);
3301 } else {
3302 align_buf[0] = cpu_to_le16(readw(mmio));
3303 memcpy(trailing_buf, align_buf, 1);
3304 }
3305 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003306}
3307
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003308/**
3309 * ata_pio_data_xfer - Transfer data by PIO
3310 * @ap: port to read/write
3311 * @buf: data buffer
3312 * @buflen: buffer length
Jeff Garzik344baba2005-09-07 01:15:17 -04003313 * @write_data: read/write
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003314 *
3315 * Transfer data from/to the device data register by PIO.
3316 *
3317 * LOCKING:
3318 * Inherited from caller.
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003319 */
3320
Linus Torvalds1da177e2005-04-16 15:20:36 -07003321static void ata_pio_data_xfer(struct ata_port *ap, unsigned char *buf,
3322 unsigned int buflen, int write_data)
3323{
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003324 unsigned int words = buflen >> 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003325
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003326 /* Transfer multiple of 2 bytes */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003327 if (write_data)
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003328 outsw(ap->ioaddr.data_addr, buf, words);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003329 else
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003330 insw(ap->ioaddr.data_addr, buf, words);
3331
3332 /* Transfer trailing 1 byte, if any. */
3333 if (unlikely(buflen & 0x01)) {
3334 u16 align_buf[1] = { 0 };
3335 unsigned char *trailing_buf = buf + buflen - 1;
3336
3337 if (write_data) {
3338 memcpy(align_buf, trailing_buf, 1);
3339 outw(le16_to_cpu(align_buf[0]), ap->ioaddr.data_addr);
3340 } else {
3341 align_buf[0] = cpu_to_le16(inw(ap->ioaddr.data_addr));
3342 memcpy(trailing_buf, align_buf, 1);
3343 }
3344 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003345}
3346
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003347/**
3348 * ata_data_xfer - Transfer data from/to the data register.
3349 * @ap: port to read/write
3350 * @buf: data buffer
3351 * @buflen: buffer length
3352 * @do_write: read/write
3353 *
3354 * Transfer data from/to the device data register.
3355 *
3356 * LOCKING:
3357 * Inherited from caller.
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003358 */
3359
Linus Torvalds1da177e2005-04-16 15:20:36 -07003360static void ata_data_xfer(struct ata_port *ap, unsigned char *buf,
3361 unsigned int buflen, int do_write)
3362{
Alan Coxa1bd9e62006-01-17 20:53:50 +00003363 /* Make the crap hardware pay the costs not the good stuff */
3364 if (unlikely(ap->flags & ATA_FLAG_IRQ_MASK)) {
3365 unsigned long flags;
3366 local_irq_save(flags);
3367 if (ap->flags & ATA_FLAG_MMIO)
3368 ata_mmio_data_xfer(ap, buf, buflen, do_write);
3369 else
3370 ata_pio_data_xfer(ap, buf, buflen, do_write);
3371 local_irq_restore(flags);
3372 } else {
3373 if (ap->flags & ATA_FLAG_MMIO)
3374 ata_mmio_data_xfer(ap, buf, buflen, do_write);
3375 else
3376 ata_pio_data_xfer(ap, buf, buflen, do_write);
3377 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003378}
3379
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003380/**
3381 * ata_pio_sector - Transfer ATA_SECT_SIZE (512 bytes) of data.
3382 * @qc: Command on going
3383 *
3384 * Transfer ATA_SECT_SIZE of data from/to the ATA device.
3385 *
3386 * LOCKING:
3387 * Inherited from caller.
3388 */
3389
Linus Torvalds1da177e2005-04-16 15:20:36 -07003390static void ata_pio_sector(struct ata_queued_cmd *qc)
3391{
3392 int do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003393 struct scatterlist *sg = qc->__sg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003394 struct ata_port *ap = qc->ap;
3395 struct page *page;
3396 unsigned int offset;
3397 unsigned char *buf;
3398
3399 if (qc->cursect == (qc->nsect - 1))
Albert Lee14be71f2005-09-27 17:36:35 +08003400 ap->hsm_task_state = HSM_ST_LAST;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003401
3402 page = sg[qc->cursg].page;
3403 offset = sg[qc->cursg].offset + qc->cursg_ofs * ATA_SECT_SIZE;
3404
3405 /* get the current page and offset */
3406 page = nth_page(page, (offset >> PAGE_SHIFT));
3407 offset %= PAGE_SIZE;
3408
Albert Lee7282aa42005-10-09 09:46:07 -04003409 DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
3410
Albert Lee91b8b312005-10-09 09:48:44 -04003411 if (PageHighMem(page)) {
3412 unsigned long flags;
Albert Lee7282aa42005-10-09 09:46:07 -04003413
Albert Lee91b8b312005-10-09 09:48:44 -04003414 local_irq_save(flags);
3415 buf = kmap_atomic(page, KM_IRQ0);
Albert Lee083958d2005-10-09 09:47:31 -04003416
Albert Lee91b8b312005-10-09 09:48:44 -04003417 /* do the actual data transfer */
3418 ata_data_xfer(ap, buf + offset, ATA_SECT_SIZE, do_write);
3419
3420 kunmap_atomic(buf, KM_IRQ0);
3421 local_irq_restore(flags);
3422 } else {
3423 buf = page_address(page);
3424 ata_data_xfer(ap, buf + offset, ATA_SECT_SIZE, do_write);
3425 }
Albert Lee7282aa42005-10-09 09:46:07 -04003426
Linus Torvalds1da177e2005-04-16 15:20:36 -07003427 qc->cursect++;
3428 qc->cursg_ofs++;
3429
Albert Lee32529e02005-05-26 03:49:42 -04003430 if ((qc->cursg_ofs * ATA_SECT_SIZE) == (&sg[qc->cursg])->length) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003431 qc->cursg++;
3432 qc->cursg_ofs = 0;
3433 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003434}
3435
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003436/**
Albert Lee07f6f7d2005-11-01 19:33:20 +08003437 * ata_pio_sectors - Transfer one or many 512-byte sectors.
3438 * @qc: Command on going
3439 *
3440 * Transfer one or many ATA_SECT_SIZE of data from/to the
3441 * ATA device for the DRQ request.
3442 *
3443 * LOCKING:
3444 * Inherited from caller.
3445 */
3446
3447static void ata_pio_sectors(struct ata_queued_cmd *qc)
3448{
3449 if (is_multi_taskfile(&qc->tf)) {
3450 /* READ/WRITE MULTIPLE */
3451 unsigned int nsect;
3452
Jeff Garzik587005d2006-02-11 18:17:32 -05003453 WARN_ON(qc->dev->multi_count == 0);
Albert Lee07f6f7d2005-11-01 19:33:20 +08003454
3455 nsect = min(qc->nsect - qc->cursect, qc->dev->multi_count);
3456 while (nsect--)
3457 ata_pio_sector(qc);
3458 } else
3459 ata_pio_sector(qc);
3460}
3461
3462/**
Albert Leec71c1852005-10-04 06:03:45 -04003463 * atapi_send_cdb - Write CDB bytes to hardware
3464 * @ap: Port to which ATAPI device is attached.
3465 * @qc: Taskfile currently active
3466 *
3467 * When device has indicated its readiness to accept
3468 * a CDB, this function is called. Send the CDB.
3469 *
3470 * LOCKING:
3471 * caller.
3472 */
3473
3474static void atapi_send_cdb(struct ata_port *ap, struct ata_queued_cmd *qc)
3475{
3476 /* send SCSI cdb */
3477 DPRINTK("send cdb\n");
Jeff Garzikdb024d52006-02-13 00:23:57 -05003478 WARN_ON(qc->dev->cdb_len < 12);
Albert Leec71c1852005-10-04 06:03:45 -04003479
Jeff Garzikdb024d52006-02-13 00:23:57 -05003480 ata_data_xfer(ap, qc->cdb, qc->dev->cdb_len, 1);
Albert Leec71c1852005-10-04 06:03:45 -04003481 ata_altstatus(ap); /* flush */
3482
3483 switch (qc->tf.protocol) {
3484 case ATA_PROT_ATAPI:
3485 ap->hsm_task_state = HSM_ST;
3486 break;
3487 case ATA_PROT_ATAPI_NODATA:
3488 ap->hsm_task_state = HSM_ST_LAST;
3489 break;
3490 case ATA_PROT_ATAPI_DMA:
3491 ap->hsm_task_state = HSM_ST_LAST;
3492 /* initiate bmdma */
3493 ap->ops->bmdma_start(qc);
3494 break;
3495 }
3496}
3497
3498/**
Albert Leee27486d2005-11-01 19:24:49 +08003499 * ata_pio_first_block - Write first data block to hardware
3500 * @ap: Port to which ATA/ATAPI device is attached.
Albert Leec71c1852005-10-04 06:03:45 -04003501 *
3502 * When device has indicated its readiness to accept
3503 * the data, this function sends out the CDB or
3504 * the first data block by PIO.
3505 * After this,
3506 * - If polling, ata_pio_task() handles the rest.
3507 * - Otherwise, interrupt handler takes over.
3508 *
3509 * LOCKING:
3510 * Kernel thread context (may sleep)
Albert Leefbcdd802005-11-01 19:30:05 +08003511 *
3512 * RETURNS:
3513 * Zero if irq handler takes over
3514 * Non-zero if has next (polling).
Albert Leec71c1852005-10-04 06:03:45 -04003515 */
3516
Albert Leefbcdd802005-11-01 19:30:05 +08003517static int ata_pio_first_block(struct ata_port *ap)
Albert Leec71c1852005-10-04 06:03:45 -04003518{
Albert Leec71c1852005-10-04 06:03:45 -04003519 struct ata_queued_cmd *qc;
3520 u8 status;
3521 unsigned long flags;
Albert Leefbcdd802005-11-01 19:30:05 +08003522 int has_next;
Albert Leec71c1852005-10-04 06:03:45 -04003523
3524 qc = ata_qc_from_tag(ap, ap->active_tag);
Jeff Garzik587005d2006-02-11 18:17:32 -05003525 WARN_ON(qc == NULL);
3526 WARN_ON((qc->flags & ATA_QCFLAG_ACTIVE) == 0);
Albert Leec71c1852005-10-04 06:03:45 -04003527
Albert Leefbcdd802005-11-01 19:30:05 +08003528 /* if polling, we will stay in the work queue after sending the data.
3529 * otherwise, interrupt handler takes over after sending the data.
3530 */
3531 has_next = (qc->tf.flags & ATA_TFLAG_POLLING);
3532
Albert Leec71c1852005-10-04 06:03:45 -04003533 /* sleep-wait for BSY to clear */
3534 DPRINTK("busy wait\n");
Albert Leefbcdd802005-11-01 19:30:05 +08003535 if (ata_busy_sleep(ap, ATA_TMOUT_DATAOUT_QUICK, ATA_TMOUT_DATAOUT)) {
Albert Lee555a8962006-02-08 16:50:29 +08003536 qc->err_mask |= AC_ERR_TIMEOUT;
Albert Leefbcdd802005-11-01 19:30:05 +08003537 ap->hsm_task_state = HSM_ST_TMOUT;
Albert Leec71c1852005-10-04 06:03:45 -04003538 goto err_out;
Albert Leefbcdd802005-11-01 19:30:05 +08003539 }
Albert Leec71c1852005-10-04 06:03:45 -04003540
3541 /* make sure DRQ is set */
3542 status = ata_chk_status(ap);
Albert Leefbcdd802005-11-01 19:30:05 +08003543 if ((status & (ATA_BUSY | ATA_DRQ)) != ATA_DRQ) {
3544 /* device status error */
Albert Lee555a8962006-02-08 16:50:29 +08003545 qc->err_mask |= AC_ERR_HSM;
Albert Leefbcdd802005-11-01 19:30:05 +08003546 ap->hsm_task_state = HSM_ST_ERR;
Albert Leec71c1852005-10-04 06:03:45 -04003547 goto err_out;
Albert Leefbcdd802005-11-01 19:30:05 +08003548 }
Albert Leec71c1852005-10-04 06:03:45 -04003549
3550 /* Send the CDB (atapi) or the first data block (ata pio out).
3551 * During the state transition, interrupt handler shouldn't
3552 * be invoked before the data transfer is complete and
3553 * hsm_task_state is changed. Hence, the following locking.
3554 */
3555 spin_lock_irqsave(&ap->host_set->lock, flags);
3556
3557 if (qc->tf.protocol == ATA_PROT_PIO) {
3558 /* PIO data out protocol.
3559 * send first data block.
3560 */
3561
Albert Lee07f6f7d2005-11-01 19:33:20 +08003562 /* ata_pio_sectors() might change the state to HSM_ST_LAST.
3563 * so, the state is changed here before ata_pio_sectors().
Albert Leec71c1852005-10-04 06:03:45 -04003564 */
3565 ap->hsm_task_state = HSM_ST;
Albert Lee07f6f7d2005-11-01 19:33:20 +08003566 ata_pio_sectors(qc);
Albert Leec71c1852005-10-04 06:03:45 -04003567 ata_altstatus(ap); /* flush */
3568 } else
3569 /* send CDB */
3570 atapi_send_cdb(ap, qc);
3571
Albert Leefbcdd802005-11-01 19:30:05 +08003572 spin_unlock_irqrestore(&ap->host_set->lock, flags);
3573
Albert Leec71c1852005-10-04 06:03:45 -04003574 /* if polling, ata_pio_task() handles the rest.
3575 * otherwise, interrupt handler takes over from here.
3576 */
Albert Leefbcdd802005-11-01 19:30:05 +08003577 return has_next;
Albert Leec71c1852005-10-04 06:03:45 -04003578
3579err_out:
Albert Leefbcdd802005-11-01 19:30:05 +08003580 return 1; /* has next */
Albert Leec71c1852005-10-04 06:03:45 -04003581}
3582
3583/**
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003584 * __atapi_pio_bytes - Transfer data from/to the ATAPI device.
3585 * @qc: Command on going
3586 * @bytes: number of bytes
3587 *
3588 * Transfer Transfer data from/to the ATAPI device.
3589 *
3590 * LOCKING:
3591 * Inherited from caller.
3592 *
3593 */
3594
Linus Torvalds1da177e2005-04-16 15:20:36 -07003595static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
3596{
3597 int do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003598 struct scatterlist *sg = qc->__sg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003599 struct ata_port *ap = qc->ap;
3600 struct page *page;
3601 unsigned char *buf;
3602 unsigned int offset, count;
3603
Albert Lee563a6e12005-08-12 14:17:50 +08003604 if (qc->curbytes + bytes >= qc->nbytes)
Albert Lee14be71f2005-09-27 17:36:35 +08003605 ap->hsm_task_state = HSM_ST_LAST;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003606
3607next_sg:
Albert Lee563a6e12005-08-12 14:17:50 +08003608 if (unlikely(qc->cursg >= qc->n_elem)) {
Jeff Garzik7fb6ec22005-09-16 06:01:48 -04003609 /*
Albert Lee563a6e12005-08-12 14:17:50 +08003610 * The end of qc->sg is reached and the device expects
3611 * more data to transfer. In order not to overrun qc->sg
3612 * and fulfill length specified in the byte count register,
3613 * - for read case, discard trailing data from the device
3614 * - for write case, padding zero data to the device
3615 */
3616 u16 pad_buf[1] = { 0 };
3617 unsigned int words = bytes >> 1;
3618 unsigned int i;
3619
3620 if (words) /* warning if bytes > 1 */
Jeff Garzik7fb6ec22005-09-16 06:01:48 -04003621 printk(KERN_WARNING "ata%u: %u bytes trailing data\n",
Albert Lee563a6e12005-08-12 14:17:50 +08003622 ap->id, bytes);
3623
3624 for (i = 0; i < words; i++)
3625 ata_data_xfer(ap, (unsigned char*)pad_buf, 2, do_write);
3626
Albert Lee14be71f2005-09-27 17:36:35 +08003627 ap->hsm_task_state = HSM_ST_LAST;
Albert Lee563a6e12005-08-12 14:17:50 +08003628 return;
3629 }
3630
Jeff Garzikcedc9a42005-10-05 07:13:30 -04003631 sg = &qc->__sg[qc->cursg];
Linus Torvalds1da177e2005-04-16 15:20:36 -07003632
Linus Torvalds1da177e2005-04-16 15:20:36 -07003633 page = sg->page;
3634 offset = sg->offset + qc->cursg_ofs;
3635
3636 /* get the current page and offset */
3637 page = nth_page(page, (offset >> PAGE_SHIFT));
3638 offset %= PAGE_SIZE;
3639
Albert Lee6952df02005-06-06 15:56:03 +08003640 /* don't overrun current sg */
Albert Lee32529e02005-05-26 03:49:42 -04003641 count = min(sg->length - qc->cursg_ofs, bytes);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003642
3643 /* don't cross page boundaries */
3644 count = min(count, (unsigned int)PAGE_SIZE - offset);
3645
Albert Lee7282aa42005-10-09 09:46:07 -04003646 DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
3647
Albert Lee91b8b312005-10-09 09:48:44 -04003648 if (PageHighMem(page)) {
3649 unsigned long flags;
Albert Lee7282aa42005-10-09 09:46:07 -04003650
Albert Lee91b8b312005-10-09 09:48:44 -04003651 local_irq_save(flags);
3652 buf = kmap_atomic(page, KM_IRQ0);
Albert Lee083958d2005-10-09 09:47:31 -04003653
Albert Lee91b8b312005-10-09 09:48:44 -04003654 /* do the actual data transfer */
3655 ata_data_xfer(ap, buf + offset, count, do_write);
3656
3657 kunmap_atomic(buf, KM_IRQ0);
3658 local_irq_restore(flags);
3659 } else {
3660 buf = page_address(page);
3661 ata_data_xfer(ap, buf + offset, count, do_write);
3662 }
Albert Lee7282aa42005-10-09 09:46:07 -04003663
Linus Torvalds1da177e2005-04-16 15:20:36 -07003664 bytes -= count;
3665 qc->curbytes += count;
3666 qc->cursg_ofs += count;
3667
Albert Lee32529e02005-05-26 03:49:42 -04003668 if (qc->cursg_ofs == sg->length) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003669 qc->cursg++;
3670 qc->cursg_ofs = 0;
3671 }
3672
Albert Lee563a6e12005-08-12 14:17:50 +08003673 if (bytes)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003674 goto next_sg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003675}
3676
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003677/**
3678 * atapi_pio_bytes - Transfer data from/to the ATAPI device.
3679 * @qc: Command on going
3680 *
3681 * Transfer Transfer data from/to the ATAPI device.
3682 *
3683 * LOCKING:
3684 * Inherited from caller.
Albert Lee6ae4cfb2005-08-12 14:15:34 +08003685 */
3686
Linus Torvalds1da177e2005-04-16 15:20:36 -07003687static void atapi_pio_bytes(struct ata_queued_cmd *qc)
3688{
3689 struct ata_port *ap = qc->ap;
3690 struct ata_device *dev = qc->dev;
3691 unsigned int ireason, bc_lo, bc_hi, bytes;
3692 int i_write, do_write = (qc->tf.flags & ATA_TFLAG_WRITE) ? 1 : 0;
3693
3694 ap->ops->tf_read(ap, &qc->tf);
3695 ireason = qc->tf.nsect;
3696 bc_lo = qc->tf.lbam;
3697 bc_hi = qc->tf.lbah;
3698 bytes = (bc_hi << 8) | bc_lo;
3699
3700 /* shall be cleared to zero, indicating xfer of data */
3701 if (ireason & (1 << 0))
3702 goto err_out;
3703
3704 /* make sure transfer direction matches expected */
3705 i_write = ((ireason & (1 << 1)) == 0) ? 1 : 0;
3706 if (do_write != i_write)
3707 goto err_out;
3708
Albert Lee312f7da2005-09-27 17:38:03 +08003709 VPRINTK("ata%u: xfering %d bytes\n", ap->id, bytes);
3710
Linus Torvalds1da177e2005-04-16 15:20:36 -07003711 __atapi_pio_bytes(qc, bytes);
3712
3713 return;
3714
3715err_out:
3716 printk(KERN_INFO "ata%u: dev %u: ATAPI check failed\n",
3717 ap->id, dev->devno);
Tejun Heo11a56d22006-01-23 13:09:36 +09003718 qc->err_mask |= AC_ERR_HSM;
Albert Lee14be71f2005-09-27 17:36:35 +08003719 ap->hsm_task_state = HSM_ST_ERR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003720}
3721
3722/**
Randy Dunlap6f0ef4f2005-10-25 01:44:30 -04003723 * ata_pio_block - start PIO on a block
3724 * @ap: the target ata_port
Linus Torvalds1da177e2005-04-16 15:20:36 -07003725 *
3726 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04003727 * None. (executing in kernel thread context)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003728 */
3729
3730static void ata_pio_block(struct ata_port *ap)
3731{
3732 struct ata_queued_cmd *qc;
3733 u8 status;
3734
3735 /*
Randy Dunlap6f0ef4f2005-10-25 01:44:30 -04003736 * This is purely heuristic. This is a fast path.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003737 * Sometimes when we enter, BSY will be cleared in
3738 * a chk-status or two. If not, the drive is probably seeking
3739 * or something. Snooze for a couple msecs, then
3740 * chk-status again. If still busy, fall back to
Albert Lee14be71f2005-09-27 17:36:35 +08003741 * HSM_ST_POLL state.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003742 */
3743 status = ata_busy_wait(ap, ATA_BUSY, 5);
3744 if (status & ATA_BUSY) {
3745 msleep(2);
3746 status = ata_busy_wait(ap, ATA_BUSY, 10);
3747 if (status & ATA_BUSY) {
Albert Lee14be71f2005-09-27 17:36:35 +08003748 ap->hsm_task_state = HSM_ST_POLL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003749 ap->pio_task_timeout = jiffies + ATA_TMOUT_PIO;
3750 return;
3751 }
3752 }
3753
3754 qc = ata_qc_from_tag(ap, ap->active_tag);
Tejun Heoa46314742006-02-11 19:11:13 +09003755 WARN_ON(qc == NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003756
Albert Leefe79e682005-12-06 11:34:59 +08003757 /* check error */
3758 if (status & (ATA_ERR | ATA_DF)) {
3759 qc->err_mask |= AC_ERR_DEV;
3760 ap->hsm_task_state = HSM_ST_ERR;
3761 return;
3762 }
3763
3764 /* transfer data if any */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003765 if (is_atapi_taskfile(&qc->tf)) {
Albert Leefe79e682005-12-06 11:34:59 +08003766 /* DRQ=0 means no more data to transfer */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003767 if ((status & ATA_DRQ) == 0) {
Albert Lee14be71f2005-09-27 17:36:35 +08003768 ap->hsm_task_state = HSM_ST_LAST;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003769 return;
3770 }
3771
3772 atapi_pio_bytes(qc);
3773 } else {
3774 /* handle BSY=0, DRQ=0 as error */
3775 if ((status & ATA_DRQ) == 0) {
Tejun Heo11a56d22006-01-23 13:09:36 +09003776 qc->err_mask |= AC_ERR_HSM;
Albert Lee14be71f2005-09-27 17:36:35 +08003777 ap->hsm_task_state = HSM_ST_ERR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003778 return;
3779 }
3780
Albert Lee07f6f7d2005-11-01 19:33:20 +08003781 ata_pio_sectors(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003782 }
Albert Lee467b16d2005-11-01 19:19:01 +08003783
3784 ata_altstatus(ap); /* flush */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003785}
3786
3787static void ata_pio_error(struct ata_port *ap)
3788{
3789 struct ata_queued_cmd *qc;
Jeff Garzika7dac442005-10-30 04:44:42 -05003790
Linus Torvalds1da177e2005-04-16 15:20:36 -07003791 qc = ata_qc_from_tag(ap, ap->active_tag);
Tejun Heoa46314742006-02-11 19:11:13 +09003792 WARN_ON(qc == NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003793
Albert Lee000080c2005-12-26 16:48:00 +08003794 if (qc->tf.command != ATA_CMD_PACKET)
3795 printk(KERN_WARNING "ata%u: PIO error\n", ap->id);
3796
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05003797 /* make sure qc->err_mask is available to
Albert Lee1c848982005-12-05 15:40:15 +08003798 * know what's wrong and recover
3799 */
Tejun Heoa46314742006-02-11 19:11:13 +09003800 WARN_ON(qc->err_mask == 0);
Albert Lee1c848982005-12-05 15:40:15 +08003801
Albert Lee14be71f2005-09-27 17:36:35 +08003802 ap->hsm_task_state = HSM_ST_IDLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003803
Albert Leea22e2eb2005-12-05 15:38:02 +08003804 ata_poll_qc_complete(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003805}
3806
3807static void ata_pio_task(void *_data)
3808{
3809 struct ata_port *ap = _data;
Jeff Garzik7fb6ec22005-09-16 06:01:48 -04003810 unsigned long timeout;
Albert Leefbcdd802005-11-01 19:30:05 +08003811 int has_next;
Jeff Garzik7fb6ec22005-09-16 06:01:48 -04003812
3813fsm_start:
3814 timeout = 0;
Albert Leefbcdd802005-11-01 19:30:05 +08003815 has_next = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003816
Albert Lee14be71f2005-09-27 17:36:35 +08003817 switch (ap->hsm_task_state) {
Albert Leee27486d2005-11-01 19:24:49 +08003818 case HSM_ST_FIRST:
Albert Leefbcdd802005-11-01 19:30:05 +08003819 has_next = ata_pio_first_block(ap);
3820 break;
Albert Leee27486d2005-11-01 19:24:49 +08003821
Albert Lee14be71f2005-09-27 17:36:35 +08003822 case HSM_ST:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003823 ata_pio_block(ap);
3824 break;
3825
Albert Lee14be71f2005-09-27 17:36:35 +08003826 case HSM_ST_LAST:
Albert Leefbcdd802005-11-01 19:30:05 +08003827 has_next = ata_pio_complete(ap);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003828 break;
3829
Albert Lee14be71f2005-09-27 17:36:35 +08003830 case HSM_ST_POLL:
3831 case HSM_ST_LAST_POLL:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003832 timeout = ata_pio_poll(ap);
3833 break;
3834
Albert Lee14be71f2005-09-27 17:36:35 +08003835 case HSM_ST_TMOUT:
3836 case HSM_ST_ERR:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003837 ata_pio_error(ap);
3838 return;
Albert Lee467b16d2005-11-01 19:19:01 +08003839
3840 default:
3841 BUG();
3842 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003843 }
3844
3845 if (timeout)
Tejun Heo8061f5f2006-03-05 15:29:09 +09003846 ata_port_queue_task(ap, ata_pio_task, ap, timeout);
Jeff Garzik46e202e2006-03-11 19:25:47 -05003847 else if (has_next)
Jeff Garzik7fb6ec22005-09-16 06:01:48 -04003848 goto fsm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003849}
3850
Linus Torvalds1da177e2005-04-16 15:20:36 -07003851/**
Tejun Heo8061f5f2006-03-05 15:29:09 +09003852 * atapi_packet_task - Write CDB bytes to hardware
3853 * @_data: Port to which ATAPI device is attached.
3854 *
3855 * When device has indicated its readiness to accept
3856 * a CDB, this function is called. Send the CDB.
3857 * If DMA is to be performed, exit immediately.
3858 * Otherwise, we are in polling mode, so poll
3859 * status under operation succeeds or fails.
3860 *
3861 * LOCKING:
3862 * Kernel thread context (may sleep)
3863 */
3864
3865static void atapi_packet_task(void *_data)
3866{
3867 struct ata_port *ap = _data;
3868 struct ata_queued_cmd *qc;
3869 u8 status;
3870
3871 qc = ata_qc_from_tag(ap, ap->active_tag);
3872 WARN_ON(qc == NULL);
3873 WARN_ON(!(qc->flags & ATA_QCFLAG_ACTIVE));
3874
3875 /* sleep-wait for BSY to clear */
3876 DPRINTK("busy wait\n");
3877 if (ata_busy_sleep(ap, ATA_TMOUT_CDB_QUICK, ATA_TMOUT_CDB)) {
3878 qc->err_mask |= AC_ERR_TIMEOUT;
3879 goto err_out;
3880 }
3881
3882 /* make sure DRQ is set */
3883 status = ata_chk_status(ap);
3884 if ((status & (ATA_BUSY | ATA_DRQ)) != ATA_DRQ) {
3885 qc->err_mask |= AC_ERR_HSM;
3886 goto err_out;
3887 }
3888
3889 /* send SCSI cdb */
3890 DPRINTK("send cdb\n");
3891 WARN_ON(qc->dev->cdb_len < 12);
3892
3893 if (qc->tf.protocol == ATA_PROT_ATAPI_DMA ||
3894 qc->tf.protocol == ATA_PROT_ATAPI_NODATA) {
3895 unsigned long flags;
3896
3897 /* Once we're done issuing command and kicking bmdma,
3898 * irq handler takes over. To not lose irq, we need
3899 * to clear NOINTR flag before sending cdb, but
3900 * interrupt handler shouldn't be invoked before we're
3901 * finished. Hence, the following locking.
3902 */
3903 spin_lock_irqsave(&ap->host_set->lock, flags);
Jeff Garzik46e202e2006-03-11 19:25:47 -05003904#warning FIXME
3905 /* ap->flags &= ~ATA_FLAG_NOINTR; */
Tejun Heo8061f5f2006-03-05 15:29:09 +09003906 ata_data_xfer(ap, qc->cdb, qc->dev->cdb_len, 1);
3907 if (qc->tf.protocol == ATA_PROT_ATAPI_DMA)
3908 ap->ops->bmdma_start(qc); /* initiate bmdma */
3909 spin_unlock_irqrestore(&ap->host_set->lock, flags);
3910 } else {
3911 ata_data_xfer(ap, qc->cdb, qc->dev->cdb_len, 1);
3912
3913 /* PIO commands are handled by polling */
3914 ap->hsm_task_state = HSM_ST;
3915 ata_port_queue_task(ap, ata_pio_task, ap, 0);
3916 }
3917
3918 return;
3919
3920err_out:
3921 ata_poll_qc_complete(qc);
3922}
3923
3924/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07003925 * ata_qc_timeout - Handle timeout of queued command
3926 * @qc: Command that timed out
3927 *
3928 * Some part of the kernel (currently, only the SCSI layer)
3929 * has noticed that the active command on port @ap has not
3930 * completed after a specified length of time. Handle this
3931 * condition by disabling DMA (if necessary) and completing
3932 * transactions, with error if necessary.
3933 *
3934 * This also handles the case of the "lost interrupt", where
3935 * for some reason (possibly hardware bug, possibly driver bug)
3936 * an interrupt was not delivered to the driver, even though the
3937 * transaction completed successfully.
3938 *
3939 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04003940 * Inherited from SCSI layer (none, can sleep)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003941 */
3942
3943static void ata_qc_timeout(struct ata_queued_cmd *qc)
3944{
3945 struct ata_port *ap = qc->ap;
Jeff Garzikb8f61532005-08-25 22:01:20 -04003946 struct ata_host_set *host_set = ap->host_set;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003947 u8 host_stat = 0, drv_stat;
Jeff Garzikb8f61532005-08-25 22:01:20 -04003948 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003949
3950 DPRINTK("ENTER\n");
3951
Tejun Heoc18d06f2006-02-02 00:56:10 +09003952 ap->hsm_task_state = HSM_ST_IDLE;
3953
Jeff Garzikb8f61532005-08-25 22:01:20 -04003954 spin_lock_irqsave(&host_set->lock, flags);
3955
Linus Torvalds1da177e2005-04-16 15:20:36 -07003956 switch (qc->tf.protocol) {
3957
3958 case ATA_PROT_DMA:
3959 case ATA_PROT_ATAPI_DMA:
3960 host_stat = ap->ops->bmdma_status(ap);
3961
3962 /* before we do anything else, clear DMA-Start bit */
Alan Coxb73fc892005-08-26 16:03:19 +01003963 ap->ops->bmdma_stop(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003964
3965 /* fall through */
3966
3967 default:
3968 ata_altstatus(ap);
3969 drv_stat = ata_chk_status(ap);
3970
3971 /* ack bmdma irq events */
3972 ap->ops->irq_clear(ap);
3973
3974 printk(KERN_ERR "ata%u: command 0x%x timeout, stat 0x%x host_stat 0x%x\n",
3975 ap->id, qc->tf.command, drv_stat, host_stat);
3976
Albert Lee312f7da2005-09-27 17:38:03 +08003977 ap->hsm_task_state = HSM_ST_IDLE;
3978
Linus Torvalds1da177e2005-04-16 15:20:36 -07003979 /* complete taskfile transaction */
Albert Lee555a8962006-02-08 16:50:29 +08003980 qc->err_mask |= AC_ERR_TIMEOUT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003981 break;
3982 }
Jeff Garzikb8f61532005-08-25 22:01:20 -04003983
3984 spin_unlock_irqrestore(&host_set->lock, flags);
3985
Tejun Heoa72ec4c2006-01-23 13:09:37 +09003986 ata_eh_qc_complete(qc);
3987
Linus Torvalds1da177e2005-04-16 15:20:36 -07003988 DPRINTK("EXIT\n");
3989}
3990
3991/**
3992 * ata_eng_timeout - Handle timeout of queued command
3993 * @ap: Port on which timed-out command is active
3994 *
3995 * Some part of the kernel (currently, only the SCSI layer)
3996 * has noticed that the active command on port @ap has not
3997 * completed after a specified length of time. Handle this
3998 * condition by disabling DMA (if necessary) and completing
3999 * transactions, with error if necessary.
4000 *
4001 * This also handles the case of the "lost interrupt", where
4002 * for some reason (possibly hardware bug, possibly driver bug)
4003 * an interrupt was not delivered to the driver, even though the
4004 * transaction completed successfully.
4005 *
4006 * LOCKING:
4007 * Inherited from SCSI layer (none, can sleep)
4008 */
4009
4010void ata_eng_timeout(struct ata_port *ap)
4011{
Linus Torvalds1da177e2005-04-16 15:20:36 -07004012 DPRINTK("ENTER\n");
4013
Tejun Heof6379022006-02-10 15:10:48 +09004014 ata_qc_timeout(ata_qc_from_tag(ap, ap->active_tag));
Linus Torvalds1da177e2005-04-16 15:20:36 -07004015
Linus Torvalds1da177e2005-04-16 15:20:36 -07004016 DPRINTK("EXIT\n");
4017}
4018
4019/**
4020 * ata_qc_new - Request an available ATA command, for queueing
4021 * @ap: Port associated with device @dev
4022 * @dev: Device from whom we request an available command structure
4023 *
4024 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04004025 * None.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004026 */
4027
4028static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap)
4029{
4030 struct ata_queued_cmd *qc = NULL;
4031 unsigned int i;
4032
4033 for (i = 0; i < ATA_MAX_QUEUE; i++)
4034 if (!test_and_set_bit(i, &ap->qactive)) {
4035 qc = ata_qc_from_tag(ap, i);
4036 break;
4037 }
4038
4039 if (qc)
4040 qc->tag = i;
4041
4042 return qc;
4043}
4044
4045/**
4046 * ata_qc_new_init - Request an available ATA command, and initialize it
4047 * @ap: Port associated with device @dev
4048 * @dev: Device from whom we request an available command structure
4049 *
4050 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04004051 * None.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004052 */
4053
4054struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
4055 struct ata_device *dev)
4056{
4057 struct ata_queued_cmd *qc;
4058
4059 qc = ata_qc_new(ap);
4060 if (qc) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004061 qc->scsicmd = NULL;
4062 qc->ap = ap;
4063 qc->dev = dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004064
Jeff Garzik2c13b7c2005-11-14 14:14:16 -05004065 ata_qc_reinit(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004066 }
4067
4068 return qc;
4069}
4070
Linus Torvalds1da177e2005-04-16 15:20:36 -07004071/**
4072 * ata_qc_free - free unused ata_queued_cmd
4073 * @qc: Command to complete
4074 *
4075 * Designed to free unused ata_queued_cmd object
4076 * in case something prevents using it.
4077 *
4078 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04004079 * spin_lock_irqsave(host_set lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004080 */
4081void ata_qc_free(struct ata_queued_cmd *qc)
4082{
Tejun Heo4ba946e2006-01-23 13:09:36 +09004083 struct ata_port *ap = qc->ap;
4084 unsigned int tag;
4085
Tejun Heoa46314742006-02-11 19:11:13 +09004086 WARN_ON(qc == NULL); /* ata_qc_from_tag _might_ return NULL */
Linus Torvalds1da177e2005-04-16 15:20:36 -07004087
Tejun Heo4ba946e2006-01-23 13:09:36 +09004088 qc->flags = 0;
4089 tag = qc->tag;
4090 if (likely(ata_tag_valid(tag))) {
4091 if (tag == ap->active_tag)
4092 ap->active_tag = ATA_TAG_POISON;
4093 qc->tag = ATA_TAG_POISON;
4094 clear_bit(tag, &ap->qactive);
4095 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004096}
4097
Tejun Heo76014422006-02-11 15:13:49 +09004098void __ata_qc_complete(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004099{
Tejun Heoa46314742006-02-11 19:11:13 +09004100 WARN_ON(qc == NULL); /* ata_qc_from_tag _might_ return NULL */
4101 WARN_ON(!(qc->flags & ATA_QCFLAG_ACTIVE));
Linus Torvalds1da177e2005-04-16 15:20:36 -07004102
4103 if (likely(qc->flags & ATA_QCFLAG_DMAMAP))
4104 ata_sg_clean(qc);
4105
Albert Lee3f3791d2005-08-16 14:25:38 +08004106 /* atapi: mark qc as inactive to prevent the interrupt handler
4107 * from completing the command twice later, before the error handler
4108 * is called. (when rc != 0 and atapi request sense is needed)
4109 */
4110 qc->flags &= ~ATA_QCFLAG_ACTIVE;
4111
Linus Torvalds1da177e2005-04-16 15:20:36 -07004112 /* call completion callback */
Tejun Heo77853bf2006-01-23 13:09:36 +09004113 qc->complete_fn(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004114}
4115
4116static inline int ata_should_dma_map(struct ata_queued_cmd *qc)
4117{
4118 struct ata_port *ap = qc->ap;
4119
4120 switch (qc->tf.protocol) {
4121 case ATA_PROT_DMA:
4122 case ATA_PROT_ATAPI_DMA:
4123 return 1;
4124
4125 case ATA_PROT_ATAPI:
4126 case ATA_PROT_PIO:
Linus Torvalds1da177e2005-04-16 15:20:36 -07004127 if (ap->flags & ATA_FLAG_PIO_DMA)
4128 return 1;
4129
4130 /* fall through */
4131
4132 default:
4133 return 0;
4134 }
4135
4136 /* never reached */
4137}
4138
4139/**
4140 * ata_qc_issue - issue taskfile to device
4141 * @qc: command to issue to device
4142 *
4143 * Prepare an ATA command to submission to device.
4144 * This includes mapping the data into a DMA-able
4145 * area, filling in the S/G table, and finally
4146 * writing the taskfile to hardware, starting the command.
4147 *
4148 * LOCKING:
4149 * spin_lock_irqsave(host_set lock)
4150 *
4151 * RETURNS:
Tejun Heo9a3d9eb2006-01-23 13:09:36 +09004152 * Zero on success, AC_ERR_* mask on failure
Linus Torvalds1da177e2005-04-16 15:20:36 -07004153 */
4154
Tejun Heo9a3d9eb2006-01-23 13:09:36 +09004155unsigned int ata_qc_issue(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004156{
4157 struct ata_port *ap = qc->ap;
4158
4159 if (ata_should_dma_map(qc)) {
4160 if (qc->flags & ATA_QCFLAG_SG) {
4161 if (ata_sg_setup(qc))
Tejun Heo8e436af2006-01-23 13:09:36 +09004162 goto sg_err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004163 } else if (qc->flags & ATA_QCFLAG_SINGLE) {
4164 if (ata_sg_setup_one(qc))
Tejun Heo8e436af2006-01-23 13:09:36 +09004165 goto sg_err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004166 }
4167 } else {
4168 qc->flags &= ~ATA_QCFLAG_DMAMAP;
4169 }
4170
4171 ap->ops->qc_prep(qc);
4172
4173 qc->ap->active_tag = qc->tag;
4174 qc->flags |= ATA_QCFLAG_ACTIVE;
4175
4176 return ap->ops->qc_issue(qc);
4177
Tejun Heo8e436af2006-01-23 13:09:36 +09004178sg_err:
4179 qc->flags &= ~ATA_QCFLAG_DMAMAP;
Tejun Heo9a3d9eb2006-01-23 13:09:36 +09004180 return AC_ERR_SYSTEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004181}
4182
Edward Falk0baab862005-06-02 18:17:13 -04004183
Linus Torvalds1da177e2005-04-16 15:20:36 -07004184/**
4185 * ata_qc_issue_prot - issue taskfile to device in proto-dependent manner
4186 * @qc: command to issue to device
4187 *
4188 * Using various libata functions and hooks, this function
4189 * starts an ATA command. ATA commands are grouped into
4190 * classes called "protocols", and issuing each type of protocol
4191 * is slightly different.
4192 *
Edward Falk0baab862005-06-02 18:17:13 -04004193 * May be used as the qc_issue() entry in ata_port_operations.
4194 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07004195 * LOCKING:
4196 * spin_lock_irqsave(host_set lock)
4197 *
4198 * RETURNS:
Tejun Heo9a3d9eb2006-01-23 13:09:36 +09004199 * Zero on success, AC_ERR_* mask on failure
Linus Torvalds1da177e2005-04-16 15:20:36 -07004200 */
4201
Tejun Heo9a3d9eb2006-01-23 13:09:36 +09004202unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004203{
4204 struct ata_port *ap = qc->ap;
4205
Albert Leee50362e2005-09-27 17:39:50 +08004206 /* Use polling pio if the LLD doesn't handle
4207 * interrupt driven pio and atapi CDB interrupt.
4208 */
4209 if (ap->flags & ATA_FLAG_PIO_POLLING) {
4210 switch (qc->tf.protocol) {
4211 case ATA_PROT_PIO:
4212 case ATA_PROT_ATAPI:
4213 case ATA_PROT_ATAPI_NODATA:
4214 qc->tf.flags |= ATA_TFLAG_POLLING;
4215 break;
4216 case ATA_PROT_ATAPI_DMA:
4217 if (qc->dev->flags & ATA_DFLAG_CDB_INTR)
4218 BUG();
4219 break;
4220 default:
4221 break;
4222 }
4223 }
4224
Albert Lee312f7da2005-09-27 17:38:03 +08004225 /* select the device */
Linus Torvalds1da177e2005-04-16 15:20:36 -07004226 ata_dev_select(ap, qc->dev->devno, 1, 0);
4227
Albert Lee312f7da2005-09-27 17:38:03 +08004228 /* start the command */
Linus Torvalds1da177e2005-04-16 15:20:36 -07004229 switch (qc->tf.protocol) {
4230 case ATA_PROT_NODATA:
Albert Lee312f7da2005-09-27 17:38:03 +08004231 if (qc->tf.flags & ATA_TFLAG_POLLING)
4232 ata_qc_set_polling(qc);
4233
Jeff Garzike5338252005-10-30 21:37:17 -05004234 ata_tf_to_host(ap, &qc->tf);
Albert Lee312f7da2005-09-27 17:38:03 +08004235 ap->hsm_task_state = HSM_ST_LAST;
4236
4237 if (qc->tf.flags & ATA_TFLAG_POLLING)
Jeff Garzik46e202e2006-03-11 19:25:47 -05004238 ata_port_queue_task(ap, ata_pio_task, ap, 0);
Albert Lee312f7da2005-09-27 17:38:03 +08004239
Linus Torvalds1da177e2005-04-16 15:20:36 -07004240 break;
4241
4242 case ATA_PROT_DMA:
Jeff Garzik587005d2006-02-11 18:17:32 -05004243 WARN_ON(qc->tf.flags & ATA_TFLAG_POLLING);
Albert Lee312f7da2005-09-27 17:38:03 +08004244
Linus Torvalds1da177e2005-04-16 15:20:36 -07004245 ap->ops->tf_load(ap, &qc->tf); /* load tf registers */
4246 ap->ops->bmdma_setup(qc); /* set up bmdma */
4247 ap->ops->bmdma_start(qc); /* initiate bmdma */
Albert Lee312f7da2005-09-27 17:38:03 +08004248 ap->hsm_task_state = HSM_ST_LAST;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004249 break;
4250
Albert Lee312f7da2005-09-27 17:38:03 +08004251 case ATA_PROT_PIO:
4252 if (qc->tf.flags & ATA_TFLAG_POLLING)
4253 ata_qc_set_polling(qc);
4254
Jeff Garzike5338252005-10-30 21:37:17 -05004255 ata_tf_to_host(ap, &qc->tf);
Albert Lee312f7da2005-09-27 17:38:03 +08004256
Albert Lee54f00382005-09-30 19:14:19 +08004257 if (qc->tf.flags & ATA_TFLAG_WRITE) {
4258 /* PIO data out protocol */
4259 ap->hsm_task_state = HSM_ST_FIRST;
Jeff Garzikce1e7a22006-03-11 19:21:17 -05004260 ata_port_queue_task(ap, ata_pio_task, ap, 0);
Albert Lee54f00382005-09-30 19:14:19 +08004261
4262 /* always send first data block using
Albert Leee27486d2005-11-01 19:24:49 +08004263 * the ata_pio_task() codepath.
Albert Lee54f00382005-09-30 19:14:19 +08004264 */
Albert Lee312f7da2005-09-27 17:38:03 +08004265 } else {
Albert Lee54f00382005-09-30 19:14:19 +08004266 /* PIO data in protocol */
4267 ap->hsm_task_state = HSM_ST;
Albert Lee312f7da2005-09-27 17:38:03 +08004268
Albert Lee54f00382005-09-30 19:14:19 +08004269 if (qc->tf.flags & ATA_TFLAG_POLLING)
Jeff Garzikce1e7a22006-03-11 19:21:17 -05004270 ata_port_queue_task(ap, ata_pio_task, ap, 0);
Albert Lee312f7da2005-09-27 17:38:03 +08004271
Albert Lee54f00382005-09-30 19:14:19 +08004272 /* if polling, ata_pio_task() handles the rest.
4273 * otherwise, interrupt handler takes over from here.
4274 */
Albert Lee312f7da2005-09-27 17:38:03 +08004275 }
4276
Linus Torvalds1da177e2005-04-16 15:20:36 -07004277 break;
4278
4279 case ATA_PROT_ATAPI:
Linus Torvalds1da177e2005-04-16 15:20:36 -07004280 case ATA_PROT_ATAPI_NODATA:
Albert Lee312f7da2005-09-27 17:38:03 +08004281 if (qc->tf.flags & ATA_TFLAG_POLLING)
4282 ata_qc_set_polling(qc);
4283
Jeff Garzike5338252005-10-30 21:37:17 -05004284 ata_tf_to_host(ap, &qc->tf);
Jeff Garzikf6ef65e2006-01-27 02:45:00 -05004285
Albert Lee312f7da2005-09-27 17:38:03 +08004286 ap->hsm_task_state = HSM_ST_FIRST;
4287
4288 /* send cdb by polling if no cdb interrupt */
4289 if ((!(qc->dev->flags & ATA_DFLAG_CDB_INTR)) ||
4290 (qc->tf.flags & ATA_TFLAG_POLLING))
Jeff Garzikce1e7a22006-03-11 19:21:17 -05004291 ata_port_queue_task(ap, atapi_packet_task, ap, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004292 break;
4293
4294 case ATA_PROT_ATAPI_DMA:
Jeff Garzik587005d2006-02-11 18:17:32 -05004295 WARN_ON(qc->tf.flags & ATA_TFLAG_POLLING);
Albert Lee312f7da2005-09-27 17:38:03 +08004296
Linus Torvalds1da177e2005-04-16 15:20:36 -07004297 ap->ops->tf_load(ap, &qc->tf); /* load tf registers */
4298 ap->ops->bmdma_setup(qc); /* set up bmdma */
Albert Lee312f7da2005-09-27 17:38:03 +08004299 ap->hsm_task_state = HSM_ST_FIRST;
4300
4301 /* send cdb by polling if no cdb interrupt */
4302 if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR))
Jeff Garzikce1e7a22006-03-11 19:21:17 -05004303 ata_port_queue_task(ap, atapi_packet_task, ap, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004304 break;
4305
4306 default:
4307 WARN_ON(1);
Tejun Heo9a3d9eb2006-01-23 13:09:36 +09004308 return AC_ERR_SYSTEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004309 }
4310
4311 return 0;
4312}
4313
4314/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07004315 * ata_host_intr - Handle host interrupt for given (port, task)
4316 * @ap: Port on which interrupt arrived (possibly...)
4317 * @qc: Taskfile currently active in engine
4318 *
4319 * Handle host interrupt for given queued command. Currently,
4320 * only DMA interrupts are handled. All other commands are
4321 * handled via polling with interrupts disabled (nIEN bit).
4322 *
4323 * LOCKING:
4324 * spin_lock_irqsave(host_set lock)
4325 *
4326 * RETURNS:
4327 * One if interrupt was handled, zero if not (shared irq).
4328 */
4329
4330inline unsigned int ata_host_intr (struct ata_port *ap,
4331 struct ata_queued_cmd *qc)
4332{
Albert Lee312f7da2005-09-27 17:38:03 +08004333 u8 status, host_stat = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004334
Albert Lee312f7da2005-09-27 17:38:03 +08004335 VPRINTK("ata%u: protocol %d task_state %d\n",
4336 ap->id, qc->tf.protocol, ap->hsm_task_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004337
Albert Lee312f7da2005-09-27 17:38:03 +08004338 /* Check whether we are expecting interrupt in this state */
4339 switch (ap->hsm_task_state) {
4340 case HSM_ST_FIRST:
4341 /* Check the ATA_DFLAG_CDB_INTR flag is enough here.
4342 * The flag was turned on only for atapi devices.
4343 * No need to check is_atapi_taskfile(&qc->tf) again.
4344 */
4345 if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR))
Linus Torvalds1da177e2005-04-16 15:20:36 -07004346 goto idle_irq;
Albert Lee312f7da2005-09-27 17:38:03 +08004347 break;
4348 case HSM_ST_LAST:
4349 if (qc->tf.protocol == ATA_PROT_DMA ||
4350 qc->tf.protocol == ATA_PROT_ATAPI_DMA) {
4351 /* check status of DMA engine */
4352 host_stat = ap->ops->bmdma_status(ap);
4353 VPRINTK("ata%u: host_stat 0x%X\n", ap->id, host_stat);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004354
Albert Lee312f7da2005-09-27 17:38:03 +08004355 /* if it's not our irq... */
4356 if (!(host_stat & ATA_DMA_INTR))
4357 goto idle_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004358
Albert Lee312f7da2005-09-27 17:38:03 +08004359 /* before we do anything else, clear DMA-Start bit */
4360 ap->ops->bmdma_stop(qc);
Albert Leea4f16612005-12-26 16:40:53 +08004361
4362 if (unlikely(host_stat & ATA_DMA_ERR)) {
4363 /* error when transfering data to/from memory */
4364 qc->err_mask |= AC_ERR_HOST_BUS;
4365 ap->hsm_task_state = HSM_ST_ERR;
4366 }
Albert Lee312f7da2005-09-27 17:38:03 +08004367 }
4368 break;
4369 case HSM_ST:
4370 break;
4371 default:
4372 goto idle_irq;
4373 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004374
Albert Lee312f7da2005-09-27 17:38:03 +08004375 /* check altstatus */
4376 status = ata_altstatus(ap);
4377 if (status & ATA_BUSY)
4378 goto idle_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004379
Albert Lee312f7da2005-09-27 17:38:03 +08004380 /* check main status, clearing INTRQ */
4381 status = ata_chk_status(ap);
4382 if (unlikely(status & ATA_BUSY))
4383 goto idle_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004384
Albert Lee312f7da2005-09-27 17:38:03 +08004385 DPRINTK("ata%u: protocol %d task_state %d (dev_stat 0x%X)\n",
4386 ap->id, qc->tf.protocol, ap->hsm_task_state, status);
4387
4388 /* ack bmdma irq events */
4389 ap->ops->irq_clear(ap);
4390
4391 /* check error */
Albert Leea4f16612005-12-26 16:40:53 +08004392 if (unlikely(status & (ATA_ERR | ATA_DF))) {
4393 qc->err_mask |= AC_ERR_DEV;
Albert Lee312f7da2005-09-27 17:38:03 +08004394 ap->hsm_task_state = HSM_ST_ERR;
Albert Leea4f16612005-12-26 16:40:53 +08004395 }
Albert Lee312f7da2005-09-27 17:38:03 +08004396
4397fsm_start:
4398 switch (ap->hsm_task_state) {
4399 case HSM_ST_FIRST:
4400 /* Some pre-ATAPI-4 devices assert INTRQ
4401 * at this state when ready to receive CDB.
4402 */
4403
4404 /* check device status */
4405 if (unlikely((status & (ATA_BUSY | ATA_DRQ)) != ATA_DRQ)) {
4406 /* Wrong status. Let EH handle this */
Albert Lee555a8962006-02-08 16:50:29 +08004407 qc->err_mask |= AC_ERR_HSM;
Albert Lee312f7da2005-09-27 17:38:03 +08004408 ap->hsm_task_state = HSM_ST_ERR;
4409 goto fsm_start;
4410 }
4411
4412 atapi_send_cdb(ap, qc);
4413
4414 break;
4415
4416 case HSM_ST:
4417 /* complete command or read/write the data register */
4418 if (qc->tf.protocol == ATA_PROT_ATAPI) {
4419 /* ATAPI PIO protocol */
4420 if ((status & ATA_DRQ) == 0) {
4421 /* no more data to transfer */
4422 ap->hsm_task_state = HSM_ST_LAST;
4423 goto fsm_start;
4424 }
4425
4426 atapi_pio_bytes(qc);
4427
4428 if (unlikely(ap->hsm_task_state == HSM_ST_ERR))
4429 /* bad ireason reported by device */
4430 goto fsm_start;
4431
4432 } else {
4433 /* ATA PIO protocol */
4434 if (unlikely((status & ATA_DRQ) == 0)) {
4435 /* handle BSY=0, DRQ=0 as error */
Albert Lee555a8962006-02-08 16:50:29 +08004436 qc->err_mask |= AC_ERR_HSM;
Albert Lee312f7da2005-09-27 17:38:03 +08004437 ap->hsm_task_state = HSM_ST_ERR;
4438 goto fsm_start;
4439 }
4440
Albert Lee07f6f7d2005-11-01 19:33:20 +08004441 ata_pio_sectors(qc);
Albert Lee312f7da2005-09-27 17:38:03 +08004442
4443 if (ap->hsm_task_state == HSM_ST_LAST &&
4444 (!(qc->tf.flags & ATA_TFLAG_WRITE))) {
4445 /* all data read */
4446 ata_altstatus(ap);
4447 status = ata_chk_status(ap);
4448 goto fsm_start;
4449 }
4450 }
4451
4452 ata_altstatus(ap); /* flush */
4453 break;
4454
4455 case HSM_ST_LAST:
4456 if (unlikely(status & ATA_DRQ)) {
4457 /* handle DRQ=1 as error */
Albert Lee555a8962006-02-08 16:50:29 +08004458 qc->err_mask |= AC_ERR_HSM;
Albert Lee312f7da2005-09-27 17:38:03 +08004459 ap->hsm_task_state = HSM_ST_ERR;
4460 goto fsm_start;
4461 }
4462
4463 /* no more data to transfer */
4464 DPRINTK("ata%u: command complete, drv_stat 0x%x\n",
4465 ap->id, status);
4466
4467 ap->hsm_task_state = HSM_ST_IDLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004468
4469 /* complete taskfile transaction */
Albert Leea22e2eb2005-12-05 15:38:02 +08004470 qc->err_mask |= ac_err_mask(status);
4471 ata_qc_complete(qc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004472 break;
4473
Albert Lee312f7da2005-09-27 17:38:03 +08004474 case HSM_ST_ERR:
Albert Lee000080c2005-12-26 16:48:00 +08004475 if (qc->tf.command != ATA_CMD_PACKET)
4476 printk(KERN_ERR "ata%u: command error, drv_stat 0x%x host_stat 0x%x\n",
4477 ap->id, status, host_stat);
Albert Lee312f7da2005-09-27 17:38:03 +08004478
Albert Leea4f16612005-12-26 16:40:53 +08004479 /* make sure qc->err_mask is available to
4480 * know what's wrong and recover
4481 */
Jeff Garzik587005d2006-02-11 18:17:32 -05004482 WARN_ON(qc->err_mask == 0);
Albert Leea4f16612005-12-26 16:40:53 +08004483
Albert Lee312f7da2005-09-27 17:38:03 +08004484 ap->hsm_task_state = HSM_ST_IDLE;
Jeff Garzik278efe92005-12-06 05:01:27 -05004485 ata_qc_complete(qc);
Albert Lee312f7da2005-09-27 17:38:03 +08004486 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004487 default:
4488 goto idle_irq;
4489 }
4490
4491 return 1; /* irq handled */
4492
4493idle_irq:
4494 ap->stats.idle_irq++;
4495
4496#ifdef ATA_IRQ_TRAP
4497 if ((ap->stats.idle_irq % 1000) == 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004498 ata_irq_ack(ap, 0); /* debug trap */
4499 printk(KERN_WARNING "ata%d: irq trap\n", ap->id);
Alan Cox23cfce82006-03-21 16:06:53 +00004500 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004501 }
4502#endif
4503 return 0; /* irq not handled */
4504}
4505
4506/**
4507 * ata_interrupt - Default ATA host interrupt handler
Jeff Garzik0cba6322005-05-30 19:49:12 -04004508 * @irq: irq line (unused)
4509 * @dev_instance: pointer to our ata_host_set information structure
Linus Torvalds1da177e2005-04-16 15:20:36 -07004510 * @regs: unused
4511 *
Jeff Garzik0cba6322005-05-30 19:49:12 -04004512 * Default interrupt handler for PCI IDE devices. Calls
4513 * ata_host_intr() for each port that is not disabled.
4514 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07004515 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04004516 * Obtains host_set lock during operation.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004517 *
4518 * RETURNS:
Jeff Garzik0cba6322005-05-30 19:49:12 -04004519 * IRQ_NONE or IRQ_HANDLED.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004520 */
4521
4522irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
4523{
4524 struct ata_host_set *host_set = dev_instance;
4525 unsigned int i;
4526 unsigned int handled = 0;
4527 unsigned long flags;
4528
4529 /* TODO: make _irqsave conditional on x86 PCI IDE legacy mode */
4530 spin_lock_irqsave(&host_set->lock, flags);
4531
4532 for (i = 0; i < host_set->n_ports; i++) {
4533 struct ata_port *ap;
4534
4535 ap = host_set->ports[i];
Tejun Heoc1389502005-08-22 14:59:24 +09004536 if (ap &&
Albert Lee312f7da2005-09-27 17:38:03 +08004537 !(ap->flags & ATA_FLAG_PORT_DISABLED)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004538 struct ata_queued_cmd *qc;
4539
4540 qc = ata_qc_from_tag(ap, ap->active_tag);
Albert Lee312f7da2005-09-27 17:38:03 +08004541 if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING)) &&
Albert Lee21b1ed72005-04-29 17:34:59 +08004542 (qc->flags & ATA_QCFLAG_ACTIVE))
Linus Torvalds1da177e2005-04-16 15:20:36 -07004543 handled |= ata_host_intr(ap, qc);
4544 }
4545 }
4546
4547 spin_unlock_irqrestore(&host_set->lock, flags);
4548
4549 return IRQ_RETVAL(handled);
4550}
4551
Edward Falk0baab862005-06-02 18:17:13 -04004552
Jens Axboe9b847542006-01-06 09:28:07 +01004553/*
4554 * Execute a 'simple' command, that only consists of the opcode 'cmd' itself,
4555 * without filling any other registers
4556 */
4557static int ata_do_simple_cmd(struct ata_port *ap, struct ata_device *dev,
4558 u8 cmd)
4559{
4560 struct ata_taskfile tf;
4561 int err;
4562
4563 ata_tf_init(ap, &tf, dev->devno);
4564
4565 tf.command = cmd;
4566 tf.flags |= ATA_TFLAG_DEVICE;
4567 tf.protocol = ATA_PROT_NODATA;
4568
4569 err = ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0);
4570 if (err)
4571 printk(KERN_ERR "%s: ata command failed: %d\n",
4572 __FUNCTION__, err);
4573
4574 return err;
4575}
4576
4577static int ata_flush_cache(struct ata_port *ap, struct ata_device *dev)
4578{
4579 u8 cmd;
4580
4581 if (!ata_try_flush_cache(dev))
4582 return 0;
4583
4584 if (ata_id_has_flush_ext(dev->id))
4585 cmd = ATA_CMD_FLUSH_EXT;
4586 else
4587 cmd = ATA_CMD_FLUSH;
4588
4589 return ata_do_simple_cmd(ap, dev, cmd);
4590}
4591
4592static int ata_standby_drive(struct ata_port *ap, struct ata_device *dev)
4593{
4594 return ata_do_simple_cmd(ap, dev, ATA_CMD_STANDBYNOW1);
4595}
4596
4597static int ata_start_drive(struct ata_port *ap, struct ata_device *dev)
4598{
4599 return ata_do_simple_cmd(ap, dev, ATA_CMD_IDLEIMMEDIATE);
4600}
4601
4602/**
4603 * ata_device_resume - wakeup a previously suspended devices
Randy Dunlapc893a3a2006-01-28 13:15:32 -05004604 * @ap: port the device is connected to
4605 * @dev: the device to resume
Jens Axboe9b847542006-01-06 09:28:07 +01004606 *
4607 * Kick the drive back into action, by sending it an idle immediate
4608 * command and making sure its transfer mode matches between drive
4609 * and host.
4610 *
4611 */
4612int ata_device_resume(struct ata_port *ap, struct ata_device *dev)
4613{
4614 if (ap->flags & ATA_FLAG_SUSPENDED) {
4615 ap->flags &= ~ATA_FLAG_SUSPENDED;
4616 ata_set_mode(ap);
4617 }
4618 if (!ata_dev_present(dev))
4619 return 0;
4620 if (dev->class == ATA_DEV_ATA)
4621 ata_start_drive(ap, dev);
4622
4623 return 0;
4624}
4625
4626/**
4627 * ata_device_suspend - prepare a device for suspend
Randy Dunlapc893a3a2006-01-28 13:15:32 -05004628 * @ap: port the device is connected to
4629 * @dev: the device to suspend
Jens Axboe9b847542006-01-06 09:28:07 +01004630 *
4631 * Flush the cache on the drive, if appropriate, then issue a
4632 * standbynow command.
Jens Axboe9b847542006-01-06 09:28:07 +01004633 */
Nigel Cunningham082776e2006-03-23 23:22:16 +10004634int ata_device_suspend(struct ata_port *ap, struct ata_device *dev, pm_message_t state)
Jens Axboe9b847542006-01-06 09:28:07 +01004635{
4636 if (!ata_dev_present(dev))
4637 return 0;
4638 if (dev->class == ATA_DEV_ATA)
4639 ata_flush_cache(ap, dev);
4640
Nigel Cunningham082776e2006-03-23 23:22:16 +10004641 if (state.event != PM_EVENT_FREEZE)
4642 ata_standby_drive(ap, dev);
Jens Axboe9b847542006-01-06 09:28:07 +01004643 ap->flags |= ATA_FLAG_SUSPENDED;
4644 return 0;
4645}
4646
Albert Lee332b5a52006-02-08 16:51:34 +08004647/**
4648 * ata_port_start - Set port up for dma.
4649 * @ap: Port to initialize
4650 *
4651 * Called just after data structures for each port are
4652 * initialized. Allocates space for PRD table.
4653 *
4654 * May be used as the port_start() entry in ata_port_operations.
4655 *
4656 * LOCKING:
4657 * Inherited from caller.
4658 */
4659
Linus Torvalds1da177e2005-04-16 15:20:36 -07004660int ata_port_start (struct ata_port *ap)
4661{
Brian King2f1f6102006-03-23 17:30:15 -06004662 struct device *dev = ap->dev;
Jeff Garzik6037d6b2005-11-04 22:08:00 -05004663 int rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004664
4665 ap->prd = dma_alloc_coherent(dev, ATA_PRD_TBL_SZ, &ap->prd_dma, GFP_KERNEL);
4666 if (!ap->prd)
4667 return -ENOMEM;
4668
Jeff Garzik6037d6b2005-11-04 22:08:00 -05004669 rc = ata_pad_alloc(ap, dev);
4670 if (rc) {
Jeff Garzikcedc9a42005-10-05 07:13:30 -04004671 dma_free_coherent(dev, ATA_PRD_TBL_SZ, ap->prd, ap->prd_dma);
Jeff Garzik6037d6b2005-11-04 22:08:00 -05004672 return rc;
Jeff Garzikcedc9a42005-10-05 07:13:30 -04004673 }
4674
Linus Torvalds1da177e2005-04-16 15:20:36 -07004675 DPRINTK("prd alloc, virt %p, dma %llx\n", ap->prd, (unsigned long long) ap->prd_dma);
4676
4677 return 0;
4678}
4679
Edward Falk0baab862005-06-02 18:17:13 -04004680
4681/**
4682 * ata_port_stop - Undo ata_port_start()
4683 * @ap: Port to shut down
4684 *
4685 * Frees the PRD table.
4686 *
4687 * May be used as the port_stop() entry in ata_port_operations.
4688 *
4689 * LOCKING:
Randy Dunlap6f0ef4f2005-10-25 01:44:30 -04004690 * Inherited from caller.
Edward Falk0baab862005-06-02 18:17:13 -04004691 */
4692
Linus Torvalds1da177e2005-04-16 15:20:36 -07004693void ata_port_stop (struct ata_port *ap)
4694{
Brian King2f1f6102006-03-23 17:30:15 -06004695 struct device *dev = ap->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004696
4697 dma_free_coherent(dev, ATA_PRD_TBL_SZ, ap->prd, ap->prd_dma);
Jeff Garzik6037d6b2005-11-04 22:08:00 -05004698 ata_pad_free(ap, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004699}
4700
Jeff Garzikaa8f0dc2005-05-26 21:54:27 -04004701void ata_host_stop (struct ata_host_set *host_set)
4702{
4703 if (host_set->mmio_base)
4704 iounmap(host_set->mmio_base);
4705}
4706
4707
Linus Torvalds1da177e2005-04-16 15:20:36 -07004708/**
4709 * ata_host_remove - Unregister SCSI host structure with upper layers
4710 * @ap: Port to unregister
4711 * @do_unregister: 1 if we fully unregister, 0 to just stop the port
4712 *
4713 * LOCKING:
Randy Dunlap6f0ef4f2005-10-25 01:44:30 -04004714 * Inherited from caller.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004715 */
4716
4717static void ata_host_remove(struct ata_port *ap, unsigned int do_unregister)
4718{
4719 struct Scsi_Host *sh = ap->host;
4720
4721 DPRINTK("ENTER\n");
4722
4723 if (do_unregister)
4724 scsi_remove_host(sh);
4725
4726 ap->ops->port_stop(ap);
4727}
4728
4729/**
4730 * ata_host_init - Initialize an ata_port structure
4731 * @ap: Structure to initialize
4732 * @host: associated SCSI mid-layer structure
4733 * @host_set: Collection of hosts to which @ap belongs
4734 * @ent: Probe information provided by low-level driver
4735 * @port_no: Port number associated with this ata_port
4736 *
Jeff Garzik0cba6322005-05-30 19:49:12 -04004737 * Initialize a new ata_port structure, and its associated
4738 * scsi_host.
4739 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07004740 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04004741 * Inherited from caller.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004742 */
4743
4744static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host,
4745 struct ata_host_set *host_set,
Jeff Garzik057ace52005-10-22 14:27:05 -04004746 const struct ata_probe_ent *ent, unsigned int port_no)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004747{
4748 unsigned int i;
4749
4750 host->max_id = 16;
4751 host->max_lun = 1;
4752 host->max_channel = 1;
4753 host->unique_id = ata_unique_id++;
4754 host->max_cmd_len = 12;
Christoph Hellwig12413192005-06-11 01:05:01 +02004755
Linus Torvalds1da177e2005-04-16 15:20:36 -07004756 ap->flags = ATA_FLAG_PORT_DISABLED;
4757 ap->id = host->unique_id;
4758 ap->host = host;
4759 ap->ctl = ATA_DEVCTL_OBS;
4760 ap->host_set = host_set;
Brian King2f1f6102006-03-23 17:30:15 -06004761 ap->dev = ent->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004762 ap->port_no = port_no;
4763 ap->hard_port_no =
4764 ent->legacy_mode ? ent->hard_port_no : port_no;
4765 ap->pio_mask = ent->pio_mask;
4766 ap->mwdma_mask = ent->mwdma_mask;
4767 ap->udma_mask = ent->udma_mask;
4768 ap->flags |= ent->host_flags;
4769 ap->ops = ent->port_ops;
4770 ap->cbl = ATA_CBL_NONE;
4771 ap->active_tag = ATA_TAG_POISON;
4772 ap->last_ctl = 0xFF;
4773
Tejun Heo86e45b62006-03-05 15:29:09 +09004774 INIT_WORK(&ap->port_task, NULL, NULL);
Tejun Heoa72ec4c2006-01-23 13:09:37 +09004775 INIT_LIST_HEAD(&ap->eh_done_q);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004776
Tejun Heoacf356b2006-03-24 14:07:50 +09004777 for (i = 0; i < ATA_MAX_DEVICES; i++) {
4778 struct ata_device *dev = &ap->device[i];
4779 dev->devno = i;
4780 dev->pio_mask = UINT_MAX;
4781 dev->mwdma_mask = UINT_MAX;
4782 dev->udma_mask = UINT_MAX;
4783 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004784
4785#ifdef ATA_IRQ_TRAP
4786 ap->stats.unhandled_irq = 1;
4787 ap->stats.idle_irq = 1;
4788#endif
4789
4790 memcpy(&ap->ioaddr, &ent->port[port_no], sizeof(struct ata_ioports));
4791}
4792
4793/**
4794 * ata_host_add - Attach low-level ATA driver to system
4795 * @ent: Information provided by low-level driver
4796 * @host_set: Collections of ports to which we add
4797 * @port_no: Port number associated with this host
4798 *
Jeff Garzik0cba6322005-05-30 19:49:12 -04004799 * Attach low-level ATA driver to system.
4800 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07004801 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04004802 * PCI/etc. bus probe sem.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004803 *
4804 * RETURNS:
Jeff Garzik0cba6322005-05-30 19:49:12 -04004805 * New ata_port on success, for NULL on error.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004806 */
4807
Jeff Garzik057ace52005-10-22 14:27:05 -04004808static struct ata_port * ata_host_add(const struct ata_probe_ent *ent,
Linus Torvalds1da177e2005-04-16 15:20:36 -07004809 struct ata_host_set *host_set,
4810 unsigned int port_no)
4811{
4812 struct Scsi_Host *host;
4813 struct ata_port *ap;
4814 int rc;
4815
4816 DPRINTK("ENTER\n");
Tejun Heoaec5c3c2006-03-25 01:33:34 +09004817
4818 if (!ent->port_ops->probe_reset &&
4819 !(ent->host_flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST))) {
4820 printk(KERN_ERR "ata%u: no reset mechanism available\n",
4821 port_no);
4822 return NULL;
4823 }
4824
Linus Torvalds1da177e2005-04-16 15:20:36 -07004825 host = scsi_host_alloc(ent->sht, sizeof(struct ata_port));
4826 if (!host)
4827 return NULL;
4828
Tejun Heo30afc842006-03-18 18:40:14 +09004829 host->transportt = &ata_scsi_transport_template;
4830
Linus Torvalds1da177e2005-04-16 15:20:36 -07004831 ap = (struct ata_port *) &host->hostdata[0];
4832
4833 ata_host_init(ap, host, host_set, ent, port_no);
4834
4835 rc = ap->ops->port_start(ap);
4836 if (rc)
4837 goto err_out;
4838
4839 return ap;
4840
4841err_out:
4842 scsi_host_put(host);
4843 return NULL;
4844}
4845
4846/**
Jeff Garzik0cba6322005-05-30 19:49:12 -04004847 * ata_device_add - Register hardware device with ATA and SCSI layers
4848 * @ent: Probe information describing hardware device to be registered
4849 *
4850 * This function processes the information provided in the probe
4851 * information struct @ent, allocates the necessary ATA and SCSI
4852 * host information structures, initializes them, and registers
4853 * everything with requisite kernel subsystems.
4854 *
4855 * This function requests irqs, probes the ATA bus, and probes
4856 * the SCSI bus.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004857 *
4858 * LOCKING:
Jeff Garzik0cba6322005-05-30 19:49:12 -04004859 * PCI/etc. bus probe sem.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004860 *
4861 * RETURNS:
Jeff Garzik0cba6322005-05-30 19:49:12 -04004862 * Number of ports registered. Zero on error (no ports registered).
Linus Torvalds1da177e2005-04-16 15:20:36 -07004863 */
4864
Jeff Garzik057ace52005-10-22 14:27:05 -04004865int ata_device_add(const struct ata_probe_ent *ent)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004866{
4867 unsigned int count = 0, i;
4868 struct device *dev = ent->dev;
4869 struct ata_host_set *host_set;
4870
4871 DPRINTK("ENTER\n");
4872 /* alloc a container for our list of ATA ports (buses) */
Randy Dunlap57f3bda2005-10-28 20:37:23 -07004873 host_set = kzalloc(sizeof(struct ata_host_set) +
Linus Torvalds1da177e2005-04-16 15:20:36 -07004874 (ent->n_ports * sizeof(void *)), GFP_KERNEL);
4875 if (!host_set)
4876 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004877 spin_lock_init(&host_set->lock);
4878
4879 host_set->dev = dev;
4880 host_set->n_ports = ent->n_ports;
4881 host_set->irq = ent->irq;
4882 host_set->mmio_base = ent->mmio_base;
4883 host_set->private_data = ent->private_data;
4884 host_set->ops = ent->port_ops;
4885
4886 /* register each port bound to this device */
4887 for (i = 0; i < ent->n_ports; i++) {
4888 struct ata_port *ap;
4889 unsigned long xfer_mode_mask;
4890
4891 ap = ata_host_add(ent, host_set, i);
4892 if (!ap)
4893 goto err_out;
4894
4895 host_set->ports[i] = ap;
4896 xfer_mode_mask =(ap->udma_mask << ATA_SHIFT_UDMA) |
4897 (ap->mwdma_mask << ATA_SHIFT_MWDMA) |
4898 (ap->pio_mask << ATA_SHIFT_PIO);
4899
4900 /* print per-port info to dmesg */
4901 printk(KERN_INFO "ata%u: %cATA max %s cmd 0x%lX ctl 0x%lX "
4902 "bmdma 0x%lX irq %lu\n",
4903 ap->id,
4904 ap->flags & ATA_FLAG_SATA ? 'S' : 'P',
4905 ata_mode_string(xfer_mode_mask),
4906 ap->ioaddr.cmd_addr,
4907 ap->ioaddr.ctl_addr,
4908 ap->ioaddr.bmdma_addr,
4909 ent->irq);
4910
4911 ata_chk_status(ap);
4912 host_set->ops->irq_clear(ap);
4913 count++;
4914 }
4915
Randy Dunlap57f3bda2005-10-28 20:37:23 -07004916 if (!count)
4917 goto err_free_ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004918
4919 /* obtain irq, that is shared between channels */
4920 if (request_irq(ent->irq, ent->port_ops->irq_handler, ent->irq_flags,
4921 DRV_NAME, host_set))
4922 goto err_out;
4923
4924 /* perform each probe synchronously */
4925 DPRINTK("probe begin\n");
4926 for (i = 0; i < count; i++) {
4927 struct ata_port *ap;
4928 int rc;
4929
4930 ap = host_set->ports[i];
4931
Randy Dunlapc893a3a2006-01-28 13:15:32 -05004932 DPRINTK("ata%u: bus probe begin\n", ap->id);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004933 rc = ata_bus_probe(ap);
Randy Dunlapc893a3a2006-01-28 13:15:32 -05004934 DPRINTK("ata%u: bus probe end\n", ap->id);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004935
4936 if (rc) {
4937 /* FIXME: do something useful here?
4938 * Current libata behavior will
4939 * tear down everything when
4940 * the module is removed
4941 * or the h/w is unplugged.
4942 */
4943 }
4944
4945 rc = scsi_add_host(ap->host, dev);
4946 if (rc) {
4947 printk(KERN_ERR "ata%u: scsi_add_host failed\n",
4948 ap->id);
4949 /* FIXME: do something useful here */
4950 /* FIXME: handle unconditional calls to
4951 * scsi_scan_host and ata_host_remove, below,
4952 * at the very least
4953 */
4954 }
4955 }
4956
4957 /* probes are done, now scan each port's disk(s) */
Randy Dunlapc893a3a2006-01-28 13:15:32 -05004958 DPRINTK("host probe begin\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07004959 for (i = 0; i < count; i++) {
4960 struct ata_port *ap = host_set->ports[i];
4961
Jeff Garzik644dd0c2005-10-03 15:55:19 -04004962 ata_scsi_scan_host(ap);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004963 }
4964
4965 dev_set_drvdata(dev, host_set);
4966
4967 VPRINTK("EXIT, returning %u\n", ent->n_ports);
4968 return ent->n_ports; /* success */
4969
4970err_out:
4971 for (i = 0; i < count; i++) {
4972 ata_host_remove(host_set->ports[i], 1);
4973 scsi_host_put(host_set->ports[i]->host);
4974 }
Randy Dunlap57f3bda2005-10-28 20:37:23 -07004975err_free_ret:
Linus Torvalds1da177e2005-04-16 15:20:36 -07004976 kfree(host_set);
4977 VPRINTK("EXIT, returning 0\n");
4978 return 0;
4979}
4980
4981/**
Alan Cox17b14452005-09-15 15:44:00 +01004982 * ata_host_set_remove - PCI layer callback for device removal
4983 * @host_set: ATA host set that was removed
4984 *
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05004985 * Unregister all objects associated with this host set. Free those
Alan Cox17b14452005-09-15 15:44:00 +01004986 * objects.
4987 *
4988 * LOCKING:
4989 * Inherited from calling layer (may sleep).
4990 */
4991
Alan Cox17b14452005-09-15 15:44:00 +01004992void ata_host_set_remove(struct ata_host_set *host_set)
4993{
4994 struct ata_port *ap;
4995 unsigned int i;
4996
4997 for (i = 0; i < host_set->n_ports; i++) {
4998 ap = host_set->ports[i];
4999 scsi_remove_host(ap->host);
5000 }
5001
5002 free_irq(host_set->irq, host_set);
5003
5004 for (i = 0; i < host_set->n_ports; i++) {
5005 ap = host_set->ports[i];
5006
5007 ata_scsi_release(ap->host);
5008
5009 if ((ap->flags & ATA_FLAG_NO_LEGACY) == 0) {
5010 struct ata_ioports *ioaddr = &ap->ioaddr;
5011
5012 if (ioaddr->cmd_addr == 0x1f0)
5013 release_region(0x1f0, 8);
5014 else if (ioaddr->cmd_addr == 0x170)
5015 release_region(0x170, 8);
5016 }
5017
5018 scsi_host_put(ap->host);
5019 }
5020
5021 if (host_set->ops->host_stop)
5022 host_set->ops->host_stop(host_set);
5023
5024 kfree(host_set);
5025}
5026
5027/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07005028 * ata_scsi_release - SCSI layer callback hook for host unload
5029 * @host: libata host to be unloaded
5030 *
5031 * Performs all duties necessary to shut down a libata port...
5032 * Kill port kthread, disable port, and release resources.
5033 *
5034 * LOCKING:
5035 * Inherited from SCSI layer.
5036 *
5037 * RETURNS:
5038 * One.
5039 */
5040
5041int ata_scsi_release(struct Scsi_Host *host)
5042{
5043 struct ata_port *ap = (struct ata_port *) &host->hostdata[0];
Tejun Heod9572b12006-03-01 16:09:35 +09005044 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005045
5046 DPRINTK("ENTER\n");
5047
5048 ap->ops->port_disable(ap);
5049 ata_host_remove(ap, 0);
Tejun Heod9572b12006-03-01 16:09:35 +09005050 for (i = 0; i < ATA_MAX_DEVICES; i++)
5051 kfree(ap->device[i].id);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005052
5053 DPRINTK("EXIT\n");
5054 return 1;
5055}
5056
5057/**
5058 * ata_std_ports - initialize ioaddr with standard port offsets.
5059 * @ioaddr: IO address structure to be initialized
Edward Falk0baab862005-06-02 18:17:13 -04005060 *
5061 * Utility function which initializes data_addr, error_addr,
5062 * feature_addr, nsect_addr, lbal_addr, lbam_addr, lbah_addr,
5063 * device_addr, status_addr, and command_addr to standard offsets
5064 * relative to cmd_addr.
5065 *
5066 * Does not set ctl_addr, altstatus_addr, bmdma_addr, or scr_addr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005067 */
Edward Falk0baab862005-06-02 18:17:13 -04005068
Linus Torvalds1da177e2005-04-16 15:20:36 -07005069void ata_std_ports(struct ata_ioports *ioaddr)
5070{
5071 ioaddr->data_addr = ioaddr->cmd_addr + ATA_REG_DATA;
5072 ioaddr->error_addr = ioaddr->cmd_addr + ATA_REG_ERR;
5073 ioaddr->feature_addr = ioaddr->cmd_addr + ATA_REG_FEATURE;
5074 ioaddr->nsect_addr = ioaddr->cmd_addr + ATA_REG_NSECT;
5075 ioaddr->lbal_addr = ioaddr->cmd_addr + ATA_REG_LBAL;
5076 ioaddr->lbam_addr = ioaddr->cmd_addr + ATA_REG_LBAM;
5077 ioaddr->lbah_addr = ioaddr->cmd_addr + ATA_REG_LBAH;
5078 ioaddr->device_addr = ioaddr->cmd_addr + ATA_REG_DEVICE;
5079 ioaddr->status_addr = ioaddr->cmd_addr + ATA_REG_STATUS;
5080 ioaddr->command_addr = ioaddr->cmd_addr + ATA_REG_CMD;
5081}
5082
Edward Falk0baab862005-06-02 18:17:13 -04005083
Jeff Garzik374b1872005-08-30 05:42:52 -04005084#ifdef CONFIG_PCI
5085
5086void ata_pci_host_stop (struct ata_host_set *host_set)
5087{
5088 struct pci_dev *pdev = to_pci_dev(host_set->dev);
5089
5090 pci_iounmap(pdev, host_set->mmio_base);
5091}
5092
Edward Falk0baab862005-06-02 18:17:13 -04005093/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07005094 * ata_pci_remove_one - PCI layer callback for device removal
5095 * @pdev: PCI device that was removed
5096 *
5097 * PCI layer indicates to libata via this hook that
Randy Dunlap6f0ef4f2005-10-25 01:44:30 -04005098 * hot-unplug or module unload event has occurred.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005099 * Handle this by unregistering all objects associated
5100 * with this PCI device. Free those objects. Then finally
5101 * release PCI resources and disable device.
5102 *
5103 * LOCKING:
5104 * Inherited from PCI layer (may sleep).
5105 */
5106
5107void ata_pci_remove_one (struct pci_dev *pdev)
5108{
5109 struct device *dev = pci_dev_to_dev(pdev);
5110 struct ata_host_set *host_set = dev_get_drvdata(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005111
Alan Cox17b14452005-09-15 15:44:00 +01005112 ata_host_set_remove(host_set);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005113 pci_release_regions(pdev);
5114 pci_disable_device(pdev);
5115 dev_set_drvdata(dev, NULL);
5116}
5117
5118/* move to PCI subsystem */
Jeff Garzik057ace52005-10-22 14:27:05 -04005119int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005120{
5121 unsigned long tmp = 0;
5122
5123 switch (bits->width) {
5124 case 1: {
5125 u8 tmp8 = 0;
5126 pci_read_config_byte(pdev, bits->reg, &tmp8);
5127 tmp = tmp8;
5128 break;
5129 }
5130 case 2: {
5131 u16 tmp16 = 0;
5132 pci_read_config_word(pdev, bits->reg, &tmp16);
5133 tmp = tmp16;
5134 break;
5135 }
5136 case 4: {
5137 u32 tmp32 = 0;
5138 pci_read_config_dword(pdev, bits->reg, &tmp32);
5139 tmp = tmp32;
5140 break;
5141 }
5142
5143 default:
5144 return -EINVAL;
5145 }
5146
5147 tmp &= bits->mask;
5148
5149 return (tmp == bits->val) ? 1 : 0;
5150}
Jens Axboe9b847542006-01-06 09:28:07 +01005151
5152int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t state)
5153{
5154 pci_save_state(pdev);
5155 pci_disable_device(pdev);
5156 pci_set_power_state(pdev, PCI_D3hot);
5157 return 0;
5158}
5159
5160int ata_pci_device_resume(struct pci_dev *pdev)
5161{
5162 pci_set_power_state(pdev, PCI_D0);
5163 pci_restore_state(pdev);
5164 pci_enable_device(pdev);
5165 pci_set_master(pdev);
5166 return 0;
5167}
Linus Torvalds1da177e2005-04-16 15:20:36 -07005168#endif /* CONFIG_PCI */
5169
5170
Linus Torvalds1da177e2005-04-16 15:20:36 -07005171static int __init ata_init(void)
5172{
5173 ata_wq = create_workqueue("ata");
5174 if (!ata_wq)
5175 return -ENOMEM;
5176
5177 printk(KERN_DEBUG "libata version " DRV_VERSION " loaded.\n");
5178 return 0;
5179}
5180
5181static void __exit ata_exit(void)
5182{
5183 destroy_workqueue(ata_wq);
5184}
5185
5186module_init(ata_init);
5187module_exit(ata_exit);
5188
Jeff Garzik67846b32005-10-05 02:58:32 -04005189static unsigned long ratelimit_time;
5190static spinlock_t ata_ratelimit_lock = SPIN_LOCK_UNLOCKED;
5191
5192int ata_ratelimit(void)
5193{
5194 int rc;
5195 unsigned long flags;
5196
5197 spin_lock_irqsave(&ata_ratelimit_lock, flags);
5198
5199 if (time_after(jiffies, ratelimit_time)) {
5200 rc = 1;
5201 ratelimit_time = jiffies + (HZ/5);
5202 } else
5203 rc = 0;
5204
5205 spin_unlock_irqrestore(&ata_ratelimit_lock, flags);
5206
5207 return rc;
5208}
5209
Linus Torvalds1da177e2005-04-16 15:20:36 -07005210/*
5211 * libata is essentially a library of internal helper functions for
5212 * low-level ATA host controller drivers. As such, the API/ABI is
5213 * likely to change as new drivers are added and updated.
5214 * Do not depend on ABI/API stability.
5215 */
5216
5217EXPORT_SYMBOL_GPL(ata_std_bios_param);
5218EXPORT_SYMBOL_GPL(ata_std_ports);
5219EXPORT_SYMBOL_GPL(ata_device_add);
Alan Cox17b14452005-09-15 15:44:00 +01005220EXPORT_SYMBOL_GPL(ata_host_set_remove);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005221EXPORT_SYMBOL_GPL(ata_sg_init);
5222EXPORT_SYMBOL_GPL(ata_sg_init_one);
Tejun Heo76014422006-02-11 15:13:49 +09005223EXPORT_SYMBOL_GPL(__ata_qc_complete);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005224EXPORT_SYMBOL_GPL(ata_qc_issue_prot);
5225EXPORT_SYMBOL_GPL(ata_eng_timeout);
5226EXPORT_SYMBOL_GPL(ata_tf_load);
5227EXPORT_SYMBOL_GPL(ata_tf_read);
5228EXPORT_SYMBOL_GPL(ata_noop_dev_select);
5229EXPORT_SYMBOL_GPL(ata_std_dev_select);
5230EXPORT_SYMBOL_GPL(ata_tf_to_fis);
5231EXPORT_SYMBOL_GPL(ata_tf_from_fis);
5232EXPORT_SYMBOL_GPL(ata_check_status);
5233EXPORT_SYMBOL_GPL(ata_altstatus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005234EXPORT_SYMBOL_GPL(ata_exec_command);
5235EXPORT_SYMBOL_GPL(ata_port_start);
5236EXPORT_SYMBOL_GPL(ata_port_stop);
Jeff Garzikaa8f0dc2005-05-26 21:54:27 -04005237EXPORT_SYMBOL_GPL(ata_host_stop);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005238EXPORT_SYMBOL_GPL(ata_interrupt);
5239EXPORT_SYMBOL_GPL(ata_qc_prep);
Brian Kinge46834c2006-03-17 17:04:03 -06005240EXPORT_SYMBOL_GPL(ata_noop_qc_prep);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005241EXPORT_SYMBOL_GPL(ata_bmdma_setup);
5242EXPORT_SYMBOL_GPL(ata_bmdma_start);
5243EXPORT_SYMBOL_GPL(ata_bmdma_irq_clear);
5244EXPORT_SYMBOL_GPL(ata_bmdma_status);
5245EXPORT_SYMBOL_GPL(ata_bmdma_stop);
5246EXPORT_SYMBOL_GPL(ata_port_probe);
5247EXPORT_SYMBOL_GPL(sata_phy_reset);
5248EXPORT_SYMBOL_GPL(__sata_phy_reset);
5249EXPORT_SYMBOL_GPL(ata_bus_reset);
Tejun Heo8a19ac82006-02-02 18:20:00 +09005250EXPORT_SYMBOL_GPL(ata_std_probeinit);
Tejun Heoc2bd5802006-01-24 17:05:22 +09005251EXPORT_SYMBOL_GPL(ata_std_softreset);
5252EXPORT_SYMBOL_GPL(sata_std_hardreset);
5253EXPORT_SYMBOL_GPL(ata_std_postreset);
5254EXPORT_SYMBOL_GPL(ata_std_probe_reset);
Tejun Heoa62c0fc2006-01-24 17:05:22 +09005255EXPORT_SYMBOL_GPL(ata_drive_probe_reset);
Tejun Heo623a3122006-03-05 17:55:58 +09005256EXPORT_SYMBOL_GPL(ata_dev_revalidate);
Jeff Garzik2e9edbf2006-03-24 09:56:57 -05005257EXPORT_SYMBOL_GPL(ata_dev_classify);
5258EXPORT_SYMBOL_GPL(ata_dev_pair);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005259EXPORT_SYMBOL_GPL(ata_port_disable);
Jeff Garzik67846b32005-10-05 02:58:32 -04005260EXPORT_SYMBOL_GPL(ata_ratelimit);
Tejun Heo6f8b9952006-01-24 17:05:21 +09005261EXPORT_SYMBOL_GPL(ata_busy_sleep);
Tejun Heo86e45b62006-03-05 15:29:09 +09005262EXPORT_SYMBOL_GPL(ata_port_queue_task);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005263EXPORT_SYMBOL_GPL(ata_scsi_ioctl);
5264EXPORT_SYMBOL_GPL(ata_scsi_queuecmd);
5265EXPORT_SYMBOL_GPL(ata_scsi_error);
5266EXPORT_SYMBOL_GPL(ata_scsi_slave_config);
5267EXPORT_SYMBOL_GPL(ata_scsi_release);
5268EXPORT_SYMBOL_GPL(ata_host_intr);
Tejun Heo6a62a042006-02-13 10:02:46 +09005269EXPORT_SYMBOL_GPL(ata_id_string);
5270EXPORT_SYMBOL_GPL(ata_id_c_string);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005271EXPORT_SYMBOL_GPL(ata_scsi_simulate);
Tejun Heoa72ec4c2006-01-23 13:09:37 +09005272EXPORT_SYMBOL_GPL(ata_eh_qc_complete);
5273EXPORT_SYMBOL_GPL(ata_eh_qc_retry);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005274
Alan Cox1bc4ccf2006-01-09 17:18:14 +00005275EXPORT_SYMBOL_GPL(ata_pio_need_iordy);
Alan Cox452503f2005-10-21 19:01:32 -04005276EXPORT_SYMBOL_GPL(ata_timing_compute);
5277EXPORT_SYMBOL_GPL(ata_timing_merge);
5278
Linus Torvalds1da177e2005-04-16 15:20:36 -07005279#ifdef CONFIG_PCI
5280EXPORT_SYMBOL_GPL(pci_test_config_bits);
Jeff Garzik374b1872005-08-30 05:42:52 -04005281EXPORT_SYMBOL_GPL(ata_pci_host_stop);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005282EXPORT_SYMBOL_GPL(ata_pci_init_native_mode);
5283EXPORT_SYMBOL_GPL(ata_pci_init_one);
5284EXPORT_SYMBOL_GPL(ata_pci_remove_one);
Jens Axboe9b847542006-01-06 09:28:07 +01005285EXPORT_SYMBOL_GPL(ata_pci_device_suspend);
5286EXPORT_SYMBOL_GPL(ata_pci_device_resume);
Alan Cox67951ad2006-03-22 15:55:54 +00005287EXPORT_SYMBOL_GPL(ata_pci_default_filter);
5288EXPORT_SYMBOL_GPL(ata_pci_clear_simplex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005289#endif /* CONFIG_PCI */
Jens Axboe9b847542006-01-06 09:28:07 +01005290
5291EXPORT_SYMBOL_GPL(ata_device_suspend);
5292EXPORT_SYMBOL_GPL(ata_device_resume);
5293EXPORT_SYMBOL_GPL(ata_scsi_device_suspend);
5294EXPORT_SYMBOL_GPL(ata_scsi_device_resume);