aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/lpfc/lpfc_hbadisc.c
diff options
context:
space:
mode:
authorJames Smart <James.Smart@Emulex.Com>2006-03-07 15:04:13 -0500
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2006-03-12 09:56:58 -0500
commit9290831f00879d4a66d3bffb609949d5ea5576fb (patch)
treef66748c875962518f9d4784fd684e189feb50d84 /drivers/scsi/lpfc/lpfc_hbadisc.c
parent1a169689c2152ea599c94d622204f7bf5b7dc09f (diff)
[SCSI] lpfc 8.1.4 : Introduce lpfc_reset_barrier() function for resets on dual channel adapters
Introduce lpfc_reset_barrier() function for resets on dual channel adapters Workaround for a hardware errata on dual channel asics. There is a potential for the chip to lock up on a reset if a shared dma engine is in use. The (ugly) work around requires a reset process which uses a mailbox command to synchronize the independent channels prior to the reset to avoid the issue. Unfortunately, the timing windows required to ensure this workaround succeeds are very specific, meaning we can't release the cpu during the barrier. Signed-off-by: James Smart <James.Smart@emulex.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_hbadisc.c')
-rw-r--r--drivers/scsi/lpfc/lpfc_hbadisc.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
index 82704148d5d4..f54089fe4732 100644
--- a/drivers/scsi/lpfc/lpfc_hbadisc.c
+++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
@@ -155,6 +155,7 @@ lpfc_work_list_done(struct lpfc_hba * phba)
155 case LPFC_EVT_WARM_START: 155 case LPFC_EVT_WARM_START:
156 if (phba->hba_state >= LPFC_LINK_DOWN) 156 if (phba->hba_state >= LPFC_LINK_DOWN)
157 lpfc_offline(phba); 157 lpfc_offline(phba);
158 lpfc_reset_barrier(phba);
158 lpfc_sli_brdreset(phba); 159 lpfc_sli_brdreset(phba);
159 lpfc_hba_down_post(phba); 160 lpfc_hba_down_post(phba);
160 *(int *)(evtp->evt_arg1) = 161 *(int *)(evtp->evt_arg1) =
@@ -164,7 +165,8 @@ lpfc_work_list_done(struct lpfc_hba * phba)
164 case LPFC_EVT_KILL: 165 case LPFC_EVT_KILL:
165 if (phba->hba_state >= LPFC_LINK_DOWN) 166 if (phba->hba_state >= LPFC_LINK_DOWN)
166 lpfc_offline(phba); 167 lpfc_offline(phba);
167 *(int *)(evtp->evt_arg1) = lpfc_sli_brdkill(phba); 168 *(int *)(evtp->evt_arg1)
169 = (phba->stopped) ? 0 : lpfc_sli_brdkill(phba);
168 complete((struct completion *)(evtp->evt_arg2)); 170 complete((struct completion *)(evtp->evt_arg2));
169 break; 171 break;
170 } 172 }