]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/scsi/lpfc/lpfc_els.c
[SCSI] lpfc 8.2.7 : Rework the worker thread
[linux-2.6-omap-h63xx.git] / drivers / scsi / lpfc / lpfc_els.c
index d418c7c1251ee541b2d7a211282d9046d3813f33..5d69dee85a8d743c8b91867cd4fa06029864ea15 100644 (file)
@@ -1813,11 +1813,11 @@ lpfc_els_retry_delay(unsigned long ptr)
         * count until the queued work is done
         */
        evtp->evt_arg1  = lpfc_nlp_get(ndlp);
-       evtp->evt       = LPFC_EVT_ELS_RETRY;
-       list_add_tail(&evtp->evt_listp, &phba->work_list);
-       if (phba->work_wait)
+       if (evtp->evt_arg1) {
+               evtp->evt = LPFC_EVT_ELS_RETRY;
+               list_add_tail(&evtp->evt_listp, &phba->work_list);
                lpfc_worker_wake_up(phba);
-
+       }
        spin_unlock_irqrestore(&phba->hbalock, flags);
        return;
 }
@@ -3802,20 +3802,17 @@ lpfc_els_timeout(unsigned long ptr)
 {
        struct lpfc_vport *vport = (struct lpfc_vport *) ptr;
        struct lpfc_hba   *phba = vport->phba;
+       uint32_t tmo_posted;
        unsigned long iflag;
 
        spin_lock_irqsave(&vport->work_port_lock, iflag);
-       if ((vport->work_port_events & WORKER_ELS_TMO) == 0) {
+       tmo_posted = vport->work_port_events & WORKER_ELS_TMO;
+       if (!tmo_posted)
                vport->work_port_events |= WORKER_ELS_TMO;
-               spin_unlock_irqrestore(&vport->work_port_lock, iflag);
+       spin_unlock_irqrestore(&vport->work_port_lock, iflag);
 
-               spin_lock_irqsave(&phba->hbalock, iflag);
-               if (phba->work_wait)
-                       lpfc_worker_wake_up(phba);
-               spin_unlock_irqrestore(&phba->hbalock, iflag);
-       }
-       else
-               spin_unlock_irqrestore(&vport->work_port_lock, iflag);
+       if (!tmo_posted)
+               lpfc_worker_wake_up(phba);
        return;
 }
 
@@ -4769,18 +4766,16 @@ lpfc_fabric_block_timeout(unsigned long ptr)
        struct lpfc_hba  *phba = (struct lpfc_hba *) ptr;
        unsigned long iflags;
        uint32_t tmo_posted;
+
        spin_lock_irqsave(&phba->pport->work_port_lock, iflags);
        tmo_posted = phba->pport->work_port_events & WORKER_FABRIC_BLOCK_TMO;
        if (!tmo_posted)
                phba->pport->work_port_events |= WORKER_FABRIC_BLOCK_TMO;
        spin_unlock_irqrestore(&phba->pport->work_port_lock, iflags);
 
-       if (!tmo_posted) {
-               spin_lock_irqsave(&phba->hbalock, iflags);
-               if (phba->work_wait)
-                       lpfc_worker_wake_up(phba);
-               spin_unlock_irqrestore(&phba->hbalock, iflags);
-       }
+       if (!tmo_posted)
+               lpfc_worker_wake_up(phba);
+       return;
 }
 
 static void