diff options
author | James Smart <James.Smart@Emulex.Com> | 2006-03-07 15:04:13 -0500 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-03-12 09:56:58 -0500 |
commit | 9290831f00879d4a66d3bffb609949d5ea5576fb (patch) | |
tree | f66748c875962518f9d4784fd684e189feb50d84 /drivers/scsi/lpfc/lpfc_hbadisc.c | |
parent | 1a169689c2152ea599c94d622204f7bf5b7dc09f (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.c | 4 |
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 | } |