list_del(&sglq_entry->list);
                        ndlp = sglq_entry->ndlp;
                        sglq_entry->ndlp = NULL;
+                       spin_lock(&pring->ring_lock);
                        list_add_tail(&sglq_entry->list,
                                &phba->sli4_hba.lpfc_sgl_list);
                        sglq_entry->state = SGL_FREED;
+                       spin_unlock(&pring->ring_lock);
                        spin_unlock(&phba->sli4_hba.abts_sgl_list_lock);
                        spin_unlock_irqrestore(&phba->hbalock, iflag);
                        lpfc_set_rrq_active(phba, ndlp,
                spin_unlock_irqrestore(&phba->hbalock, iflag);
                return;
        }
+       spin_lock(&pring->ring_lock);
        sglq_entry = __lpfc_get_active_sglq(phba, lxri);
        if (!sglq_entry || (sglq_entry->sli4_xritag != xri)) {
+               spin_unlock(&pring->ring_lock);
                spin_unlock_irqrestore(&phba->hbalock, iflag);
                return;
        }
        sglq_entry->state = SGL_XRI_ABORTED;
+       spin_unlock(&pring->ring_lock);
        spin_unlock_irqrestore(&phba->hbalock, iflag);
        return;
 }
 
        LIST_HEAD(aborts);
        unsigned long iflag = 0;
        struct lpfc_sglq *sglq_entry = NULL;
+       struct lpfc_sli *psli = &phba->sli;
+       struct lpfc_sli_ring *pring;
 
        lpfc_hba_free_post_buf(phba);
        lpfc_hba_clean_txcmplq(phba);
+       pring = &psli->ring[LPFC_ELS_RING];
 
        /* At this point in time the HBA is either reset or DOA. Either
         * way, nothing should be on lpfc_abts_els_sgl_list, it needs to be
                &phba->sli4_hba.lpfc_abts_els_sgl_list, list)
                sglq_entry->state = SGL_FREED;
 
+       spin_lock(&pring->ring_lock);
        list_splice_init(&phba->sli4_hba.lpfc_abts_els_sgl_list,
                        &phba->sli4_hba.lpfc_sgl_list);
+       spin_unlock(&pring->ring_lock);
        spin_unlock(&phba->sli4_hba.abts_sgl_list_lock);
        /* abts_scsi_buf_list_lock required because worker thread uses this
         * list.
        LIST_HEAD(els_sgl_list);
        LIST_HEAD(scsi_sgl_list);
        int rc;
+       struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING];
 
        /*
         * update on pci function's els xri-sgl list
                        list_add_tail(&sglq_entry->list, &els_sgl_list);
                }
                spin_lock_irq(&phba->hbalock);
+               spin_lock(&pring->ring_lock);
                list_splice_init(&els_sgl_list, &phba->sli4_hba.lpfc_sgl_list);
+               spin_unlock(&pring->ring_lock);
                spin_unlock_irq(&phba->hbalock);
        } else if (els_xri_cnt < phba->sli4_hba.els_xri_cnt) {
                /* els xri-sgl shrinked */
                                "%d to %d\n", phba->sli4_hba.els_xri_cnt,
                                els_xri_cnt);
                spin_lock_irq(&phba->hbalock);
+               spin_lock(&pring->ring_lock);
                list_splice_init(&phba->sli4_hba.lpfc_sgl_list, &els_sgl_list);
+               spin_unlock(&pring->ring_lock);
                spin_unlock_irq(&phba->hbalock);
                /* release extra els sgls from list */
                for (i = 0; i < xri_cnt; i++) {
                        }
                }
                spin_lock_irq(&phba->hbalock);
+               spin_lock(&pring->ring_lock);
                list_splice_init(&els_sgl_list, &phba->sli4_hba.lpfc_sgl_list);
+               spin_unlock(&pring->ring_lock);
                spin_unlock_irq(&phba->hbalock);
        } else
                lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
 lpfc_free_els_sgl_list(struct lpfc_hba *phba)
 {
        LIST_HEAD(sglq_list);
+       struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING];
 
        /* Retrieve all els sgls from driver list */
        spin_lock_irq(&phba->hbalock);
+       spin_lock(&pring->ring_lock);
        list_splice_init(&phba->sli4_hba.lpfc_sgl_list, &sglq_list);
+       spin_unlock(&pring->ring_lock);
        spin_unlock_irq(&phba->hbalock);
 
        /* Now free the sgl list */
 
  * @phba: Pointer to HBA context object.
  * @piocb: Pointer to the iocbq.
  *
- * This function is called with hbalock held. This function
+ * This function is called with the ring lock held. This function
  * gets a new driver sglq object from the sglq list. If the
  * list is not empty then it is successful, it returns pointer to the newly
  * allocated sglq object else it returns NULL.
                        spin_unlock_irqrestore(
                                &phba->sli4_hba.abts_sgl_list_lock, iflag);
                } else {
+                       spin_lock_irqsave(&pring->ring_lock, iflag);
                        sglq->state = SGL_FREED;
                        sglq->ndlp = NULL;
                        list_add_tail(&sglq->list,
                                &phba->sli4_hba.lpfc_sgl_list);
+                       spin_unlock_irqrestore(&pring->ring_lock, iflag);
 
                        /* Check if TXQ queue needs to be serviced */
                        if (!list_empty(&pring->txq))
        struct lpfc_sglq *sglq_entry_first = NULL;
        int status, total_cnt, post_cnt = 0, num_posted = 0, block_cnt = 0;
        int last_xritag = NO_XRI;
+       struct lpfc_sli_ring *pring;
        LIST_HEAD(prep_sgl_list);
        LIST_HEAD(blck_sgl_list);
        LIST_HEAD(allc_sgl_list);
        LIST_HEAD(post_sgl_list);
        LIST_HEAD(free_sgl_list);
 
+       pring = &phba->sli.ring[LPFC_ELS_RING];
        spin_lock_irq(&phba->hbalock);
+       spin_lock(&pring->ring_lock);
        list_splice_init(&phba->sli4_hba.lpfc_sgl_list, &allc_sgl_list);
+       spin_unlock(&pring->ring_lock);
        spin_unlock_irq(&phba->hbalock);
 
        total_cnt = phba->sli4_hba.els_xri_cnt;
        /* push els sgls posted to the availble list */
        if (!list_empty(&post_sgl_list)) {
                spin_lock_irq(&phba->hbalock);
+               spin_lock(&pring->ring_lock);
                list_splice_init(&post_sgl_list,
                                 &phba->sli4_hba.lpfc_sgl_list);
+               spin_unlock(&pring->ring_lock);
                spin_unlock_irq(&phba->hbalock);
        } else {
                lpfc_printf_log(phba, KERN_ERR, LOG_SLI,