]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/scsi/lpfc/lpfc_els.c
[SCSI] lpfc 8.3.13: Add TX Queue Support for SLI4 ELS commands.
[mv-sheeva.git] / drivers / scsi / lpfc / lpfc_els.c
index 6b1850c9fdff355fda8d507f4c1256b581efa6b6..f936f8c7efe17e17b59eb826368045047e406a12 100644 (file)
@@ -1472,8 +1472,12 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
                        }
                        goto out;
                }
-               /* PLOGI failed */
-               lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
+               /* PLOGI failed Don't print the vport to vport rjts */
+               if (irsp->ulpStatus != IOSTAT_LS_RJT ||
+                       (((irsp->un.ulpWord[4]) >> 16 != LSRJT_INVALID_CMD) &&
+                       ((irsp->un.ulpWord[4]) >> 16 != LSRJT_UNABLE_TPC)) ||
+                       (phba)->pport->cfg_log_verbose & LOG_ELS)
+                       lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
                                 "2753 PLOGI failure DID:%06X Status:x%x/x%x\n",
                                 ndlp->nlp_DID, irsp->ulpStatus,
                                 irsp->un.ulpWord[4]);
@@ -5144,6 +5148,7 @@ lpfc_els_timeout(unsigned long ptr)
        return;
 }
 
+
 /**
  * lpfc_els_timeout_handler - Process an els timeout event
  * @vport: pointer to a virtual N_Port data structure.
@@ -5164,13 +5169,19 @@ lpfc_els_timeout_handler(struct lpfc_vport *vport)
        uint32_t els_command = 0;
        uint32_t timeout;
        uint32_t remote_ID = 0xffffffff;
+       LIST_HEAD(txcmplq_completions);
+       LIST_HEAD(abort_list);
+
 
-       spin_lock_irq(&phba->hbalock);
        timeout = (uint32_t)(phba->fc_ratov << 1);
 
        pring = &phba->sli.ring[LPFC_ELS_RING];
 
-       list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
+       spin_lock_irq(&phba->hbalock);
+       list_splice_init(&pring->txcmplq, &txcmplq_completions);
+       spin_unlock_irq(&phba->hbalock);
+
+       list_for_each_entry_safe(piocb, tmp_iocb, &txcmplq_completions, list) {
                cmd = &piocb->iocb;
 
                if ((piocb->iocb_flag & LPFC_IO_LIBDFC) != 0 ||
@@ -5207,13 +5218,22 @@ lpfc_els_timeout_handler(struct lpfc_vport *vport)
                        if (ndlp && NLP_CHK_NODE_ACT(ndlp))
                                remote_ID = ndlp->nlp_DID;
                }
+               list_add_tail(&piocb->dlist, &abort_list);
+       }
+       spin_lock_irq(&phba->hbalock);
+       list_splice(&txcmplq_completions, &pring->txcmplq);
+       spin_unlock_irq(&phba->hbalock);
+
+       list_for_each_entry_safe(piocb, tmp_iocb, &abort_list, dlist) {
                lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
-                                "0127 ELS timeout Data: x%x x%x x%x "
-                                "x%x\n", els_command,
-                                remote_ID, cmd->ulpCommand, cmd->ulpIoTag);
+                        "0127 ELS timeout Data: x%x x%x x%x "
+                        "x%x\n", els_command,
+                        remote_ID, cmd->ulpCommand, cmd->ulpIoTag);
+               spin_lock_irq(&phba->hbalock);
+               list_del_init(&piocb->dlist);
                lpfc_sli_issue_abort_iotag(phba, pring, piocb);
+               spin_unlock_irq(&phba->hbalock);
        }
-       spin_unlock_irq(&phba->hbalock);
 
        if (phba->sli.ring[LPFC_ELS_RING].txcmplq_cnt)
                mod_timer(&vport->els_tmofunc, jiffies + HZ * timeout);