lkml.org 
[lkml]   [2005]   [Sep]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 3/4] ide: Break ide_lock -- change controller drivers
    Patch to make ide-host controllers use hwgroup lock where serialization with
    hwgroup->lock is necessary


    Signed-off-by: Vaibhav V. Nivargi <vaibhav.nivargi@gmail.com>
    Signed-off-by: Alok N. Kataria <alokk@calsoftinc.com>
    Signed-off-by: Ravikiran Thirumalai <kiran@scalex86.org>

    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 majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2005-09-07 01:44    [W:0.033 / U:5.328 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site