blob: 724b7d1c18ea2223da214cbf85c264b29be384fb [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 Copyright 2003-2004 Red Hat, Inc. All rights reserved.
3 Copyright 2003-2004 Jeff Garzik
4
5 The contents of this file are subject to the Open
6 Software License version 1.1 that can be found at
7 http://www.opensource.org/licenses/osl-1.1.txt and is included herein
8 by reference.
9
10 Alternatively, the contents of this file may be used under the terms
11 of the GNU General Public License version 2 (the "GPL") as distributed
12 in the kernel source COPYING file, in which case the provisions of
13 the GPL are applicable instead of the above. If you wish to allow
14 the use of your version of this file only under the terms of the
15 GPL and not to allow others to use your version of this file under
16 the OSL, indicate your decision by deleting the provisions above and
17 replace them with the notice and other provisions required by the GPL.
18 If you do not delete the provisions above, a recipient may use your
19 version of this file under either the OSL or the GPL.
20
21 */
22
23#ifndef __LINUX_LIBATA_H__
24#define __LINUX_LIBATA_H__
25
26#include <linux/delay.h>
27#include <linux/interrupt.h>
28#include <linux/pci.h>
29#include <asm/io.h>
30#include <linux/ata.h>
31#include <linux/workqueue.h>
32
33/*
34 * compile-time options
35 */
36#undef ATA_DEBUG /* debugging output */
37#undef ATA_VERBOSE_DEBUG /* yet more debugging output */
38#undef ATA_IRQ_TRAP /* define to ack screaming irqs */
39#undef ATA_NDEBUG /* define to disable quick runtime checks */
40#undef ATA_ENABLE_ATAPI /* define to enable ATAPI support */
41#undef ATA_ENABLE_PATA /* define to enable PATA support in some
42 * low-level drivers */
43#undef ATAPI_ENABLE_DMADIR /* enables ATAPI DMADIR bridge support */
44
45
46/* note: prints function name for you */
47#ifdef ATA_DEBUG
48#define DPRINTK(fmt, args...) printk(KERN_ERR "%s: " fmt, __FUNCTION__, ## args)
49#ifdef ATA_VERBOSE_DEBUG
50#define VPRINTK(fmt, args...) printk(KERN_ERR "%s: " fmt, __FUNCTION__, ## args)
51#else
52#define VPRINTK(fmt, args...)
53#endif /* ATA_VERBOSE_DEBUG */
54#else
55#define DPRINTK(fmt, args...)
56#define VPRINTK(fmt, args...)
57#endif /* ATA_DEBUG */
58
59#ifdef ATA_NDEBUG
60#define assert(expr)
61#else
62#define assert(expr) \
63 if(unlikely(!(expr))) { \
64 printk(KERN_ERR "Assertion failed! %s,%s,%s,line=%d\n", \
65 #expr,__FILE__,__FUNCTION__,__LINE__); \
66 }
67#endif
68
69/* defines only for the constants which don't work well as enums */
70#define ATA_TAG_POISON 0xfafbfcfdU
71
72/* move to PCI layer? */
73static inline struct device *pci_dev_to_dev(struct pci_dev *pdev)
74{
75 return &pdev->dev;
76}
77
78enum {
79 /* various global constants */
80 LIBATA_MAX_PRD = ATA_MAX_PRD / 2,
81 ATA_MAX_PORTS = 8,
82 ATA_DEF_QUEUE = 1,
83 ATA_MAX_QUEUE = 1,
84 ATA_MAX_SECTORS = 200, /* FIXME */
85 ATA_MAX_BUS = 2,
86 ATA_DEF_BUSY_WAIT = 10000,
87 ATA_SHORT_PAUSE = (HZ >> 6) + 1,
88
89 ATA_SHT_EMULATED = 1,
90 ATA_SHT_CMD_PER_LUN = 1,
91 ATA_SHT_THIS_ID = -1,
92 ATA_SHT_USE_CLUSTERING = 0,
93
94 /* struct ata_device stuff */
95 ATA_DFLAG_LBA48 = (1 << 0), /* device supports LBA48 */
96 ATA_DFLAG_PIO = (1 << 1), /* device currently in PIO mode */
97 ATA_DFLAG_LOCK_SECTORS = (1 << 2), /* don't adjust max_sectors */
98
99 ATA_DEV_UNKNOWN = 0, /* unknown device */
100 ATA_DEV_ATA = 1, /* ATA device */
101 ATA_DEV_ATA_UNSUP = 2, /* ATA device (unsupported) */
102 ATA_DEV_ATAPI = 3, /* ATAPI device */
103 ATA_DEV_ATAPI_UNSUP = 4, /* ATAPI device (unsupported) */
104 ATA_DEV_NONE = 5, /* no device */
105
106 /* struct ata_port flags */
107 ATA_FLAG_SLAVE_POSS = (1 << 1), /* host supports slave dev */
108 /* (doesn't imply presence) */
109 ATA_FLAG_PORT_DISABLED = (1 << 2), /* port is disabled, ignore it */
110 ATA_FLAG_SATA = (1 << 3),
111 ATA_FLAG_NO_LEGACY = (1 << 4), /* no legacy mode check */
112 ATA_FLAG_SRST = (1 << 5), /* use ATA SRST, not E.D.D. */
113 ATA_FLAG_MMIO = (1 << 6), /* use MMIO, not PIO */
114 ATA_FLAG_SATA_RESET = (1 << 7), /* use COMRESET */
115 ATA_FLAG_PIO_DMA = (1 << 8), /* PIO cmds via DMA */
Tejun Heoc1389502005-08-22 14:59:24 +0900116 ATA_FLAG_NOINTR = (1 << 9), /* FIXME: Remove this once
117 * proper HSM is in place. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700118
119 ATA_QCFLAG_ACTIVE = (1 << 1), /* cmd not yet ack'd to scsi lyer */
120 ATA_QCFLAG_SG = (1 << 3), /* have s/g table? */
121 ATA_QCFLAG_SINGLE = (1 << 4), /* no s/g, just a single buffer */
122 ATA_QCFLAG_DMAMAP = ATA_QCFLAG_SG | ATA_QCFLAG_SINGLE,
123
124 /* various lengths of time */
125 ATA_TMOUT_EDD = 5 * HZ, /* hueristic */
126 ATA_TMOUT_PIO = 30 * HZ,
127 ATA_TMOUT_BOOT = 30 * HZ, /* hueristic */
128 ATA_TMOUT_BOOT_QUICK = 7 * HZ, /* hueristic */
129 ATA_TMOUT_CDB = 30 * HZ,
130 ATA_TMOUT_CDB_QUICK = 5 * HZ,
131
132 /* ATA bus states */
133 BUS_UNKNOWN = 0,
134 BUS_DMA = 1,
135 BUS_IDLE = 2,
136 BUS_NOINTR = 3,
137 BUS_NODATA = 4,
138 BUS_TIMER = 5,
139 BUS_PIO = 6,
140 BUS_EDD = 7,
141 BUS_IDENTIFY = 8,
142 BUS_PACKET = 9,
143
144 /* SATA port states */
145 PORT_UNKNOWN = 0,
146 PORT_ENABLED = 1,
147 PORT_DISABLED = 2,
148
149 /* encoding various smaller bitmaps into a single
150 * unsigned long bitmap
151 */
152 ATA_SHIFT_UDMA = 0,
153 ATA_SHIFT_MWDMA = 8,
154 ATA_SHIFT_PIO = 11,
155};
156
157enum pio_task_states {
158 PIO_ST_UNKNOWN,
159 PIO_ST_IDLE,
160 PIO_ST_POLL,
161 PIO_ST_TMOUT,
162 PIO_ST,
163 PIO_ST_LAST,
164 PIO_ST_LAST_POLL,
165 PIO_ST_ERR,
166};
167
168/* forward declarations */
169struct scsi_device;
170struct ata_port_operations;
171struct ata_port;
172struct ata_queued_cmd;
173
174/* typedefs */
175typedef int (*ata_qc_cb_t) (struct ata_queued_cmd *qc, u8 drv_stat);
176
177struct ata_ioports {
178 unsigned long cmd_addr;
179 unsigned long data_addr;
180 unsigned long error_addr;
181 unsigned long feature_addr;
182 unsigned long nsect_addr;
183 unsigned long lbal_addr;
184 unsigned long lbam_addr;
185 unsigned long lbah_addr;
186 unsigned long device_addr;
187 unsigned long status_addr;
188 unsigned long command_addr;
189 unsigned long altstatus_addr;
190 unsigned long ctl_addr;
191 unsigned long bmdma_addr;
192 unsigned long scr_addr;
193};
194
195struct ata_probe_ent {
196 struct list_head node;
197 struct device *dev;
198 struct ata_port_operations *port_ops;
199 Scsi_Host_Template *sht;
200 struct ata_ioports port[ATA_MAX_PORTS];
201 unsigned int n_ports;
202 unsigned int hard_port_no;
203 unsigned int pio_mask;
204 unsigned int mwdma_mask;
205 unsigned int udma_mask;
206 unsigned int legacy_mode;
207 unsigned long irq;
208 unsigned int irq_flags;
209 unsigned long host_flags;
210 void __iomem *mmio_base;
211 void *private_data;
212};
213
214struct ata_host_set {
215 spinlock_t lock;
216 struct device *dev;
217 unsigned long irq;
218 void __iomem *mmio_base;
219 unsigned int n_ports;
220 void *private_data;
221 struct ata_port_operations *ops;
222 struct ata_port * ports[0];
223};
224
225struct ata_queued_cmd {
226 struct ata_port *ap;
227 struct ata_device *dev;
228
229 struct scsi_cmnd *scsicmd;
230 void (*scsidone)(struct scsi_cmnd *);
231
232 struct ata_taskfile tf;
233 u8 cdb[ATAPI_CDB_LEN];
234
235 unsigned long flags; /* ATA_QCFLAG_xxx */
236 unsigned int tag;
237 unsigned int n_elem;
238
239 int dma_dir;
240
241 unsigned int nsect;
242 unsigned int cursect;
243
244 unsigned int nbytes;
245 unsigned int curbytes;
246
247 unsigned int cursg;
248 unsigned int cursg_ofs;
249
250 struct scatterlist sgent;
251 void *buf_virt;
252
253 struct scatterlist *sg;
254
255 ata_qc_cb_t complete_fn;
256
257 struct completion *waiting;
258
259 void *private_data;
260};
261
262struct ata_host_stats {
263 unsigned long unhandled_irq;
264 unsigned long idle_irq;
265 unsigned long rw_reqbuf;
266};
267
268struct ata_device {
269 u64 n_sectors; /* size of device, if ATA */
270 unsigned long flags; /* ATA_DFLAG_xxx */
271 unsigned int class; /* ATA_DEV_xxx */
272 unsigned int devno; /* 0 or 1 */
273 u16 id[ATA_ID_WORDS]; /* IDENTIFY xxx DEVICE data */
274 u8 pio_mode;
275 u8 dma_mode;
276 u8 xfer_mode;
277 unsigned int xfer_shift; /* ATA_SHIFT_xxx */
278
279 /* cache info about current transfer mode */
280 u8 xfer_protocol; /* taskfile xfer protocol */
281 u8 read_cmd; /* opcode to use on read */
282 u8 write_cmd; /* opcode to use on write */
283};
284
285struct ata_port {
286 struct Scsi_Host *host; /* our co-allocated scsi host */
287 struct ata_port_operations *ops;
288 unsigned long flags; /* ATA_FLAG_xxx */
289 unsigned int id; /* unique id req'd by scsi midlyr */
290 unsigned int port_no; /* unique port #; from zero */
291 unsigned int hard_port_no; /* hardware port #; from zero */
292
293 struct ata_prd *prd; /* our SG list */
294 dma_addr_t prd_dma; /* and its DMA mapping */
295
296 struct ata_ioports ioaddr; /* ATA cmd/ctl/dma register blocks */
297
298 u8 ctl; /* cache of ATA control register */
299 u8 last_ctl; /* Cache last written value */
300 unsigned int bus_state;
301 unsigned int port_state;
302 unsigned int pio_mask;
303 unsigned int mwdma_mask;
304 unsigned int udma_mask;
305 unsigned int cbl; /* cable type; ATA_CBL_xxx */
306 unsigned int cdb_len;
307
308 struct ata_device device[ATA_MAX_DEVICES];
309
310 struct ata_queued_cmd qcmd[ATA_MAX_QUEUE];
311 unsigned long qactive;
312 unsigned int active_tag;
313
314 struct ata_host_stats stats;
315 struct ata_host_set *host_set;
316
317 struct work_struct packet_task;
318
319 struct work_struct pio_task;
320 unsigned int pio_task_state;
321 unsigned long pio_task_timeout;
322
323 void *private_data;
324};
325
326struct ata_port_operations {
327 void (*port_disable) (struct ata_port *);
328
329 void (*dev_config) (struct ata_port *, struct ata_device *);
330
331 void (*set_piomode) (struct ata_port *, struct ata_device *);
332 void (*set_dmamode) (struct ata_port *, struct ata_device *);
333
334 void (*tf_load) (struct ata_port *ap, struct ata_taskfile *tf);
335 void (*tf_read) (struct ata_port *ap, struct ata_taskfile *tf);
336
337 void (*exec_command)(struct ata_port *ap, struct ata_taskfile *tf);
338 u8 (*check_status)(struct ata_port *ap);
339 u8 (*check_altstatus)(struct ata_port *ap);
340 u8 (*check_err)(struct ata_port *ap);
341 void (*dev_select)(struct ata_port *ap, unsigned int device);
342
343 void (*phy_reset) (struct ata_port *ap);
344 void (*post_set_mode) (struct ata_port *ap);
345
346 int (*check_atapi_dma) (struct ata_queued_cmd *qc);
347
348 void (*bmdma_setup) (struct ata_queued_cmd *qc);
349 void (*bmdma_start) (struct ata_queued_cmd *qc);
350
351 void (*qc_prep) (struct ata_queued_cmd *qc);
352 int (*qc_issue) (struct ata_queued_cmd *qc);
353
354 void (*eng_timeout) (struct ata_port *ap);
355
356 irqreturn_t (*irq_handler)(int, void *, struct pt_regs *);
357 void (*irq_clear) (struct ata_port *);
358
359 u32 (*scr_read) (struct ata_port *ap, unsigned int sc_reg);
360 void (*scr_write) (struct ata_port *ap, unsigned int sc_reg,
361 u32 val);
362
363 int (*port_start) (struct ata_port *ap);
364 void (*port_stop) (struct ata_port *ap);
365
366 void (*host_stop) (struct ata_host_set *host_set);
367
368 void (*bmdma_stop) (struct ata_port *ap);
369 u8 (*bmdma_status) (struct ata_port *ap);
370};
371
372struct ata_port_info {
373 Scsi_Host_Template *sht;
374 unsigned long host_flags;
375 unsigned long pio_mask;
376 unsigned long mwdma_mask;
377 unsigned long udma_mask;
378 struct ata_port_operations *port_ops;
379};
380
381
382extern void ata_port_probe(struct ata_port *);
383extern void __sata_phy_reset(struct ata_port *ap);
384extern void sata_phy_reset(struct ata_port *ap);
385extern void ata_bus_reset(struct ata_port *ap);
386extern void ata_port_disable(struct ata_port *);
387extern void ata_std_ports(struct ata_ioports *ioaddr);
388#ifdef CONFIG_PCI
389extern int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
390 unsigned int n_ports);
391extern void ata_pci_remove_one (struct pci_dev *pdev);
392#endif /* CONFIG_PCI */
393extern int ata_device_add(struct ata_probe_ent *ent);
394extern int ata_scsi_detect(Scsi_Host_Template *sht);
395extern int ata_scsi_ioctl(struct scsi_device *dev, int cmd, void __user *arg);
396extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *));
397extern int ata_scsi_error(struct Scsi_Host *host);
398extern int ata_scsi_release(struct Scsi_Host *host);
399extern unsigned int ata_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc);
400/*
401 * Default driver ops implementations
402 */
403extern void ata_tf_load(struct ata_port *ap, struct ata_taskfile *tf);
404extern void ata_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
405extern void ata_tf_to_fis(struct ata_taskfile *tf, u8 *fis, u8 pmp);
406extern void ata_tf_from_fis(u8 *fis, struct ata_taskfile *tf);
407extern void ata_noop_dev_select (struct ata_port *ap, unsigned int device);
408extern void ata_std_dev_select (struct ata_port *ap, unsigned int device);
409extern u8 ata_check_status(struct ata_port *ap);
410extern u8 ata_altstatus(struct ata_port *ap);
411extern u8 ata_chk_err(struct ata_port *ap);
412extern void ata_exec_command(struct ata_port *ap, struct ata_taskfile *tf);
413extern int ata_port_start (struct ata_port *ap);
414extern void ata_port_stop (struct ata_port *ap);
Jeff Garzikaa8f0dc2005-05-26 21:54:27 -0400415extern void ata_host_stop (struct ata_host_set *host_set);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416extern irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs);
417extern void ata_qc_prep(struct ata_queued_cmd *qc);
418extern int ata_qc_issue_prot(struct ata_queued_cmd *qc);
419extern void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf,
420 unsigned int buflen);
421extern void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
422 unsigned int n_elem);
423extern unsigned int ata_dev_classify(struct ata_taskfile *tf);
424extern void ata_dev_id_string(u16 *id, unsigned char *s,
425 unsigned int ofs, unsigned int len);
Brad Campbell6f2f3812005-05-12 15:07:47 -0400426extern void ata_dev_config(struct ata_port *ap, unsigned int i);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700427extern void ata_bmdma_setup (struct ata_queued_cmd *qc);
428extern void ata_bmdma_start (struct ata_queued_cmd *qc);
429extern void ata_bmdma_stop(struct ata_port *ap);
430extern u8 ata_bmdma_status(struct ata_port *ap);
431extern void ata_bmdma_irq_clear(struct ata_port *ap);
432extern void ata_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat);
433extern void ata_eng_timeout(struct ata_port *ap);
434extern void ata_scsi_simulate(u16 *id, struct scsi_cmnd *cmd,
435 void (*done)(struct scsi_cmnd *));
436extern int ata_std_bios_param(struct scsi_device *sdev,
437 struct block_device *bdev,
438 sector_t capacity, int geom[]);
439extern int ata_scsi_slave_config(struct scsi_device *sdev);
440
441
442#ifdef CONFIG_PCI
443struct pci_bits {
444 unsigned int reg; /* PCI config register to read */
445 unsigned int width; /* 1 (8 bit), 2 (16 bit), 4 (32 bit) */
446 unsigned long mask;
447 unsigned long val;
448};
449
450extern struct ata_probe_ent *
451ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port);
452extern int pci_test_config_bits(struct pci_dev *pdev, struct pci_bits *bits);
453
454#endif /* CONFIG_PCI */
455
456
457static inline unsigned int ata_tag_valid(unsigned int tag)
458{
459 return (tag < ATA_MAX_QUEUE) ? 1 : 0;
460}
461
462static inline unsigned int ata_dev_present(struct ata_device *dev)
463{
464 return ((dev->class == ATA_DEV_ATA) ||
465 (dev->class == ATA_DEV_ATAPI));
466}
467
468static inline u8 ata_chk_status(struct ata_port *ap)
469{
470 return ap->ops->check_status(ap);
471}
472
Edward Falk0baab862005-06-02 18:17:13 -0400473
474/**
475 * ata_pause - Flush writes and pause 400 nanoseconds.
476 * @ap: Port to wait for.
477 *
478 * LOCKING:
479 * Inherited from caller.
480 */
481
Linus Torvalds1da177e2005-04-16 15:20:36 -0700482static inline void ata_pause(struct ata_port *ap)
483{
484 ata_altstatus(ap);
485 ndelay(400);
486}
487
Edward Falk0baab862005-06-02 18:17:13 -0400488
489/**
490 * ata_busy_wait - Wait for a port status register
491 * @ap: Port to wait for.
492 *
493 * Waits up to max*10 microseconds for the selected bits in the port's
494 * status register to be cleared.
495 * Returns final value of status register.
496 *
497 * LOCKING:
498 * Inherited from caller.
499 */
500
Linus Torvalds1da177e2005-04-16 15:20:36 -0700501static inline u8 ata_busy_wait(struct ata_port *ap, unsigned int bits,
502 unsigned int max)
503{
504 u8 status;
505
506 do {
507 udelay(10);
508 status = ata_chk_status(ap);
509 max--;
510 } while ((status & bits) && (max > 0));
511
512 return status;
513}
514
Edward Falk0baab862005-06-02 18:17:13 -0400515
516/**
517 * ata_wait_idle - Wait for a port to be idle.
518 * @ap: Port to wait for.
519 *
520 * Waits up to 10ms for port's BUSY and DRQ signals to clear.
521 * Returns final value of status register.
522 *
523 * LOCKING:
524 * Inherited from caller.
525 */
526
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527static inline u8 ata_wait_idle(struct ata_port *ap)
528{
529 u8 status = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
530
531 if (status & (ATA_BUSY | ATA_DRQ)) {
532 unsigned long l = ap->ioaddr.status_addr;
533 printk(KERN_WARNING
534 "ATA: abnormal status 0x%X on port 0x%lX\n",
535 status, l);
536 }
537
538 return status;
539}
540
541static inline void ata_qc_set_polling(struct ata_queued_cmd *qc)
542{
543 qc->tf.ctl |= ATA_NIEN;
544}
545
546static inline struct ata_queued_cmd *ata_qc_from_tag (struct ata_port *ap,
547 unsigned int tag)
548{
549 if (likely(ata_tag_valid(tag)))
550 return &ap->qcmd[tag];
551 return NULL;
552}
553
554static inline void ata_tf_init(struct ata_port *ap, struct ata_taskfile *tf, unsigned int device)
555{
556 memset(tf, 0, sizeof(*tf));
557
558 tf->ctl = ap->ctl;
559 if (device == 0)
560 tf->device = ATA_DEVICE_OBS;
561 else
562 tf->device = ATA_DEVICE_OBS | ATA_DEV1;
563}
564
Edward Falk0baab862005-06-02 18:17:13 -0400565
566/**
567 * ata_irq_on - Enable interrupts on a port.
568 * @ap: Port on which interrupts are enabled.
569 *
570 * Enable interrupts on a legacy IDE device using MMIO or PIO,
571 * wait for idle, clear any pending interrupts.
572 *
573 * LOCKING:
574 * Inherited from caller.
575 */
576
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577static inline u8 ata_irq_on(struct ata_port *ap)
578{
579 struct ata_ioports *ioaddr = &ap->ioaddr;
580 u8 tmp;
581
582 ap->ctl &= ~ATA_NIEN;
583 ap->last_ctl = ap->ctl;
584
585 if (ap->flags & ATA_FLAG_MMIO)
586 writeb(ap->ctl, (void __iomem *) ioaddr->ctl_addr);
587 else
588 outb(ap->ctl, ioaddr->ctl_addr);
589 tmp = ata_wait_idle(ap);
590
591 ap->ops->irq_clear(ap);
592
593 return tmp;
594}
595
Edward Falk0baab862005-06-02 18:17:13 -0400596
597/**
598 * ata_irq_ack - Acknowledge a device interrupt.
599 * @ap: Port on which interrupts are enabled.
600 *
601 * Wait up to 10 ms for legacy IDE device to become idle (BUSY
602 * or BUSY+DRQ clear). Obtain dma status and port status from
603 * device. Clear the interrupt. Return port status.
604 *
605 * LOCKING:
606 */
607
Linus Torvalds1da177e2005-04-16 15:20:36 -0700608static inline u8 ata_irq_ack(struct ata_port *ap, unsigned int chk_drq)
609{
610 unsigned int bits = chk_drq ? ATA_BUSY | ATA_DRQ : ATA_BUSY;
611 u8 host_stat, post_stat, status;
612
613 status = ata_busy_wait(ap, bits, 1000);
614 if (status & bits)
615 DPRINTK("abnormal status 0x%X\n", status);
616
617 /* get controller status; clear intr, err bits */
618 if (ap->flags & ATA_FLAG_MMIO) {
619 void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
620 host_stat = readb(mmio + ATA_DMA_STATUS);
621 writeb(host_stat | ATA_DMA_INTR | ATA_DMA_ERR,
622 mmio + ATA_DMA_STATUS);
623
624 post_stat = readb(mmio + ATA_DMA_STATUS);
625 } else {
626 host_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
627 outb(host_stat | ATA_DMA_INTR | ATA_DMA_ERR,
628 ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
629
630 post_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
631 }
632
633 VPRINTK("irq ack: host_stat 0x%X, new host_stat 0x%X, drv_stat 0x%X\n",
634 host_stat, post_stat, status);
635
636 return status;
637}
638
639static inline u32 scr_read(struct ata_port *ap, unsigned int reg)
640{
641 return ap->ops->scr_read(ap, reg);
642}
643
644static inline void scr_write(struct ata_port *ap, unsigned int reg, u32 val)
645{
646 ap->ops->scr_write(ap, reg, val);
647}
648
Jeff Garzik8a60a072005-07-31 13:13:24 -0400649static inline void scr_write_flush(struct ata_port *ap, unsigned int reg,
Brett Russcdcca89e2005-03-28 15:10:27 -0500650 u32 val)
651{
652 ap->ops->scr_write(ap, reg, val);
653 (void) ap->ops->scr_read(ap, reg);
654}
655
Linus Torvalds1da177e2005-04-16 15:20:36 -0700656static inline unsigned int sata_dev_present(struct ata_port *ap)
657{
658 return ((scr_read(ap, SCR_STATUS) & 0xf) == 0x3) ? 1 : 0;
659}
660
661static inline int ata_try_flush_cache(struct ata_device *dev)
662{
663 return ata_id_wcache_enabled(dev->id) ||
664 ata_id_has_flush(dev->id) ||
665 ata_id_has_flush_ext(dev->id);
666}
667
668#endif /* __LINUX_LIBATA_H__ */