]> err.no Git - linux-2.6/blobdiff - include/linux/ide.h
ide: add ->read_altstatus method
[linux-2.6] / include / linux / ide.h
index ac4eeb2932efb03a61484d1badbfd34620957a28..e5fa5e868d67d4952d25b15301144cfe71069289 100644 (file)
@@ -138,6 +138,12 @@ struct ide_io_ports {
 #define WAIT_CMD       (10*HZ) /* 10sec  - maximum wait for an IRQ to happen */
 #define WAIT_MIN_SLEEP (2*HZ/100)      /* 20msec - minimum sleep time */
 
+/*
+ * Op codes for special requests to be handled by ide_special_rq().
+ * Values should be in the range of 0x20 to 0x3f.
+ */
+#define REQ_DRIVE_RESET                0x20
+
 /*
  * Check for an interrupt and acknowledge the interrupt status
  */
@@ -171,7 +177,7 @@ typedef struct hw_regs_s {
        int             irq;                    /* our irq number */
        ide_ack_intr_t  *ack_intr;              /* acknowledge interrupt */
        hwif_chipset_t  chipset;
-       struct device   *dev;
+       struct device   *dev, *parent;
 } hw_regs_t;
 
 void ide_init_port_data(struct hwif_s *, unsigned int);
@@ -405,8 +411,8 @@ typedef struct ide_drive_s {
 struct ide_port_info;
 
 struct ide_port_ops {
-       /* host specific initialization of devices on a port */
-       void    (*port_init_devs)(struct hwif_s *);
+       /* host specific initialization of a device */
+       void    (*init_dev)(ide_drive_t *);
        /* routine to program host for PIO mode */
        void    (*set_pio_mode)(ide_drive_t *, const u8);
        /* routine to program host for DMA mode */
@@ -483,6 +489,11 @@ typedef struct hwif_s {
        const struct ide_port_ops       *port_ops;
        const struct ide_dma_ops        *dma_ops;
 
+       void    (*exec_command)(struct hwif_s *, u8);
+       u8      (*read_status)(struct hwif_s *);
+       u8      (*read_altstatus)(struct hwif_s *);
+       u8      (*read_sff_dma_status)(struct hwif_s *);
+
        void (*tf_load)(ide_drive_t *, struct ide_task_s *);
        void (*tf_read)(ide_drive_t *, struct ide_task_s *);
 
@@ -518,8 +529,6 @@ typedef struct hwif_s {
        int             irq;            /* our irq number */
 
        unsigned long   dma_base;       /* base addr for dma ports */
-       unsigned long   dma_command;    /* dma command register */
-       unsigned long   dma_status;     /* dma status register */
 
        unsigned long   config_data;    /* for use by chipset-specific code */
        unsigned long   select_data;    /* for use by chipset-specific code */
@@ -565,8 +574,6 @@ typedef struct hwgroup_s {
        unsigned int sleeping   : 1;
                /* BOOL: polling active & poll_timeout field valid */
        unsigned int polling    : 1;
-               /* BOOL: in a polling reset situation. Must not trigger another reset yet */
-       unsigned int resetting  : 1;
 
                /* current drive */
        ide_drive_t *drive;
@@ -786,7 +793,6 @@ struct ide_driver_s {
        ide_startstop_t (*do_request)(ide_drive_t *, struct request *, sector_t);
        int             (*end_request)(ide_drive_t *, int, int);
        ide_startstop_t (*error)(ide_drive_t *, struct request *rq, u8, u8);
-       ide_startstop_t (*abort)(ide_drive_t *, struct request *rq);
        struct device_driver    gen_driver;
        int             (*probe)(ide_drive_t *);
        void            (*remove)(ide_drive_t *);
@@ -801,18 +807,6 @@ struct ide_driver_s {
 
 int generic_ide_ioctl(ide_drive_t *, struct file *, struct block_device *, unsigned, unsigned long);
 
-/*
- * ide_hwifs[] is the master data structure used to keep track
- * of just about everything in ide.c.  Whenever possible, routines
- * should be using pointers to a drive (ide_drive_t *) or
- * pointers to a hwif (ide_hwif_t *), rather than indexing this
- * structure directly (the allocation/layout may change!).
- *
- */
-#ifndef _IDE_C
-extern ide_hwif_t      ide_hwifs[];            /* master data repository */
-#endif
-
 extern int ide_vlb_clk;
 extern int ide_pci_clk;
 
@@ -840,10 +834,6 @@ ide_startstop_t __ide_error(ide_drive_t *, struct request *, u8, u8);
 
 ide_startstop_t ide_error (ide_drive_t *drive, const char *msg, byte stat);
 
-ide_startstop_t __ide_abort(ide_drive_t *, struct request *);
-
-extern ide_startstop_t ide_abort(ide_drive_t *, const char *);
-
 extern void ide_fix_driveid(struct hd_driveid *);
 
 extern void ide_fixstring(u8 *, const int, const int);
@@ -1013,12 +1003,15 @@ extern int __ide_pci_register_driver(struct pci_driver *driver, struct module *o
 #define ide_pci_register_driver(d) pci_register_driver(d)
 #endif
 
-void ide_pci_setup_ports(struct pci_dev *, const struct ide_port_info *, int, u8 *);
+void ide_pci_setup_ports(struct pci_dev *, const struct ide_port_info *, int,
+                        u8 *, hw_regs_t *, hw_regs_t **);
 void ide_setup_pci_noise(struct pci_dev *, const struct ide_port_info *);
 
 #ifdef CONFIG_BLK_DEV_IDEDMA_PCI
 int ide_pci_set_master(struct pci_dev *, const char *);
 unsigned long ide_pci_dma_base(ide_hwif_t *, const struct ide_port_info *);
+extern const struct ide_dma_ops sff_dma_ops;
+int ide_pci_check_simplex(ide_hwif_t *, const struct ide_port_info *);
 int ide_hwif_setup_dma(ide_hwif_t *, const struct ide_port_info *);
 #else
 static inline int ide_hwif_setup_dma(ide_hwif_t *hwif,
@@ -1176,7 +1169,6 @@ void ide_destroy_dmatable(ide_drive_t *);
 extern int ide_build_dmatable(ide_drive_t *, struct request *);
 int ide_allocate_dma_engine(ide_hwif_t *);
 void ide_release_dma_engine(ide_hwif_t *);
-void ide_setup_dma(ide_hwif_t *, unsigned long);
 
 void ide_dma_host_set(ide_drive_t *, int);
 extern int ide_dma_setup(ide_drive_t *);
@@ -1230,8 +1222,8 @@ void ide_undecoded_slave(ide_drive_t *);
 
 void ide_port_apply_params(ide_hwif_t *);
 
-int ide_device_add_all(u8 *idx, const struct ide_port_info *);
-int ide_device_add(u8 idx[4], const struct ide_port_info *);
+int ide_device_add_all(u8 *, const struct ide_port_info *, hw_regs_t **);
+int ide_device_add(u8 *, const struct ide_port_info *, hw_regs_t **);
 int ide_legacy_device_add(const struct ide_port_info *, unsigned long);
 void ide_port_unregister_devices(ide_hwif_t *);
 void ide_port_scan(ide_hwif_t *);
@@ -1271,16 +1263,43 @@ static inline int ide_dev_is_sata(struct hd_driveid *id)
 u64 ide_get_lba_addr(struct ide_taskfile *, int);
 u8 ide_dump_status(ide_drive_t *, const char *, u8);
 
-typedef struct ide_pio_timings_s {
-       int     setup_time;     /* Address setup (ns) minimum */
-       int     active_time;    /* Active pulse (ns) minimum */
-       int     cycle_time;     /* Cycle time (ns) minimum = */
-                               /* active + recovery (+ setup for some chips) */
-} ide_pio_timings_t;
+struct ide_timing {
+       u8  mode;
+       u8  setup;      /* t1 */
+       u16 act8b;      /* t2 for 8-bit io */
+       u16 rec8b;      /* t2i for 8-bit io */
+       u16 cyc8b;      /* t0 for 8-bit io */
+       u16 active;     /* t2 or tD */
+       u16 recover;    /* t2i or tK */
+       u16 cycle;      /* t0 */
+       u16 udma;       /* t2CYCTYP/2 */
+};
+
+enum {
+       IDE_TIMING_SETUP        = (1 << 0),
+       IDE_TIMING_ACT8B        = (1 << 1),
+       IDE_TIMING_REC8B        = (1 << 2),
+       IDE_TIMING_CYC8B        = (1 << 3),
+       IDE_TIMING_8BIT         = IDE_TIMING_ACT8B | IDE_TIMING_REC8B |
+                                 IDE_TIMING_CYC8B,
+       IDE_TIMING_ACTIVE       = (1 << 4),
+       IDE_TIMING_RECOVER      = (1 << 5),
+       IDE_TIMING_CYCLE        = (1 << 6),
+       IDE_TIMING_UDMA         = (1 << 7),
+       IDE_TIMING_ALL          = IDE_TIMING_SETUP | IDE_TIMING_8BIT |
+                                 IDE_TIMING_ACTIVE | IDE_TIMING_RECOVER |
+                                 IDE_TIMING_CYCLE | IDE_TIMING_UDMA,
+};
+
+struct ide_timing *ide_timing_find_mode(u8);
+u16 ide_pio_cycle_time(ide_drive_t *, u8);
+void ide_timing_merge(struct ide_timing *, struct ide_timing *,
+                     struct ide_timing *, unsigned int);
+int ide_timing_compute(ide_drive_t *, u8, struct ide_timing *, int, int);
+
+int ide_scan_pio_blacklist(char *);
 
-unsigned int ide_pio_cycle_time(ide_drive_t *, u8);
 u8 ide_get_best_pio_mode(ide_drive_t *, u8, u8);
-extern const ide_pio_timings_t ide_pio_timings[6];
 
 int ide_set_pio_mode(ide_drive_t *, u8);
 int ide_set_dma_mode(ide_drive_t *, u8);
@@ -1345,20 +1364,6 @@ static inline void ide_set_irq(ide_drive_t *drive, int on)
                       hwif->io_ports.ctl_addr);
 }
 
-static inline u8 ide_read_status(ide_drive_t *drive)
-{
-       ide_hwif_t *hwif = drive->hwif;
-
-       return hwif->INB(hwif->io_ports.status_addr);
-}
-
-static inline u8 ide_read_altstatus(ide_drive_t *drive)
-{
-       ide_hwif_t *hwif = drive->hwif;
-
-       return hwif->INB(hwif->io_ports.ctl_addr);
-}
-
 static inline u8 ide_read_error(ide_drive_t *drive)
 {
        ide_hwif_t *hwif = drive->hwif;