From 9144775590c99a54ee9fdda2e4ac2c835a52d5c6 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Mon, 26 Jun 2006 00:26:12 -0700 Subject: [PATCH] --- yaml --- r: 30271 b: refs/heads/master c: 4fb0f76d8cf4f7a3ffc36dd5e1bc8ca977b68824 h: refs/heads/master i: 30269: 0bcf0f64690a3e7812ebbc551cdc36100346e5d0 30267: dd9edc8297591c159de23a477cf5cf938bcfc90f 30263: e179547dfa16841c30d4e039ac64bc9852d6d289 30255: 0d8b704726047f4ce6323c491295ebee8223b275 30239: 980766f129510d4268fca5eaab8cb6071094d439 30207: 589ad079c10345de9d684b9e90fc5c2d801c6fff v: v3 --- [refs] | 2 +- trunk/drivers/ide/pci/piix.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 3d47cacdcc4e..304a369f3848 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b5cdccf841d7d29fb96e03de5a64ed395e0fde61 +refs/heads/master: 4fb0f76d8cf4f7a3ffc36dd5e1bc8ca977b68824 diff --git a/trunk/drivers/ide/pci/piix.c b/trunk/drivers/ide/pci/piix.c index e9b83e1a3028..7fac6f57b5d6 100644 --- a/trunk/drivers/ide/pci/piix.c +++ b/trunk/drivers/ide/pci/piix.c @@ -222,6 +222,8 @@ static void piix_tune_drive (ide_drive_t *drive, u8 pio) unsigned long flags; u16 master_data; u8 slave_data; + static DEFINE_SPINLOCK(tune_lock); + /* ISP RTC */ u8 timings[][2] = { { 0, 0 }, { 0, 0 }, @@ -230,7 +232,13 @@ static void piix_tune_drive (ide_drive_t *drive, u8 pio) { 2, 3 }, }; pio = ide_get_best_pio_mode(drive, pio, 5, NULL); - spin_lock_irqsave(&ide_lock, flags); + + /* + * Master vs slave is synchronized above us but the slave register is + * shared by the two hwifs so the corner case of two slave timeouts in + * parallel must be locked. + */ + spin_lock_irqsave(&tune_lock, flags); pci_read_config_word(dev, master_port, &master_data); if (is_slave) { master_data = master_data | 0x4000; @@ -250,7 +258,7 @@ static void piix_tune_drive (ide_drive_t *drive, u8 pio) 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_irqrestore(&tune_lock, flags); } /**