ide: merge ide_hwgroup_t with ide_hwif_t (v2)
[linux-2.6.git] / include / linux / ide.h
index db5ef8a..f27f130 100644 (file)
@@ -42,7 +42,6 @@ typedef unsigned char byte;   /* used everywhere */
 #define ERROR_RECAL    1       /* Recalibrate every 2nd retry */
 
 #define HWIF(drive)            ((ide_hwif_t *)((drive)->hwif))
-#define HWGROUP(drive)         ((ide_hwgroup_t *)(HWIF(drive)->hwgroup))
 
 /*
  * Definitions for accessing IDE controller registers
@@ -588,7 +587,6 @@ struct ide_drive_s {
        struct request_queue    *queue; /* request queue */
 
        struct request          *rq;    /* current request */
-       struct ide_drive_s      *next;  /* circular list of hwgroup drives */
        void            *driver_data;   /* extra driver data */
        u16                     *id;    /* identification info */
 #ifdef CONFIG_IDE_PROC_FS
@@ -750,9 +748,7 @@ struct ide_dma_ops {
 struct ide_host;
 
 typedef struct hwif_s {
-       struct hwif_s *next;            /* for linked-list in ide_hwgroup_t */
        struct hwif_s *mate;            /* other hwif from same PCI chip */
-       struct hwgroup_s *hwgroup;      /* actually (ide_hwgroup_t *) */
        struct proc_dir_entry *proc;    /* /proc/ide/ directory entry */
 
        struct ide_host *host;
@@ -830,6 +826,7 @@ typedef struct hwif_s {
 
        unsigned        present    : 1; /* this interface exists */
        unsigned        sg_mapped  : 1; /* sg_table and sg_nents are ready */
+       unsigned        busy       : 1; /* serializes devices on a port */
 
        struct device           gendev;
        struct device           *portdev;
@@ -841,6 +838,30 @@ typedef struct hwif_s {
 #ifdef CONFIG_BLK_DEV_IDEACPI
        struct ide_acpi_hwif_link *acpidata;
 #endif
+
+       /* IRQ handler, if active */
+       ide_startstop_t (*handler)(ide_drive_t *);
+
+       /* BOOL: polling active & poll_timeout field valid */
+       unsigned int polling : 1;
+
+       /* current drive */
+       ide_drive_t *cur_dev;
+
+       /* current request */
+       struct request *rq;
+
+       /* failsafe timer */
+       struct timer_list timer;
+       /* timeout value during long polls */
+       unsigned long poll_timeout;
+       /* queried upon timeouts */
+       int (*expiry)(ide_drive_t *);
+
+       int req_gen;
+       int req_gen_timer;
+
+       spinlock_t lock;
 } ____cacheline_internodealigned_in_smp ide_hwif_t;
 
 #define MAX_HOST_PORTS 4
@@ -852,8 +873,14 @@ struct ide_host {
        unsigned int    (*init_chipset)(struct pci_dev *);
        unsigned long   host_flags;
        void            *host_priv;
+       ide_hwif_t      *cur_port;      /* for hosts requiring serialization */
+
+       /* used for hosts requiring serialization */
+       volatile long   host_busy;
 };
 
+#define IDE_HOST_BUSY 0
+
 /*
  *  internal ide interrupt handler type
  */
@@ -863,36 +890,6 @@ typedef int (ide_expiry_t)(ide_drive_t *);
 /* used by ide-cd, ide-floppy, etc. */
 typedef void (xfer_func_t)(ide_drive_t *, struct request *rq, void *, unsigned);
 
-typedef struct hwgroup_s {
-               /* irq handler, if active */
-       ide_startstop_t (*handler)(ide_drive_t *);
-
-               /* BOOL: protects all fields below */
-       volatile int busy;
-               /* BOOL: polling active & poll_timeout field valid */
-       unsigned int polling    : 1;
-
-               /* current drive */
-       ide_drive_t *drive;
-               /* ptr to current hwif in linked-list */
-       ide_hwif_t *hwif;
-
-               /* current request */
-       struct request *rq;
-
-               /* failsafe timer */
-       struct timer_list timer;
-               /* timeout value during long polls */
-       unsigned long poll_timeout;
-               /* queried upon timeouts */
-       int (*expiry)(ide_drive_t *);
-
-       int req_gen;
-       int req_gen_timer;
-
-       spinlock_t lock;
-} ide_hwgroup_t;
-
 typedef struct ide_driver_s ide_driver_t;
 
 extern struct mutex ide_setting_mtx;
@@ -1272,26 +1269,6 @@ extern void ide_stall_queue(ide_drive_t *drive, unsigned long timeout);
 
 extern void ide_timer_expiry(unsigned long);
 extern irqreturn_t ide_intr(int irq, void *dev_id);
-
-static inline int ide_lock_hwgroup(ide_hwgroup_t *hwgroup)
-{
-       if (hwgroup->busy)
-               return 1;
-
-       hwgroup->busy = 1;
-       /* for atari only */
-       ide_get_lock(ide_intr, hwgroup);
-
-       return 0;
-}
-
-static inline void ide_unlock_hwgroup(ide_hwgroup_t *hwgroup)
-{
-       /* for atari only */
-       ide_release_lock();
-       hwgroup->busy = 0;
-}
-
 extern void do_ide_request(struct request_queue *);
 
 void ide_init_disk(struct gendisk *, ide_drive_t *);
@@ -1529,7 +1506,6 @@ static inline void ide_acpi_port_init_devices(ide_hwif_t *hwif) { ; }
 static inline void ide_acpi_set_state(ide_hwif_t *hwif, int on) {}
 #endif
 
-void ide_remove_port_from_hwgroup(ide_hwif_t *);
 void ide_unregister(ide_hwif_t *);
 
 void ide_register_region(struct gendisk *);
@@ -1618,18 +1594,6 @@ static inline void ide_set_max_pio(ide_drive_t *drive)
 
 extern spinlock_t ide_lock;
 extern struct mutex ide_cfg_mtx;
-/*
- * Structure locking:
- *
- * ide_cfg_mtx and hwgroup->lock together protect changes to
- * ide_hwif_t->next
- * ide_drive_t->next
- *
- * ide_hwgroup_t->busy: hwgroup->lock
- * ide_hwgroup_t->hwif: hwgroup->lock
- * ide_hwif_t->{hwgroup,mate}: constant, no locking
- * ide_drive_t->hwif: constant, no locking
- */
 
 #define local_irq_set(flags)   do { local_save_flags((flags)); local_irq_enable_in_hardirq(); } while (0)