uint32_t rc, keepDID = 0;
        int  put_node;
        int  put_rport;
-       struct lpfc_node_rrqs rrq;
+       unsigned long *active_rrqs_xri_bitmap = NULL;
 
        /* Fabric nodes can have the same WWPN so we don't bother searching
         * by WWPN.  Just return the ndlp that was given to us.
 
        if (new_ndlp == ndlp && NLP_CHK_NODE_ACT(new_ndlp))
                return ndlp;
-       memset(&rrq.xri_bitmap, 0, sizeof(new_ndlp->active_rrqs.xri_bitmap));
+       if (phba->sli_rev == LPFC_SLI_REV4) {
+               active_rrqs_xri_bitmap = mempool_alloc(phba->active_rrq_pool,
+                                                      GFP_KERNEL);
+               if (active_rrqs_xri_bitmap)
+                       memset(active_rrqs_xri_bitmap, 0,
+                              phba->cfg_rrq_xri_bitmap_sz);
+       }
 
        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
                 "3178 PLOGI confirm: ndlp %p x%x: new_ndlp %p\n",
        if (!new_ndlp) {
                rc = memcmp(&ndlp->nlp_portname, name,
                            sizeof(struct lpfc_name));
-               if (!rc)
+               if (!rc) {
+                       if (active_rrqs_xri_bitmap)
+                               mempool_free(active_rrqs_xri_bitmap,
+                                            phba->active_rrq_pool);
                        return ndlp;
+               }
                new_ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_ATOMIC);
-               if (!new_ndlp)
+               if (!new_ndlp) {
+                       if (active_rrqs_xri_bitmap)
+                               mempool_free(active_rrqs_xri_bitmap,
+                                            phba->active_rrq_pool);
                        return ndlp;
+               }
                lpfc_nlp_init(vport, new_ndlp, ndlp->nlp_DID);
        } else if (!NLP_CHK_NODE_ACT(new_ndlp)) {
                rc = memcmp(&ndlp->nlp_portname, name,
                            sizeof(struct lpfc_name));
-               if (!rc)
+               if (!rc) {
+                       if (active_rrqs_xri_bitmap)
+                               mempool_free(active_rrqs_xri_bitmap,
+                                            phba->active_rrq_pool);
                        return ndlp;
+               }
                new_ndlp = lpfc_enable_node(vport, new_ndlp,
                                                NLP_STE_UNUSED_NODE);
-               if (!new_ndlp)
+               if (!new_ndlp) {
+                       if (active_rrqs_xri_bitmap)
+                               mempool_free(active_rrqs_xri_bitmap,
+                                            phba->active_rrq_pool);
                        return ndlp;
+               }
                keepDID = new_ndlp->nlp_DID;
-               if (phba->sli_rev == LPFC_SLI_REV4)
-                       memcpy(&rrq.xri_bitmap,
-                               &new_ndlp->active_rrqs.xri_bitmap,
-                               sizeof(new_ndlp->active_rrqs.xri_bitmap));
+               if ((phba->sli_rev == LPFC_SLI_REV4) && active_rrqs_xri_bitmap)
+                       memcpy(active_rrqs_xri_bitmap,
+                              new_ndlp->active_rrqs_xri_bitmap,
+                              phba->cfg_rrq_xri_bitmap_sz);
        } else {
                keepDID = new_ndlp->nlp_DID;
-               if (phba->sli_rev == LPFC_SLI_REV4)
-                       memcpy(&rrq.xri_bitmap,
-                               &new_ndlp->active_rrqs.xri_bitmap,
-                               sizeof(new_ndlp->active_rrqs.xri_bitmap));
+               if (phba->sli_rev == LPFC_SLI_REV4 &&
+                   active_rrqs_xri_bitmap)
+                       memcpy(active_rrqs_xri_bitmap,
+                              new_ndlp->active_rrqs_xri_bitmap,
+                              phba->cfg_rrq_xri_bitmap_sz);
        }
 
        lpfc_unreg_rpi(vport, new_ndlp);
        new_ndlp->nlp_DID = ndlp->nlp_DID;
        new_ndlp->nlp_prev_state = ndlp->nlp_prev_state;
        if (phba->sli_rev == LPFC_SLI_REV4)
-               memcpy(new_ndlp->active_rrqs.xri_bitmap,
-                       &ndlp->active_rrqs.xri_bitmap,
-                       sizeof(ndlp->active_rrqs.xri_bitmap));
+               memcpy(new_ndlp->active_rrqs_xri_bitmap,
+                      ndlp->active_rrqs_xri_bitmap,
+                      phba->cfg_rrq_xri_bitmap_sz);
 
        if (ndlp->nlp_flag & NLP_NPR_2B_DISC)
                new_ndlp->nlp_flag |= NLP_NPR_2B_DISC;
 
                /* Two ndlps cannot have the same did on the nodelist */
                ndlp->nlp_DID = keepDID;
