diff options
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_sli.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index eadc19346408..4e5b4ee121f1 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -5238,6 +5238,7 @@ lpfc_sp_intr_handler(int irq, void *dev_id) | |||
5238 | uint32_t ha_copy; | 5238 | uint32_t ha_copy; |
5239 | uint32_t work_ha_copy; | 5239 | uint32_t work_ha_copy; |
5240 | unsigned long status; | 5240 | unsigned long status; |
5241 | unsigned long iflag; | ||
5241 | uint32_t control; | 5242 | uint32_t control; |
5242 | 5243 | ||
5243 | MAILBOX_t *mbox, *pmbox; | 5244 | MAILBOX_t *mbox, *pmbox; |
@@ -5270,7 +5271,7 @@ lpfc_sp_intr_handler(int irq, void *dev_id) | |||
5270 | if (unlikely(phba->link_state < LPFC_LINK_DOWN)) | 5271 | if (unlikely(phba->link_state < LPFC_LINK_DOWN)) |
5271 | return IRQ_NONE; | 5272 | return IRQ_NONE; |
5272 | /* Need to read HA REG for slow-path events */ | 5273 | /* Need to read HA REG for slow-path events */ |
5273 | spin_lock(&phba->hbalock); | 5274 | spin_lock_irqsave(&phba->hbalock, iflag); |
5274 | ha_copy = readl(phba->HAregaddr); | 5275 | ha_copy = readl(phba->HAregaddr); |
5275 | /* If somebody is waiting to handle an eratt don't process it | 5276 | /* If somebody is waiting to handle an eratt don't process it |
5276 | * here. The brdkill function will do this. | 5277 | * here. The brdkill function will do this. |
@@ -5290,7 +5291,7 @@ lpfc_sp_intr_handler(int irq, void *dev_id) | |||
5290 | writel((ha_copy & (HA_MBATT | HA_R2_CLR_MSK)), | 5291 | writel((ha_copy & (HA_MBATT | HA_R2_CLR_MSK)), |
5291 | phba->HAregaddr); | 5292 | phba->HAregaddr); |
5292 | readl(phba->HAregaddr); /* flush */ | 5293 | readl(phba->HAregaddr); /* flush */ |
5293 | spin_unlock(&phba->hbalock); | 5294 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
5294 | } else | 5295 | } else |
5295 | ha_copy = phba->ha_copy; | 5296 | ha_copy = phba->ha_copy; |
5296 | 5297 | ||
@@ -5303,13 +5304,13 @@ lpfc_sp_intr_handler(int irq, void *dev_id) | |||
5303 | * Turn off Link Attention interrupts | 5304 | * Turn off Link Attention interrupts |
5304 | * until CLEAR_LA done | 5305 | * until CLEAR_LA done |
5305 | */ | 5306 | */ |
5306 | spin_lock(&phba->hbalock); | 5307 | spin_lock_irqsave(&phba->hbalock, iflag); |
5307 | phba->sli.sli_flag &= ~LPFC_PROCESS_LA; | 5308 | phba->sli.sli_flag &= ~LPFC_PROCESS_LA; |
5308 | control = readl(phba->HCregaddr); | 5309 | control = readl(phba->HCregaddr); |
5309 | control &= ~HC_LAINT_ENA; | 5310 | control &= ~HC_LAINT_ENA; |
5310 | writel(control, phba->HCregaddr); | 5311 | writel(control, phba->HCregaddr); |
5311 | readl(phba->HCregaddr); /* flush */ | 5312 | readl(phba->HCregaddr); /* flush */ |
5312 | spin_unlock(&phba->hbalock); | 5313 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
5313 | } | 5314 | } |
5314 | else | 5315 | else |
5315 | work_ha_copy &= ~HA_LATT; | 5316 | work_ha_copy &= ~HA_LATT; |
@@ -5324,7 +5325,7 @@ lpfc_sp_intr_handler(int irq, void *dev_id) | |||
5324 | (HA_RXMASK << (4*LPFC_ELS_RING))); | 5325 | (HA_RXMASK << (4*LPFC_ELS_RING))); |
5325 | status >>= (4*LPFC_ELS_RING); | 5326 | status >>= (4*LPFC_ELS_RING); |
5326 | if (status & HA_RXMASK) { | 5327 | if (status & HA_RXMASK) { |
5327 | spin_lock(&phba->hbalock); | 5328 | spin_lock_irqsave(&phba->hbalock, iflag); |
5328 | control = readl(phba->HCregaddr); | 5329 | control = readl(phba->HCregaddr); |
5329 | 5330 | ||
5330 | lpfc_debugfs_slow_ring_trc(phba, | 5331 | lpfc_debugfs_slow_ring_trc(phba, |
@@ -5353,10 +5354,10 @@ lpfc_sp_intr_handler(int irq, void *dev_id) | |||
5353 | (uint32_t)((unsigned long) | 5354 | (uint32_t)((unsigned long) |
5354 | &phba->work_waitq)); | 5355 | &phba->work_waitq)); |
5355 | } | 5356 | } |
5356 | spin_unlock(&phba->hbalock); | 5357 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
5357 | } | 5358 | } |
5358 | } | 5359 | } |
5359 | spin_lock(&phba->hbalock); | 5360 | spin_lock_irqsave(&phba->hbalock, iflag); |
5360 | if (work_ha_copy & HA_ERATT) | 5361 | if (work_ha_copy & HA_ERATT) |
5361 | lpfc_sli_read_hs(phba); | 5362 | lpfc_sli_read_hs(phba); |
5362 | if ((work_ha_copy & HA_MBATT) && (phba->sli.mbox_active)) { | 5363 | if ((work_ha_copy & HA_MBATT) && (phba->sli.mbox_active)) { |
@@ -5368,7 +5369,7 @@ lpfc_sp_intr_handler(int irq, void *dev_id) | |||
5368 | /* First check out the status word */ | 5369 | /* First check out the status word */ |
5369 | lpfc_sli_pcimem_bcopy(mbox, pmbox, sizeof(uint32_t)); | 5370 | lpfc_sli_pcimem_bcopy(mbox, pmbox, sizeof(uint32_t)); |
5370 | if (pmbox->mbxOwner != OWN_HOST) { | 5371 | if (pmbox->mbxOwner != OWN_HOST) { |
5371 | spin_unlock(&phba->hbalock); | 5372 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
5372 | /* | 5373 | /* |
5373 | * Stray Mailbox Interrupt, mbxCommand <cmd> | 5374 | * Stray Mailbox Interrupt, mbxCommand <cmd> |
5374 | * mbxStatus <status> | 5375 | * mbxStatus <status> |
@@ -5385,7 +5386,7 @@ lpfc_sp_intr_handler(int irq, void *dev_id) | |||
5385 | work_ha_copy &= ~HA_MBATT; | 5386 | work_ha_copy &= ~HA_MBATT; |
5386 | } else { | 5387 | } else { |
5387 | phba->sli.mbox_active = NULL; | 5388 | phba->sli.mbox_active = NULL; |
5388 | spin_unlock(&phba->hbalock); | 5389 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
5389 | phba->last_completion_time = jiffies; | 5390 | phba->last_completion_time = jiffies; |
5390 | del_timer(&phba->sli.mbox_tmo); | 5391 | del_timer(&phba->sli.mbox_tmo); |
5391 | if (pmb->mbox_cmpl) { | 5392 | if (pmb->mbox_cmpl) { |
@@ -5434,14 +5435,18 @@ lpfc_sp_intr_handler(int irq, void *dev_id) | |||
5434 | goto send_current_mbox; | 5435 | goto send_current_mbox; |
5435 | } | 5436 | } |
5436 | } | 5437 | } |
5437 | spin_lock(&phba->pport->work_port_lock); | 5438 | spin_lock_irqsave( |
5439 | &phba->pport->work_port_lock, | ||
5440 | iflag); | ||
5438 | phba->pport->work_port_events &= | 5441 | phba->pport->work_port_events &= |
5439 | ~WORKER_MBOX_TMO; | 5442 | ~WORKER_MBOX_TMO; |
5440 | spin_unlock(&phba->pport->work_port_lock); | 5443 | spin_unlock_irqrestore( |
5444 | &phba->pport->work_port_lock, | ||
5445 | iflag); | ||
5441 | lpfc_mbox_cmpl_put(phba, pmb); | 5446 | lpfc_mbox_cmpl_put(phba, pmb); |
5442 | } | 5447 | } |
5443 | } else | 5448 | } else |
5444 | spin_unlock(&phba->hbalock); | 5449 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
5445 | 5450 | ||
5446 | if ((work_ha_copy & HA_MBATT) && | 5451 | if ((work_ha_copy & HA_MBATT) && |
5447 | (phba->sli.mbox_active == NULL)) { | 5452 | (phba->sli.mbox_active == NULL)) { |
@@ -5457,9 +5462,9 @@ send_current_mbox: | |||
5457 | "MBX_SUCCESS"); | 5462 | "MBX_SUCCESS"); |
5458 | } | 5463 | } |
5459 | 5464 | ||
5460 | spin_lock(&phba->hbalock); | 5465 | spin_lock_irqsave(&phba->hbalock, iflag); |
5461 | phba->work_ha |= work_ha_copy; | 5466 | phba->work_ha |= work_ha_copy; |
5462 | spin_unlock(&phba->hbalock); | 5467 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
5463 | lpfc_worker_wake_up(phba); | 5468 | lpfc_worker_wake_up(phba); |
5464 | } | 5469 | } |
5465 | return IRQ_HANDLED; | 5470 | return IRQ_HANDLED; |
@@ -5491,6 +5496,7 @@ lpfc_fp_intr_handler(int irq, void *dev_id) | |||
5491 | struct lpfc_hba *phba; | 5496 | struct lpfc_hba *phba; |
5492 | uint32_t ha_copy; | 5497 | uint32_t ha_copy; |
5493 | unsigned long status; | 5498 | unsigned long status; |
5499 | unsigned long iflag; | ||
5494 | 5500 | ||
5495 | /* Get the driver's phba structure from the dev_id and | 5501 | /* Get the driver's phba structure from the dev_id and |
5496 | * assume the HBA is not interrupting. | 5502 | * assume the HBA is not interrupting. |
@@ -5516,11 +5522,11 @@ lpfc_fp_intr_handler(int irq, void *dev_id) | |||
5516 | /* Need to read HA REG for FCP ring and other ring events */ | 5522 | /* Need to read HA REG for FCP ring and other ring events */ |
5517 | ha_copy = readl(phba->HAregaddr); | 5523 | ha_copy = readl(phba->HAregaddr); |
5518 | /* Clear up only attention source related to fast-path */ | 5524 | /* Clear up only attention source related to fast-path */ |
5519 | spin_lock(&phba->hbalock); | 5525 | spin_lock_irqsave(&phba->hbalock, iflag); |
5520 | writel((ha_copy & (HA_R0_CLR_MSK | HA_R1_CLR_MSK)), | 5526 | writel((ha_copy & (HA_R0_CLR_MSK | HA_R1_CLR_MSK)), |
5521 | phba->HAregaddr); | 5527 | phba->HAregaddr); |
5522 | readl(phba->HAregaddr); /* flush */ | 5528 | readl(phba->HAregaddr); /* flush */ |
5523 | spin_unlock(&phba->hbalock); | 5529 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
5524 | } else | 5530 | } else |
5525 | ha_copy = phba->ha_copy; | 5531 | ha_copy = phba->ha_copy; |
5526 | 5532 | ||