Patch to make ide-host controllers use hwgroup lock where serialization with hwgroup->lock is necessary
Signed-off-by: Vaibhav V. Nivargi <[EMAIL PROTECTED]> Signed-off-by: Alok N. Kataria <[EMAIL PROTECTED]> Signed-off-by: Ravikiran Thirumalai <[EMAIL PROTECTED]> Index: linux-2.6.13/drivers/ide/legacy/ht6560b.c =================================================================== --- linux-2.6.13.orig/drivers/ide/legacy/ht6560b.c 2005-08-28 19:41:01.000000000 -0400 +++ linux-2.6.13/drivers/ide/legacy/ht6560b.c 2005-09-06 15:57:46.113541000 -0400 @@ -256,9 +256,11 @@ { unsigned long flags; int t = HT_PREFETCH_MODE << 8; - - spin_lock_irqsave(&ide_lock, flags); - + ide_hwgroup_t *hwgroup = HWGROUP(drive); + + spin_lock_irqsave(&hwgroup->lock, flags); + spin_lock(&ide_lock); + /* * Prefetch mode and unmask irq seems to conflict */ @@ -270,9 +272,10 @@ drive->drive_data &= ~t; /* disable prefetch mode */ drive->no_unmask = 0; } - - spin_unlock_irqrestore(&ide_lock, flags); - + + spin_unlock(&ide_lock); + spin_unlock_irqrestore(&hwgroup->lock, flags); + #ifdef DEBUG printk("ht6560b: drive %s prefetch mode %sabled\n", drive->name, (state ? "en" : "dis")); #endif @@ -282,6 +285,7 @@ { unsigned long flags; u8 timing; + ide_hwgroup_t *hwgroup = HWGROUP(drive); switch (pio) { case 8: /* set prefetch off */ @@ -291,14 +295,15 @@ } timing = ht_pio2timings(drive, pio); - - spin_lock_irqsave(&ide_lock, flags); + + spin_lock_irqsave(&hwgroup->lock, flags); + spin_lock(&ide_lock); drive->drive_data &= 0xff00; drive->drive_data |= timing; - spin_unlock_irqrestore(&ide_lock, flags); - + spin_unlock(&ide_lock); + spin_unlock_irqrestore(&hwgroup->lock, flags); #ifdef DEBUG printk("ht6560b: drive %s tuned to pio mode %#x timing=%#x\n", drive->name, pio, timing); #endif Index: linux-2.6.13/drivers/ide/pci/cmd640.c =================================================================== --- linux-2.6.13.orig/drivers/ide/pci/cmd640.c 2005-08-28 19:41:01.000000000 -0400 +++ linux-2.6.13/drivers/ide/pci/cmd640.c 2005-09-06 15:50:35.330618750 -0400 @@ -442,11 +442,14 @@ static void set_prefetch_mode (unsigned int index, int mode) { ide_drive_t *drive = cmd_drives[index]; + ide_hwgroup_t *hwgroup = HWGROUP(drive); int reg = prefetch_regs[index]; u8 b; unsigned long flags; - spin_lock_irqsave(&ide_lock, flags); + spin_lock_irqsave(&hwgroup->lock, flags); + spin_lock(&ide_lock); + b = __get_cmd640_reg(reg); if (mode) { /* want prefetch on? */ #if CMD640_PREFETCH_MASKS @@ -462,7 +465,9 @@ b |= prefetch_masks[index]; /* disable prefetch */ } __put_cmd640_reg(reg, b); - spin_unlock_irqrestore(&ide_lock, flags); + + spin_unlock(&ide_lock); + spin_unlock_irqrestore(&hwgroup->lock, flags); } /* Index: linux-2.6.13/drivers/ide/pci/piix.c =================================================================== --- linux-2.6.13.orig/drivers/ide/pci/piix.c 2005-09-06 15:49:48.271677750 -0400 +++ linux-2.6.13/drivers/ide/pci/piix.c 2005-09-06 15:56:55.982408000 -0400 @@ -215,6 +215,7 @@ { ide_hwif_t *hwif = HWIF(drive); struct pci_dev *dev = hwif->pci_dev; + ide_hwgroup_t *hwgroup = HWGROUP(drive); int is_slave = (&hwif->drives[1] == drive); int master_port = hwif->channel ? 0x42 : 0x40; int slave_port = 0x44; @@ -229,7 +230,8 @@ { 2, 3 }, }; pio = ide_get_best_pio_mode(drive, pio, 5, NULL); - spin_lock_irqsave(&ide_lock, flags); + spin_lock_irqsave(&hwgroup->lock, flags); + spin_lock(&ide_lock); pci_read_config_word(dev, master_port, &master_data); if (is_slave) { master_data = master_data | 0x4000; @@ -249,7 +251,8 @@ pci_write_config_word(dev, master_port, master_data); if (is_slave) pci_write_config_byte(dev, slave_port, slave_data); - spin_unlock_irqrestore(&ide_lock, flags); + spin_unlock(&ide_lock); + spin_unlock_irqrestore(&hwgroup->lock, flags); } /** - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/