-               if (phba->sli_rev == LPFC_SLI_REV4)
-                       memcpy(&ndlp->active_rrqs.xri_bitmap,
-                               &rrq.xri_bitmap,
-                               sizeof(ndlp->active_rrqs.xri_bitmap));
+               if (phba->sli_rev == LPFC_SLI_REV4 &&
+                   active_rrqs_xri_bitmap)
+                       memcpy(ndlp->active_rrqs_xri_bitmap,
+                              active_rrqs_xri_bitmap,
+                              phba->cfg_rrq_xri_bitmap_sz);
                lpfc_drop_node(vport, ndlp);
        }
        else {
 
                /* Two ndlps cannot have the same did */
                ndlp->nlp_DID = keepDID;
-               if (phba->sli_rev == LPFC_SLI_REV4)
-                       memcpy(&ndlp->active_rrqs.xri_bitmap,
-                               &rrq.xri_bitmap,
-                               sizeof(ndlp->active_rrqs.xri_bitmap));
+               if (phba->sli_rev == LPFC_SLI_REV4 &&
+                   active_rrqs_xri_bitmap)
+                       memcpy(ndlp->active_rrqs_xri_bitmap,
+                              active_rrqs_xri_bitmap,
+                              phba->cfg_rrq_xri_bitmap_sz);
 
                /* Since we are swapping the ndlp passed in with the new one
                 * and the did has already been swapped, copy over state.
                                put_device(&rport->dev);
                }
        }
+       if (phba->sli_rev == LPFC_SLI_REV4 &&
+           active_rrqs_xri_bitmap)
+               mempool_free(active_rrqs_xri_bitmap,
+                            phba->active_rrq_pool);
        return new_ndlp;
 }
 
        /* This will cause the callback-function lpfc_cmpl_els_cmd to
         * trigger the release of node.
         */
+
        lpfc_nlp_put(ndlp);
        return 0;
 }
 
        struct lpfc_hba *phba = vport->phba;
        uint32_t did;
        unsigned long flags;
+       unsigned long *active_rrqs_xri_bitmap = NULL;
 
        if (!ndlp)
                return NULL;
 
        /* Keep the original DID */
        did = ndlp->nlp_DID;
+       if (phba->sli_rev == LPFC_SLI_REV4)
+               active_rrqs_xri_bitmap = ndlp->active_rrqs_xri_bitmap;
 
        /* re-initialize ndlp except of ndlp linked list pointer */
        memset((((char *)ndlp) + sizeof (struct list_head)), 0,
                sizeof (struct lpfc_nodelist) - sizeof (struct list_head));
        lpfc_initialize_node(vport, ndlp, did);
 
+       if (phba->sli_rev == LPFC_SLI_REV4)
+               ndlp->active_rrqs_xri_bitmap = active_rrqs_xri_bitmap;
+
        spin_unlock_irqrestore(&phba->ndlp_lock, flags);
        if (vport->phba->sli_rev == LPFC_SLI_REV4)
                ndlp->nlp_rpi = lpfc_sli4_alloc_rpi(vport->phba);
                                 ((uint32_t) ndlp->nlp_rpi & 0xff));
                        lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE,
                                         "0929 FIND node DID "
-                                        "Data: x%p x%x x%x x%x\n",
+                                        "Data: x%p x%x x%x x%x %p\n",
                                         ndlp, ndlp->nlp_DID,
-                                        ndlp->nlp_flag, data1);
+                                        ndlp->nlp_flag, data1,
+                                        ndlp->active_rrqs_xri_bitmap);
                        return ndlp;
                }
        }
 
        lpfc_initialize_node(vport, ndlp, did);
        INIT_LIST_HEAD(&ndlp->nlp_listp);
-       if (vport->phba->sli_rev == LPFC_SLI_REV4)
+       if (vport->phba->sli_rev == LPFC_SLI_REV4) {
                ndlp->nlp_rpi = lpfc_sli4_alloc_rpi(vport->phba);
+               ndlp->active_rrqs_xri_bitmap =
+                               mempool_alloc(vport->phba->active_rrq_pool,
+                                             GFP_KERNEL);
+       }
+
 
 
        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_NODE,
        /* free ndlp memory for final ndlp release */
        if (NLP_CHK_FREE_REQ(ndlp)) {
                kfree(ndlp->lat_data);
+               if (phba->sli_rev == LPFC_SLI_REV4)
+                       mempool_free(ndlp->active_rrqs_xri_bitmap,
+                                    ndlp->phba->active_rrq_pool);
                mempool_free(ndlp, ndlp->phba->nlp_mem_pool);
        }
 }