diff options
| -rw-r--r-- | drivers/ata/ata_piix.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 56b8a3ff1286..9ac4e378992e 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
| @@ -664,6 +664,8 @@ static int piix_pata_prereset(struct ata_link *link, unsigned long deadline) | |||
| 664 | return ata_sff_prereset(link, deadline); | 664 | return ata_sff_prereset(link, deadline); |
| 665 | } | 665 | } |
| 666 | 666 | ||
| 667 | static DEFINE_SPINLOCK(piix_lock); | ||
| 668 | |||
| 667 | /** | 669 | /** |
| 668 | * piix_set_piomode - Initialize host controller PATA PIO timings | 670 | * piix_set_piomode - Initialize host controller PATA PIO timings |
| 669 | * @ap: Port whose timings we are configuring | 671 | * @ap: Port whose timings we are configuring |
| @@ -677,8 +679,9 @@ static int piix_pata_prereset(struct ata_link *link, unsigned long deadline) | |||
| 677 | 679 | ||
| 678 | static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev) | 680 | static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev) |
| 679 | { | 681 | { |
| 680 | unsigned int pio = adev->pio_mode - XFER_PIO_0; | ||
| 681 | struct pci_dev *dev = to_pci_dev(ap->host->dev); | 682 | struct pci_dev *dev = to_pci_dev(ap->host->dev); |
| 683 | unsigned long flags; | ||
| 684 | unsigned int pio = adev->pio_mode - XFER_PIO_0; | ||
| 682 | unsigned int is_slave = (adev->devno != 0); | 685 | unsigned int is_slave = (adev->devno != 0); |
| 683 | unsigned int master_port= ap->port_no ? 0x42 : 0x40; | 686 | unsigned int master_port= ap->port_no ? 0x42 : 0x40; |
| 684 | unsigned int slave_port = 0x44; | 687 | unsigned int slave_port = 0x44; |
| @@ -708,6 +711,8 @@ static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev) | |||
| 708 | if (adev->class == ATA_DEV_ATA) | 711 | if (adev->class == ATA_DEV_ATA) |
| 709 | control |= 4; /* PPE enable */ | 712 | control |= 4; /* PPE enable */ |
| 710 | 713 | ||
| 714 | spin_lock_irqsave(&piix_lock, flags); | ||
| 715 | |||
| 711 | /* PIO configuration clears DTE unconditionally. It will be | 716 | /* PIO configuration clears DTE unconditionally. It will be |
| 712 | * programmed in set_dmamode which is guaranteed to be called | 717 | * programmed in set_dmamode which is guaranteed to be called |
| 713 | * after set_piomode if any DMA mode is available. | 718 | * after set_piomode if any DMA mode is available. |
| @@ -747,6 +752,8 @@ static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev) | |||
| 747 | udma_enable &= ~(1 << (2 * ap->port_no + adev->devno)); | 752 | udma_enable &= ~(1 << (2 * ap->port_no + adev->devno)); |
| 748 | pci_write_config_byte(dev, 0x48, udma_enable); | 753 | pci_write_config_byte(dev, 0x48, udma_enable); |
| 749 | } | 754 | } |
| 755 | |||
| 756 | spin_unlock_irqrestore(&piix_lock, flags); | ||
| 750 | } | 757 | } |
| 751 | 758 | ||
| 752 | /** | 759 | /** |
| @@ -764,6 +771,7 @@ static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev) | |||
| 764 | static void do_pata_set_dmamode(struct ata_port *ap, struct ata_device *adev, int isich) | 771 | static void do_pata_set_dmamode(struct ata_port *ap, struct ata_device *adev, int isich) |
| 765 | { | 772 | { |
| 766 | struct pci_dev *dev = to_pci_dev(ap->host->dev); | 773 | struct pci_dev *dev = to_pci_dev(ap->host->dev); |
| 774 | unsigned long flags; | ||
| 767 | u8 master_port = ap->port_no ? 0x42 : 0x40; | 775 | u8 master_port = ap->port_no ? 0x42 : 0x40; |
| 768 | u16 master_data; | 776 | u16 master_data; |
| 769 | u8 speed = adev->dma_mode; | 777 | u8 speed = adev->dma_mode; |
| @@ -777,6 +785,8 @@ static void do_pata_set_dmamode(struct ata_port *ap, struct ata_device *adev, in | |||
| 777 | { 2, 1 }, | 785 | { 2, 1 }, |
| 778 | { 2, 3 }, }; | 786 | { 2, 3 }, }; |
| 779 | 787 | ||
| 788 | spin_lock_irqsave(&piix_lock, flags); | ||
| 789 | |||
| 780 | pci_read_config_word(dev, master_port, &master_data); | 790 | pci_read_config_word(dev, master_port, &master_data); |
| 781 | if (ap->udma_mask) | 791 | if (ap->udma_mask) |
| 782 | pci_read_config_byte(dev, 0x48, &udma_enable); | 792 | pci_read_config_byte(dev, 0x48, &udma_enable); |
| @@ -867,6 +877,8 @@ static void do_pata_set_dmamode(struct ata_port *ap, struct ata_device *adev, in | |||
| 867 | /* Don't scribble on 0x48 if the controller does not support UDMA */ | 877 | /* Don't scribble on 0x48 if the controller does not support UDMA */ |
| 868 | if (ap->udma_mask) | 878 | if (ap->udma_mask) |
| 869 | pci_write_config_byte(dev, 0x48, udma_enable); | 879 | pci_write_config_byte(dev, 0x48, udma_enable); |
| 880 | |||
| 881 | spin_unlock_irqrestore(&piix_lock, flags); | ||
| 870 | } | 882 | } |
| 871 | 883 | ||
| 872 | /** | 884 | /** |
