aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/ata_piix.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata/ata_piix.c')
-rw-r--r--drivers/ata/ata_piix.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
index 7409f98d2ae6..3971bc0a4838 100644
--- a/drivers/ata/ata_piix.c
+++ b/drivers/ata/ata_piix.c
@@ -158,6 +158,7 @@ struct piix_map_db {
158struct piix_host_priv { 158struct piix_host_priv {
159 const int *map; 159 const int *map;
160 u32 saved_iocfg; 160 u32 saved_iocfg;
161 spinlock_t sidpr_lock; /* FIXME: remove once locking in EH is fixed */
161 void __iomem *sidpr; 162 void __iomem *sidpr;
162}; 163};
163 164
@@ -951,12 +952,15 @@ static int piix_sidpr_scr_read(struct ata_link *link,
951 unsigned int reg, u32 *val) 952 unsigned int reg, u32 *val)
952{ 953{
953 struct piix_host_priv *hpriv = link->ap->host->private_data; 954 struct piix_host_priv *hpriv = link->ap->host->private_data;
955 unsigned long flags;
954 956
955 if (reg >= ARRAY_SIZE(piix_sidx_map)) 957 if (reg >= ARRAY_SIZE(piix_sidx_map))
956 return -EINVAL; 958 return -EINVAL;
957 959
960 spin_lock_irqsave(&hpriv->sidpr_lock, flags);
958 piix_sidpr_sel(link, reg); 961 piix_sidpr_sel(link, reg);
959 *val = ioread32(hpriv->sidpr + PIIX_SIDPR_DATA); 962 *val = ioread32(hpriv->sidpr + PIIX_SIDPR_DATA);
963 spin_unlock_irqrestore(&hpriv->sidpr_lock, flags);
960 return 0; 964 return 0;
961} 965}
962 966
@@ -964,12 +968,15 @@ static int piix_sidpr_scr_write(struct ata_link *link,
964 unsigned int reg, u32 val) 968 unsigned int reg, u32 val)
965{ 969{
966 struct piix_host_priv *hpriv = link->ap->host->private_data; 970 struct piix_host_priv *hpriv = link->ap->host->private_data;
971 unsigned long flags;
967 972
968 if (reg >= ARRAY_SIZE(piix_sidx_map)) 973 if (reg >= ARRAY_SIZE(piix_sidx_map))
969 return -EINVAL; 974 return -EINVAL;
970 975
976 spin_lock_irqsave(&hpriv->sidpr_lock, flags);
971 piix_sidpr_sel(link, reg); 977 piix_sidpr_sel(link, reg);
972 iowrite32(val, hpriv->sidpr + PIIX_SIDPR_DATA); 978 iowrite32(val, hpriv->sidpr + PIIX_SIDPR_DATA);
979 spin_unlock_irqrestore(&hpriv->sidpr_lock, flags);
973 return 0; 980 return 0;
974} 981}
975 982
@@ -1566,6 +1573,7 @@ static int __devinit piix_init_one(struct pci_dev *pdev,
1566 hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL); 1573 hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
1567 if (!hpriv) 1574 if (!hpriv)
1568 return -ENOMEM; 1575 return -ENOMEM;
1576 spin_lock_init(&hpriv->sidpr_lock);
1569 1577
1570 /* Save IOCFG, this will be used for cable detection, quirk 1578 /* Save IOCFG, this will be used for cable detection, quirk
1571 * detection and restoration on detach. This is necessary 1579 * detection and restoration on detach. This is necessary