aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-probe.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/ide-probe.c')
-rw-r--r--drivers/ide/ide-probe.c50
1 files changed, 5 insertions, 45 deletions
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
index f76c22c45086..c1cd1af2646b 100644
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -864,31 +864,6 @@ static void ide_port_tune_devices(ide_hwif_t *hwif)
864} 864}
865 865
866/* 866/*
867 * save_match() is used to simplify logic in init_irq() below.
868 *
869 * A loophole here is that we may not know about a particular
870 * hwif's irq until after that hwif is actually probed/initialized..
871 * This could be a problem for the case where an hwif is on a
872 * dual interface that requires serialization (eg. cmd640) and another
873 * hwif using one of the same irqs is initialized beforehand.
874 *
875 * This routine detects and reports such situations, but does not fix them.
876 */
877static void save_match(ide_hwif_t *hwif, ide_hwif_t *new, ide_hwif_t **match)
878{
879 ide_hwif_t *m = *match;
880
881 if (m && m->hwgroup && m->hwgroup != new->hwgroup) {
882 if (!new->hwgroup)
883 return;
884 printk(KERN_WARNING "%s: potential IRQ problem with %s and %s\n",
885 hwif->name, new->name, m->name);
886 }
887 if (!m || m->irq != hwif->irq) /* don't undo a prior perfect match */
888 *match = new;
889}
890
891/*
892 * init request queue 867 * init request queue
893 */ 868 */
894static int ide_init_queue(ide_drive_t *drive) 869static int ide_init_queue(ide_drive_t *drive)
@@ -1052,26 +1027,13 @@ static int init_irq (ide_hwif_t *hwif)
1052 mutex_lock(&ide_cfg_mtx); 1027 mutex_lock(&ide_cfg_mtx);
1053 hwif->hwgroup = NULL; 1028 hwif->hwgroup = NULL;
1054 1029
1055 /*
1056 * Group up with any other hwifs that share our irq(s).
1057 */
1058 for (index = 0; index < MAX_HWIFS; index++) { 1030 for (index = 0; index < MAX_HWIFS; index++) {
1059 ide_hwif_t *h = ide_ports[index]; 1031 ide_hwif_t *h = ide_ports[index];
1060 1032
1061 if (h && h->hwgroup) { /* scan only initialized ports */ 1033 if (h && h->hwgroup) { /* scan only initialized ports */
1062 if (hwif->irq == h->irq) { 1034 if (hwif->host->host_flags & IDE_HFLAG_SERIALIZE) {
1063 if (hwif->chipset != ide_pci || 1035 if (hwif->host == h->host)
1064 h->chipset != ide_pci) { 1036 match = h;
1065 save_match(hwif, h, &match);
1066 }
1067 }
1068 if (hwif->serialized) {
1069 if (hwif->mate && hwif->mate->irq == h->irq)
1070 save_match(hwif, h, &match);
1071 }
1072 if (h->serialized) {
1073 if (h->mate && hwif->irq == h->mate->irq)
1074 save_match(hwif, h, &match);
1075 } 1037 }
1076 } 1038 }
1077 } 1039 }
@@ -1437,10 +1399,8 @@ static void ide_init_port(ide_hwif_t *hwif, unsigned int port,
1437 } 1399 }
1438 1400
1439 if ((d->host_flags & IDE_HFLAG_SERIALIZE) || 1401 if ((d->host_flags & IDE_HFLAG_SERIALIZE) ||
1440 ((d->host_flags & IDE_HFLAG_SERIALIZE_DMA) && hwif->dma_base)) { 1402 ((d->host_flags & IDE_HFLAG_SERIALIZE_DMA) && hwif->dma_base))
1441 if (hwif->mate) 1403 hwif->host->host_flags |= IDE_HFLAG_SERIALIZE;
1442 hwif->mate->serialized = hwif->serialized = 1;
1443 }
1444 1404
1445 if (d->max_sectors) 1405 if (d->max_sectors)
1446 hwif->rqsize = d->max_sectors; 1406 hwif->rqsize = d->max_sectors;