ide: rework handling of serialized ports (v2)
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Mon, 29 Dec 2008 19:27:36 +0000 (20:27 +0100)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Mon, 29 Dec 2008 19:27:36 +0000 (20:27 +0100)
* hpt366: set IDE_HFLAG_SERIALIZE in ->host_flags if needed
  in init_hwif_hpt366().  Remove HPT_SERIALIZE_IO while at it.

* Set IDE_HFLAG_SERIALIZE in ->host_flags if needed in
  ide_init_port().

* Convert init_irq() to use IDE_HFLAG_SERIALIZE together with
  hwif->host to find out ports which need to be serialized.

* Remove no longer needed save_match() and ide_hwif_t.serialized.

v2:
* Set host's ->host_flags field instead of port's copy.

This patch should fix the incorrect grouping of port(s) from
host(s) that need serialization with port(s) that happen to use
the same IRQ(s) but are from the host(s) that don't need it.

Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/hpt366.c
drivers/ide/ide-probe.c
include/linux/ide.h

index f5afd46ed51cc80034bf2fd04ecdf6f31e2e95ab..b18e10d99d2e461de8560f571edb0bc77b0c9e59 100644 (file)
 /* various tuning parameters */
 #define HPT_RESET_STATE_ENGINE
 #undef HPT_DELAY_INTERRUPT
-#define HPT_SERIALIZE_IO       0
 
 static const char *quirk_drives[] = {
        "QUANTUM FIREBALLlct08 08",
@@ -1288,7 +1287,6 @@ static u8 hpt3xx_cable_detect(ide_hwif_t *hwif)
 static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
 {
        struct hpt_info *info   = hpt3xx_get_info(hwif->dev);
-       int serialize           = HPT_SERIALIZE_IO;
        u8  chip_type           = info->chip_type;
 
        /* Cache the channel's MISC. control registers' offset */
@@ -1305,13 +1303,9 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
                 * Clock is shared between the channels,
                 * so we'll have to serialize them... :-(
                 */
-               serialize = 1;
+               hwif->host->host_flags |= IDE_HFLAG_SERIALIZE;
                hwif->rw_disk = &hpt3xxn_rw_disk;
        }
-
-       /* Serialize access to this device if needed */
-       if (serialize && hwif->mate)
-               hwif->serialized = hwif->mate->serialized = 1;
 }
 
 static int __devinit init_dma_hpt366(ide_hwif_t *hwif,
index f76c22c450868144e2dd09eb32e6c26279501b1c..c1cd1af2646b98c06cdfc3b1166007ecb14c2182 100644 (file)
@@ -863,31 +863,6 @@ static void ide_port_tune_devices(ide_hwif_t *hwif)
        }
 }
 
-/*
- * save_match() is used to simplify logic in init_irq() below.
- *
- * A loophole here is that we may not know about a particular
- * hwif's irq until after that hwif is actually probed/initialized..
- * This could be a problem for the case where an hwif is on a
- * dual interface that requires serialization (eg. cmd640) and another
- * hwif using one of the same irqs is initialized beforehand.
- *
- * This routine detects and reports such situations, but does not fix them.
- */
-static void save_match(ide_hwif_t *hwif, ide_hwif_t *new, ide_hwif_t **match)
-{
-       ide_hwif_t *m = *match;
-
-       if (m && m->hwgroup && m->hwgroup != new->hwgroup) {
-               if (!new->hwgroup)
-                       return;
-               printk(KERN_WARNING "%s: potential IRQ problem with %s and %s\n",
-                       hwif->name, new->name, m->name);
-       }
-       if (!m || m->irq != hwif->irq) /* don't undo a prior perfect match */
-               *match = new;
-}
-
 /*
  * init request queue
  */
@@ -1052,26 +1027,13 @@ static int init_irq (ide_hwif_t *hwif)
        mutex_lock(&ide_cfg_mtx);
        hwif->hwgroup = NULL;
 
-       /*
-        * Group up with any other hwifs that share our irq(s).
-        */
        for (index = 0; index < MAX_HWIFS; index++) {
                ide_hwif_t *h = ide_ports[index];
 
                if (h && h->hwgroup) {  /* scan only initialized ports */
-                       if (hwif->irq == h->irq) {
-                               if (hwif->chipset != ide_pci ||
-                                   h->chipset != ide_pci) {
-                                       save_match(hwif, h, &match);
-                               }
-                       }
-                       if (hwif->serialized) {
-                               if (hwif->mate && hwif->mate->irq == h->irq)
-                                       save_match(hwif, h, &match);
-                       }
-                       if (h->serialized) {
-                               if (h->mate && hwif->irq == h->mate->irq)
-                                       save_match(hwif, h, &match);
+                       if (hwif->host->host_flags & IDE_HFLAG_SERIALIZE) {
+                               if (hwif->host == h->host)
+                                       match = h;
                        }
                }
        }
@@ -1437,10 +1399,8 @@ static void ide_init_port(ide_hwif_t *hwif, unsigned int port,
        }
 
        if ((d->host_flags & IDE_HFLAG_SERIALIZE) ||
-           ((d->host_flags & IDE_HFLAG_SERIALIZE_DMA) && hwif->dma_base)) {
-               if (hwif->mate)
-                       hwif->mate->serialized = hwif->serialized = 1;
-       }
+           ((d->host_flags & IDE_HFLAG_SERIALIZE_DMA) && hwif->dma_base))
+               hwif->host->host_flags |= IDE_HFLAG_SERIALIZE;
 
        if (d->max_sectors)
                hwif->rqsize = d->max_sectors;
index f89d6d69a3864a94397ae3749245ea182cb55767..9b89cab6d4935bfc02bd6d28dbd2bd2d9ce86de5 100644 (file)
@@ -839,7 +839,6 @@ typedef struct hwif_s {
        unsigned        extra_ports;    /* number of extra dma ports */
 
        unsigned        present    : 1; /* this interface exists */
-       unsigned        serialized : 1; /* serialized all channel operation */
        unsigned        sg_mapped  : 1; /* sg_table and sg_nents are ready */
 
        struct device           gendev;