|
@@ -1,7 +1,7 @@
|
|
/*
|
|
/*
|
|
* pata_atiixp.c - ATI PATA for new ATA layer
|
|
* pata_atiixp.c - ATI PATA for new ATA layer
|
|
* (C) 2005 Red Hat Inc
|
|
* (C) 2005 Red Hat Inc
|
|
- * (C) 2009 Bartlomiej Zolnierkiewicz
|
|
|
|
|
|
+ * (C) 2009-2010 Bartlomiej Zolnierkiewicz
|
|
*
|
|
*
|
|
* Based on
|
|
* Based on
|
|
*
|
|
*
|
|
@@ -46,6 +46,8 @@ static int atiixp_cable_detect(struct ata_port *ap)
|
|
return ATA_CBL_PATA40;
|
|
return ATA_CBL_PATA40;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static DEFINE_SPINLOCK(atiixp_lock);
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* atiixp_set_pio_timing - set initial PIO mode data
|
|
* atiixp_set_pio_timing - set initial PIO mode data
|
|
* @ap: ATA interface
|
|
* @ap: ATA interface
|
|
@@ -88,7 +90,10 @@ static void atiixp_set_pio_timing(struct ata_port *ap, struct ata_device *adev,
|
|
|
|
|
|
static void atiixp_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
|
static void atiixp_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
|
{
|
|
{
|
|
|
|
+ unsigned long flags;
|
|
|
|
+ spin_lock_irqsave(&atiixp_lock, flags);
|
|
atiixp_set_pio_timing(ap, adev, adev->pio_mode - XFER_PIO_0);
|
|
atiixp_set_pio_timing(ap, adev, adev->pio_mode - XFER_PIO_0);
|
|
|
|
+ spin_unlock_irqrestore(&atiixp_lock, flags);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -108,6 +113,9 @@ static void atiixp_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
|
int dma = adev->dma_mode;
|
|
int dma = adev->dma_mode;
|
|
int dn = 2 * ap->port_no + adev->devno;
|
|
int dn = 2 * ap->port_no + adev->devno;
|
|
int wanted_pio;
|
|
int wanted_pio;
|
|
|
|
+ unsigned long flags;
|
|
|
|
+
|
|
|
|
+ spin_lock_irqsave(&atiixp_lock, flags);
|
|
|
|
|
|
if (adev->dma_mode >= XFER_UDMA_0) {
|
|
if (adev->dma_mode >= XFER_UDMA_0) {
|
|
u16 udma_mode_data;
|
|
u16 udma_mode_data;
|
|
@@ -145,6 +153,7 @@ static void atiixp_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
|
|
|
|
|
if (adev->pio_mode != wanted_pio)
|
|
if (adev->pio_mode != wanted_pio)
|
|
atiixp_set_pio_timing(ap, adev, wanted_pio);
|
|
atiixp_set_pio_timing(ap, adev, wanted_pio);
|
|
|
|
+ spin_unlock_irqrestore(&atiixp_lock, flags);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|