aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/aic94xx/aic94xx_seq.c
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@us.ibm.com>2007-01-11 17:15:32 -0500
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2007-01-13 17:19:42 -0500
commit57ba07dc54b7657e69fe8ac42d83df21e415c85b (patch)
tree493da7233a4d7116c6302099a81c6c087b106165 /drivers/scsi/aic94xx/aic94xx_seq.c
parent3b709df5f7c83b6b0907217a248a1414a37ffcb6 (diff)
[SCSI] aic94xx: Lock DDB read/write accesses
Extend the use of the DDB lock to include all DDB accesses, because DDB updates now occur from multiple threads. This fixes the SMP timeout problems that we were occasionally seeing with a x260, because the controller got confused when the DDBs got corrupted. Signed-off-by: Darrick J. Wong <djwong@us.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/aic94xx/aic94xx_seq.c')
-rw-r--r--drivers/scsi/aic94xx/aic94xx_seq.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/scsi/aic94xx/aic94xx_seq.c b/drivers/scsi/aic94xx/aic94xx_seq.c
index 0d343cfd4333..2768fe4d66ba 100644
--- a/drivers/scsi/aic94xx/aic94xx_seq.c
+++ b/drivers/scsi/aic94xx/aic94xx_seq.c
@@ -1395,7 +1395,9 @@ void asd_update_port_links(struct asd_ha_struct *asd_ha, struct asd_phy *phy)
1395 u8 phy_is_up; 1395 u8 phy_is_up;
1396 u8 mask; 1396 u8 mask;
1397 int i, err; 1397 int i, err;
1398 unsigned long flags;
1398 1399
1400 spin_lock_irqsave(&asd_ha->hw_prof.ddb_lock, flags);
1399 for_each_phy(phy_mask, mask, i) 1401 for_each_phy(phy_mask, mask, i)
1400 asd_ddbsite_write_byte(asd_ha, 0, 1402 asd_ddbsite_write_byte(asd_ha, 0,
1401 offsetof(struct asd_ddb_seq_shared, 1403 offsetof(struct asd_ddb_seq_shared,
@@ -1415,6 +1417,7 @@ void asd_update_port_links(struct asd_ha_struct *asd_ha, struct asd_phy *phy)
1415 break; 1417 break;
1416 } 1418 }
1417 } 1419 }
1420 spin_unlock_irqrestore(&asd_ha->hw_prof.ddb_lock, flags);
1418 1421
1419 if (err) 1422 if (err)
1420 asd_printk("couldn't update DDB 0:error:%d\n", err); 1423 asd_printk("couldn't update DDB 0:error:%d\n", err);